Merge branch 'stable-3.0'

* stable-3.0:
  Adapt whole plugin codebase to 3.0 release API use
  Adapt whole plugin codebase to 2.16 release API use
  Upgrade bazlets to latest stable-2.16 to build with 2.16.10 API
  Align eclipse project generation w/ high-availability
  Add an empty tools/BUILD file explicitly for Bazel
  Upgrade bazlets to latest stable-2.15
  Upgrade bazlets to latest stable-2.14
  Upgrade bazlets to latest stable-2.15
  Upgrade bazlets to latest stable-2.14
  WORKSPACE: Align template content w/ other plugins
  Upgrade bazlets to latest stable-2.15
  Upgrade bazlets to latest stable-2.14
  Align tests target name prefix with plugin name
  Upgrade bazlets to latest stable-2.15 to build with 2.15.14 API
  Upgrade mockito-core to 2.28.2
  Make transitive starlark loads explicit
  Make transitive starlark loads explicit
  Upgrade bazlets to latest stable-2.15 to build with 2.15.13 API
  Upgrade bazlets to latest stable-2.14 to build with 2.14.20 API

Change-Id: If3a4bd049c9795987b02c0e5ed141dc554903981
diff --git a/.gitignore b/.gitignore
index 1c54bab..681ddba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
+# `LC_COLLATE=C sort`
+/.apt_generated/
 /.classpath
 /.project
 /.settings/
 /bazel-*
+/bin/
 /eclipse-out/
diff --git a/BUILD b/BUILD
index 6ced402..9c9cbff 100644
--- a/BUILD
+++ b/BUILD
@@ -18,7 +18,7 @@
 )
 
 junit_tests(
-    name = "rename_project_tests",
+    name = "rename-project_tests",
     srcs = glob(["src/test/java/**/*.java"]),
     tags = ["rename-project"],
     deps = [":rename-project__plugin_test_deps"],
diff --git a/WORKSPACE b/WORKSPACE
index 21ad9d6..dd03f37 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,9 +3,19 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "8386b3fbf80e375f0a10c8386c0a8dfe260c5c1b",
+    commit = "3c0a1bd325152af99640655831aef109e460bbe7",
+    #local_path = "/home/<user>/projects/bazlets",
 )
 
+# Snapshot Plugin API
+#load(
+#    "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
+#    "gerrit_api_maven_local",
+#)
+
+# Load snapshot Plugin API
+#gerrit_api_maven_local()
+
 # Release Plugin API
 load(
     "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index 1d8851b..c1932a9 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -3,8 +3,8 @@
 def external_plugin_deps():
     maven_jar(
         name = "mockito",
-        artifact = "org.mockito:mockito-core:2.27.0",
-        sha1 = "835fc3283b481f4758b8ef464cd560c649c08b00",
+        artifact = "org.mockito:mockito-core:2.28.2",
+        sha1 = "91110215a8cb9b77a46e045ee758f77d79167cc0",
         deps = [
             "@byte-buddy//jar",
             "@byte-buddy-agent//jar",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
index 45cf294..170e0d6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
@@ -16,9 +16,9 @@
 
 import com.google.gerrit.extensions.client.ProjectState;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import java.io.IOException;
@@ -28,17 +28,22 @@
 public class LockUnlockProject {
   private final MetaDataUpdate.Server metaDataUpdateFactory;
   private final ProjectCache projectCache;
+  private final ProjectConfig.Factory projectConfigFactory;
 
   @Inject
-  LockUnlockProject(MetaDataUpdate.Server metaDataUpdateFactory, ProjectCache projectCache) {
+  LockUnlockProject(
+      MetaDataUpdate.Server metaDataUpdateFactory,
+      ProjectCache projectCache,
+      ProjectConfig.Factory projectConfigFactory) {
     this.metaDataUpdateFactory = metaDataUpdateFactory;
     this.projectCache = projectCache;
+    this.projectConfigFactory = projectConfigFactory;
   }
 
   public void lock(Project.NameKey key) throws IOException, ConfigInvalidException {
     MetaDataUpdate md = metaDataUpdateFactory.create(key);
 
-    ProjectConfig projectConfig = ProjectConfig.read(md);
+    ProjectConfig projectConfig = projectConfigFactory.read(md);
     Project p = projectConfig.getProject();
     p.setState(ProjectState.READ_ONLY);
 
@@ -50,7 +55,7 @@
   public void unlock(Project.NameKey key) throws IOException, ConfigInvalidException {
     MetaDataUpdate md = metaDataUpdateFactory.create(key);
 
-    ProjectConfig projectConfig = ProjectConfig.read(md);
+    ProjectConfig projectConfig = projectConfigFactory.read(md);
     Project p = projectConfig.getProject();
     p.setState(ProjectState.ACTIVE);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
index b28d47c..db1e862 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
@@ -18,12 +18,14 @@
 
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.renameproject.monitor.CommandProgressMonitor;
 import com.googlesource.gerrit.plugins.renameproject.monitor.ProgressMonitor;
 import java.io.BufferedReader;
@@ -37,17 +39,24 @@
 @CommandMetaData(name = "rename", description = "Rename project")
 public final class RenameCommand extends SshCommand {
   @Argument(index = 0, required = true, metaVar = "OLDPROJECT", usage = "project to rename")
-  private ProjectControl projectControl;
+  private String projectControl;
 
   @Argument(index = 1, required = true, metaVar = "NEWNAME", usage = "new name for the project")
   private String newProjectName;
 
   private static final Logger log = LoggerFactory.getLogger(RenameCommand.class);
   private final RenameProject renameProject;
+  private final Provider<ProjectCache> projectCacheProvider;
+  private final Provider<CurrentUser> self;
 
   @Inject
-  protected RenameCommand(RenameProject renameProject) {
+  protected RenameCommand(
+      RenameProject renameProject,
+      Provider<ProjectCache> projectCacheProvider,
+      Provider<CurrentUser> self) {
     this.renameProject = renameProject;
+    this.projectCacheProvider = projectCacheProvider;
+    this.self = self;
   }
 
   @Override
@@ -55,7 +64,9 @@
     try {
       RenameProject.Input input = new RenameProject.Input();
       input.name = newProjectName;
-      ProjectResource rsrc = new ProjectResource(projectControl);
+      ProjectResource rsrc =
+          new ProjectResource(
+              projectCacheProvider.get().get(new Project.NameKey(projectControl)), self.get());
       try (CommandProgressMonitor monitor = new CommandProgressMonitor(stdout)) {
         renameProject.assertCanRename(rsrc, input, monitor);
         List<Change.Id> changeIds = renameProject.getChanges(rsrc, monitor);
@@ -68,7 +79,7 @@
           stdout.flush();
         }
       }
-    } catch (RestApiException | OrmException | IOException e) {
+    } catch (RestApiException | IOException e) {
       throw die(e);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
index a15d2c5..6449cba 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
@@ -16,15 +16,15 @@
 
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.audit.AuditEvent;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.common.TimeUtil;
 import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.json.OutputFormat;
 import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AuditEvent;
 import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.audit.AuditService;
 import com.google.gerrit.server.util.PluginLogFile;
 import com.google.gerrit.server.util.SystemLog;
+import com.google.gerrit.server.util.time.TimeUtil;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import org.apache.log4j.Level;
@@ -68,7 +68,7 @@
             null);
 
     event.setProperty(ACCOUNT_ID, user.getAccountId().toString());
-    event.setProperty(USER_NAME, user.getUserName());
+    event.setProperty(USER_NAME, user.getUserName().get());
     event.setProperty(PROJECT_NAME, project.get());
 
     if (options != null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLogLayout.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLogLayout.java
index 5a11a17..053e8b9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLogLayout.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLogLayout.java
@@ -33,8 +33,8 @@
    * +0100] INFO 1000000 admin OK \ myProject {"name": newName}
    *
    * <p>The log entry for a failed project rename will look like this: [2015-03-05 12:14:30,180
-   * +0100] ERROR 1000000 admin FAIL \ myProject {"name": newName}
-   * com.google.gwtorm.server.OrmException: \ Failed to access the database
+   * +0100] ERROR 1000000 admin FAIL \ myProject {"name": newName} TODO(mmiller): \ Failed to access
+   * the database
    */
   @Override
   public String format(LoggingEvent event) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
index 8bc3828..4d4f671 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
@@ -30,8 +30,9 @@
 import com.google.gerrit.server.extensions.events.PluginEvent;
 import com.google.gerrit.server.permissions.GlobalPermission;
 import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gerrit.server.project.ProjectResource;
-import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -108,11 +109,27 @@
   }
 
   protected boolean canRename(ProjectResource rsrc) {
-    PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider);
+    PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider.get());
     return userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER)
         || userPermission.testOrFalse(new PluginPermission(pluginName, RENAME_PROJECT))
         || (userPermission.testOrFalse(new PluginPermission(pluginName, RENAME_OWN_PROJECT))
-            && rsrc.getControl().isOwner());
+            && isOwner(rsrc));
+  }
+
+  private boolean isOwner(ProjectResource project) {
+    try {
+      permissionBackend
+          .user(project.getUser())
+          .project(project.getNameKey())
+          .check(ProjectPermission.WRITE_CONFIG);
+    } catch (AuthException | PermissionBackendException noWriter) {
+      try {
+        permissionBackend.user(project.getUser()).check(GlobalPermission.ADMINISTRATE_SERVER);
+      } catch (AuthException | PermissionBackendException noAdmin) {
+        return false;
+      }
+    }
+    return true;
   }
 
   void assertCanRename(ProjectResource rsrc, Input input, ProgressMonitor pm)
@@ -129,17 +146,17 @@
   }
 
   void doRename(List<Change.Id> changeIds, ProjectResource rsrc, Input input, ProgressMonitor pm)
-      throws InterruptedException, OrmException, ConfigInvalidException, IOException {
-    Project.NameKey oldProjectKey = rsrc.getControl().getProject().getNameKey();
+      throws InterruptedException, ConfigInvalidException, IOException {
+    Project.NameKey oldProjectKey = rsrc.getNameKey();
     Project.NameKey newProjectKey = new Project.NameKey(input.name);
     Exception ex = null;
     try {
       fsHandler.rename(oldProjectKey, newProjectKey, pm);
       log.debug("Renamed the git repo to {} successfully.", newProjectKey.get());
-      cacheHandler.update(rsrc.getControl().getProject(), newProjectKey);
+      cacheHandler.update(rsrc.getProjectState().getProject(), newProjectKey);
 
       List<Change.Id> updatedChangeIds =
-          dbHandler.rename(changeIds, oldProjectKey, newProjectKey, pm);
+          dbHandler.rename(changeIds, newProjectKey, pm);
       log.debug("Updated the changes in DB successfully for project {}.", oldProjectKey.get());
 
       // if the DB update is successful, update the secondary index
@@ -158,9 +175,9 @@
     }
   }
 
-  List<Change.Id> getChanges(ProjectResource rsrc, ProgressMonitor pm) throws OrmException {
+  List<Change.Id> getChanges(ProjectResource rsrc, ProgressMonitor pm) throws IOException {
     pm.beginTask("Retrieving the list of changes from DB");
-    Project.NameKey oldProjectKey = rsrc.getControl().getProject().getNameKey();
+    Project.NameKey oldProjectKey = rsrc.getNameKey();
     return dbHandler.getChangeIds(oldProjectKey);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java
index e2a7ee0..4dcae20 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java
@@ -16,7 +16,7 @@
 
 import com.google.gerrit.sshd.SingleCommandPluginModule;
 import com.google.inject.binder.LinkedBindingBuilder;
-import org.apache.sshd.server.Command;
+import org.apache.sshd.server.command.Command;
 
 public class SshModule extends SingleCommandPluginModule {
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java
index c9ff8cf..0ca033e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import java.io.IOException;
 
 @Singleton
 public class CacheRenameHandler {
@@ -29,7 +30,7 @@
     this.projectCache = projectCache;
   }
 
-  public void update(Project oldProject, Project.NameKey newProjectKey) {
+  public void update(Project oldProject, Project.NameKey newProjectKey) throws IOException {
     projectCache.remove(oldProject);
     projectCache.onCreateProject(newProjectKey);
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java
index 2246d50..3e30f6e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java
@@ -15,18 +15,19 @@
 package com.googlesource.gerrit.plugins.renameproject.conditions;
 
 import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.config.AllProjectsName;
 import com.google.gerrit.server.config.AllUsersName;
 import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeOpRepoManager;
-import com.google.gerrit.server.git.SubmoduleException;
-import com.google.gerrit.server.git.SubmoduleOp;
 import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ListChildProjects;
 import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.ListChildProjects;
+import com.google.gerrit.server.submit.MergeOpRepoManager;
+import com.google.gerrit.server.submit.SubmoduleException;
+import com.google.gerrit.server.submit.SubmoduleOp;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -73,7 +74,7 @@
 
   public void assertCanRename(ProjectResource oldProjectRsrc, Project.NameKey newProjectKey)
       throws CannotRenameProjectException {
-    Project.NameKey oldProjectKey = oldProjectRsrc.getControl().getProject().getNameKey();
+    Project.NameKey oldProjectKey = oldProjectRsrc.getNameKey();
     assertNewRepoNotExists(newProjectKey);
     assertIsNotDefaultProject(oldProjectKey);
     assertHasNoChildProjects(oldProjectRsrc);
@@ -100,7 +101,7 @@
         log.error(message);
         throw new CannotRenameProjectException(message);
       }
-    } catch (PermissionBackendException e) {
+    } catch (PermissionBackendException | RestApiException e) {
       throw new CannotRenameProjectException(e);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
index 3215c42..62e517e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
@@ -14,29 +14,36 @@
 
 package com.googlesource.gerrit.plugins.renameproject.database;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.ServerInitiated;
 import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.WatchConfig;
-import com.google.gerrit.server.account.WatchConfig.Accessor;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
+import com.google.gerrit.server.notedb.ChangeUpdate;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.renameproject.monitor.ProgressMonitor;
 import java.io.IOException;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
+import java.time.Instant;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,96 +52,127 @@
 public class DatabaseRenameHandler {
   private static final Logger log = LoggerFactory.getLogger(DatabaseRenameHandler.class);
 
-  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final ChangeNotes.Factory schemaFactory;
+  private final ChangeUpdate.Factory updateFactory;
+  private final GitRepositoryManager repoManager;
+  private final Provider<CurrentUser> userProvider;
   private final Provider<InternalAccountQuery> accountQueryProvider;
-  private final Provider<Accessor> watchConfig;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final Map<Change.Id, ChangeNotes> changeNotes = new HashMap<>();
+
+  private Project.NameKey oldProjectKey;
 
   @Inject
   public DatabaseRenameHandler(
-      SchemaFactory<ReviewDb> schemaFactory,
+      ChangeNotes.Factory schemaFactory,
+      ChangeUpdate.Factory updateFactory,
+      GitRepositoryManager repoManager,
+      Provider<CurrentUser> userProvider,
       Provider<InternalAccountQuery> accountQueryProvider,
-      Provider<WatchConfig.Accessor> watchConfig) {
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
     this.accountQueryProvider = accountQueryProvider;
-    this.watchConfig = watchConfig;
     this.schemaFactory = schemaFactory;
+    this.updateFactory = updateFactory;
+    this.repoManager = repoManager;
+    this.userProvider = userProvider;
+    this.accountsUpdateProvider = accountsUpdateProvider;
   }
 
-  public List<Change.Id> getChangeIds(Project.NameKey oldProjectKey) throws OrmException {
+  public List<Change.Id> getChangeIds(Project.NameKey oldProjectKey) throws IOException {
     log.debug("Starting to retrieve changes from the DB for project {}", oldProjectKey.get());
+    this.oldProjectKey = oldProjectKey;
 
     List<Change.Id> changeIds = new ArrayList<>();
-    Connection conn = ((JdbcSchema) schemaFactory.open()).getConnection();
-    String query =
-        "select change_id from changes where dest_project_name ='" + oldProjectKey.get() + "';";
-    try (Statement stmt = conn.createStatement();
-        ResultSet changes = stmt.executeQuery(query)) {
-      while (changes != null && changes.next()) {
-        Change.Id changeId = new Change.Id(changes.getInt(1));
-        changeIds.add(changeId);
-      }
-      log.debug(
-          "Number of changes related to the project {} are {}",
-          oldProjectKey.get(),
-          changeIds.size());
-      return changeIds;
-    } catch (SQLException e) {
-      throw new OrmException(e);
+    Stream<ChangeNotesResult> changes =
+        schemaFactory.scan(repoManager.openRepository(oldProjectKey), oldProjectKey);
+    Iterator<ChangeNotesResult> iterator = changes.iterator();
+    while (iterator.hasNext()) {
+      ChangeNotesResult change = iterator.next();
+      Change.Id changeId = change.id();
+      changeIds.add(changeId);
+      changeNotes.put(changeId, change.notes());
     }
+    log.debug(
+        "Number of changes related to the project {} are {}",
+        oldProjectKey.get(),
+        changeIds.size());
+    return changeIds;
   }
 
   public List<Change.Id> rename(
-      List<Change.Id> changes,
-      Project.NameKey oldProjectKey,
-      Project.NameKey newProjectKey,
-      ProgressMonitor pm)
-      throws OrmException {
+      List<Change.Id> changes, Project.NameKey newProjectKey, ProgressMonitor pm)
+      throws IOException {
     pm.beginTask("Updating changes in the database");
-    Connection conn = ((JdbcSchema) schemaFactory.open()).getConnection();
-    try (Statement stmt = conn.createStatement()) {
-      conn.setAutoCommit(false);
-      try {
-        log.debug("Updating the changes in the DB related to project {}", oldProjectKey.get());
-        for (Change.Id cd : changes) {
-          stmt.addBatch(
-              "update changes set dest_project_name='"
-                  + newProjectKey.get()
-                  + "' where change_id ="
-                  + cd.id
-                  + ";");
-        }
-        stmt.executeBatch();
-        updateWatchEntries(oldProjectKey, newProjectKey);
-        conn.commit();
-        log.debug(
-            "Successfully updated the changes in the DB related to project {}",
-            oldProjectKey.get());
-        return changes;
-      } finally {
-        conn.setAutoCommit(true);
+    log.debug("Updating the changes in the DB related to project {}", oldProjectKey.get());
+    List<ChangeUpdate> updates = getChangeUpdates(changes, newProjectKey);
+    updateWatchEntries(newProjectKey);
+    List<Change> updated = new ArrayList<>();
+    try {
+      for (ChangeUpdate update : updates) {
+        update.commit();
+        updated.add(update.getChange());
       }
-    } catch (SQLException e) {
-      try {
-        log.error(
-            "Failed to update changes in the DB for the project {}, rolling back the operation.",
-            oldProjectKey.get());
-        conn.rollback();
-      } catch (SQLException ex) {
-        throw new OrmException(ex);
-      }
-      throw new OrmException(e);
+    } catch (IOException e) {
+      // TODO(mmiller): Consider covering this path with tests, albeit exceptional.
+      log.error(
+          "Failed to update changes in the DB for the project {}, rolling back the operation.",
+          oldProjectKey.get());
+      rollback(updated, newProjectKey);
+      throw e;
     }
+    log.debug(
+        "Successfully updated the changes in the DB related to project {}", oldProjectKey.get());
+    return changes;
   }
 
-  private void updateWatchEntries(Project.NameKey oldProjectKey, Project.NameKey newProjectKey)
-      throws OrmException {
+  private List<ChangeUpdate> getChangeUpdates(List<Change.Id> changeIds, Project.NameKey nameKey) {
+    List<ChangeUpdate> updates = new ArrayList<>();
+    Date from = Date.from(Instant.now());
+    changeIds.forEach(
+        changeId -> {
+          ChangeNotes notes = schemaFactory.create(nameKey, changeId);
+          ChangeUpdate update = updateFactory.create(notes, userProvider.get(), from);
+          updates.add(update);
+        });
+    return updates;
+  }
+
+  private void rollback(List<Change> changes, Project.NameKey newProjectKey) {
+    Date from = Date.from(Instant.now());
+    changes.forEach(
+        change -> {
+          ChangeNotes notes = changeNotes.get(change.getId());
+          ChangeUpdate revert = updateFactory.create(notes, userProvider.get(), from);
+          revert.setRevertOf(change.getChangeId());
+          try {
+            revert.commit();
+          } catch (IOException ex) {
+            log.error(
+                "Failed to rollback change {} in DB from project {} to {}; rolling back others still.",
+                change.getChangeId(),
+                newProjectKey.get(),
+                oldProjectKey.get());
+          }
+        });
+  }
+
+  private void updateWatchEntries(Project.NameKey newProjectKey) {
     for (AccountState a : accountQueryProvider.get().byWatchedProject(newProjectKey)) {
       Account.Id accountId = a.getAccount().getId();
+      ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches =
+          a.getProjectWatches();
+      Map<ProjectWatchKey, Set<NotifyType>> newProjectWatches = new HashMap<>();
       for (ProjectWatchKey watchKey : a.getProjectWatches().keySet()) {
         if (oldProjectKey.equals(watchKey.project())) {
+          newProjectWatches.put(watchKey, projectWatches.get(watchKey));
           try {
-            watchConfig
+            accountsUpdateProvider
                 .get()
-                .upsertProjectWatches(accountId, watchConfig.get().getProjectWatches(accountId));
+                .update(
+                    "Update watch entry",
+                    accountId,
+                    (accountState, update) ->
+                        update.updateProjectWatches(newProjectWatches).build());
           } catch (ConfigInvalidException e) {
             log.error(
                 "Updating watch entry for user {} in project {} failed. Watch config found invalid.",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/IndexUpdateHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/IndexUpdateHandler.java
index ed12dc3..daef534 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/IndexUpdateHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/IndexUpdateHandler.java
@@ -17,15 +17,11 @@
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.renameproject.Configuration;
 import com.googlesource.gerrit.plugins.renameproject.monitor.ProgressMonitor;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -40,14 +36,11 @@
 public class IndexUpdateHandler {
   private static final Logger log = LoggerFactory.getLogger(IndexUpdateHandler.class);
 
-  private final SchemaFactory<ReviewDb> schemaFactory;
   private final ChangeIndexer indexer;
   private final Configuration config;
 
   @Inject
-  public IndexUpdateHandler(
-      SchemaFactory<ReviewDb> schemaFactory, ChangeIndexer indexer, Configuration config) {
-    this.schemaFactory = schemaFactory;
+  public IndexUpdateHandler(ChangeIndexer indexer, Configuration config) {
     this.indexer = indexer;
     this.config = config;
   }
@@ -100,14 +93,9 @@
 
     @Override
     public Boolean call() throws Exception {
-      try (ReviewDb db = schemaFactory.open()) {
-        indexer.index(db, newProjectKey, changeId);
-        monitor.update(1);
-        return Boolean.TRUE;
-      } catch (OrmException | IOException e) {
-        log.error("Failed to reindex change {} from index, Cause: {}", changeId, e);
-        throw e;
-      }
+      indexer.index(newProjectKey, changeId);
+      monitor.update(1);
+      return Boolean.TRUE;
     }
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java
index 879e660..efb8886 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java
@@ -83,12 +83,13 @@
   @Test
   @UseLocalDisk
   public void testRenameSubscribedFail() throws Exception {
-    NameKey superProject = createProject("super-project");
+    NameKey superProject = createProjectOverAPI("super-project", null, true, null);
     TestRepository<?> superRepo = cloneProject(superProject);
-    NameKey subProject = createProject("subscribed-to-project");
+    NameKey subProject = createProjectOverAPI("subscribed-to-project", null, true, null);
     SubmoduleUtil.allowSubmoduleSubscription(
         metaDataUpdateFactory,
         projectCache,
+        projectConfigFactory,
         subProject,
         "refs/heads/master",
         superProject,
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
index 89243a1..68515c4 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
@@ -18,10 +18,10 @@
 
 import com.google.gerrit.common.data.SubscribeSection;
 import com.google.gerrit.reviewdb.client.Project.NameKey;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.MetaDataUpdate.Server;
-import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.MetaDataUpdate.Server;
 import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
@@ -45,6 +45,7 @@
   static void allowSubmoduleSubscription(
       Server metaDataUpdateFactory,
       ProjectCache projectCache,
+      ProjectConfig.Factory projectConfigFactory,
       NameKey sub,
       String subBranch,
       NameKey superName,
@@ -54,7 +55,7 @@
     try (MetaDataUpdate md = metaDataUpdateFactory.create(sub)) {
       md.setMessage("Added superproject subscription");
       SubscribeSection s;
-      ProjectConfig pc = ProjectConfig.read(md);
+      ProjectConfig pc = projectConfigFactory.read(md);
       if (pc.getSubscribeSections().containsKey(superName)) {
         s = pc.getSubscribeSections().get(superName);
       } else {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java
index 43050e1..e42e550 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java
@@ -19,14 +19,15 @@
 
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.AllProjectsName;
 import com.google.gerrit.server.config.AllUsersName;
 import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeOpRepoManager;
-import com.google.gerrit.server.git.SubmoduleOp;
-import com.google.gerrit.server.project.ListChildProjects;
-import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.ListChildProjects;
+import com.google.gerrit.server.submit.MergeOpRepoManager;
+import com.google.gerrit.server.submit.SubmoduleOp;
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.renameproject.CannotRenameProjectException;
 import java.util.ArrayList;
@@ -50,7 +51,8 @@
   @Mock private Provider<MergeOpRepoManager> ormProvider;
   @Mock private RenamePreconditions preconditions;
   @Mock private ObjectDatabase objDb;
-  @Mock private ProjectControl control;
+  @Mock private ProjectState control;
+  @Mock private CurrentUser user;
   @Mock private Repository repo;
   @Mock private ListChildProjects listChildProjects;
 
@@ -60,7 +62,7 @@
 
   @Before
   public void setUp() throws Exception {
-    oldRsrc = new ProjectResource(control);
+    oldRsrc = new ProjectResource(control, user);
     when(repoManager.openRepository(newProjectKey)).thenReturn(repo);
     when(repo.getObjectDatabase()).thenReturn(objDb);
     preconditions =
@@ -75,8 +77,6 @@
 
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameRepoExists() throws Exception {
-    Project oldProject = new Project(new Project.NameKey("oldProject"));
-    when(control.getProject()).thenReturn(oldProject);
     when(objDb.exists()).thenReturn(true);
 
     preconditions.assertCanRename(oldRsrc, newProjectKey);
@@ -85,7 +85,7 @@
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameAllProjects() throws Exception {
     Project oldProject = new Project(allProjects);
-    when(control.getProject()).thenReturn(oldProject);
+    when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
     when(objDb.exists()).thenReturn(false);
 
     preconditions.assertCanRename(oldRsrc, newProjectKey);
@@ -94,7 +94,7 @@
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameAllUsers() throws Exception {
     Project oldProject = new Project(allUsersName);
-    when(control.getProject()).thenReturn(oldProject);
+    when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
     when(objDb.exists()).thenReturn(false);
 
     preconditions.assertCanRename(oldRsrc, newProjectKey);
@@ -103,7 +103,7 @@
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameHasChildren() throws Exception {
     Project oldProject = new Project(new Project.NameKey("oldProject"));
-    when(control.getProject()).thenReturn(oldProject);
+    when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
     when(objDb.exists()).thenReturn(false);
 
     when(listChildProjectsProvider.get()).thenReturn(listChildProjects);
diff --git a/tools/BUILD b/tools/BUILD
new file mode 100644
index 0000000..c5ed0b7
--- /dev/null
+++ b/tools/BUILD
@@ -0,0 +1 @@
+# Empty file required by Bazel
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
index d5764f7..c921d01 100644
--- a/tools/bzl/classpath.bzl
+++ b/tools/bzl/classpath.bzl
@@ -1,4 +1,6 @@
 load(
     "@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
-    "classpath_collector",
+    _classpath_collector = "classpath_collector",
 )
+
+classpath_collector = _classpath_collector
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl
index 3af7e58..97307bd 100644
--- a/tools/bzl/junit.bzl
+++ b/tools/bzl/junit.bzl
@@ -1,4 +1,6 @@
 load(
     "@com_googlesource_gerrit_bazlets//tools:junit.bzl",
-    "junit_tests",
+    _junit_tests = "junit_tests",
 )
+
+junit_tests = _junit_tests
diff --git a/tools/bzl/maven_jar.bzl b/tools/bzl/maven_jar.bzl
index 2eabedb..35ea8ce 100644
--- a/tools/bzl/maven_jar.bzl
+++ b/tools/bzl/maven_jar.bzl
@@ -1 +1,3 @@
-load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", "maven_jar")
+load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", _maven_jar = "maven_jar")
+
+maven_jar = _maven_jar
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
index 0b25d23..4d2dbdd 100644
--- a/tools/bzl/plugin.bzl
+++ b/tools/bzl/plugin.bzl
@@ -1,6 +1,10 @@
 load(
     "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
-    "PLUGIN_DEPS",
-    "PLUGIN_TEST_DEPS",
-    "gerrit_plugin",
+    _gerrit_plugin = "gerrit_plugin",
+    _plugin_deps = "PLUGIN_DEPS",
+    _plugin_test_deps = "PLUGIN_TEST_DEPS",
 )
+
+gerrit_plugin = _gerrit_plugin
+PLUGIN_DEPS = _plugin_deps
+PLUGIN_TEST_DEPS = _plugin_test_deps
diff --git a/tools/eclipse/project.sh b/tools/eclipse/project.sh
index 2b895ff..3003cc2 100755
--- a/tools/eclipse/project.sh
+++ b/tools/eclipse/project.sh
@@ -13,4 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-`bazel query @com_googlesource_gerrit_bazlets//tools/eclipse:project --output location | sed s/BUILD:.*//`project.py -n rename-project -r .
+path=$(bazel query @com_googlesource_gerrit_bazlets//tools/eclipse:project \
+    --output location | sed s/BUILD:.*//)
+${path}project.py -n rename-project -r . "$@"