diff --git a/.bazelversion b/.bazelversion
index fd2a018..7c69a55 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-3.1.0
+3.7.0
diff --git a/BUILD b/BUILD
index 0d3e09b..32b4c8d 100644
--- a/BUILD
+++ b/BUILD
@@ -9,37 +9,14 @@
 load("//tools/bzl:genrule2.bzl", "genrule2")
 load("//tools/bzl:js.bzl", "polygerrit_plugin")
 
-SRC = "src/main/java/com/googlesource/gerrit/plugins/reviewers/"
-
-BACKEND_SRCS = glob([
-    SRC + "common/*.java",
-    SRC + "server/*.java",
-])
-
-gerrit_plugin(
-    name = "reviewers-backend",
-    srcs = BACKEND_SRCS,
-    dir_name = "reviewers",
-    manifest_entries = [
-        # Different jar name, but use same plugin name in manifest so REST API is compatible.
-        "Gerrit-PluginName: reviewers",
-        "Gerrit-Module: com.googlesource.gerrit.plugins.reviewers.server.BackendModule",
-    ],
-    resources = glob(["src/main/resources/**/*"]),
-)
-
 gerrit_plugin(
     name = "reviewers",
-    srcs = BACKEND_SRCS + glob([
-        SRC + "*.java",
-        SRC + "client/*.java",
-    ]),
-    gwt_module = "com.googlesource.gerrit.plugins.reviewers.ReviewersForm",
+    srcs = glob(["src/main/java/**/*.java"]),
     manifest_entries = [
         "Gerrit-PluginName: reviewers",
         "Gerrit-Module: com.googlesource.gerrit.plugins.reviewers.Module",
     ],
-    resources = glob(["src/main/**/*"]),
+    resources = glob(["src/main/resources/**/*"]),
     resource_jars = [":rv-reviewers-static"],
 )
 
diff --git a/WORKSPACE b/WORKSPACE
index 31267e2..c774c5a 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "6c39deb06f58bb62162ccb6865964f531739f512",
+    commit = "a010a539824bd467059f414412a47b80101352d7",
     #local_path = "/home/<user>/projects/bazlets",
 )
 
@@ -35,26 +35,7 @@
     repository = GERRIT,
 )
 
-# Release Plugin API
-load(
-    "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
-    "gerrit_api",
-)
+# Load plugin API
+load("@com_googlesource_gerrit_bazlets//:gerrit_api.bzl", "gerrit_api")
 
-# Snapshot Plugin API
-#load(
-#    "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
-#    "gerrit_api_maven_local",
-#)
-load(
-    "@com_googlesource_gerrit_bazlets//:gerrit_gwt.bzl",
-    "gerrit_gwt",
-)
-
-# Load release Plugin API
 gerrit_api()
-
-# Load snapshot Plugin API
-#gerrit_api_maven_local()
-
-gerrit_gwt()
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/common/Action.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Action.java
similarity index 91%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/common/Action.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/Action.java
index ebda5e1..04a15fc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/common/Action.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Action.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.common;
+package com.googlesource.gerrit.plugins.reviewers;
 
 public enum Action {
   ADD,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/AddReviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/AddReviewers.java
similarity index 71%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/AddReviewers.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/AddReviewers.java
index 54d1552..c82fa7c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/AddReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/AddReviewers.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.api.GerritApi;
@@ -21,15 +21,10 @@
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.util.RequestContext;
 import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
 import java.util.ArrayList;
 import java.util.Set;
 
@@ -39,21 +34,16 @@
   private final ThreadLocalRequestContext tl;
   protected final GerritApi gApi;
   protected final IdentifiedUser.GenericFactory identifiedUserFactory;
-  protected final SchemaFactory<ReviewDb> schemaFactory;
   protected final ChangeInfo changeInfo;
 
-  private ReviewDb db = null;
-
   AddReviewers(
       ThreadLocalRequestContext tl,
       GerritApi gApi,
       IdentifiedUser.GenericFactory identifiedUserFactory,
-      SchemaFactory<ReviewDb> schemaFactory,
       ChangeInfo changeInfo) {
     this.tl = tl;
     this.gApi = gApi;
     this.identifiedUserFactory = identifiedUserFactory;
-    this.schemaFactory = schemaFactory;
     this.changeInfo = changeInfo;
   }
 
@@ -67,34 +57,13 @@
 
               @Override
               public CurrentUser getUser() {
-                return identifiedUserFactory.create(new Account.Id(changeInfo.owner._accountId));
-              }
-
-              @Override
-              public Provider<ReviewDb> getReviewDbProvider() {
-                return new Provider<ReviewDb>() {
-                  @Override
-                  public ReviewDb get() {
-                    if (db == null) {
-                      try {
-                        db = schemaFactory.open();
-                      } catch (OrmException e) {
-                        throw new ProvisionException("Cannot open ReviewDb", e);
-                      }
-                    }
-                    return db;
-                  }
-                };
+                return identifiedUserFactory.create(Account.id(changeInfo.owner._accountId));
               }
             });
     try {
       addReviewers(getReviewers(), changeInfo);
     } finally {
       tl.setContext(old);
-      if (db != null) {
-        db.close();
-        db = null;
-      }
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/AddReviewersByConfiguration.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/AddReviewersByConfiguration.java
similarity index 84%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/AddReviewersByConfiguration.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/AddReviewersByConfiguration.java
index 1ef93f2..6d291a4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/AddReviewersByConfiguration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/AddReviewersByConfiguration.java
@@ -12,15 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import com.google.gerrit.extensions.api.GerritApi;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.SchemaFactory;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.util.Set;
@@ -37,10 +35,9 @@
       ThreadLocalRequestContext tl,
       GerritApi gApi,
       IdentifiedUser.GenericFactory identifiedUserFactory,
-      SchemaFactory<ReviewDb> schemaFactory,
       @Assisted ChangeInfo changeInfo,
       @Assisted Set<Account.Id> reviewers) {
-    super(tl, gApi, identifiedUserFactory, schemaFactory, changeInfo);
+    super(tl, gApi, identifiedUserFactory, changeInfo);
     this.reviewers = reviewers;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ClientModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ClientModule.java
deleted file mode 100644
index bf6acbb..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ClientModule.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2013 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.
-
-package com.googlesource.gerrit.plugins.reviewers;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.webui.GwtPlugin;
-import com.google.gerrit.extensions.webui.JavaScriptPlugin;
-import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.inject.AbstractModule;
-
-public class ClientModule extends AbstractModule {
-  @Override
-  protected void configure() {
-    DynamicSet.bind(binder(), TopMenu.class).to(ReviewersTopMenu.class);
-    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new GwtPlugin("reviewers"));
-    DynamicSet.bind(binder(), WebUiPlugin.class)
-        .toInstance(new JavaScriptPlugin("rv-reviewers.html"));
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/GetReviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/GetReviewers.java
similarity index 95%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/GetReviewers.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/GetReviewers.java
index d8ce0ca..7ee4c83 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/GetReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/GetReviewers.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestReadView;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ModifyReviewersConfigCapability.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ModifyReviewersConfigCapability.java
similarity index 93%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ModifyReviewersConfigCapability.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/ModifyReviewersConfigCapability.java
index b97e422..4c6cb9a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ModifyReviewersConfigCapability.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ModifyReviewersConfigCapability.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import com.google.gerrit.extensions.config.CapabilityDefinition;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java
index 55b663c..efc3614 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java
@@ -14,22 +14,79 @@
 
 package com.googlesource.gerrit.plugins.reviewers;
 
+import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;
+import static com.googlesource.gerrit.plugins.reviewers.ModifyReviewersConfigCapability.MODIFY_REVIEWERS_CONFIG;
+
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.events.PrivateStateChangedListener;
+import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.extensions.webui.JavaScriptPlugin;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.server.change.ReviewerSuggestion;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
-import com.googlesource.gerrit.plugins.reviewers.server.BackendModule;
-import com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig;
 
-public class Module extends AbstractModule {
-  private final ReviewersConfig cfg;
+public class Module extends FactoryModule {
+  private final boolean enableREST;
+  private final boolean suggestOnly;
 
   @Inject
   public Module(ReviewersConfig cfg) {
-    this.cfg = cfg;
+    this(cfg.enableREST(), cfg.suggestOnly());
+  }
+
+  public Module(boolean enableREST, boolean suggestOnly) {
+    this.enableREST = enableREST;
+    this.suggestOnly = suggestOnly;
   }
 
   @Override
   protected void configure() {
-    install(new BackendModule(cfg.enableREST(), cfg.suggestOnly()));
-    install(new ClientModule());
+    bind(CapabilityDefinition.class)
+        .annotatedWith(Exports.named(MODIFY_REVIEWERS_CONFIG))
+        .to(ModifyReviewersConfigCapability.class);
+
+    if (suggestOnly) {
+      install(
+          new AbstractModule() {
+            @Override
+            protected void configure() {
+              bind(ReviewerSuggestion.class)
+                  .annotatedWith(Exports.named("reviewer-suggest"))
+                  .to(Reviewers.class);
+            }
+          });
+    } else {
+      DynamicSet.bind(binder(), RevisionCreatedListener.class).to(Reviewers.class);
+      DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class).to(Reviewers.class);
+      DynamicSet.bind(binder(), PrivateStateChangedListener.class).to(Reviewers.class);
+    }
+
+    factory(AddReviewersByConfiguration.Factory.class);
+
+    if (enableREST) {
+      install(
+          new RestApiModule() {
+            @Override
+            protected void configure() {
+              get(PROJECT_KIND, "reviewers").to(GetReviewers.class);
+              put(PROJECT_KIND, "reviewers").to(PutReviewers.class);
+              get(PROJECT_KIND, "suggest_reviewers").to(SuggestProjectReviewers.class);
+            }
+          });
+    }
+    install(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            DynamicSet.bind(binder(), WebUiPlugin.class)
+                .toInstance(new JavaScriptPlugin("rv-reviewers.html"));
+          }
+        });
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/PutReviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
similarity index 86%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/PutReviewers.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
index cc985df..5240bc8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/PutReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
-import static com.googlesource.gerrit.plugins.reviewers.server.ModifyReviewersConfigCapability.MODIFY_REVIEWERS_CONFIG;
+import static com.googlesource.gerrit.plugins.reviewers.ModifyReviewersConfigCapability.MODIFY_REVIEWERS_CONFIG;
 
 import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.api.access.PluginPermission;
 import com.google.gerrit.extensions.restapi.AuthException;
@@ -25,9 +26,9 @@
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestModifyView;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountResolver.UnresolvableAccountException;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.group.GroupResolver;
 import com.google.gerrit.server.permissions.PermissionBackend;
@@ -35,12 +36,10 @@
 import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gerrit.server.project.ProjectCache;
 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;
-import com.googlesource.gerrit.plugins.reviewers.common.Action;
-import com.googlesource.gerrit.plugins.reviewers.server.PutReviewers.Input;
+import com.googlesource.gerrit.plugins.reviewers.PutReviewers.Input;
 import java.io.IOException;
 import java.util.List;
 import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -148,15 +147,20 @@
 
   private void validateReviewer(String reviewer) throws RestApiException {
     try {
-      Account account = accountResolver.find(reviewer);
-      if (account == null) {
-        try {
-          groupResolver.get().parse(reviewer);
-        } catch (UnprocessableEntityException e) {
-          throw new ResourceNotFoundException("Account or group " + reviewer + " not found");
-        }
+      UnresolvableAccountException accountException;
+      try {
+        accountResolver.resolve(reviewer).asUnique();
+        return;
+      } catch (UnresolvableAccountException e) {
+        accountException = e;
       }
-    } catch (OrmException | IOException | ConfigInvalidException e) {
+      try {
+        groupResolver.get().parse(reviewer);
+      } catch (UnprocessableEntityException e) {
+        throw new ResourceNotFoundException(
+            "Account or group '" + reviewer + "' not found\n" + accountException.getMessage());
+      }
+    } catch (StorageException | IOException | ConfigInvalidException e) {
       logger.atSevere().log("Failed to resolve account %s", reviewer);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewerFilterSection.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewerFilterSection.java
similarity index 95%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewerFilterSection.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewerFilterSection.java
index 7f0000a..06e7387 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewerFilterSection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewerFilterSection.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import java.util.Objects;
 import java.util.Set;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
similarity index 92%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
index 07a7d18..c2eae68 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import static java.util.stream.Collectors.toSet;
 
@@ -22,6 +22,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.Nullable;
+import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.events.ChangeEvent;
@@ -38,7 +39,6 @@
 import com.google.gerrit.server.git.WorkQueue;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
 import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -113,7 +113,7 @@
             .map(a -> suggestedReviewer(a))
             .collect(toSet());
       }
-    } catch (OrmException | QueryParseException x) {
+    } catch (StorageException | QueryParseException x) {
       logger.atSevere().withCause(x).log(x.getMessage());
     }
     return ImmutableSet.of();
@@ -139,7 +139,7 @@
     if (config.ignorePrivate() && (c.isPrivate != null && c.isPrivate)) {
       return;
     }
-    Project.NameKey projectName = new Project.NameKey(c.project);
+    Project.NameKey projectName = Project.nameKey(c.project);
 
     List<ReviewerFilterSection> sections = getSections(projectName);
 
@@ -163,13 +163,13 @@
       logger.atWarning().log(
           "Could not add default reviewers for change %d of project %s, filter is invalid: %s",
           changeNumber, projectName.get(), e.getMessage());
-    } catch (OrmException x) {
+    } catch (StorageException x) {
       logger.atSevere().withCause(x).log(x.getMessage());
     }
   }
 
   private Set<String> findReviewers(int change, List<ReviewerFilterSection> sections)
-      throws OrmException, QueryParseException {
+      throws StorageException, QueryParseException {
     ImmutableSet.Builder<String> reviewers = ImmutableSet.builder();
     List<ReviewerFilterSection> found = findReviewerSections(change, sections);
     for (ReviewerFilterSection s : found) {
@@ -179,7 +179,8 @@
   }
 
   private List<ReviewerFilterSection> findReviewerSections(
-      int change, List<ReviewerFilterSection> sections) throws OrmException, QueryParseException {
+      int change, List<ReviewerFilterSection> sections)
+      throws StorageException, QueryParseException {
     ImmutableList.Builder<ReviewerFilterSection> found = ImmutableList.builder();
     for (ReviewerFilterSection s : sections) {
       if (Strings.isNullOrEmpty(s.getFilter()) || s.getFilter().equals("*")) {
@@ -191,7 +192,7 @@
     return found.build();
   }
 
-  boolean filterMatch(int change, String filter) throws OrmException, QueryParseException {
+  boolean filterMatch(int change, String filter) throws StorageException, QueryParseException {
     Preconditions.checkNotNull(filter);
     ChangeQueryBuilder qb = queryBuilder.asUser(user.get());
     return !queryProvider
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersConfig.java
similarity index 98%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersConfig.java
index fe06aa3..b277d62 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersForm.gwt.xml b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersForm.gwt.xml
deleted file mode 100644
index 1ea6083..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersForm.gwt.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2014 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.
--->
-<module rename-to="reviewers">
-  <!-- Inherit the core Web Toolkit stuff.                        -->
-  <inherits name="com.google.gwt.user.User"/>
-  <!-- Other module inherits                                      -->
-  <inherits name="com.google.gerrit.Plugin"/>
-  <inherits name="com.google.gwt.http.HTTP"/>
-  <inherits name="com.google.gwt.json.JSON"/>
-  <inherits name="com.google.gwtexpui.globalkey.GlobalKey"/>
-  <!-- Using GWT built-in themes adds a number of static          -->
-  <!-- resources to the plugin. No theme inherits lines were      -->
-  <!-- added in order to make this plugin as simple as possible   -->
-  <!-- Specify the app entry point class.                         -->
-  <entry-point class="com.googlesource.gerrit.plugins.reviewers.client.ReviewersPlugin"/>
-  <stylesheet src="reviewers.css"/>
-</module>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersResolver.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersResolver.java
similarity index 84%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersResolver.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersResolver.java
index 10785f2..7556553 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersResolver.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersResolver.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import static java.util.stream.Collectors.toSet;
 
@@ -20,6 +20,7 @@
 import com.google.common.collect.Sets;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.Nullable;
+import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
@@ -28,7 +29,6 @@
 import com.google.gerrit.server.account.GroupMembers;
 import com.google.gerrit.server.group.GroupResolver;
 import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -85,31 +85,25 @@
   private boolean resolveAccount(
       Project.NameKey project,
       int changeNumber,
-      AccountInfo uploader,
+      @Nullable AccountInfo uploader,
       Set<Account.Id> reviewers,
       String accountName) {
     try {
-      Account account = accountResolver.find(accountName);
-      if (account != null) {
-        if (account.isActive()) {
-          if (uploader == null || uploader._accountId != account.getId().get()) {
-            reviewers.add(account.getId());
-          }
+      AccountResolver.Result result = accountResolver.resolve(accountName);
+      if (result.asList().size() == 1) {
+        Account.Id id = result.asList().get(0).getAccount().getId();
+        if (uploader == null || id.get() != uploader._accountId) {
+          reviewers.add(id);
           return true;
         }
-        logger.atWarning().log(
-            "For the change %d of project %s: account %s is inactive.",
-            changeNumber, project, accountName);
       }
-    } catch (OrmException | IOException | ConfigInvalidException e) {
-      // If the account doesn't exist, find() will return null.  We only
-      // get here if something went wrong accessing the database
+      return false;
+    } catch (StorageException | IOException | ConfigInvalidException e) {
       logger.atSevere().withCause(e).log(
           "For the change %d of project %s: failed to resolve account %s.",
           changeNumber, project, accountName);
       return true;
     }
-    return false;
   }
 
   private void resolveGroup(
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersTopMenu.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersTopMenu.java
deleted file mode 100644
index 2c839a0..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersTopMenu.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.extensions.client.MenuItem;
-import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.inject.Inject;
-import java.util.Collections;
-import java.util.List;
-
-public class ReviewersTopMenu implements TopMenu {
-  private final List<MenuEntry> menuEntries;
-
-  @Inject
-  ReviewersTopMenu(@PluginName String pluginName) {
-    menuEntries = Lists.newArrayList();
-    menuEntries.add(
-        new MenuEntry(
-            "Projects",
-            Collections.singletonList(
-                new MenuItem("Reviewers", "#/x/" + pluginName + "/p/${projectName}", "_self"))));
-  }
-
-  @Override
-  public List<MenuEntry> getEntries() {
-    return this.menuEntries;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/SuggestProjectReviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java
similarity index 87%
rename from src/main/java/com/googlesource/gerrit/plugins/reviewers/server/SuggestProjectReviewers.java
rename to src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java
index 35619c1..5329f7c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/SuggestProjectReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
+import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.extensions.common.AccountVisibility;
 import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.RestReadView;
 import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
@@ -28,9 +28,7 @@
 import com.google.gerrit.server.restapi.change.ReviewersUtil;
 import com.google.gerrit.server.restapi.change.ReviewersUtil.VisibilityControl;
 import com.google.gerrit.server.restapi.change.SuggestReviewers;
-import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import java.io.IOException;
 import java.util.List;
 import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -43,17 +41,16 @@
   @Inject
   SuggestProjectReviewers(
       AccountVisibility av,
-      Provider<ReviewDb> dbProvider,
       @GerritServerConfig Config cfg,
       ReviewersUtil reviewersUtil,
       PermissionBackend permissionBackend) {
-    super(av, dbProvider, cfg, reviewersUtil);
+    super(av, cfg, reviewersUtil);
     this.permissionBackend = permissionBackend;
   }
 
   @Override
   public List<SuggestedReviewerInfo> apply(ProjectResource rsrc)
-      throws BadRequestException, OrmException, IOException, ConfigInvalidException,
+      throws BadRequestException, StorageException, IOException, ConfigInvalidException,
           PermissionBackendException {
     return reviewersUtil.suggestReviewers(
         null, this, rsrc.getProjectState(), getVisibility(rsrc), true);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/AccountCapabilities.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/AccountCapabilities.java
deleted file mode 100644
index 397ffcb..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/AccountCapabilities.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import com.google.gerrit.plugin.client.rpc.RestApi;
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
-public class AccountCapabilities extends JavaScriptObject {
-  static String MODIFY_REVIEWERS_CONFIG = "reviewers-modifyReviewersConfig";
-
-  public static void queryPluginCapability(AsyncCallback<AccountCapabilities> cb) {
-    new RestApi("/accounts/self/capabilities").addParameter("q", MODIFY_REVIEWERS_CONFIG).get(cb);
-  }
-
-  protected AccountCapabilities() {}
-
-  public final native boolean canPerform(String name) /*-{ return this[name] ? true : false; }-*/;
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/Action.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/Action.java
deleted file mode 100644
index 96ebd14..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/Action.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-public enum Action {
-  ADD,
-  REMOVE
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ChangeReviewersInput.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ChangeReviewersInput.java
deleted file mode 100644
index 9560feb..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ChangeReviewersInput.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class ChangeReviewersInput extends JavaScriptObject {
-  public static ChangeReviewersInput create() {
-    return (ChangeReviewersInput) createObject();
-  }
-
-  protected ChangeReviewersInput() {}
-
-  final void setAction(Action a) {
-    setActionRaw(a.name());
-  }
-
-  final native void setActionRaw(String a) /*-{ if(a)this.action=a; }-*/;
-
-  final native void setFilter(String f) /*-{ if(f)this.filter=f; }-*/;
-
-  final native void setReviewer(String r) /*-{ if(r)this.reviewer=r; }-*/;
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ProjectAccessInfo.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ProjectAccessInfo.java
deleted file mode 100644
index 48010ed..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ProjectAccessInfo.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class ProjectAccessInfo extends JavaScriptObject {
-  public final native boolean isOwner() /*-{ return this.is_owner ? true : false; }-*/;
-
-  protected ProjectAccessInfo() {}
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewerFilterSection.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewerFilterSection.java
deleted file mode 100644
index eed5448..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewerFilterSection.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.client.JsArrayString;
-
-public class ReviewerFilterSection extends JavaScriptObject {
-  public final native String filter() /*-{ return this.filter; }-*/;
-
-  public final native JsArrayString reviewers() /*-{ return this.reviewers; }-*/;
-
-  protected ReviewerFilterSection() {}
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewerSuggestOracle.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewerSuggestOracle.java
deleted file mode 100644
index 8bb7556..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewerSuggestOracle.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (C) 2016 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import com.google.gerrit.client.rpc.NativeMap;
-import com.google.gerrit.client.rpc.Natives;
-import com.google.gerrit.client.ui.HighlightSuggestion;
-import com.google.gerrit.plugin.client.rpc.RestApi;
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.SuggestOracle;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/** A {@code SuggestOracle} for reviewers. */
-public class ReviewerSuggestOracle extends SuggestOracle {
-  private static final String ACCOUNT_KEY = "account";
-  private static final String GROUP_KEY = "group";
-  private static final String NAME_KEY = "name";
-  private static final String EMAIL_KEY = "email";
-  private static final String ACCOUNT_ID_KEY = "_account_id";
-
-  private final int chars;
-  private final String projectName;
-
-  /**
-   * @param chars minimum chars to start suggesting.
-   * @param projectName the name of the project to check visibility
-   */
-  public ReviewerSuggestOracle(int chars, String projectName) {
-    this.chars = chars;
-    this.projectName = projectName;
-  }
-
-  @Override
-  public boolean isDisplayStringHTML() {
-    return true;
-  }
-
-  private class ReviewerSuggestion extends HighlightSuggestion {
-    private final String name;
-
-    ReviewerSuggestion(String query, String groupName) {
-      super(query, groupName + " (group)");
-      this.name = groupName;
-    }
-
-    ReviewerSuggestion(String query, String fullname, String email, String accountId) {
-      super(query, fullname + ((!email.isEmpty()) ? " <" + email + ">" : " (" + accountId + ")"));
-      this.name = fullname;
-    }
-
-    @Override
-    public String getReplacementString() {
-      return name;
-    }
-  }
-
-  @Override
-  public void requestSuggestions(final Request req, final Callback done) {
-    if (req.getQuery().length() < chars) {
-      responseEmptySuggestion(req, done);
-      return;
-    }
-    RestApi rest = new RestApi("/projects/").id(projectName).view("suggest_reviewers");
-    rest.addParameter("q", req.getQuery());
-    if (req.getLimit() > 0) {
-      rest.addParameter("n", req.getLimit());
-    }
-    rest.get(
-        new AsyncCallback<NativeMap<JavaScriptObject>>() {
-          @Override
-          public void onSuccess(NativeMap<JavaScriptObject> result) {
-            List<String> keys0 = result.sortedKeys();
-            List<Suggestion> suggestions = new ArrayList<>(keys0.size());
-            for (String key0 : keys0) {
-              Set<String> keys1 = Natives.keys(result.get(key0));
-              NativeMap<JavaScriptObject> map1 = result.get(key0).cast();
-              for (String key1 : keys1) {
-                NativeMap<JavaScriptObject> map2 = map1.get(key1).cast();
-                if (ACCOUNT_KEY.equals(key1)) {
-                  String name = map2.get(NAME_KEY).toString();
-                  String email =
-                      (map2.containsKey(EMAIL_KEY)) ? map2.get(EMAIL_KEY).toString() : "";
-                  String accountId = map2.get(ACCOUNT_ID_KEY).toString();
-                  suggestions.add(new ReviewerSuggestion(req.getQuery(), name, email, accountId));
-                } else if (GROUP_KEY.equals(key1)) {
-                  String name = map2.get(NAME_KEY).toString();
-                  suggestions.add(new ReviewerSuggestion(req.getQuery(), name));
-                }
-              }
-            }
-            done.onSuggestionsReady(req, new Response(suggestions));
-          }
-
-          @Override
-          public void onFailure(Throwable caught) {
-            responseEmptySuggestion(req, done);
-          }
-        });
-  }
-
-  private static void responseEmptySuggestion(Request req, Callback done) {
-    List<Suggestion> empty = Collections.emptyList();
-    done.onSuggestionsReady(req, new Response(empty));
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewersPlugin.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewersPlugin.java
deleted file mode 100644
index 29aecf5..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewersPlugin.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import com.google.gerrit.plugin.client.Plugin;
-import com.google.gerrit.plugin.client.PluginEntryPoint;
-
-public class ReviewersPlugin extends PluginEntryPoint {
-  @Override
-  public void onPluginLoad() {
-    Plugin.get().screenRegex("p/(.*)", new ReviewersScreen.Factory());
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewersScreen.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewersScreen.java
deleted file mode 100644
index 47bedd7..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/client/ReviewersScreen.java
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright (C) 2014 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.
-
-package com.googlesource.gerrit.plugins.reviewers.client;
-
-import static com.googlesource.gerrit.plugins.reviewers.client.AccountCapabilities.MODIFY_REVIEWERS_CONFIG;
-
-import com.google.gerrit.client.rpc.NativeMap;
-import com.google.gerrit.client.rpc.Natives;
-import com.google.gerrit.plugin.client.rpc.RestApi;
-import com.google.gerrit.plugin.client.screen.Screen;
-import com.google.gwt.core.client.JsArray;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.http.client.URL;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.Image;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.SuggestBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwtexpui.globalkey.client.NpTextBox;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
-public class ReviewersScreen extends HorizontalPanel {
-  private static final String REMOVE_BUTTON_IMG = "plugins/reviewers/static/remove_reviewer.png";
-
-  static class Factory implements Screen.EntryPoint {
-    @Override
-    public void onLoad(Screen screen) {
-      screen.setPageTitle("Reviewers");
-      screen.show(new ReviewersScreen(URL.decodeQueryString(screen.getToken(1))));
-    }
-  }
-
-  private boolean isOwner;
-  private boolean hasModifyReviewersConfigCapability;
-  private String projectName;
-  private Set<ReviewerEntry> rEntries;
-
-  ReviewersScreen(String projectName) {
-    setStyleName("reviewers-panel");
-    this.projectName = projectName;
-    this.rEntries = new HashSet<>();
-
-    new RestApi("access/")
-        .addParameter("project", projectName)
-        .get(
-            new AsyncCallback<NativeMap<ProjectAccessInfo>>() {
-
-              @Override
-              public void onSuccess(NativeMap<ProjectAccessInfo> result) {
-                isOwner = result.get(projectName).isOwner();
-                if (isOwner) {
-                  display();
-                } else {
-                  // TODO(davido): Find a way to run above and below requests in parallel
-                  AccountCapabilities.queryPluginCapability(
-                      new AsyncCallback<AccountCapabilities>() {
-
-                        @Override
-                        public void onSuccess(AccountCapabilities result) {
-                          hasModifyReviewersConfigCapability =
-                              result.canPerform(MODIFY_REVIEWERS_CONFIG);
-                          display();
-                        }
-
-                        @Override
-                        public void onFailure(Throwable caught) {}
-                      });
-                }
-              }
-
-              @Override
-              public void onFailure(Throwable caught) {}
-            });
-  }
-
-  void display() {
-    new RestApi("projects")
-        .id(projectName)
-        .view("reviewers")
-        .get(
-            new AsyncCallback<JsArray<ReviewerFilterSection>>() {
-
-              @Override
-              public void onSuccess(JsArray<ReviewerFilterSection> result) {
-                display(result);
-              }
-
-              @Override
-              public void onFailure(Throwable caught) {}
-            });
-  }
-
-  void display(JsArray<ReviewerFilterSection> sections) {
-    add(createEntriesPanel(sections));
-    add(createInputPanel());
-  }
-
-  Panel createEntriesPanel(JsArray<ReviewerFilterSection> sections) {
-    Panel p = new VerticalPanel();
-    for (ReviewerFilterSection section : Natives.asList(sections)) {
-      Label filter = new Label(section.filter());
-      filter.addStyleName("reviewers-filterLabel");
-      p.add(filter);
-      for (String reviewer : Natives.asList(section.reviewers())) {
-        ReviewerEntry rEntry = new ReviewerEntry(section.filter(), reviewer);
-        rEntries.add(rEntry);
-        p.add(createOneEntry(rEntry));
-      }
-    }
-    return p;
-  }
-
-  Panel createOneEntry(final ReviewerEntry e) {
-    Label l = new Label(e.reviewer);
-    l.setStyleName("reviewers-reviewerLabel");
-
-    Image img = new Image(REMOVE_BUTTON_IMG);
-    Button removeButton = Button.wrap(img.getElement());
-    removeButton.setStyleName("reviewers-removeButton");
-    removeButton.setTitle("remove reviewer");
-    removeButton.addClickHandler(
-        new ClickHandler() {
-          @Override
-          public void onClick(final ClickEvent event) {
-            doSave(Action.REMOVE, e);
-          }
-        });
-    removeButton.setVisible(isModifiable());
-
-    HorizontalPanel p = new HorizontalPanel();
-    p.add(l);
-    p.add(removeButton);
-    return p;
-  }
-
-  Panel createInputPanel() {
-    Grid inputGrid = new Grid(2, 2);
-
-    final NpTextBox filterBox = new NpTextBox();
-    filterBox.getElement().setPropertyString("placeholder", "filter");
-    inputGrid.setText(0, 0, "Filter: ");
-    inputGrid.setWidget(0, 1, filterBox);
-
-    // TODO(davido): Remove hard coded start suggest char 3
-    final ReviewerSuggestOracle oracle = new ReviewerSuggestOracle(3, projectName);
-    final SuggestBox reviewerBox = new SuggestBox(oracle, new NpTextBox());
-    reviewerBox.getElement().setPropertyString("placeholder", "reviewer");
-    inputGrid.setText(1, 0, "Reviewer: ");
-    inputGrid.setWidget(1, 1, reviewerBox);
-
-    Button addButton = new Button("Add");
-    addButton.setStyleName("reviewers-addButton");
-    addButton.addClickHandler(
-        new ClickHandler() {
-          @Override
-          public void onClick(final ClickEvent event) {
-            ReviewerEntry e = new ReviewerEntry(filterBox.getValue(), reviewerBox.getValue());
-            if (!rEntries.contains(e) && !e.filter.isEmpty() && !e.reviewer.isEmpty()) {
-              doSave(Action.ADD, e);
-            }
-            filterBox.setText("");
-            reviewerBox.setText("");
-          }
-        });
-    filterBox.setEnabled(isModifiable());
-    reviewerBox.setEnabled(isModifiable());
-    addButton.setEnabled(isModifiable());
-
-    Panel p = new VerticalPanel();
-    p.setStyleName("reviewers-inputPanel");
-    p.add(inputGrid);
-    p.add(addButton);
-    return p;
-  }
-
-  boolean isModifiable() {
-    return isOwner || hasModifyReviewersConfigCapability;
-  }
-
-  void doSave(Action action, ReviewerEntry entry) {
-    ChangeReviewersInput in = ChangeReviewersInput.create();
-    in.setAction(action);
-    in.setFilter(entry.filter);
-    in.setReviewer(entry.reviewer);
-    reset();
-
-    new RestApi("projects")
-        .id(projectName)
-        .view("reviewers")
-        .put(
-            in,
-            new AsyncCallback<JsArray<ReviewerFilterSection>>() {
-
-              @Override
-              public void onSuccess(JsArray<ReviewerFilterSection> result) {
-                display(result);
-              }
-
-              @Override
-              public void onFailure(Throwable caught) {}
-            });
-  }
-
-  void reset() {
-    clear();
-    rEntries = new HashSet<>();
-  }
-
-  static class ReviewerEntry {
-    private String filter;
-    private String reviewer;
-
-    ReviewerEntry(String filter, String reviewer) {
-      this.filter = filter;
-      this.reviewer = reviewer;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(filter, reviewer);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o == null || !(o instanceof ReviewerEntry)) {
-        return false;
-      }
-      ReviewerEntry other = (ReviewerEntry) o;
-      if (!this.filter.equals(other.filter) || !this.reviewer.equals(other.reviewer)) {
-        return false;
-      }
-      return true;
-    }
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/public/reviewers.css b/src/main/java/com/googlesource/gerrit/plugins/reviewers/public/reviewers.css
deleted file mode 100644
index 8a09264..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/public/reviewers.css
+++ /dev/null
@@ -1,28 +0,0 @@
-.reviewers-panel {
-  border-spacing: 10px 10px;
-}
-
-.reviewers-addButton {
-  float: right;
-  margin-right: 5px;
-}
-
-.reviewers-inputPanel {
-  margin-left: 15px;
-}
-
-.reviewers-filterLabel {
-  font-size: 14px;
-  font-weight: bold;
-}
-
-.reviewers-reviewerLabel {
-  font-size: 14px;
-  margin-left: 15px;
-}
-
-.reviewers-removeButton {
-  margin-left: 10px;
-  vertical-align: middle;
-  cursor: pointer;
-}
\ No newline at end of file
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java
deleted file mode 100644
index fc98943..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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.
-
-package com.googlesource.gerrit.plugins.reviewers.server;
-
-import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;
-import static com.googlesource.gerrit.plugins.reviewers.server.ModifyReviewersConfigCapability.MODIFY_REVIEWERS_CONFIG;
-
-import com.google.gerrit.extensions.annotations.Exports;
-import com.google.gerrit.extensions.config.CapabilityDefinition;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.events.PrivateStateChangedListener;
-import com.google.gerrit.extensions.events.RevisionCreatedListener;
-import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.server.change.ReviewerSuggestion;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-
-public class BackendModule extends FactoryModule {
-  private final boolean enableREST;
-  private final boolean suggestOnly;
-
-  @Inject
-  public BackendModule(ReviewersConfig cfg) {
-    this(cfg.enableREST(), cfg.suggestOnly());
-  }
-
-  public BackendModule(boolean enableREST, boolean suggestOnly) {
-    this.enableREST = enableREST;
-    this.suggestOnly = suggestOnly;
-  }
-
-  @Override
-  protected void configure() {
-    bind(CapabilityDefinition.class)
-        .annotatedWith(Exports.named(MODIFY_REVIEWERS_CONFIG))
-        .to(ModifyReviewersConfigCapability.class);
-
-    if (suggestOnly) {
-      install(
-          new AbstractModule() {
-            @Override
-            protected void configure() {
-              bind(ReviewerSuggestion.class)
-                  .annotatedWith(Exports.named("reviewer-suggest"))
-                  .to(Reviewers.class);
-            }
-          });
-    } else {
-      DynamicSet.bind(binder(), RevisionCreatedListener.class).to(Reviewers.class);
-      DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class).to(Reviewers.class);
-      DynamicSet.bind(binder(), PrivateStateChangedListener.class).to(Reviewers.class);
-    }
-
-    factory(AddReviewersByConfiguration.Factory.class);
-
-    if (enableREST) {
-      install(
-          new RestApiModule() {
-            @Override
-            protected void configure() {
-              get(PROJECT_KIND, "reviewers").to(GetReviewers.class);
-              put(PROJECT_KIND, "reviewers").to(PutReviewers.class);
-              get(PROJECT_KIND, "suggest_reviewers").to(SuggestProjectReviewers.class);
-            }
-          });
-    }
-  }
-}
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 6960506..de99226 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -58,14 +58,6 @@
   ./tools/eclipse/project.py
 ```
 
-### Backend-only
-
-There are two separate plugin targets, one containing UI components
-(`reviewers`), and one with only backend components (`reviewers-backend`). The
-UI plugin is only compatible with the GWT UI, and does not work with PolyGerrit.
-Both build instructions will work with either `reviewers` or
-`reviewers-backend`.
-
 How to build the Gerrit Plugin API is described in the [Gerrit
 documentation](../../../Documentation/dev-bazel.html#_extension_and_plugin_api_jar_files).
 
diff --git a/src/main/resources/static/remove_reviewer.png b/src/main/resources/static/remove_reviewer.png
deleted file mode 100644
index 5a3e6f0..0000000
--- a/src/main/resources/static/remove_reviewer.png
+++ /dev/null
Binary files differ
diff --git a/src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfigIT.java b/src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersConfigIT.java
similarity index 83%
rename from src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfigIT.java
rename to src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersConfigIT.java
index 32b2243..4356b90 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfigIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersConfigIT.java
@@ -12,21 +12,23 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.gerrit.acceptance.GitUtil.fetch;
-import static com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig.FILENAME;
-import static com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig.KEY_REVIEWER;
-import static com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig.SECTION_FILTER;
+import static com.googlesource.gerrit.plugins.reviewers.ReviewersConfig.FILENAME;
+import static com.googlesource.gerrit.plugins.reviewers.ReviewersConfig.KEY_REVIEWER;
+import static com.googlesource.gerrit.plugins.reviewers.ReviewersConfig.SECTION_FILTER;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
 import com.google.gerrit.acceptance.NoHttpd;
 import com.google.gerrit.acceptance.TestPlugin;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.inject.Inject;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.Config;
 import org.junit.Before;
@@ -40,6 +42,8 @@
   private static final String JANE_DOE = "jane.doe@example.com";
   private static final String JOHN_DOE = "john.doe@example.com";
 
+  @Inject private ProjectOperations projectOperations;
+
   @Before
   public void setUp() throws Exception {
     fetch(testRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
@@ -53,7 +57,7 @@
     cfg.setString(SECTION_FILTER, BRANCH_MAIN, KEY_REVIEWER, JANE_DOE);
 
     pushFactory
-        .create(db, admin.getIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
+        .create(admin.newIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
@@ -73,8 +77,7 @@
 
     pushFactory
         .create(
-            db,
-            admin.getIdent(),
+            admin.newIdent(),
             testRepo,
             "Add reviewers parent project",
             FILENAME,
@@ -82,7 +85,7 @@
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
-    Project.NameKey childProject = createProject("child", project);
+    Project.NameKey childProject = projectOperations.newProject().parent(project).create();
     TestRepository<?> childTestRepo = cloneProject(childProject);
     fetch(childTestRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
     childTestRepo.reset("refs/heads/config");
@@ -93,12 +96,7 @@
 
     pushFactory
         .create(
-            db,
-            admin.getIdent(),
-            childTestRepo,
-            "Add reviewers child project",
-            FILENAME,
-            cfg.toText())
+            admin.newIdent(), childTestRepo, "Add reviewers child project", FILENAME, cfg.toText())
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersIT.java b/src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersIT.java
similarity index 80%
rename from src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersIT.java
rename to src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersIT.java
index 5c5f478..fdc7fe4 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersIT.java
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assert_;
 import static com.google.gerrit.acceptance.GitUtil.fetch;
 import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-import static com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig.FILENAME;
-import static com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig.KEY_REVIEWER;
-import static com.googlesource.gerrit.plugins.reviewers.server.ReviewersConfig.SECTION_FILTER;
+import static com.googlesource.gerrit.plugins.reviewers.ReviewersConfig.FILENAME;
+import static com.googlesource.gerrit.plugins.reviewers.ReviewersConfig.KEY_REVIEWER;
+import static com.googlesource.gerrit.plugins.reviewers.ReviewersConfig.SECTION_FILTER;
 import static java.util.stream.Collectors.toSet;
 
 import com.google.common.collect.ImmutableList;
@@ -53,10 +53,11 @@
     TestAccount user2 = accountCreator.user2();
 
     Config cfg = new Config();
-    cfg.setStringList(SECTION_FILTER, "*", KEY_REVIEWER, ImmutableList.of(user.email, user2.email));
+    cfg.setStringList(
+        SECTION_FILTER, "*", KEY_REVIEWER, ImmutableList.of(user.email(), user2.email()));
 
     pushFactory
-        .create(db, admin.getIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
+        .create(admin.newIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
@@ -79,7 +80,8 @@
     } while (reviewers == null);
 
     assertThat(reviewers.stream().map(a -> a._accountId).collect(toSet()))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.id.get(), user.id.get(), user2.id.get()));
+        .containsExactlyElementsIn(
+            ImmutableSet.of(admin.id().get(), user.id().get(), user2.id().get()));
   }
 
   @Test
@@ -88,11 +90,11 @@
     TestAccount user2 = accountCreator.user2();
 
     Config cfg = new Config();
-    cfg.setStringList(SECTION_FILTER, "*", KEY_REVIEWER, ImmutableList.of(user.email));
-    cfg.setStringList(SECTION_FILTER, "^a.txt", KEY_REVIEWER, ImmutableList.of(user2.email));
+    cfg.setStringList(SECTION_FILTER, "*", KEY_REVIEWER, ImmutableList.of(user.email()));
+    cfg.setStringList(SECTION_FILTER, "^a.txt", KEY_REVIEWER, ImmutableList.of(user2.email()));
 
     pushFactory
-        .create(db, admin.getIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
+        .create(admin.newIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
@@ -115,7 +117,8 @@
     } while (reviewers == null);
 
     assertThat(reviewers.stream().map(a -> a._accountId).collect(toSet()))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.id.get(), user.id.get(), user2.id.get()));
+        .containsExactlyElementsIn(
+            ImmutableSet.of(admin.id().get(), user.id().get(), user2.id().get()));
   }
 
   @Test
@@ -123,16 +126,16 @@
     RevCommit oldHead = getRemoteHead();
 
     Config cfg = new Config();
-    cfg.setString(SECTION_FILTER, "branch:master", KEY_REVIEWER, user.email);
+    cfg.setString(SECTION_FILTER, "branch:master", KEY_REVIEWER, user.email());
 
     pushFactory
-        .create(db, admin.getIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
+        .create(admin.newIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
     testRepo.reset(oldHead);
 
-    createBranch(new Branch.NameKey(project, "other-branch"));
+    createBranch(Branch.nameKey(project, "other-branch"));
 
     // Create a change that matches the filter section.
     createChange("refs/for/master");
@@ -156,16 +159,16 @@
     RevCommit oldHead = getRemoteHead();
 
     Config cfg = new Config();
-    cfg.setString(SECTION_FILTER, "branch:other-branch", KEY_REVIEWER, user.email);
+    cfg.setString(SECTION_FILTER, "branch:other-branch", KEY_REVIEWER, user.email());
 
     pushFactory
-        .create(db, admin.getIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
+        .create(admin.newIdent(), testRepo, "Add reviewers", FILENAME, cfg.toText())
         .to(RefNames.REFS_CONFIG)
         .assertOkStatus();
 
     testRepo.reset(oldHead);
 
-    createBranch(new Branch.NameKey(project, "other-branch"));
+    createBranch(Branch.nameKey(project, "other-branch"));
 
     // Create a change that doesn't match the filter section.
     createChange("refs/for/master");
@@ -182,6 +185,6 @@
     } while (reviewers == null && wait < 100);
 
     assertThat(reviewers.stream().map(a -> a._accountId).collect(toSet()))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.id.get(), user.id.get()));
+        .containsExactlyElementsIn(ImmutableSet.of(admin.id().get(), user.id().get()));
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersResolverIT.java b/src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersResolverIT.java
similarity index 73%
rename from src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersResolverIT.java
rename to src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersResolverIT.java
index c893a6c..185e4cd 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersResolverIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/reviewers/ReviewersResolverIT.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.reviewers.server;
+package com.googlesource.gerrit.plugins.reviewers;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -20,6 +20,7 @@
 import com.google.gerrit.acceptance.AbstractDaemonTest;
 import com.google.gerrit.acceptance.NoHttpd;
 import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.testsuite.group.GroupOperations;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.inject.Inject;
 import java.util.Collections;
@@ -30,6 +31,7 @@
 @NoHttpd
 public class ReviewersResolverIT extends AbstractDaemonTest {
 
+  @Inject private GroupOperations groupOperations;
   @Inject private ReviewersResolver resolver;
   private int change;
 
@@ -42,10 +44,10 @@
   public void testUploaderSkippedAsReviewer() throws Exception {
     Set<Account.Id> reviewers =
         resolver.resolve(
-            Collections.singleton(user.email),
+            Collections.singleton(user.email()),
             project,
             change,
-            gApi.accounts().id(user.id.get()).get());
+            gApi.accounts().id(user.id().get()).get());
     assertThat(reviewers).isEmpty();
   }
 
@@ -53,20 +55,22 @@
   public void testAccountResolve() throws Exception {
     Set<Account.Id> reviewers =
         resolver.resolve(
-            ImmutableSet.of(user.email, admin.email),
+            ImmutableSet.of(user.email(), admin.email()),
             project,
             change,
-            gApi.accounts().id(admin.id.get()).get());
-    assertThat(reviewers).containsExactly(user.id);
+            gApi.accounts().id(admin.id().get()).get());
+    assertThat(reviewers).containsExactly(user.id());
   }
 
   @Test
   public void testAccountGroupResolve() throws Exception {
-    String group1 = createGroup("group1");
+    String group1 = "group1";
+    groupOperations.newGroup().name(group1).create();
     TestAccount foo = createTestAccount("foo", group1);
     TestAccount bar = createTestAccount("bar", group1);
 
-    String group2 = createGroup("group2");
+    String group2 = "group2";
+    groupOperations.newGroup().name(group2).create();
     TestAccount baz = createTestAccount("baz", group2);
     TestAccount qux = createTestAccount("qux", group2);
 
@@ -74,11 +78,11 @@
 
     Set<Account.Id> reviewers =
         resolver.resolve(
-            ImmutableSet.of(system.email, group1, group2),
+            ImmutableSet.of(system.email(), group1, group2),
             project,
             change,
-            gApi.accounts().id(admin.id.get()).get());
-    assertThat(reviewers).containsExactly(system.id, foo.id, bar.id, baz.id, qux.id);
+            gApi.accounts().id(admin.id().get()).get());
+    assertThat(reviewers).containsExactly(system.id(), foo.id(), bar.id(), baz.id(), qux.id());
   }
 
   private TestAccount createTestAccount(String name, String group) throws Exception {
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
index ea73147..4d2dbdd 100644
--- a/tools/bzl/plugin.bzl
+++ b/tools/bzl/plugin.bzl
@@ -1,12 +1,10 @@
 load(
     "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
     _gerrit_plugin = "gerrit_plugin",
-    _gwt_plugin_deps = "GWT_PLUGIN_DEPS",
     _plugin_deps = "PLUGIN_DEPS",
     _plugin_test_deps = "PLUGIN_TEST_DEPS",
 )
 
 gerrit_plugin = _gerrit_plugin
-GWT_PLUGIN_DEPS = _gwt_plugin_deps
 PLUGIN_DEPS = _plugin_deps
 PLUGIN_TEST_DEPS = _plugin_test_deps
diff --git a/tools/eclipse/BUILD b/tools/eclipse/BUILD
index 77a865e..b51010e 100644
--- a/tools/eclipse/BUILD
+++ b/tools/eclipse/BUILD
@@ -1,15 +1,7 @@
 load("//tools/bzl:classpath.bzl", "classpath_collector")
-load(
-    "//tools/bzl:plugin.bzl",
-    "GWT_PLUGIN_DEPS",
-)
 
 classpath_collector(
     name = "main_classpath_collect",
     testonly = 1,
-    deps = GWT_PLUGIN_DEPS + [
-        "//external:gwt-dev",
-        "//external:gwt-user",
-        "//:reviewers__plugin_test_deps",
-    ],
+    deps = ["//:reviewers__plugin_test_deps"],
 )
