diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java
index 0eba65b..f4dbca4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java
@@ -27,7 +27,7 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
 import com.google.gerrit.server.change.ChangeResource;
 import com.google.gerrit.server.change.RevisionResource;
 import com.google.gerrit.server.config.PluginConfigFactory;
@@ -55,7 +55,7 @@
   private static final Logger log = LoggerFactory.getLogger(Action.class);
 
   private AccountCache accountCache;
-  private Accounts accounts;
+  private Emails emails;
   private ChangeData.Factory changeDataFactory;
   private GitRepositoryManager repoManager;
   private Provider<CurrentUser> userProvider;
@@ -74,13 +74,13 @@
       SchemaFactory<ReviewDb> reviewDbProvider,
       ChangeData.Factory changeDataFactory,
       AccountCache accountCache,
-      Accounts accounts,
+      Emails emails,
       GitRepositoryManager repoManager) {
     this.userProvider = userProvider;
     this.reviewDbProvider = reviewDbProvider;
     this.changeDataFactory = changeDataFactory;
     this.accountCache = accountCache;
-    this.accounts = accounts;
+    this.emails = emails;
     this.repoManager = repoManager;
     Config.setVariables(pluginName, configFactory);
     Cache.getInstance(); // Create a single Cache.
@@ -171,7 +171,7 @@
       Repository repository, Parameters params, ChangeData changeData)
       throws OrmException, BadRequestException {
     int patchset = getValidPatchsetNum(changeData, params.patchset);
-    OwnersDb db = Cache.getInstance().get(accountCache, accounts, repository, changeData, patchset);
+    OwnersDb db = Cache.getInstance().get(accountCache, emails, repository, changeData, patchset);
     Collection<String> changedFiles = changeData.currentFilePaths();
     Map<String, Set<String>> file2Owners = db.findOwners(changedFiles);
 
@@ -216,7 +216,7 @@
       if (needFindOwners && !Config.getAlwaysShowButton()) {
         needFindOwners = false; // Show button only if some owner is found.
         try (Repository repo = repoManager.openRepository(change.getProject())) {
-          OwnersDb db = Cache.getInstance().get(accountCache, accounts, repo, changeData);
+          OwnersDb db = Cache.getInstance().get(accountCache, emails, repo, changeData);
           log.trace("getDescription db key = " + db.key);
           needFindOwners = db.getNumOwners() > 0;
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java
index 10fdebf..b9e1f43 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java
@@ -19,7 +19,7 @@
 import com.google.common.cache.CacheBuilder;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gwtorm.server.OrmException;
 import java.util.Collection;
@@ -87,16 +87,16 @@
   }
 
   /** Returns a cached or new OwnersDb, for the current patchset. */
-  OwnersDb get(AccountCache accountCache, Accounts accounts, Repository repo, ChangeData changeData)
+  OwnersDb get(AccountCache accountCache, Emails emails, Repository repo, ChangeData changeData)
       throws OrmException {
     return get(
-        accountCache, accounts, repo, changeData, changeData.currentPatchSet().getId().get());
+        accountCache, emails, repo, changeData, changeData.currentPatchSet().getId().get());
   }
 
   /** Returns a cached or new OwnersDb, for the specified patchset. */
   OwnersDb get(
       AccountCache accountCache,
-      Accounts accounts,
+      Emails emails,
       Repository repository,
       ChangeData changeData,
       int patchset)
@@ -106,13 +106,13 @@
     String dbKey = Cache.makeKey(changeData.getId().get(), patchset, branch);
     // TODO: get changed files of the given patchset?
     return get(
-        accountCache, accounts, dbKey, repository, project, branch, changeData.currentFilePaths());
+        accountCache, emails, dbKey, repository, project, branch, changeData.currentFilePaths());
   }
 
   /** Returns a cached or new OwnersDb, for the specified branch and changed files. */
   OwnersDb get(
       AccountCache accountCache,
-      Accounts accounts,
+      Emails emails,
       String key,
       Repository repository,
       Project.NameKey project,
@@ -120,7 +120,7 @@
       Collection<String> files) {
     if (dbCache == null) { // Do not cache OwnersDb
       log.trace("Create new OwnersDb, key=" + key);
-      return new OwnersDb(accountCache, accounts, key, repository, project, branch, files);
+      return new OwnersDb(accountCache, emails, key, repository, project, branch, files);
     }
     try {
       log.trace("Get from cash " + dbCache + ", key=" + key + ", cache size=" + dbCache.size());
@@ -130,12 +130,12 @@
             @Override
             public OwnersDb call() {
               log.trace("Create new OwnersDb, key=" + key);
-              return new OwnersDb(accountCache, accounts, key, repository, project, branch, files);
+              return new OwnersDb(accountCache, emails, key, repository, project, branch, files);
             }
           });
     } catch (ExecutionException e) {
       log.error("Cache.get has exception: " + e);
-      return new OwnersDb(accountCache, accounts, key, repository, project, branch, files);
+      return new OwnersDb(accountCache, emails, key, repository, project, branch, files);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java
index 6b9897d..8ecca66 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java
@@ -18,7 +18,7 @@
 import com.google.gerrit.reviewdb.client.PatchSetApproval;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gwtorm.server.OrmException;
 import com.googlecode.prolog_cafe.lang.Prolog;
@@ -103,10 +103,10 @@
   public static int findApproval(Prolog engine, int minVoteLevel) {
     try {
       AccountCache accountCache = StoredValues.ACCOUNT_CACHE.get(engine);
-      Accounts accounts = StoredValues.ACCOUNTS.get(engine);
+      Emails emails = StoredValues.EMAILS.get(engine);
       ChangeData changeData = StoredValues.CHANGE_DATA.get(engine);
       Repository repository = StoredValues.REPOSITORY.get(engine);
-      return new Checker(repository, changeData, minVoteLevel).findApproval(accountCache, accounts);
+      return new Checker(repository, changeData, minVoteLevel).findApproval(accountCache, emails);
     } catch (OrmException e) {
       log.error("Exception", e);
       return 0; // owner approval may or may not be required.
@@ -129,13 +129,13 @@
     return (status == Status.ABANDONED || status == Status.MERGED);
   }
 
-  int findApproval(AccountCache accountCache, Accounts accounts) throws OrmException {
+  int findApproval(AccountCache accountCache, Emails emails) throws OrmException {
     if (isExemptFromOwnerApproval(changeData)) {
       return 0;
     }
     // One update to a Gerrit change can call submit_rule or submit_filter
     // many times. So this function should use cached values.
-    OwnersDb db = Cache.getInstance().get(accountCache, accounts, repository, changeData);
+    OwnersDb db = Cache.getInstance().get(accountCache, emails, repository, changeData);
     if (db.getNumOwners() <= 0) {
       return 0;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java
index e918be7..fd60850 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java
@@ -21,7 +21,7 @@
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
 import com.google.gerrit.server.change.ChangeResource;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.git.GitRepositoryManager;
@@ -57,7 +57,7 @@
       SchemaFactory<ReviewDb> reviewDbProvider,
       ChangeData.Factory dataFactory,
       AccountCache accountCache,
-      Accounts accounts,
+      Emails emails,
       GitRepositoryManager repoManager) {
     this.action =
         new Action(
@@ -67,7 +67,7 @@
             reviewDbProvider,
             dataFactory,
             accountCache,
-            accounts,
+            emails,
             repoManager);
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
index 381430d..3d4eb82 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
@@ -20,7 +20,7 @@
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
 import java.nio.file.FileSystem;
 import java.nio.file.FileSystems;
 import java.nio.file.PathMatcher;
@@ -46,7 +46,7 @@
   private static final Logger log = LoggerFactory.getLogger(OwnersDb.class);
 
   private AccountCache accountCache;
-  private Accounts accounts;
+  private Emails emails;
   private int numOwners = -1; // # of owners of all given files.
 
   String key = ""; // key to find this OwnersDb in a cache.
@@ -63,14 +63,14 @@
 
   OwnersDb(
       AccountCache accountCache,
-      Accounts accounts,
+      Emails emails,
       String key,
       Repository repository,
       Project.NameKey project,
       String branch,
       Collection<String> files) {
     this.accountCache = accountCache;
-    this.accounts = accounts;
+    this.emails = emails;
     this.key = key;
     preferredEmails.put("*", "*");
     String ownersFileName = Config.getOwnersFileName(project);
@@ -132,15 +132,15 @@
     List<String> owners = new ArrayList<>(ownerEmails);
     owners.removeIf(o -> preferredEmails.get(o) != null);
     if (!owners.isEmpty()) {
-      String[] emails = new String[owners.size()];
-      owners.toArray(emails);
+      String[] ownerEmailsAsArray = new String[owners.size()];
+      owners.toArray(ownerEmailsAsArray);
       Multimap<String, Account.Id> email2ids = null;
       try {
-        email2ids = accounts.byEmails(emails);
+        email2ids = emails.getAccountsFor(ownerEmailsAsArray);
       } catch (Exception e) {
         log.error("accounts.byEmails failed with exception: ", e);
       }
-      for (String owner : emails) {
+      for (String owner : ownerEmailsAsArray) {
         String email = owner;
         try {
           if (email2ids == null) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/findowners/FindOwnersIT.java b/src/test/java/com/googlesource/gerrit/plugins/findowners/FindOwnersIT.java
index b72c860..cc7d73a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/findowners/FindOwnersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/findowners/FindOwnersIT.java
@@ -32,6 +32,7 @@
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.Emails;
 import com.google.gerrit.server.change.ChangeResource;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.inject.Inject;
@@ -48,6 +49,7 @@
 @TestPlugin(name = "find-owners", sysModule = "com.googlesource.gerrit.plugins.findowners.Module")
 public class FindOwnersIT extends LightweightPluginDaemonTest {
 
+  @Inject private Emails emails;
   @Inject private PluginConfigFactory configFactory;
 
   @Test
@@ -186,12 +188,12 @@
       gApi.accounts().id(users[i]).addEmail(input);
     }
     // Find accounts with given first and second email addresses.
-    // OwnersDb uses either accounts.byEmail or byEmails to get preferred email addresses.
-    Multimap<String, Account.Id> map1 = accounts.byEmails(emails1);
-    Multimap<String, Account.Id> map2 = accounts.byEmails(emails2);
+    // OwnersDb uses either emails.getAccountFor or getAccountsFor to get preferred email addresses.
+    Multimap<String, Account.Id> map1 = emails.getAccountsFor(emails1);
+    Multimap<String, Account.Id> map2 = emails.getAccountsFor(emails2);
     for (int i = 0; i < users.length; i++) {
-      Collection<Account.Id> ids1 = accounts.byEmail(emails1[i]);
-      Collection<Account.Id> ids2 = accounts.byEmail(emails2[i]);
+      Collection<Account.Id> ids1 = emails.getAccountFor(emails1[i]);
+      Collection<Account.Id> ids2 = emails.getAccountFor(emails2[i]);
       Collection<Account.Id> ids3 = map1.get(emails1[i]);
       Collection<Account.Id> ids4 = map2.get(emails2[i]);
       assertThat(ids1).hasSize(1);
@@ -210,9 +212,9 @@
     }
     // Wrong or non-existing email address.
     String[] wrongEmails = {"nobody", "@g.com", "nobody@g.com", "*"};
-    Multimap<String, Account.Id> email2ids = accounts.byEmails(wrongEmails);
+    Multimap<String, Account.Id> email2ids = emails.getAccountsFor(wrongEmails);
     for (String email : wrongEmails) {
-      assertThat(accounts.byEmail(email)).isEmpty();
+      assertThat(emails.getAccountFor(email)).isEmpty();
       assertThat(email2ids.get(email)).isEmpty();
     }
   }
@@ -331,7 +333,7 @@
             null,
             changeDataFactory,
             accountCache,
-            accounts,
+            emails,
             repoManager);
     Response<RestResult> response = action.apply(db, cr, param);
     RestResult result = response.value();
@@ -443,7 +445,7 @@
   private int checkApproval(PushOneCommit.Result r) throws Exception {
     Repository repo = repoManager.openRepository(r.getChange().project());
     Cache cache = Cache.getInstance().init(0, 0);
-    OwnersDb db = cache.get(accountCache, accounts, repo, r.getChange(), 1);
+    OwnersDb db = cache.get(accountCache, emails, repo, r.getChange(), 1);
     Checker c = new Checker(repo, r.getChange(), 1);
     return c.findApproval(accountCache, db);
   }
