Merge branch 'stable-3.0' into stable-3.3

* stable-3.0:
  Fix JDBC connection not terminated after project rename

Change-Id: I0822bc4d34f24565d3b0c30bc5d981ac8d1a1d7e
diff --git a/.bazelignore b/.bazelignore
deleted file mode 100644
index 30f1613..0000000
--- a/.bazelignore
+++ /dev/null
@@ -1 +0,0 @@
-eclipse-out
diff --git a/.bazelrc b/.bazelrc
deleted file mode 100644
index 3ae03ff..0000000
--- a/.bazelrc
+++ /dev/null
@@ -1,2 +0,0 @@
-build --workspace_status_command="python ./tools/workspace_status.py"
-test --build_tests_only
diff --git a/.bazelversion b/.bazelversion
deleted file mode 100644
index 7c69a55..0000000
--- a/.bazelversion
+++ /dev/null
@@ -1 +0,0 @@
-3.7.0
diff --git a/.gitignore b/.gitignore
index 681ddba..f6a5a71 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,3 @@
 # `LC_COLLATE=C sort`
-/.apt_generated/
-/.classpath
-/.project
 /.settings/
-/bazel-*
 /bin/
-/eclipse-out/
diff --git a/WORKSPACE b/WORKSPACE
deleted file mode 100644
index c42a339..0000000
--- a/WORKSPACE
+++ /dev/null
@@ -1,19 +0,0 @@
-workspace(name = "rename_project")
-
-load("//:bazlets.bzl", "load_bazlets")
-
-load_bazlets(
-    commit = "a029d8e41d6211c8b23052aa0a0c2c7649577e85",
-    #local_path = "/home/<user>/projects/bazlets",
-)
-
-load(
-    "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
-    "gerrit_api",
-)
-
-gerrit_api()
-
-load("//:external_plugin_deps.bzl", "external_plugin_deps")
-
-external_plugin_deps()
diff --git a/bazlets.bzl b/bazlets.bzl
deleted file mode 100644
index f089af4..0000000
--- a/bazlets.bzl
+++ /dev/null
@@ -1,18 +0,0 @@
-load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
-
-NAME = "com_googlesource_gerrit_bazlets"
-
-def load_bazlets(
-        commit,
-        local_path = None):
-    if not local_path:
-        git_repository(
-            name = NAME,
-            remote = "https://gerrit.googlesource.com/bazlets",
-            commit = commit,
-        )
-    else:
-        native.local_repository(
-            name = NAME,
-            path = local_path,
-        )
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java
index 1a3570d..a74c4cb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java
@@ -33,6 +33,7 @@
   private final int indexThreads;
   private final int sshCommandTimeout;
   private final int sshConnectionTimeout;
+  private final String renameRegex;
 
   private final Set<String> urls;
 
@@ -42,6 +43,7 @@
     indexThreads = cfg.getInt("indexThreads", 4);
     sshCommandTimeout = cfg.getInt("sshCommandTimeout", 0);
     sshConnectionTimeout = cfg.getInt("sshConnectionTimeout", DEFAULT_SSH_CONNECTION_TIMEOUT_MS);
+    renameRegex = cfg.getString("renameRegex", ".+");
 
     urls =
         Arrays.stream(cfg.getStringList(URL_KEY))
@@ -66,4 +68,8 @@
   public int getSshConnectionTimeout() {
     return sshConnectionTimeout;
   }
+
+  public String getRenameRegex() {
+    return renameRegex;
+  }
 }
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 170e0d6..91f018f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
@@ -14,8 +14,8 @@
 
 package com.googlesource.gerrit.plugins.renameproject;
 
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectConfig;
@@ -44,23 +44,23 @@
     MetaDataUpdate md = metaDataUpdateFactory.create(key);
 
     ProjectConfig projectConfig = projectConfigFactory.read(md);
-    Project p = projectConfig.getProject();
-    p.setState(ProjectState.READ_ONLY);
+    projectConfig.updateProject(project -> project.setState(ProjectState.READ_ONLY));
 
     md.setMessage(String.format("Lock project while renaming the project %s\n", key.get()));
     projectConfig.commit(md);
-    projectCache.evict(p);
+    Project p = projectConfig.getProject();
+    projectCache.evict(p.getNameKey());
   }
 
   public void unlock(Project.NameKey key) throws IOException, ConfigInvalidException {
     MetaDataUpdate md = metaDataUpdateFactory.create(key);
 
     ProjectConfig projectConfig = projectConfigFactory.read(md);
-    Project p = projectConfig.getProject();
-    p.setState(ProjectState.ACTIVE);
+    projectConfig.updateProject(project -> project.setState(ProjectState.ACTIVE));
 
     md.setMessage(String.format("Unlock project after renaming the project to %s\n", key.get()));
     projectConfig.commit(md);
-    projectCache.evict(p);
+    Project p = projectConfig.getProject();
+    projectCache.evict(p.getNameKey());
   }
 }
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 9883858..cac0b30 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
@@ -17,10 +17,10 @@
 import static com.googlesource.gerrit.plugins.renameproject.RenameProject.CANCELLATION_MSG;
 import static com.googlesource.gerrit.plugins.renameproject.RenameProject.WARNING_LIMIT;
 
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.project.ProjectState;
@@ -34,6 +34,7 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
@@ -88,7 +89,7 @@
           }
         }
       }
-    } catch (RestApiException | IOException e) {
+    } catch (NoSuchElementException | 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 6449cba..e37edb1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
@@ -16,9 +16,9 @@
 
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.entities.Project;
 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.audit.AuditService;
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 aae93b2..0cf1ca4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
@@ -20,6 +20,9 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
 import com.google.common.cache.Cache;
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.entities.Change.Id;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.api.access.PluginPermission;
 import com.google.gerrit.extensions.restapi.AuthException;
@@ -27,9 +30,6 @@
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Id;
-import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.extensions.events.PluginEvent;
@@ -64,7 +64,7 @@
 public class RenameProject implements RestModifyView<ProjectResource, Input> {
 
   @Override
-  public Object apply(ProjectResource resource, Input input)
+  public Response<?> apply(ProjectResource resource, Input input)
       throws IOException, AuthException, BadRequestException, ResourceConflictException,
           InterruptedException, ConfigInvalidException, RenameRevertException {
     assertCanRename(resource, input, Optional.empty());
@@ -151,6 +151,14 @@
     }
   }
 
+  private void assertNewNameMatchesRegex(Input input) throws BadRequestException {
+    if (!input.name.matches(cfg.getRenameRegex())) {
+      throw new BadRequestException(
+          String.format(
+              "Name of the repo should match the expected regex: %s", cfg.getRenameRegex()));
+    }
+  }
+
   private void assertRenamePermission(ProjectResource rsrc) throws AuthException {
     if (!canRename(rsrc)) {
       throw new AuthException("Not allowed to rename project");
@@ -195,8 +203,9 @@
       pm.ifPresent(progressMonitor -> progressMonitor.beginTask("Checking preconditions"));
 
       assertNewNameNotNull(input);
+      assertNewNameMatchesRegex(input);
       assertRenamePermission(rsrc);
-      renamePreconditions.assertCanRename(rsrc, new Project.NameKey(input.name));
+      renamePreconditions.assertCanRename(rsrc, Project.nameKey(input.name));
       log.debug("Rename preconditions check successful.");
     } catch (CannotRenameProjectException e) {
       throw new ResourceConflictException(e.getMessage());
@@ -207,7 +216,7 @@
       List<Change.Id> changeIds, ProjectResource rsrc, Input input, Optional<ProgressMonitor> pm)
       throws InterruptedException, ConfigInvalidException, IOException, RenameRevertException {
     Project.NameKey oldProjectKey = rsrc.getNameKey();
-    Project.NameKey newProjectKey = new Project.NameKey(input.name);
+    Project.NameKey newProjectKey = Project.nameKey(input.name);
     Exception ex = null;
     stepsPerformed.clear();
     try {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProject.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProject.java
index 0671c71..484492a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProject.java
@@ -14,9 +14,9 @@
 
 package com.googlesource.gerrit.plugins.renameproject;
 
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Id;
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.entities.Change.Id;
+import com.google.gerrit.entities.Project;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.renameproject.RenameProject.Step;
 import com.googlesource.gerrit.plugins.renameproject.cache.CacheRenameHandler;
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 4526489..5b16875 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
@@ -14,7 +14,7 @@
 
 package com.googlesource.gerrit.plugins.renameproject.cache;
 
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
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 3e30f6e..55ed291 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
@@ -14,31 +14,30 @@
 
 package com.googlesource.gerrit.plugins.renameproject.conditions;
 
+import static com.google.gerrit.entities.RefNames.REFS_HEADS;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.entities.BranchNameKey;
+import com.google.gerrit.entities.Project;
 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.extensions.restapi.Response;
 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.permissions.PermissionBackendException;
 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.gerrit.server.submit.SubmoduleConflictException;
+import com.google.gerrit.server.submit.SubscriptionGraph;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.renameproject.CannotRenameProjectException;
 import java.io.IOException;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -53,7 +52,7 @@
   public final AllUsersName allUsersName;
   private final Provider<ListChildProjects> listChildProjectsProvider;
   private final GitRepositoryManager repoManager;
-  private final SubmoduleOp.Factory subOpFactory;
+  private final SubscriptionGraph.Factory subscriptionGraphFactory;
   private final Provider<MergeOpRepoManager> ormProvider;
 
   @Inject
@@ -62,13 +61,13 @@
       AllUsersName allUsersName,
       Provider<ListChildProjects> listChildProjectsProvider,
       GitRepositoryManager repoManager,
-      SubmoduleOp.Factory subOpFactory,
+      SubscriptionGraph.Factory subscriptionGraphFactory,
       Provider<MergeOpRepoManager> ormProvider) {
     this.allProjectsName = allProjectsName;
     this.allUsersName = allUsersName;
     this.listChildProjectsProvider = listChildProjectsProvider;
     this.repoManager = repoManager;
-    this.subOpFactory = subOpFactory;
+    this.subscriptionGraphFactory = subscriptionGraphFactory;
     this.ormProvider = ormProvider;
   }
 
@@ -91,17 +90,18 @@
 
   private void assertHasNoChildProjects(ProjectResource rsrc) throws CannotRenameProjectException {
     try {
-      List<ProjectInfo> children = listChildProjectsProvider.get().apply(rsrc);
-      if (!children.isEmpty()) {
+      Response<List<ProjectInfo>> children = listChildProjectsProvider.get().apply(rsrc);
+      if (!children.value().isEmpty()) {
         String childrenString =
             String.join(
-                ", ", children.stream().map(info -> info.name).collect(Collectors.toList()));
+                ", ",
+                children.value().stream().map(info -> info.name).collect(Collectors.toList()));
         String message =
             String.format("Cannot rename project because it has children: %s", childrenString);
         log.error(message);
         throw new CannotRenameProjectException(message);
       }
-    } catch (PermissionBackendException | RestApiException e) {
+    } catch (Exception e) {
       throw new CannotRenameProjectException(e);
     }
   }
@@ -109,19 +109,19 @@
   private void assertIsNotSubscribed(Project.NameKey key) throws CannotRenameProjectException {
     try (Repository repo = repoManager.openRepository(key);
         MergeOpRepoManager orm = ormProvider.get()) {
-      Set<Branch.NameKey> branches = new HashSet<>();
-      for (Ref ref : repo.getRefDatabase().getRefs(RefNames.REFS_HEADS).values()) {
-        branches.add(new Branch.NameKey(key, ref.getName()));
-      }
-      SubmoduleOp sub = subOpFactory.create(branches, orm);
-      for (Branch.NameKey b : branches) {
-        if (!sub.superProjectSubscriptionsForSubmoduleBranch(b).isEmpty()) {
+      Set<BranchNameKey> branches =
+          repo.getRefDatabase().getRefsByPrefix(REFS_HEADS).stream()
+              .map(ref -> BranchNameKey.create(key, ref.getName()))
+              .collect(toSet());
+      SubscriptionGraph sub = subscriptionGraphFactory.compute(branches, orm);
+      for (BranchNameKey b : branches) {
+        if (sub.hasSuperproject(b)) {
           String message = "Cannot rename a project subscribed to by the other projects";
           log.error(message);
           throw new CannotRenameProjectException(message);
         }
       }
-    } catch (IOException | SubmoduleException e) {
+    } catch (IOException | SubmoduleConflictException 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 2ed4ad5..7afbf11 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
@@ -16,13 +16,13 @@
 
 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.entities.Account;
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.entities.NotifyConfig.NotifyType;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.ServerInitiated;
 import com.google.gerrit.server.account.AccountState;
 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;
@@ -122,12 +122,11 @@
   private void updateWatchEntries(Project.NameKey newProjectKey)
       throws IOException, ConfigInvalidException {
     for (AccountState a : accountQueryProvider.get().byWatchedProject(oldProjectKey)) {
-      Account.Id accountId = a.getAccount().getId();
-      ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches =
-          a.getProjectWatches();
+      Account.Id accountId = a.account().id();
+      ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches = a.projectWatches();
       Map<ProjectWatchKey, Set<NotifyType>> newProjectWatches = new HashMap<>();
       List<ProjectWatchKey> oldProjectWatches = new ArrayList<>();
-      for (ProjectWatchKey watchKey : a.getProjectWatches().keySet()) {
+      for (ProjectWatchKey watchKey : a.projectWatches().keySet()) {
         if (oldProjectKey.equals(watchKey.project())) {
           newProjectWatches.put(
               ProjectWatchKey.create(newProjectKey, watchKey.filter()),
@@ -151,14 +150,14 @@
           } catch (ConfigInvalidException e) {
             log.error(
                 "Updating watch entry for user {} in project {} failed. Watch config found invalid.",
-                a.getUserName(),
+                a.userName(),
                 newProjectKey.get(),
                 e);
             throw e;
           } catch (IOException e) {
             log.error(
                 "Updating watch entry for user {} in project {} failed.",
-                a.getUserName(),
+                a.userName(),
                 newProjectKey.get(),
                 e);
             throw e;
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 f75b784..81fa156 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
@@ -15,8 +15,8 @@
 package com.googlesource.gerrit.plugins.renameproject.database;
 
 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.entities.Change;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.index.change.ChangeIndexer;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/fs/FilesystemRenameHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/fs/FilesystemRenameHandler.java
index 1572d53..a1ea2b1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/fs/FilesystemRenameHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/fs/FilesystemRenameHandler.java
@@ -14,7 +14,7 @@
 
 package com.googlesource.gerrit.plugins.renameproject.fs;
 
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 6386725..f0d9cf1 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,56 +1,7 @@
 Build
 =====
 
-This plugin is built with Bazel and two build modes are supported:
-
-* Standalone
-* In Gerrit tree.
-
-Standalone build mode is recommended, as this mode doesn't require local Gerrit
-tree to exist.
-
-## Build standalone
-
-To build the plugin, issue the following command:
-
-```
-  bazel build @PLUGIN@
-```
-
-The output is created in
-
-```
-  bazel-bin/@PLUGIN@.jar
-```
-
-To package the plugin sources run:
-
-```
-  bazel build lib@PLUGIN@__plugin-src.jar
-```
-
-The output is created in:
-
-```
-  bazel-bin/lib@PLUGIN@__plugin-src.jar
-```
-
-To execute the tests run:
-
-```
-  bazel test //...
-```
-
-This project can be imported into the Eclipse IDE. Execute:
-
-```
-  ./tools/eclipse/project.sh
-```
-
-to generate the required files and then import the project.
-
-
-## Build in Gerrit tree
+This plugin can be built with Bazel in the Gerrit tree.
 
 Clone or link this plugin to the plugins directory of Gerrit's source
 tree, and issue the command:
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 7a5faeb..80872a1 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -43,3 +43,14 @@
 the client waits indefinitely. By default, 0.
 * `sshConnectionTimeout` : Timeout for SSH connections in minutes. If 0, there is no timeout, and
 the client waits indefinitely. By default, 2 minutes.
+
+Also, this plugin offers a way to restrict the new names of the projects to match an optionally
+configured regex. For example:
+
+```
+  [plugin "@PLUGIN@"]
+    renameRegex = [a-z0-9]+
+```
+
+In this example the new names for projects will be restricted to only non-capital letters and
+numbers.
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProjectTest.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProjectTest.java
index aa3776f..02c47c5 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProjectTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProjectTest.java
@@ -34,10 +34,13 @@
 
   @Test
   public void testLockUnlockSucceeds() throws IOException, ConfigInvalidException {
-    assertThat(projectCache.get(project).getProject().getState()).isEqualTo(ProjectState.ACTIVE);
+    assertThat(projectCache.get(project).get().getProject().getState())
+        .isEqualTo(ProjectState.ACTIVE);
     lockUnlockInstance.lock(project);
-    assertThat(projectCache.get(project).getProject().getState()).isEqualTo(ProjectState.READ_ONLY);
+    assertThat(projectCache.get(project).get().getProject().getState())
+        .isEqualTo(ProjectState.READ_ONLY);
     lockUnlockInstance.unlock(project);
-    assertThat(projectCache.get(project).getProject().getState()).isEqualTo(ProjectState.ACTIVE);
+    assertThat(projectCache.get(project).get().getProject().getState())
+        .isEqualTo(ProjectState.ACTIVE);
   }
 }
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 41c36d3..c436745 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java
@@ -22,23 +22,24 @@
 import static org.mockito.Mockito.when;
 
 import com.google.common.cache.Cache;
-import com.google.gerrit.acceptance.GerritConfig;
 import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
 import com.google.gerrit.acceptance.PushOneCommit.Result;
 import com.google.gerrit.acceptance.RestResponse;
 import com.google.gerrit.acceptance.TestPlugin;
 import com.google.gerrit.acceptance.UseLocalDisk;
 import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.acceptance.config.GerritConfig;
 import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations;
+import com.google.gerrit.entities.Change.Id;
+import com.google.gerrit.entities.Project;
+import com.google.gerrit.entities.Project.NameKey;
 import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.reviewdb.client.Change.Id;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.renameproject.RenameProject.Input;
 import java.io.OutputStream;
 import java.util.List;
+import java.util.Optional;
 import javax.inject.Named;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.transport.URIish;
@@ -57,6 +58,7 @@
   private static final String CACHE_NAME = "changeid_project";
   private static final String REPLICATION_OPTION = "--replication";
   private static final String URL = "ssh://localhost:29418";
+  private static final String RENAME_REGEX = "[a-zA-Z]+";
 
   @Inject private RequestScopeOperations requestScopeOperations;
 
@@ -71,10 +73,10 @@
     adminSshSession.exec(PLUGIN_NAME + " " + project.get() + " " + NEW_PROJECT_NAME);
 
     adminSshSession.assertSuccess();
-    ProjectState projectState = projectCache.get(new Project.NameKey(NEW_PROJECT_NAME));
-    assertThat(projectState).isNotNull();
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
+    assertThat(projectState.isPresent()).isTrue();
     assertThat(queryProvider.get().byProject(project)).isEmpty();
-    assertThat(queryProvider.get().byProject(new Project.NameKey(NEW_PROJECT_NAME))).isNotEmpty();
+    assertThat(queryProvider.get().byProject(Project.nameKey(NEW_PROJECT_NAME))).isNotEmpty();
   }
 
   @Test
@@ -96,8 +98,8 @@
         PLUGIN_NAME + " " + project.get() + " " + NEW_PROJECT_NAME + " " + REPLICATION_OPTION);
 
     adminSshSession.assertSuccess();
-    ProjectState projectState = projectCache.get(new Project.NameKey(NEW_PROJECT_NAME));
-    assertThat(projectState).isNotNull();
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
+    assertThat(projectState.isPresent()).isTrue();
   }
 
   @Test
@@ -108,8 +110,8 @@
     adminSshSession.exec(PLUGIN_NAME + " " + project.get() + " " + newProjectName);
 
     adminSshSession.assertFailure();
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    assertThat(projectState).isNull();
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(newProjectName));
+    assertThat(projectState.isPresent()).isFalse();
   }
 
   @Test
@@ -119,8 +121,8 @@
     adminSshSession.exec(PLUGIN_NAME + " " + allProjects.get() + " " + NEW_PROJECT_NAME);
 
     adminSshSession.assertFailure();
-    ProjectState projectState = projectCache.get(new Project.NameKey(NEW_PROJECT_NAME));
-    assertThat(projectState).isNull();
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
+    assertThat(projectState.isPresent()).isFalse();
   }
 
   @Test
@@ -235,8 +237,8 @@
     RestResponse r = renameProjectTo(NEW_PROJECT_NAME);
     r.assertOK();
 
-    ProjectState projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
-    assertThat(projectState).isNotNull();
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
+    assertThat(projectState.isPresent()).isTrue();
     assertThat(queryProvider.get().byProject(project)).isEmpty();
     assertThat(queryProvider.get().byProject(Project.nameKey(NEW_PROJECT_NAME))).isNotEmpty();
   }
@@ -249,8 +251,34 @@
     RestResponse r = renameProjectTo(newProjectName);
     r.assertBadRequest();
 
-    ProjectState projectState = projectCache.get(Project.nameKey(newProjectName));
-    assertThat(projectState).isNull();
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(newProjectName));
+    assertThat(projectState.isPresent()).isFalse();
+  }
+
+  @Test
+  @UseLocalDisk
+  @GerritConfig(name = "plugin.rename-project.renameRegex", value = RENAME_REGEX)
+  public void testRenameViaHttpWithNonMatchingNameFail() throws Exception {
+    createChange();
+    RestResponse r = renameProjectTo(NEW_PROJECT_NAME + "1");
+    r.assertBadRequest();
+
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
+    assertThat(projectState.isPresent()).isFalse();
+  }
+
+  @Test
+  @UseLocalDisk
+  @GerritConfig(name = "plugin.rename-project.renameRegex", value = RENAME_REGEX)
+  public void testRenameViaHttpWithMatchingNameSuccess() throws Exception {
+    createChange();
+    RestResponse r = renameProjectTo(NEW_PROJECT_NAME);
+    r.assertOK();
+
+    Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME));
+    assertThat(projectState.isPresent()).isTrue();
+    assertThat(queryProvider.get().byProject(project)).isEmpty();
+    assertThat(queryProvider.get().byProject(Project.nameKey(NEW_PROJECT_NAME))).isNotEmpty();
   }
 
   private RestResponse renameProjectTo(String newName) throws Exception {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProjectTest.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProjectTest.java
index f77d80e..8330748 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProjectTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RevertRenameProjectTest.java
@@ -21,10 +21,10 @@
 import com.google.gerrit.acceptance.PushOneCommit.Result;
 import com.google.gerrit.acceptance.TestPlugin;
 import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.api.changes.ChangeApi;
 import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.project.ProjectState;
 import com.googlesource.gerrit.plugins.renameproject.RenameProject.Step;
@@ -55,7 +55,7 @@
     revertRenameProject = plugin.getSysInjector().getInstance(RevertRenameProject.class);
 
     oldProjectKey = project;
-    newProjectKey = new Project.NameKey(NEW_PROJECT_NAME);
+    newProjectKey = Project.nameKey(NEW_PROJECT_NAME);
 
     pm = Optional.of(Mockito.mock(ProgressMonitor.class));
 
@@ -126,22 +126,26 @@
   }
 
   private void assertReverted() throws Exception {
-    ProjectState oldProjectState = projectCache.get(oldProjectKey);
-    assertThat(oldProjectState).isNotNull();
+    evictCaches();
 
-    ProjectState newProjectState = projectCache.get(newProjectKey);
-    assertThat(newProjectState).isNull();
+    Optional<ProjectState> oldProjectState = projectCache.get(oldProjectKey);
+    assertThat(oldProjectState.isPresent()).isTrue();
+
+    Optional<ProjectState> newProjectState = projectCache.get(newProjectKey);
+    assertThat(newProjectState.isPresent()).isFalse();
 
     assertThat(queryProvider.get().byProject(oldProjectKey)).isNotEmpty();
     assertThat(queryProvider.get().byProject(newProjectKey)).isEmpty();
   }
 
   private void assertRenamed(Result result) throws Exception {
-    ProjectState oldProjectState = projectCache.get(oldProjectKey);
-    assertThat(oldProjectState).isNull();
+    evictCaches();
 
-    ProjectState newProjectState = projectCache.get(newProjectKey);
-    assertThat(newProjectState).isNotNull();
+    Optional<ProjectState> oldProjectState = projectCache.get(oldProjectKey);
+    assertThat(oldProjectState.isPresent()).isFalse();
+
+    Optional<ProjectState> newProjectState = projectCache.get(newProjectKey);
+    assertThat(newProjectState.isPresent()).isTrue();
 
     if (renameProject.getStepsPerformed().contains(Step.DATABASE)) {
       ChangeApi changeApi = gApi.changes().id(NEW_PROJECT_NAME, result.getChange().getId().get());
@@ -153,4 +157,9 @@
       assertThat(queryProvider.get().byProject(oldProjectKey)).isEmpty();
     }
   }
+
+  private void evictCaches() {
+    projectCache.evict(oldProjectKey);
+    projectCache.evict(newProjectKey);
+  }
 }
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 68515c4..f6798b1 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
@@ -16,8 +16,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.gerrit.common.data.SubscribeSection;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
+import com.google.gerrit.entities.Project.NameKey;
+import com.google.gerrit.entities.SubscribeSection;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.git.meta.MetaDataUpdate.Server;
 import com.google.gerrit.server.project.ProjectCache;
@@ -54,12 +54,12 @@
       throws Exception {
     try (MetaDataUpdate md = metaDataUpdateFactory.create(sub)) {
       md.setMessage("Added superproject subscription");
-      SubscribeSection s;
+      SubscribeSection.Builder s;
       ProjectConfig pc = projectConfigFactory.read(md);
       if (pc.getSubscribeSections().containsKey(superName)) {
-        s = pc.getSubscribeSections().get(superName);
+        s = pc.getSubscribeSections().get(superName).toBuilder();
       } else {
-        s = new SubscribeSection(superName);
+        s = SubscribeSection.builder(superName);
       }
       String refspec;
       if (superBranch == null) {
@@ -72,11 +72,11 @@
       } else {
         s.addMultiMatchRefSpec(refspec);
       }
-      pc.addSubscribeSection(s);
+      pc.addSubscribeSection(s.build());
       ObjectId oldId = pc.getRevision();
       ObjectId newId = pc.commit(md);
       assertThat(newId).isNotEqualTo(oldId);
-      projectCache.evict(pc.getProject());
+      projectCache.evict(pc.getName());
     }
   }
 
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 e42e550..049db6d 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
@@ -17,17 +17,20 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
 import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
 import com.google.gerrit.server.git.GitRepositoryManager;
 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.gerrit.server.submit.SubscriptionGraph;
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.renameproject.CannotRenameProjectException;
 import java.util.ArrayList;
@@ -43,11 +46,8 @@
 @RunWith(MockitoJUnitRunner.class)
 public class RenamePreconditionsTest {
 
-  @Mock private AllProjectsName allProjects;
-  @Mock private AllUsersName allUsersName;
   @Mock private Provider<ListChildProjects> listChildProjectsProvider;
   @Mock private GitRepositoryManager repoManager;
-  @Mock private SubmoduleOp.Factory subOpFactory;
   @Mock private Provider<MergeOpRepoManager> ormProvider;
   @Mock private RenamePreconditions preconditions;
   @Mock private ObjectDatabase objDb;
@@ -55,13 +55,18 @@
   @Mock private CurrentUser user;
   @Mock private Repository repo;
   @Mock private ListChildProjects listChildProjects;
+  @Mock private SubscriptionGraph.Factory subscriptionGraphFactory;
 
+  private AllProjectsName allProjects;
+  private AllUsersName allUsersName;
   private ProjectResource oldRsrc;
-  private List<ProjectInfo> children = new ArrayList<>();
-  private Project.NameKey newProjectKey = new Project.NameKey("newProject");
+  private Response<List<ProjectInfo>> children = Response.ok(new ArrayList<>());
+  private Project.NameKey newProjectKey = Project.nameKey("newProject");
 
   @Before
   public void setUp() throws Exception {
+    allProjects = new AllProjectsName(AllProjectsNameProvider.DEFAULT);
+    allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
     oldRsrc = new ProjectResource(control, user);
     when(repoManager.openRepository(newProjectKey)).thenReturn(repo);
     when(repo.getObjectDatabase()).thenReturn(objDb);
@@ -71,7 +76,7 @@
             allUsersName,
             listChildProjectsProvider,
             repoManager,
-            subOpFactory,
+            subscriptionGraphFactory,
             ormProvider);
   }
 
@@ -84,7 +89,7 @@
 
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameAllProjects() throws Exception {
-    Project oldProject = new Project(allProjects);
+    Project oldProject = Project.builder(allProjects).build();
     when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
     when(objDb.exists()).thenReturn(false);
 
@@ -93,7 +98,7 @@
 
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameAllUsers() throws Exception {
-    Project oldProject = new Project(allUsersName);
+    Project oldProject = Project.builder(allUsersName).build();
     when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
     when(objDb.exists()).thenReturn(false);
 
@@ -102,13 +107,13 @@
 
   @Test(expected = CannotRenameProjectException.class)
   public void testAssertCannotRenameHasChildren() throws Exception {
-    Project oldProject = new Project(new Project.NameKey("oldProject"));
+    Project oldProject = Project.builder(Project.nameKey("oldProject")).build();
     when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
     when(objDb.exists()).thenReturn(false);
 
     when(listChildProjectsProvider.get()).thenReturn(listChildProjects);
     ProjectInfo projInfo = mock(ProjectInfo.class);
-    children.add(projInfo);
+    children.value().add(projInfo);
     when(listChildProjects.apply(oldRsrc)).thenReturn(children);
 
     preconditions.assertCanRename(oldRsrc, newProjectKey);
diff --git a/tools/BUILD b/tools/BUILD
deleted file mode 100644
index c5ed0b7..0000000
--- a/tools/BUILD
+++ /dev/null
@@ -1 +0,0 @@
-# Empty file required by Bazel
diff --git a/tools/bzl/BUILD b/tools/bzl/BUILD
deleted file mode 100644
index c5ed0b7..0000000
--- a/tools/bzl/BUILD
+++ /dev/null
@@ -1 +0,0 @@
-# Empty file required by Bazel
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
deleted file mode 100644
index c921d01..0000000
--- a/tools/bzl/classpath.bzl
+++ /dev/null
@@ -1,6 +0,0 @@
-load(
-    "@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
-    _classpath_collector = "classpath_collector",
-)
-
-classpath_collector = _classpath_collector
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl
deleted file mode 100644
index 97307bd..0000000
--- a/tools/bzl/junit.bzl
+++ /dev/null
@@ -1,6 +0,0 @@
-load(
-    "@com_googlesource_gerrit_bazlets//tools:junit.bzl",
-    _junit_tests = "junit_tests",
-)
-
-junit_tests = _junit_tests
diff --git a/tools/bzl/maven_jar.bzl b/tools/bzl/maven_jar.bzl
deleted file mode 100644
index 35ea8ce..0000000
--- a/tools/bzl/maven_jar.bzl
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index 4d2dbdd..0000000
--- a/tools/bzl/plugin.bzl
+++ /dev/null
@@ -1,10 +0,0 @@
-load(
-    "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
-    _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/BUILD b/tools/eclipse/BUILD
deleted file mode 100644
index 9d74cff..0000000
--- a/tools/eclipse/BUILD
+++ /dev/null
@@ -1,9 +0,0 @@
-load("//tools/bzl:classpath.bzl", "classpath_collector")
-
-classpath_collector(
-    name = "main_classpath_collect",
-    testonly = 1,
-    deps = [
-        "//:rename-project__plugin_test_deps",
-    ],
-)
diff --git a/tools/eclipse/project.sh b/tools/eclipse/project.sh
deleted file mode 100755
index 3003cc2..0000000
--- a/tools/eclipse/project.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-path=$(bazel query @com_googlesource_gerrit_bazlets//tools/eclipse:project \
-    --output location | sed s/BUILD:.*//)
-${path}project.py -n rename-project -r . "$@"
diff --git a/tools/sonar/sonar.sh b/tools/sonar/sonar.sh
deleted file mode 100755
index 8df06d3..0000000
--- a/tools/sonar/sonar.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-`bazel query @com_googlesource_gerrit_bazlets//tools/sonar:sonar --output location | sed s/BUILD:.*//`sonar.py
diff --git a/tools/workspace_status.py b/tools/workspace_status.py
deleted file mode 100644
index 5729ce1..0000000
--- a/tools/workspace_status.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env python
-
-# This script will be run by bazel when the build process starts to
-# generate key-value information that represents the status of the
-# workspace. The output should be like
-#
-# KEY1 VALUE1
-# KEY2 VALUE2
-#
-# If the script exits with non-zero code, it's considered as a failure
-# and the output will be discarded.
-
-from __future__ import print_function
-import subprocess
-import sys
-
-CMD = ['git', 'describe', '--always', '--match', 'v[0-9].*', '--dirty']
-
-
-def revision():
-    try:
-        return subprocess.check_output(CMD).strip().decode("utf-8")
-    except OSError as err:
-        print('could not invoke git: %s' % err, file=sys.stderr)
-        sys.exit(1)
-    except subprocess.CalledProcessError as err:
-        print('error using git: %s' % err, file=sys.stderr)
-        sys.exit(1)
-
-
-print("STABLE_BUILD_RENAME-PROJECT_LABEL %s" % revision())