diff --git a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/AutoassignModule.java b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/AutoassignModule.java
index 35bac7f..a341505 100644
--- a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/AutoassignModule.java
+++ b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/AutoassignModule.java
@@ -23,7 +23,6 @@
 public class AutoassignModule extends AbstractModule {
   @Override
   protected void configure() {
-    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
-        .to(GitRefListener.class);
+    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(GitRefListener.class);
   }
 }
diff --git a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
index 907469d..aeb5960 100644
--- a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
+++ b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
@@ -18,14 +18,6 @@
 
 import static com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace.IGNORE_NONE;
 
-import java.io.IOException;
-import java.util.Set;
-
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import com.google.common.collect.Sets;
 import com.google.gerrit.extensions.annotations.Listen;
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
@@ -41,11 +33,16 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Listen
 public class GitRefListener implements GitReferenceUpdatedListener {
-  private static final Logger logger =
-      LoggerFactory.getLogger(GitRefListener.class);
+  private static final Logger logger = LoggerFactory.getLogger(GitRefListener.class);
 
   private static final String CHANGES_REF = "refs/changes/";
 
@@ -60,7 +57,8 @@
   private final ReviewerManager reviewerManager;
 
   @Inject
-  public GitRefListener(Provider<ReviewDb> db,
+  public GitRefListener(
+      Provider<ReviewDb> db,
       PatchListCache patchListCache,
       GitRepositoryManager repositoryManager,
       Accounts accounts,
@@ -77,8 +75,7 @@
     String projectName = event.getProjectName();
     Repository repository;
     try {
-      repository = repositoryManager
-          .openRepository(Project.NameKey.parse(projectName));
+      repository = repositoryManager.openRepository(Project.NameKey.parse(projectName));
       try {
         processEvent(repository, event);
       } finally {
@@ -103,10 +100,10 @@
               new PathOwners(accounts, repository, change.getDest().get(), patchList);
           Set<Account.Id> allReviewers = Sets.newHashSet();
           allReviewers.addAll(owners.get().values());
-          for(Matcher matcher: owners.getMatchers().values()) {
-            allReviewers.addAll( matcher.getOwners());
+          for (Matcher matcher : owners.getMatchers().values()) {
+            allReviewers.addAll(matcher.getOwners());
           }
-          logger.debug("Autoassigned reviewers are: {}",allReviewers.toString());
+          logger.debug("Autoassigned reviewers are: {}", allReviewers.toString());
           reviewerManager.addReviewers(change, allReviewers);
         }
       } catch (OrmException e) {
diff --git a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/ReviewerManager.java b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/ReviewerManager.java
index 4309992..b026390 100644
--- a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/ReviewerManager.java
+++ b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/ReviewerManager.java
@@ -26,31 +26,26 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
+import java.util.Collection;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Collection;
-
 @Singleton
 public class ReviewerManager {
-  private static final Logger log = LoggerFactory
-      .getLogger(ReviewerManager.class);
+  private static final Logger log = LoggerFactory.getLogger(ReviewerManager.class);
 
   private final GerritApi gApi;
   private final OneOffRequestContext requestContext;
 
   @Inject
-  public ReviewerManager(GerritApi gApi,
-      OneOffRequestContext requestContext) {
+  public ReviewerManager(GerritApi gApi, OneOffRequestContext requestContext) {
     this.gApi = gApi;
     this.requestContext = requestContext;
   }
 
   public void addReviewers(Change change, Collection<Account.Id> reviewers)
       throws ReviewerManagerException {
-    try (ManualRequestContext ctx = requestContext.openAs(
-      change.getOwner())) {
+    try (ManualRequestContext ctx = requestContext.openAs(change.getOwner())) {
 
       ChangeApi cApi = gApi.changes().id(change.getId().get());
       for (Account.Id account : reviewers) {
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/Accounts.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/Accounts.java
index 1683ead..0320414 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/Accounts.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/Accounts.java
@@ -14,10 +14,9 @@
 
 package com.vmware.gerrit.owners.common;
 
-import java.util.Set;
-
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.inject.ImplementedBy;
+import java.util.Set;
 
 @ImplementedBy(AccountsImpl.class)
 public interface Accounts {
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
index ec6df7f..ca64560 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
@@ -16,8 +16,8 @@
 
 import com.google.gerrit.common.errors.NoSuchGroupException;
 import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountCache;
@@ -30,14 +30,13 @@
 import com.google.gerrit.server.util.OneOffRequestContext;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class AccountsImpl implements Accounts {
   private static final Logger log = LoggerFactory.getLogger(AccountsImpl.class);
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/ConfigurationParser.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/ConfigurationParser.java
index d5859e6..2b8ecc9 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/ConfigurationParser.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/ConfigurationParser.java
@@ -17,24 +17,21 @@
 
 import static com.vmware.gerrit.owners.common.StreamUtils.iteratorStream;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.google.gerrit.reviewdb.client.Account.Id;
 import java.io.IOException;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.google.gerrit.reviewdb.client.Account.Id;
-
 public class ConfigurationParser {
 
-  private static final Logger log =
-      LoggerFactory.getLogger(OwnersConfig.class);
+  private static final Logger log = LoggerFactory.getLogger(OwnersConfig.class);
   private Accounts accounts;
 
   public ConfigurationParser(Accounts accounts) {
@@ -44,10 +41,9 @@
   public Optional<OwnersConfig> getOwnersConfig(byte[] yamlBytes) {
     try {
       final OwnersConfig ret = new OwnersConfig();
-      JsonNode jsonNode = new ObjectMapper(new YAMLFactory())
-          .readValue(yamlBytes, JsonNode.class);
-      Boolean inherited = Optional.ofNullable(jsonNode.get("inherited"))
-          .map(JsonNode::asBoolean).orElse(false);
+      JsonNode jsonNode = new ObjectMapper(new YAMLFactory()).readValue(yamlBytes, JsonNode.class);
+      Boolean inherited =
+          Optional.ofNullable(jsonNode.get("inherited")).map(JsonNode::asBoolean).orElse(false);
       ret.setInherited(inherited);
       addClassicMatcher(jsonNode, ret);
       addMatchers(jsonNode, ret);
@@ -60,10 +56,8 @@
 
   private void addClassicMatcher(JsonNode jsonNode, OwnersConfig ret) {
     Optional<Stream<String>> owners =
-        Optional.ofNullable(jsonNode.get("owners"))
-        .map(ConfigurationParser::extractOwners);
+        Optional.ofNullable(jsonNode.get("owners")).map(ConfigurationParser::extractOwners);
     ret.setOwners(flattenSet(owners));
-
   }
 
   private static <T> Set<T> flattenSet(Optional<Stream<T>> optionalStream) {
@@ -75,9 +69,7 @@
   }
 
   private void addMatchers(JsonNode jsonNode, OwnersConfig ret) {
-    getNode(jsonNode, "matchers")
-    .map(this::getMatchers)
-    .ifPresent(m -> m.forEach(ret::addMatcher));
+    getNode(jsonNode, "matchers").map(this::getMatchers).ifPresent(m -> m.forEach(ret::addMatcher));
   }
 
   private Stream<Matcher> getMatchers(JsonNode node) {
@@ -87,18 +79,13 @@
         .map(m -> m.get());
   }
 
-  private static Stream<String> extractOwners(
-      JsonNode node) {
-    return iteratorStream(node.iterator())
-            .map(JsonNode::asText);
+  private static Stream<String> extractOwners(JsonNode node) {
+    return iteratorStream(node.iterator()).map(JsonNode::asText);
   }
 
-
-
   private Optional<Matcher> toMatcher(JsonNode node) {
     Set<Id> owners =
-        flatten(getNode(node, "owners")
-            .map(ConfigurationParser::extractOwners))
+        flatten(getNode(node, "owners").map(ConfigurationParser::extractOwners))
             .flatMap(o -> accounts.find(o).stream())
             .collect(Collectors.toSet());
     if (owners.isEmpty()) {
@@ -108,22 +95,23 @@
 
     Optional<Matcher> suffixMatcher =
         getText(node, "suffix").map(el -> new SuffixMatcher(el, owners));
-    Optional<Matcher> regexMatcher =
-        getText(node, "regex").map(el -> new RegExMatcher(el, owners));
+    Optional<Matcher> regexMatcher = getText(node, "regex").map(el -> new RegExMatcher(el, owners));
     Optional<Matcher> partialRegexMatcher =
-        getText(node, "partial_regex").map(
-            el -> new PartialRegExMatcher(el, owners));
-    Optional<Matcher> exactMatcher =
-        getText(node, "exact").map(el -> new ExactMatcher(el, owners));
+        getText(node, "partial_regex").map(el -> new PartialRegExMatcher(el, owners));
+    Optional<Matcher> exactMatcher = getText(node, "exact").map(el -> new ExactMatcher(el, owners));
 
-    return Optional.ofNullable(suffixMatcher
-        .orElseGet(() -> regexMatcher
-        .orElseGet(() -> partialRegexMatcher
-        .orElseGet(() -> exactMatcher
-        .orElseGet(() -> {
-          log.warn("Ignoring invalid element " + node.toString());
-          return null;
-        })))));
+    return Optional.ofNullable(
+        suffixMatcher.orElseGet(
+            () ->
+                regexMatcher.orElseGet(
+                    () ->
+                        partialRegexMatcher.orElseGet(
+                            () ->
+                                exactMatcher.orElseGet(
+                                    () -> {
+                                      log.warn("Ignoring invalid element " + node.toString());
+                                      return null;
+                                    })))));
   }
 
   private static Optional<String> getText(JsonNode node, String field) {
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/ExactMatcher.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/ExactMatcher.java
index b12ac03..04c3c32 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/ExactMatcher.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/ExactMatcher.java
@@ -16,11 +16,10 @@
 package com.vmware.gerrit.owners.common;
 
 import com.google.gerrit.reviewdb.client.Account;
-
 import java.util.Set;
 
 public class ExactMatcher extends Matcher {
-  public ExactMatcher(String path, Set<Account.Id> owners ){
+  public ExactMatcher(String path, Set<Account.Id> owners) {
     super(path, owners);
   }
 
@@ -28,4 +27,4 @@
   public boolean matches(String pathToMatch) {
     return pathToMatch.equals(path);
   }
-}
\ No newline at end of file
+}
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/JgitWrapper.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/JgitWrapper.java
index 268de96..c076c6e 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/JgitWrapper.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/JgitWrapper.java
@@ -19,6 +19,8 @@
 import static org.eclipse.jgit.lib.FileMode.TYPE_FILE;
 import static org.eclipse.jgit.lib.FileMode.TYPE_MASK;
 
+import java.io.IOException;
+import java.util.Optional;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -27,18 +29,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.Optional;
-
 public class JgitWrapper {
-  private static final Logger log =
-      LoggerFactory.getLogger(JgitWrapper.class);
+  private static final Logger log = LoggerFactory.getLogger(JgitWrapper.class);
 
-  public static Optional<byte[]> getBlobAsBytes(Repository repository,
-      String revision, String path) throws IOException {
-    try (final TreeWalk w = TreeWalk.forPath(repository, path,
-        parseCommit(repository, repository.resolve(revision))
-            .getTree())) {
+  public static Optional<byte[]> getBlobAsBytes(Repository repository, String revision, String path)
+      throws IOException {
+    try (final TreeWalk w =
+        TreeWalk.forPath(
+            repository, path, parseCommit(repository, repository.resolve(revision)).getTree())) {
 
       return Optional.ofNullable(w)
           .filter(walk -> (walk.getRawMode(0) & TYPE_MASK) == TYPE_FILE)
@@ -47,24 +45,20 @@
     }
   }
 
-  private static RevCommit parseCommit(Repository repository,
-      ObjectId commit) throws IOException {
+  private static RevCommit parseCommit(Repository repository, ObjectId commit) throws IOException {
     try (final RevWalk walk = new RevWalk(repository)) {
       walk.setRetainBody(true);
       return walk.parseCommit(commit);
     }
   }
 
-  private static Optional<byte[]> readBlob(Repository repository,
-      ObjectId id) {
+  private static Optional<byte[]> readBlob(Repository repository, ObjectId id) {
     try {
-      return Optional.of(repository.open(id, OBJ_BLOB)
-          .getCachedBytes(Integer.MAX_VALUE));
+      return Optional.of(repository.open(id, OBJ_BLOB).getCachedBytes(Integer.MAX_VALUE));
     } catch (Exception e) {
       // TODO: are we sure we want to swallow this exception?
       log.error("Unexpected error while reading Git Object " + id, e);
       return Optional.empty();
     }
   }
-
 }
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/Matcher.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/Matcher.java
index 401de9a..df0df2b 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/Matcher.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/Matcher.java
@@ -15,7 +15,6 @@
 package com.vmware.gerrit.owners.common;
 
 import com.google.gerrit.reviewdb.client.Account;
-
 import java.util.Set;
 
 public abstract class Matcher {
@@ -44,10 +43,9 @@
     this.path = path;
   }
 
-
   public String getPath() {
     return path;
   }
 
-  abstract public boolean matches(String pathToMatch);
+  public abstract boolean matches(String pathToMatch);
 }
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersConfig.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersConfig.java
index fb54fd3..e827691 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersConfig.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersConfig.java
@@ -18,35 +18,33 @@
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-
 import java.util.Map;
 import java.util.Set;
 
 /**
  * OWNERS file model.
- * <p/>
- * Used for de-serializing the OWNERS files.
+ *
+ * <p>Used for de-serializing the OWNERS files.
  */
 public class OwnersConfig {
-  /**
-   * Flag for marking that this OWNERS file inherits from the parent OWNERS.
-   */
+  /** Flag for marking that this OWNERS file inherits from the parent OWNERS. */
   private boolean inherited = true;
 
-  /**
-   * Set of OWNER email addresses.
-   */
+  /** Set of OWNER email addresses. */
   private Set<String> owners = Sets.newHashSet();
 
-  /**
-   * Map name of matcher and Matcher (value + Set Owners)
-   */
-  private Map<String,Matcher> matchers = Maps.newHashMap();
+  /** Map name of matcher and Matcher (value + Set Owners) */
+  private Map<String, Matcher> matchers = Maps.newHashMap();
 
   @Override
   public String toString() {
-    return "OwnersConfig [inherited=" + inherited + ", owners=" + owners
-        + ", matchers=" + matchers + "]";
+    return "OwnersConfig [inherited="
+        + inherited
+        + ", owners="
+        + owners
+        + ", matchers="
+        + matchers
+        + "]";
   }
 
   public boolean isInherited() {
@@ -65,7 +63,7 @@
     this.owners = owners;
   }
 
-  public Map<String,Matcher> getMatchers() {
+  public Map<String, Matcher> getMatchers() {
     return matchers;
   }
 
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersMap.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersMap.java
index 5167d19..30f796c 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersMap.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/OwnersMap.java
@@ -20,48 +20,54 @@
 import com.google.common.collect.Sets;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Account.Id;
-
 import java.util.Map;
 import java.util.Set;
 
 public class OwnersMap {
   private SetMultimap<String, Account.Id> pathOwners = HashMultimap.create();
-  private Map<String,Matcher> matchers = Maps.newHashMap();
-  private Map<String,Set<Account.Id>> fileOwners = Maps.newHashMap();
+  private Map<String, Matcher> matchers = Maps.newHashMap();
+  private Map<String, Set<Account.Id>> fileOwners = Maps.newHashMap();
 
   @Override
   public String toString() {
-    return "OwnersMap [pathOwners=" + pathOwners + ", matchers=" + matchers
-        + "]";
+    return "OwnersMap [pathOwners=" + pathOwners + ", matchers=" + matchers + "]";
   }
+
   public void setMatchers(Map<String, Matcher> matchers) {
     this.matchers = matchers;
   }
+
   public SetMultimap<String, Account.Id> getPathOwners() {
     return pathOwners;
   }
+
   public void setPathOwners(SetMultimap<String, Account.Id> pathOwners) {
     this.pathOwners = pathOwners;
   }
-  public Map<String,Matcher> getMatchers() {
+
+  public Map<String, Matcher> getMatchers() {
     return matchers;
   }
-  public void addMatchers(Map<String,Matcher> matchers) {
+
+  public void addMatchers(Map<String, Matcher> matchers) {
     this.matchers.putAll(matchers);
   }
+
   public void addPathOwners(String ownersPath, Set<Id> owners) {
     pathOwners.putAll(ownersPath, owners);
   }
-  public Map<String,Set<Id>> getFileOwners() {
+
+  public Map<String, Set<Id>> getFileOwners() {
     return fileOwners;
   }
+
   public void addFileOwners(String file, Set<Id> owners) {
-    if(owners.isEmpty()) {
+    if (owners.isEmpty()) {
       return;
     }
 
     Set<Id> set = fileOwners.get(file);
-    if(set!=null) {
+    if (set != null) {
       // add new owners removing duplicates
       set.addAll(owners);
     } else {
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PartialRegExMatcher.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PartialRegExMatcher.java
index 85b10c2..e33704b 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PartialRegExMatcher.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PartialRegExMatcher.java
@@ -16,21 +16,20 @@
 package com.vmware.gerrit.owners.common;
 
 import com.google.gerrit.reviewdb.client.Account;
-
 import java.util.Set;
 import java.util.regex.Pattern;
 
 // Javascript like regular expression matching substring
 public class PartialRegExMatcher extends Matcher {
   Pattern pattern;
+
   public PartialRegExMatcher(String path, Set<Account.Id> owners) {
     super(path, owners);
-    pattern = Pattern.compile(".*"+path+".*");
-
+    pattern = Pattern.compile(".*" + path + ".*");
   }
+
   @Override
   public boolean matches(String pathToMatch) {
     return pattern.matcher(pathToMatch).matches();
   }
-
-}
\ No newline at end of file
+}
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java
index 70a1af4..0e3da7c 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java
@@ -18,18 +18,6 @@
 
 import static com.vmware.gerrit.owners.common.JgitWrapper.getBlobAsBytes;
 
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.SetMultimap;
@@ -40,10 +28,18 @@
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.lib.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-/**
- * Calculates the owners of a patch list.
- */
+/** Calculates the owners of a patch list. */
 // TODO(vspivak): provide assisted factory
 public class PathOwners {
 
@@ -108,9 +104,9 @@
               .orElse(new PathOwnersEntry());
 
       PathOwnersEntry rootEntry =
-          getOwnersConfig(rootPath, branch).map(
-              conf -> new PathOwnersEntry(rootPath, conf, accounts, Collections
-                  .emptySet())).orElse(new PathOwnersEntry());
+          getOwnersConfig(rootPath, branch)
+              .map(conf -> new PathOwnersEntry(rootPath, conf, accounts, Collections.emptySet()))
+              .orElse(new PathOwnersEntry());
 
       Set<String> modifiedPaths = getModifiedPaths();
       Map<String, PathOwnersEntry> entries = new HashMap<>();
@@ -119,13 +115,12 @@
         currentEntry = resolvePathEntry(path, branch, projectEntry, rootEntry, entries);
 
         // add owners to file for matcher predicates
-        ownersMap.addFileOwners(path,currentEntry.getOwners());
+        ownersMap.addFileOwners(path, currentEntry.getOwners());
 
         // Only add the path to the OWNERS file to reduce the number of
         // entries in the result
         if (currentEntry.getOwnersPath() != null) {
-          ownersMap.addPathOwners(currentEntry.getOwnersPath(),
-              currentEntry.getOwners());
+          ownersMap.addPathOwners(currentEntry.getOwnersPath(), currentEntry.getOwners());
         }
         ownersMap.addMatchers(currentEntry.getMatchers());
       }
@@ -149,8 +144,11 @@
     }
   }
 
-  private void processMatcherPerPath(Map<String, Matcher> fullMatchers,
-      HashMap<String, Matcher> newMatchers, String path, OwnersMap ownersMap) {
+  private void processMatcherPerPath(
+      Map<String, Matcher> fullMatchers,
+      HashMap<String, Matcher> newMatchers,
+      String path,
+      OwnersMap ownersMap) {
     Iterator<Matcher> it = fullMatchers.values().iterator();
     while (it.hasNext()) {
       Matcher matcher = it.next();
@@ -173,8 +171,8 @@
     StringBuilder builder = new StringBuilder();
 
     if (rootEntry.isInherited()) {
-      for(Matcher matcher : projectEntry.getMatchers().values()) {
-        if(!currentEntry.hasMatcher(matcher.getPath())) {
+      for (Matcher matcher : projectEntry.getMatchers().values()) {
+        if (!currentEntry.hasMatcher(matcher.getPath())) {
           currentEntry.addMatcher(matcher);
         }
       }
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwnersEntry.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwnersEntry.java
index c56d5fd..856a20b 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwnersEntry.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwnersEntry.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.gerrit.reviewdb.client.Account;
-
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
@@ -27,9 +26,8 @@
 
 /**
  * Path Owners Entry.
- * <p/>
- * Used internally by PathOwners to represent and compute the owners at a
- * specific path.
+ *
+ * <p>Used internally by PathOwners to represent and compute the owners at a specific path.
  */
 class PathOwnersEntry {
   private final boolean inherited;
@@ -38,11 +36,14 @@
     inherited = true;
   }
 
-  public PathOwnersEntry(String path, OwnersConfig config, Accounts accounts,
-      Set<Account.Id> inheritedOwners) {
+  public PathOwnersEntry(
+      String path, OwnersConfig config, Accounts accounts, Set<Account.Id> inheritedOwners) {
     this.ownersPath = path;
     this.owners =
-        config.getOwners().stream().flatMap(o -> accounts.find(o).stream())
+        config
+            .getOwners()
+            .stream()
+            .flatMap(o -> accounts.find(o).stream())
             .collect(Collectors.toSet());
     if (config.isInherited()) {
       this.owners.addAll(inheritedOwners);
@@ -53,8 +54,13 @@
 
   @Override
   public String toString() {
-    return "PathOwnersEntry [ownersPath=" + ownersPath + ", owners=" + owners
-        + ", matchers=" + matchers + "]";
+    return "PathOwnersEntry [ownersPath="
+        + ownersPath
+        + ", owners="
+        + owners
+        + ", matchers="
+        + matchers
+        + "]";
   }
 
   private String ownersPath;
@@ -62,7 +68,6 @@
 
   private Map<String, Matcher> matchers = Maps.newHashMap();
 
-
   public void addMatcher(Matcher matcher) {
     this.matchers.put(matcher.getPath(), matcher);
   }
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/RegExMatcher.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/RegExMatcher.java
index f76da14..c4b13ff 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/RegExMatcher.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/RegExMatcher.java
@@ -16,20 +16,19 @@
 package com.vmware.gerrit.owners.common;
 
 import com.google.gerrit.reviewdb.client.Account;
-
 import java.util.Set;
 import java.util.regex.Pattern;
 
 public class RegExMatcher extends Matcher {
   Pattern pattern;
+
   public RegExMatcher(String path, Set<Account.Id> owners) {
     super(path, owners);
     pattern = Pattern.compile(path);
-
   }
+
   @Override
   public boolean matches(String pathToMatch) {
     return pattern.matcher(pathToMatch).matches();
   }
-
-}
\ No newline at end of file
+}
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/SuffixMatcher.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/SuffixMatcher.java
index cbbe7f9..d7a481f 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/SuffixMatcher.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/SuffixMatcher.java
@@ -16,7 +16,6 @@
 package com.vmware.gerrit.owners.common;
 
 import com.google.gerrit.reviewdb.client.Account;
-
 import java.util.Set;
 
 public class SuffixMatcher extends Matcher {
@@ -28,4 +27,4 @@
   public boolean matches(String pathToMatch) {
     return pathToMatch.endsWith(path);
   }
-}
\ No newline at end of file
+}
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/ClassicConfig.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/ClassicConfig.java
index 7384dc8..ee14e25 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/ClassicConfig.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/ClassicConfig.java
@@ -14,9 +14,8 @@
 
 package com.vmware.gerrit.owners.common;
 
-import org.junit.Ignore;
-
 import com.google.gerrit.reviewdb.client.Account;
+import org.junit.Ignore;
 
 @Ignore
 public class ClassicConfig extends Config {
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java
index 148e116..81aa76f 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java
@@ -18,21 +18,19 @@
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import org.eclipse.jgit.lib.Repository;
-import org.junit.Ignore;
-import org.powermock.api.easymock.PowerMock;
-
 import com.google.common.base.Charsets;
 import com.google.gerrit.reviewdb.client.Patch;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Ignore;
+import org.powermock.api.easymock.PowerMock;
 
 @Ignore
 public abstract class Config {
@@ -52,15 +50,17 @@
 
   void expectConfig(String path, String config) throws IOException {
     expect(
-        JgitWrapper.getBlobAsBytes(anyObject(Repository.class),
-            anyObject(String.class), eq(path))).andReturn(
-        Optional.of(config.getBytes())).anyTimes();
+            JgitWrapper.getBlobAsBytes(
+                anyObject(Repository.class), anyObject(String.class), eq(path)))
+        .andReturn(Optional.of(config.getBytes()))
+        .anyTimes();
   }
 
   void expectNoConfig(String path) throws IOException {
     expect(
-        JgitWrapper.getBlobAsBytes(anyObject(Repository.class),
-            anyObject(String.class), eq(path))).andReturn(Optional.empty())
+            JgitWrapper.getBlobAsBytes(
+                anyObject(Repository.class), anyObject(String.class), eq(path)))
+        .andReturn(Optional.empty())
         .anyTimes();
   }
 
@@ -71,16 +71,14 @@
   void creatingPatchList(List<String> names) {
     patchList = PowerMock.createMock(PatchList.class);
     List<PatchListEntry> entries =
-        names.stream().map(name -> expectEntry(name))
-            .collect(Collectors.toList());
+        names.stream().map(name -> expectEntry(name)).collect(Collectors.toList());
     expect(patchList.getPatches()).andReturn(entries);
   }
 
   PatchListEntry expectEntry(String name) {
     PatchListEntry entry = PowerMock.createMock(PatchListEntry.class);
     expect(entry.getNewName()).andReturn(name).anyTimes();
-    expect(entry.getChangeType()).andReturn(Patch.ChangeType.MODIFIED)
-        .anyTimes();
+    expect(entry.getChangeType()).andReturn(Patch.ChangeType.MODIFIED).anyTimes();
     expect(entry.getDeletions()).andReturn(1);
     expect(entry.getInsertions()).andReturn(1);
     return entry;
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java
index 1b77177..77dc597 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java
@@ -18,18 +18,16 @@
 import static org.junit.Assert.assertTrue;
 import static org.powermock.api.easymock.PowerMock.replayAll;
 
+import com.google.gerrit.reviewdb.client.Account;
 import java.util.Arrays;
 import java.util.Optional;
 import java.util.Set;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import com.google.gerrit.reviewdb.client.Account;
-
 @RunWith(PowerMockRunner.class)
 @PrepareForTest(JgitWrapper.class)
 public class PathOwnersTest extends ClassicConfig {
@@ -43,8 +41,7 @@
   @Test
   public void testClassic() throws Exception {
     expectNoConfig("OWNERS");
-    expectConfig("classic/OWNERS",
-        createConfig(false, owners(USER_A_EMAIL_COM, USER_B_EMAIL_COM)));
+    expectConfig("classic/OWNERS", createConfig(false, owners(USER_A_EMAIL_COM, USER_B_EMAIL_COM)));
 
     creatingPatchList(Arrays.asList("classic/file.txt"));
     replayAll();
@@ -59,8 +56,7 @@
   @Test
   public void testClassicWithInheritance() throws Exception {
     expectConfig("OWNERS", createConfig(true, owners(USER_C_EMAIL_COM)));
-    expectConfig("classic/OWNERS",
-        createConfig(true, owners(USER_A_EMAIL_COM, USER_B_EMAIL_COM)));
+    expectConfig("classic/OWNERS", createConfig(true, owners(USER_A_EMAIL_COM, USER_B_EMAIL_COM)));
 
     creatingPatchList(Arrays.asList("classic/file.txt"));
     replayAll();
@@ -79,8 +75,7 @@
   public void testClassicWithInheritanceAndDeepNesting() throws Exception {
     expectConfig("OWNERS", createConfig(true, owners(USER_C_EMAIL_COM)));
     expectConfig("dir/OWNERS", createConfig(true, owners(USER_B_EMAIL_COM)));
-    expectConfig("dir/subdir/OWNERS",
-        createConfig(true, owners(USER_A_EMAIL_COM)));
+    expectConfig("dir/subdir/OWNERS", createConfig(true, owners(USER_A_EMAIL_COM)));
 
     creatingPatchList(Arrays.asList("dir/subdir/file.txt"));
     replayAll();
@@ -96,14 +91,11 @@
 
   @Test
   public void testParsingYaml() {
-    String yamlString = (
-        "inherited: true\n" +
-        "owners:\n" +
-        "- " + USER_C_EMAIL_COM);
+    String yamlString = ("inherited: true\nowners:\n- " + USER_C_EMAIL_COM);
     Optional<OwnersConfig> config = getOwnersConfig(yamlString);
     assertTrue(config.isPresent());
     assertTrue(config.get().isInherited());
-    assertEquals(1,config.get().getOwners().size());
+    assertEquals(1, config.get().getOwners().size());
     assertTrue(config.get().getOwners().contains(USER_C_EMAIL_COM));
   }
 }
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexMatcherTest.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexMatcherTest.java
index cf0d29c..747912b 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexMatcherTest.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexMatcherTest.java
@@ -32,11 +32,10 @@
   }
 
   @Test
-  public void testFloatingRegex(){
+  public void testFloatingRegex() {
     PartialRegExMatcher matcher = new PartialRegExMatcher("a.*.sql", null);
     assertTrue(matcher.matches("xxxxxxx/alfa.sql"));
     assertTrue(matcher.matches("alfa.sqlxxxxx"));
     assertFalse(matcher.matches("alfa.bar"));
   }
-
 }
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java
index f06edb7..51cf937 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java
@@ -24,6 +24,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.powermock.api.easymock.PowerMock.replayAll;
 
+import com.google.gerrit.reviewdb.client.Account;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -31,15 +32,12 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import com.google.gerrit.reviewdb.client.Account;
-
 @RunWith(PowerMockRunner.class)
 @PrepareForTest(JgitWrapper.class)
 public class RegexTest extends Config {
@@ -78,9 +76,9 @@
         createConfig(
             true,
             owners(ACCOUNT_A),
-                suffixMatcher(".sql", ACCOUNT_B, ACCOUNT_C),
-                regexMatcher(".*/a.*", ACCOUNT_D),
-                partialRegexMatcher("Product.sql", ACCOUNT_A));
+            suffixMatcher(".sql", ACCOUNT_B, ACCOUNT_C),
+            regexMatcher(".*/a.*", ACCOUNT_D),
+            partialRegexMatcher("Product.sql", ACCOUNT_A));
     // the function to test
     Optional<OwnersConfig> configNullable = getOwnersConfig(fullConfig);
     // check classical configuration
@@ -112,7 +110,6 @@
     Set<Account.Id> dbOwners = dbMatcher.getOwners();
     assertTrue(dbOwners.contains(ACCOUNT_D_ID));
 
-
     // partial_regex matcher
     Matcher partial = matchers.get("Product.sql");
     assertEquals(1, partial.getOwners().size());
@@ -123,24 +120,30 @@
   @Test
   public void checkMatchers() throws Exception {
     String parentConfig =
-        createConfig(true, owners(ACCOUNT_A),
+        createConfig(
+            true,
+            owners(ACCOUNT_A),
             suffixMatcher(".sql", ACCOUNT_B, ACCOUNT_C),
             regexMatcher(".*/a.*", ACCOUNT_D));
     String childConfig =
-        createConfig(true, owners(ACCOUNT_F),
+        createConfig(
+            true,
+            owners(ACCOUNT_F),
             exactMatcher("project/file.txt", ACCOUNT_D, ACCOUNT_E),
             partialRegexMatcher("alfa", ACCOUNT_A));
 
     expectConfig("OWNERS", parentConfig);
     expectConfig("project/OWNERS", childConfig);
 
-    creatingPatchList(Arrays.asList("project/file.txt", // matches exact in
-                                                        // project owners d,e
-        "file1.txt", // no matches so nothing for this
-        "project/afile2.sql", // matches two matchers so we have b,c,d
-        "project/bfile.txt",  // no matching
-        "projectalfa", // matches PartialRegex
-        "project/file.sql")); // only .sql matching b,c
+    creatingPatchList(
+        Arrays.asList(
+            "project/file.txt", // matches exact in
+            // project owners d,e
+            "file1.txt", // no matches so nothing for this
+            "project/afile2.sql", // matches two matchers so we have b,c,d
+            "project/bfile.txt", // no matching
+            "projectalfa", // matches PartialRegex
+            "project/file.sql")); // only .sql matching b,c
     replayAll();
 
     // function under test
@@ -156,9 +159,9 @@
 
     // asserts we have 1 exact matcher
     List<Entry<String, Matcher>> onlyExacts =
-        iteratorStream(matchers.entrySet().iterator()).filter(
-            entry -> entry.getValue() instanceof ExactMatcher).collect(
-            Collectors.toList());
+        iteratorStream(matchers.entrySet().iterator())
+            .filter(entry -> entry.getValue() instanceof ExactMatcher)
+            .collect(Collectors.toList());
     assertEquals(1, onlyExacts.size());
     assertEquals("project/file.txt", onlyExacts.get(0).getKey());
 
@@ -172,7 +175,7 @@
 
     // ... 1 partial regex matcher
     List<Entry<String, Matcher>> partialRegexList =
-       iteratorStream(matchers.entrySet().iterator())
+        iteratorStream(matchers.entrySet().iterator())
             .filter(entry -> entry.getValue() instanceof PartialRegExMatcher)
             .collect(Collectors.toList());
     assertEquals(1, partialRegexList.size());
@@ -180,25 +183,25 @@
 
     // .... 1 suffix matcher
     List<Entry<String, Matcher>> suffixList =
-        iteratorStream(matchers.entrySet().iterator()).filter(
-            entry -> entry.getValue() instanceof SuffixMatcher).collect(
-            Collectors.toList());
+        iteratorStream(matchers.entrySet().iterator())
+            .filter(entry -> entry.getValue() instanceof SuffixMatcher)
+            .collect(Collectors.toList());
     assertEquals(1, suffixList.size());
     assertEquals(".sql", suffixList.get(0).getKey());
 
     // now checks file owners as well
     Map<String, Set<Account.Id>> fileOwners = owners.getFileOwners();
-    assertEquals(6,fileOwners.size());
+    assertEquals(6, fileOwners.size());
 
     Set<Account.Id> set1 = fileOwners.get("project/file.txt");
-    assertEquals(4,set1.size()); // includes classic owners a and f
+    assertEquals(4, set1.size()); // includes classic owners a and f
     assertTrue(set1.contains(ACCOUNT_A_ID));
     assertTrue(set1.contains(ACCOUNT_D_ID));
     assertTrue(set1.contains(ACCOUNT_E_ID));
     assertTrue(set1.contains(ACCOUNT_F_ID));
 
     Set<Account.Id> set2 = fileOwners.get("project/afile2.sql");
-    assertEquals(5,set2.size());
+    assertEquals(5, set2.size());
     assertTrue(set2.contains(ACCOUNT_A_ID));
     assertTrue(set2.contains(ACCOUNT_B_ID));
     assertTrue(set2.contains(ACCOUNT_C_ID));
@@ -206,14 +209,14 @@
     assertTrue(set2.contains(ACCOUNT_F_ID));
 
     Set<Account.Id> set3 = fileOwners.get("project/file.sql");
-    assertEquals(4,set3.size());
+    assertEquals(4, set3.size());
     assertTrue(set3.contains(ACCOUNT_A_ID));
     assertTrue(set3.contains(ACCOUNT_B_ID));
     assertTrue(set3.contains(ACCOUNT_C_ID));
     assertTrue(set3.contains(ACCOUNT_F_ID));
 
     Set<Account.Id> set4 = fileOwners.get("projectalfa");
-    assertEquals(1,set4.size()); // only 1 because a is class and alfa owner
+    assertEquals(1, set4.size()); // only 1 because a is class and alfa owner
     assertTrue(set4.contains(ACCOUNT_A_ID));
   }
 
@@ -222,8 +225,7 @@
     replayAll();
 
     Optional<OwnersConfig> ownersConfigOpt =
-        getOwnersConfig(createConfig(false, new String[0],
-            suffixMatcher(".txt", ACCOUNT_B)));
+        getOwnersConfig(createConfig(false, new String[0], suffixMatcher(".txt", ACCOUNT_B)));
 
     assertThat(ownersConfigOpt.isPresent()).named("ownersConfig").isTrue();
     OwnersConfig ownersConfig = ownersConfigOpt.get();
@@ -234,8 +236,7 @@
 
   @Test
   public void testkRegexShouldMatchOnlyOnSuffix() throws Exception {
-    String configString =
-        createConfig(false, new String[0], suffixMatcher(".sql", ACCOUNT_B));
+    String configString = createConfig(false, new String[0], suffixMatcher(".sql", ACCOUNT_B));
 
     expectConfig("OWNERS", configString);
     expectNoConfig("project/OWNERS");
@@ -247,4 +248,4 @@
     Set<String> ownedFiles = owners.getFileOwners().keySet();
     assertThat(ownedFiles).containsExactly("project/file.sql");
   }
-}
\ No newline at end of file
+}
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/TestAccounts.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/TestAccounts.java
index cb74748..7141931 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/TestAccounts.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/TestAccounts.java
@@ -14,19 +14,16 @@
 
 package com.vmware.gerrit.owners.common;
 
+import com.google.gerrit.reviewdb.client.Account;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
-
 import org.junit.Ignore;
 
-import com.google.gerrit.reviewdb.client.Account;
-
 @Ignore
-public class TestAccounts extends HashMap<String, Account.Id> implements
-    Accounts {
+public class TestAccounts extends HashMap<String, Account.Id> implements Accounts {
   private static final long serialVersionUID = 1L;
 
   @Override
diff --git a/owners/src/main/java/com/vmware/gerrit/owners/CompileStub.java b/owners/src/main/java/com/vmware/gerrit/owners/CompileStub.java
index 8f1e94f..66be624 100644
--- a/owners/src/main/java/com/vmware/gerrit/owners/CompileStub.java
+++ b/owners/src/main/java/com/vmware/gerrit/owners/CompileStub.java
@@ -15,8 +15,5 @@
 
 package com.vmware.gerrit.owners;
 
-/**
- * A stub class only used for pleasing BUCK.
- */
-public class CompileStub {
-}
+/** A stub class only used for pleasing BUCK. */
+public class CompileStub {}
diff --git a/owners/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java b/owners/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java
index 13fabb5..0470aea 100644
--- a/owners/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java
+++ b/owners/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java
@@ -16,16 +16,13 @@
 
 package com.vmware.gerrit.owners;
 
-
 import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.extensions.annotations.Listen;
 import com.google.gerrit.rules.PredicateProvider;
 import com.google.inject.Inject;
 import com.vmware.gerrit.owners.common.Accounts;
 
-/**
- * Gerrit OWNERS Prolog Predicate Provider.
- */
+/** Gerrit OWNERS Prolog Predicate Provider. */
 @Listen
 public class OwnerPredicateProvider implements PredicateProvider {
   @Inject
diff --git a/owners/src/main/java/com/vmware/gerrit/owners/OwnersModule.java b/owners/src/main/java/com/vmware/gerrit/owners/OwnersModule.java
index 0295002..3b5b567 100644
--- a/owners/src/main/java/com/vmware/gerrit/owners/OwnersModule.java
+++ b/owners/src/main/java/com/vmware/gerrit/owners/OwnersModule.java
@@ -15,15 +15,13 @@
 
 package com.vmware.gerrit.owners;
 
-import com.google.gerrit.rules.PredicateProvider;
 import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.rules.PredicateProvider;
 import com.google.inject.AbstractModule;
 
-
 public class OwnersModule extends AbstractModule {
   @Override
   protected void configure() {
-    DynamicSet.bind(binder(), PredicateProvider.class)
-        .to(OwnerPredicateProvider.class);
+    DynamicSet.bind(binder(), PredicateProvider.class).to(OwnerPredicateProvider.class);
   }
 }
diff --git a/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java b/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java
index 9c2e27f..97502b1 100644
--- a/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java
+++ b/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java
@@ -16,28 +16,23 @@
 
 package com.vmware.gerrit.owners;
 
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import com.google.gerrit.rules.StoredValue;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.patch.PatchList;
 import com.googlecode.prolog_cafe.lang.Prolog;
 import com.vmware.gerrit.owners.common.Accounts;
 import com.vmware.gerrit.owners.common.PathOwners;
+import org.eclipse.jgit.lib.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-
-/**
- * StoredValues for the Gerrit OWNERS plugin.
- */
+/** StoredValues for the Gerrit OWNERS plugin. */
 public class OwnersStoredValues {
   private static final Logger log = LoggerFactory.getLogger(OwnersStoredValues.class);
 
   public static StoredValue<PathOwners> PATH_OWNERS;
 
-  synchronized
-  public static void initialize(Accounts accounts) {
+  public static synchronized void initialize(Accounts accounts) {
     if (PATH_OWNERS != null) {
       return;
     }
@@ -54,6 +49,5 @@
         };
   }
 
-  private OwnersStoredValues() {
-  }
+  private OwnersStoredValues() {}
 }
diff --git a/owners/src/main/java/gerrit_owners/PRED_file_owners_2.java b/owners/src/main/java/gerrit_owners/PRED_file_owners_2.java
index 3bdcc1a..06557e2 100644
--- a/owners/src/main/java/gerrit_owners/PRED_file_owners_2.java
+++ b/owners/src/main/java/gerrit_owners/PRED_file_owners_2.java
@@ -20,7 +20,6 @@
 import com.google.gerrit.rules.PrologEnvironment;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.IdentifiedUser;
-
 import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.Operation;
@@ -31,16 +30,14 @@
 import com.googlecode.prolog_cafe.lang.VariableTerm;
 import com.vmware.gerrit.owners.OwnersStoredValues;
 import com.vmware.gerrit.owners.common.PathOwners;
-
 import java.io.File;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
- * Get the list of users owning this file Actually a variation of
- * PRED_current_user/2 in gerrit main module, sharing its cache.. This is really
- * needed to avoid prolog consuming rules and RAM space
+ * Get the list of users owning this file Actually a variation of PRED_current_user/2 in gerrit main
+ * module, sharing its cache.. This is really needed to avoid prolog consuming rules and RAM space
  *
  * <pre>
  *   gerrit_owners:file_owners(+FilePath, -UserListFormatted).
@@ -86,8 +83,9 @@
     String path = key.toString();
     PathOwners owners = OwnersStoredValues.PATH_OWNERS.get(engine);
     Set<String> ownersNames =
-        iteratorStream(owners.getFileOwners().get(path).iterator()).map(
-            id -> getFullNameFromId(engine, id)).collect(Collectors.toSet());
+        iteratorStream(owners.getFileOwners().get(path).iterator())
+            .map(id -> getFullNameFromId(engine, id))
+            .collect(Collectors.toSet());
     String ownVerb = ownersNames.size() > 1 ? " own " : " owns ";
     String userNames = ownersNames.stream().collect(Collectors.joining(", "));
     return SymbolTerm.create(userNames + ownVerb + (new File(path)).getName());
diff --git a/owners/src/main/java/gerrit_owners/PRED_matcher_owner_2.java b/owners/src/main/java/gerrit_owners/PRED_matcher_owner_2.java
index a3bbe3f..3afc6c7 100644
--- a/owners/src/main/java/gerrit_owners/PRED_matcher_owner_2.java
+++ b/owners/src/main/java/gerrit_owners/PRED_matcher_owner_2.java
@@ -16,9 +16,6 @@
 
 package gerrit_owners;
 
-import java.util.Iterator;
-import java.util.Map;
-
 import com.google.gerrit.reviewdb.client.Account;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.IntegerTerm;
@@ -31,10 +28,10 @@
 import com.googlecode.prolog_cafe.lang.Term;
 import com.vmware.gerrit.owners.OwnersStoredValues;
 import com.vmware.gerrit.owners.common.PathOwners;
+import java.util.Iterator;
+import java.util.Map;
 
-/**
- * 'owner'(-Path, -User)
- */
+/** 'owner'(-Path, -User) */
 public class PRED_matcher_owner_2 extends Predicate.P2 {
 
   private static final PRED_owner_check OWNER_CHECK = new PRED_owner_check();
@@ -118,5 +115,4 @@
       return engine.jtry3(OWNER_CHECK, OWNER_NEXT);
     }
   }
-
 }
diff --git a/owners/src/main/java/gerrit_owners/PRED_matcher_path_1.java b/owners/src/main/java/gerrit_owners/PRED_matcher_path_1.java
index 0fe7ad9..3cb3bb9 100644
--- a/owners/src/main/java/gerrit_owners/PRED_matcher_path_1.java
+++ b/owners/src/main/java/gerrit_owners/PRED_matcher_path_1.java
@@ -16,8 +16,6 @@
 
 package gerrit_owners;
 
-import java.util.Iterator;
-
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
 import com.googlecode.prolog_cafe.lang.Operation;
@@ -27,10 +25,9 @@
 import com.googlecode.prolog_cafe.lang.Term;
 import com.vmware.gerrit.owners.OwnersStoredValues;
 import com.vmware.gerrit.owners.common.PathOwners;
+import java.util.Iterator;
 
-/**
- * 'owner_path'(-Path)
- */
+/** 'owner_path'(-Path) */
 public class PRED_matcher_path_1 extends Predicate.P1 {
 
   private static final PRED_owner_path_check OWNER_PATH_CHECK = new PRED_owner_path_check();
@@ -96,5 +93,4 @@
       return engine.jtry2(OWNER_PATH_CHECK, OWNER_PATH_NEXT);
     }
   }
-
 }
diff --git a/owners/src/main/java/gerrit_owners/PRED_owner_2.java b/owners/src/main/java/gerrit_owners/PRED_owner_2.java
index 444e411..92b77c9 100644
--- a/owners/src/main/java/gerrit_owners/PRED_owner_2.java
+++ b/owners/src/main/java/gerrit_owners/PRED_owner_2.java
@@ -16,9 +16,6 @@
 
 package gerrit_owners;
 
-import com.vmware.gerrit.owners.OwnersStoredValues;
-import com.vmware.gerrit.owners.common.PathOwners;
-
 import com.google.gerrit.reviewdb.client.Account;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.IntegerTerm;
@@ -29,13 +26,12 @@
 import com.googlecode.prolog_cafe.lang.StructureTerm;
 import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
-
+import com.vmware.gerrit.owners.OwnersStoredValues;
+import com.vmware.gerrit.owners.common.PathOwners;
 import java.util.Iterator;
 import java.util.Map;
 
-/**
- * 'owner'(-Path, -User)
- */
+/** 'owner'(-Path, -User) */
 public class PRED_owner_2 extends Predicate.P2 {
 
   private static final PRED_owner_check OWNER_CHECK = new PRED_owner_check();
@@ -114,5 +110,4 @@
       return engine.jtry3(OWNER_CHECK, OWNER_NEXT);
     }
   }
-
 }
diff --git a/owners/src/main/java/gerrit_owners/PRED_owner_path_1.java b/owners/src/main/java/gerrit_owners/PRED_owner_path_1.java
index 23e1f06..90936e0 100644
--- a/owners/src/main/java/gerrit_owners/PRED_owner_path_1.java
+++ b/owners/src/main/java/gerrit_owners/PRED_owner_path_1.java
@@ -16,8 +16,6 @@
 
 package gerrit_owners;
 
-import com.vmware.gerrit.owners.OwnersStoredValues;
-import com.vmware.gerrit.owners.common.PathOwners;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
 import com.googlecode.prolog_cafe.lang.Operation;
@@ -25,12 +23,11 @@
 import com.googlecode.prolog_cafe.lang.Prolog;
 import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
-
+import com.vmware.gerrit.owners.OwnersStoredValues;
+import com.vmware.gerrit.owners.common.PathOwners;
 import java.util.Iterator;
 
-/**
- * 'owner_path'(-Path)
- */
+/** 'owner_path'(-Path) */
 public class PRED_owner_path_1 extends Predicate.P1 {
 
   private static final PRED_owner_path_check OWNER_PATH_CHECK = new PRED_owner_path_check();
@@ -99,5 +96,4 @@
       return engine.jtry2(OWNER_PATH_CHECK, OWNER_PATH_NEXT);
     }
   }
-
 }
