diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
index 348e856..6ace126 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
@@ -16,11 +16,7 @@
 
 import static java.util.stream.Collectors.toSet;
 
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.entities.Account;
@@ -34,13 +30,9 @@
 import com.google.gerrit.extensions.events.RevisionCreatedListener;
 import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
 import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.change.ReviewerSuggestion;
 import com.google.gerrit.server.change.SuggestedReviewer;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.reviewers.config.ReviewersConfig;
 import java.util.List;
@@ -59,9 +51,7 @@
   private final AddReviewers.Factory addReviewersFactory;
   private final ReviewerWorkQueue workQueue;
   private final ReviewersConfig config;
-  private final Provider<CurrentUser> user;
-  private final ChangeQueryBuilder queryBuilder;
-  private final Provider<InternalChangeQuery> queryProvider;
+  private final ReviewersFilterUtil filterUtil;
 
   @Inject
   Reviewers(
@@ -69,16 +59,12 @@
       AddReviewers.Factory addReviewersFactory,
       ReviewerWorkQueue workQueue,
       ReviewersConfig config,
-      Provider<CurrentUser> user,
-      ChangeQueryBuilder queryBuilder,
-      Provider<InternalChangeQuery> queryProvider) {
+      ReviewersFilterUtil util) {
     this.resolver = resolver;
     this.addReviewersFactory = addReviewersFactory;
     this.workQueue = workQueue;
     this.config = config;
-    this.user = user;
-    this.queryBuilder = queryBuilder;
-    this.queryProvider = queryProvider;
+    this.filterUtil = util;
   }
 
   @Override
@@ -109,7 +95,7 @@
     }
 
     try {
-      Set<String> reviewers = findReviewers(changeId.get(), filters);
+      Set<String> reviewers = filterUtil.findReviewers(changeId.get(), filters);
       if (!reviewers.isEmpty()) {
         return resolver.resolve(reviewers, projectName, changeId.get(), null).stream()
             .map(a -> suggestedReviewer(a))
@@ -153,9 +139,8 @@
     AccountInfo uploader = event.getWho();
     int changeNumber = c._number;
     try {
-      List<ReviewerFilter> matching = findMatchingFilters(changeNumber, filters);
-      Set<String> reviewers = getReviewersFrom(matching);
-      Set<String> ccs = getCcsFrom(matching);
+      Set<String> reviewers = filterUtil.findReviewers(changeNumber, filters);
+      Set<String> ccs = filterUtil.findCcs(changeNumber, filters);
       if (reviewers.isEmpty() && ccs.isEmpty()) {
         return;
       }
@@ -176,48 +161,4 @@
       logger.atSevere().withCause(x).log(x.getMessage());
     }
   }
-
-  private Set<String> findReviewers(int change, List<ReviewerFilter> filters)
-      throws StorageException, QueryParseException {
-    return getReviewersFrom(findMatchingFilters(change, filters));
-  }
-
-  private Set<String> getReviewersFrom(List<ReviewerFilter> filters) throws StorageException {
-    ImmutableSet.Builder<String> reviewers = ImmutableSet.builder();
-    for (ReviewerFilter f : filters) {
-      reviewers.addAll(f.getReviewers());
-    }
-    return reviewers.build();
-  }
-
-  private Set<String> getCcsFrom(List<ReviewerFilter> filters) throws StorageException {
-    Set<String> ccs = Sets.newHashSet();
-    for (ReviewerFilter f : filters) {
-      ccs.addAll(f.getCcs());
-    }
-    return ccs;
-  }
-
-  private List<ReviewerFilter> findMatchingFilters(int change, List<ReviewerFilter> filters)
-      throws StorageException, QueryParseException {
-    ImmutableList.Builder<ReviewerFilter> found = ImmutableList.builder();
-    for (ReviewerFilter s : filters) {
-      if (Strings.isNullOrEmpty(s.getFilter()) || s.getFilter().equals("*")) {
-        found.add(s);
-      } else if (filterMatch(change, s.getFilter())) {
-        found.add(s);
-      }
-    }
-    return found.build();
-  }
-
-  boolean filterMatch(int change, String filter) throws StorageException, QueryParseException {
-    Preconditions.checkNotNull(filter);
-    ChangeQueryBuilder qb = queryBuilder.asUser(user.get());
-    return !queryProvider
-        .get()
-        .noFields()
-        .query(qb.parse(String.format("change:%s %s", change, filter)))
-        .isEmpty();
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersFilterUtil.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersFilterUtil.java
new file mode 100644
index 0000000..5f0574c
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersFilterUtil.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2020 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.base.Preconditions;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+import com.google.gerrit.exceptions.StorageException;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.List;
+import java.util.Set;
+
+public class ReviewersFilterUtil {
+  private final ChangeQueryBuilder queryBuilder;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Provider<CurrentUser> user;
+
+  @Inject
+  public ReviewersFilterUtil(
+      ChangeQueryBuilder queryBuilder,
+      Provider<InternalChangeQuery> queryProvider,
+      Provider<CurrentUser> user) {
+    this.queryBuilder = queryBuilder;
+    this.queryProvider = queryProvider;
+    this.user = user;
+  }
+
+  public Set<String> findReviewers(int change, List<ReviewerFilter> filters)
+      throws StorageException, QueryParseException {
+    Set<String> reviewers = Sets.newHashSet();
+    List<ReviewerFilter> found = findReviewerFilters(change, filters);
+    for (ReviewerFilter s : found) {
+      reviewers.addAll(s.getReviewers());
+    }
+    return reviewers;
+  }
+
+  public Set<String> findCcs(int change, List<ReviewerFilter> filters)
+      throws StorageException, QueryParseException {
+    Set<String> ccs = Sets.newHashSet();
+    List<ReviewerFilter> found = findReviewerFilters(change, filters);
+    for (ReviewerFilter s : found) {
+      ccs.addAll(s.getCcs());
+    }
+    return ccs;
+  }
+
+  private List<ReviewerFilter> findReviewerFilters(int change, List<ReviewerFilter> sections)
+      throws StorageException, QueryParseException {
+    ImmutableList.Builder<ReviewerFilter> found = ImmutableList.builder();
+    for (ReviewerFilter s : sections) {
+      if (Strings.isNullOrEmpty(s.getFilter()) || s.getFilter().equals("*")) {
+        found.add(s);
+      } else if (filterMatch(change, s.getFilter())) {
+        found.add(s);
+      }
+    }
+    return found.build();
+  }
+
+  boolean filterMatch(int change, String filter) throws StorageException, QueryParseException {
+    Preconditions.checkNotNull(filter);
+    ChangeQueryBuilder qb = queryBuilder.asUser(user.get());
+    return !queryProvider
+        .get()
+        .noFields()
+        .query(qb.parse(String.format("change:%s %s", change, filter)))
+        .isEmpty();
+  }
+}
