diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
index 07e5d8f..b3f62de 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
@@ -37,14 +37,12 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 class AccountUtil {
@@ -76,12 +74,13 @@
   }
 
   Account.Id resolveUser(GerritApi api, AccountInfo acc)
-      throws NoSuchAccountException, IOException, OrmException,
-      RestApiException, ConfigInvalidException {
+      throws NoSuchAccountException, IOException, OrmException, RestApiException,
+          ConfigInvalidException {
     if (acc.username == null) {
-      throw new NoSuchAccountException(String.format(
-          "User %s <%s> (%s) doesn't have a username and cannot be looked up.",
-          acc.name, acc.email, acc._accountId));
+      throw new NoSuchAccountException(
+          String.format(
+              "User %s <%s> (%s) doesn't have a username and cannot be looked up.",
+              acc.name, acc.email, acc._accountId));
     }
     AccountState a = accountCache.getByUsername(acc.username);
 
@@ -103,19 +102,19 @@
       }
     }
     if (!Objects.equals(a.getAccount().getPreferredEmail(), acc.email)) {
-      log.warn(String.format(
-          "Email mismatch for user %s: expected %s but found %s",
-          acc.username, acc.email, a.getAccount().getPreferredEmail()));
+      log.warn(
+          String.format(
+              "Email mismatch for user %s: expected %s but found %s",
+              acc.username, acc.email, a.getAccount().getPreferredEmail()));
     }
     return a.getAccount().getId();
   }
 
-  private Account.Id createAccountByLdapAndAddSshKeys(GerritApi api,
-      AccountInfo acc) throws NoSuchAccountException, IOException, OrmException,
-          RestApiException, ConfigInvalidException {
+  private Account.Id createAccountByLdapAndAddSshKeys(GerritApi api, AccountInfo acc)
+      throws NoSuchAccountException, IOException, OrmException, RestApiException,
+          ConfigInvalidException {
     if (!acc.username.matches(Account.USER_NAME_PATTERN)) {
-      throw new NoSuchAccountException(String.format("User %s not found",
-          acc.username));
+      throw new NoSuchAccountException(String.format("User %s not found", acc.username));
     }
 
     try {
@@ -130,8 +129,7 @@
   }
 
   private void addSshKeys(GerritApi api, AccountInfo acc)
-      throws BadRequestException, IOException, OrmException,
-      ConfigInvalidException {
+      throws BadRequestException, IOException, OrmException, ConfigInvalidException {
     List<SshKeyInfo> sshKeys = api.getSshKeys(acc.username);
     AccountState a = accountCache.getByUsername(acc.username);
     for (SshKeyInfo sshKeyInfo : sshKeys) {
@@ -153,8 +151,7 @@
     input.name = acc.name;
 
     AccountInfo accInfo =
-        createAccountFactory.create(username)
-            .apply(TopLevelResource.INSTANCE, input).value();
+        createAccountFactory.create(username).apply(TopLevelResource.INSTANCE, input).value();
     log.info(String.format("Local user '%s' created", username));
 
     Account.Id userId = new Account.Id(accInfo._accountId);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
index 267925f..ac8bf2d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
@@ -33,15 +33,13 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class AddApprovalsStep {
 
@@ -49,8 +47,7 @@
     AddApprovalsStep create(Change change, ChangeInfo changeInfo, boolean resume);
   }
 
-  private static final Logger log = LoggerFactory
-      .getLogger(ReplayInlineCommentsStep.class);
+  private static final Logger log = LoggerFactory.getLogger(ReplayInlineCommentsStep.class);
 
   private final AccountUtil accountUtil;
   private final ChangeUpdate.Factory updateFactory;
@@ -62,7 +59,8 @@
   private final boolean resume;
 
   @Inject
-  public AddApprovalsStep(AccountUtil accountUtil,
+  public AddApprovalsStep(
+      AccountUtil accountUtil,
       ChangeUpdate.Factory updateFactory,
       ReviewDb db,
       IdentifiedUser.GenericFactory genericUserFactory,
@@ -80,12 +78,11 @@
     this.resume = resume;
   }
 
-  void add(GerritApi api) throws OrmException, NoSuchChangeException,
-      IOException, NoSuchAccountException, RestApiException,
-      ConfigInvalidException {
+  void add(GerritApi api)
+      throws OrmException, NoSuchChangeException, IOException, NoSuchAccountException,
+          RestApiException, ConfigInvalidException {
     if (resume) {
-      db.patchSetApprovals().delete(
-          db.patchSetApprovals().byChange(change.getId()));
+      db.patchSetApprovals().delete(db.patchSetApprovals().byChange(change.getId()));
     }
 
     List<PatchSetApproval> approvals = new ArrayList<>();
@@ -97,20 +94,25 @@
           Account.Id user = accountUtil.resolveUser(api, a);
           ChangeData cd = changeDataFactory.create(db, change);
           LabelType labelType = cd.getLabelTypes().byLabel(labelName);
-          if(labelType == null) {
-            log.warn(String.format("Label '%s' not found in target system."
-                + " This label was referenced by an approval provided from '%s'"
-                + " for change '%s'."
-                + " This approval will be skipped. In order to import this"
-                + " approval configure the missing label and resume the import"
-                + " with the force option."
-                , labelName, a.username, changeInfo.id));
+          if (labelType == null) {
+            log.warn(
+                String.format(
+                    "Label '%s' not found in target system."
+                        + " This label was referenced by an approval provided from '%s'"
+                        + " for change '%s'."
+                        + " This approval will be skipped. In order to import this"
+                        + " approval configure the missing label and resume the import"
+                        + " with the force option.",
+                    labelName, a.username, changeInfo.id));
             continue;
           }
           short shortValue = a.value != null ? a.value.shortValue() : 0;
-          approvals.add(new PatchSetApproval(new PatchSetApproval.Key(change
-              .currentPatchSetId(), user, labelType.getLabelId()), shortValue,
-              MoreObjects.firstNonNull(a.date, TimeUtil.nowTs())));
+          approvals.add(
+              new PatchSetApproval(
+                  new PatchSetApproval.Key(
+                      change.currentPatchSetId(), user, labelType.getLabelId()),
+                  shortValue,
+                  MoreObjects.firstNonNull(a.date, TimeUtil.nowTs())));
           ChangeUpdate update = updateFactory.create(cd.notes(), genericUserFactory.create(user));
           if (shortValue != 0) {
             update.putApproval(labelName, shortValue);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
index 676c063..f2d241a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
@@ -24,28 +24,25 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.change.ChangeTriplet;
 import com.google.gerrit.server.change.SetHashtagsOp;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.project.ChangeControl;
 import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
-
+import java.util.HashSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashSet;
-
 class AddHashtagsStep {
 
   interface Factory {
     AddHashtagsStep create(Change change, ChangeInfo changeInfo, boolean resume);
   }
 
-  private static final Logger log = LoggerFactory
-      .getLogger(AddHashtagsStep.class);
+  private static final Logger log = LoggerFactory.getLogger(AddHashtagsStep.class);
 
   private final CurrentUser currentUser;
   private final ChangeControl.GenericFactory changeControlFactory;
@@ -57,7 +54,8 @@
   private final SetHashtagsOp.Factory hashtagsFactory;
 
   @Inject
-  AddHashtagsStep(CurrentUser currentUser,
+  AddHashtagsStep(
+      CurrentUser currentUser,
       ChangeControl.GenericFactory changeControlFactory,
       Provider<ReviewDb> db,
       BatchUpdate.Factory batchUpdateFactory,
@@ -75,38 +73,40 @@
     this.resume = resume;
   }
 
-  void add() throws IllegalArgumentException, OrmException,
-      NoSuchChangeException, UpdateException, RestApiException {
-    ChangeControl ctrl =
-        changeControlFactory.controlFor(db.get(), change, currentUser);
+  void add()
+      throws IllegalArgumentException, OrmException, NoSuchChangeException, UpdateException,
+          RestApiException {
+    ChangeControl ctrl = changeControlFactory.controlFor(db.get(), change, currentUser);
 
     try {
       if (resume) {
         HashtagsInput input = new HashtagsInput();
         input.remove = ctrl.getNotes().load().getHashtags();
-        try (BatchUpdate bu = batchUpdateFactory.create(db.get(),
-            change.getProject(), currentUser, TimeUtil.nowTs())) {
-                  SetHashtagsOp op = hashtagsFactory.create(input);
-                  bu.addOp(change.getId(), op);
-                  bu.execute();
+        try (BatchUpdate bu =
+            batchUpdateFactory.create(
+                db.get(), change.getProject(), currentUser, TimeUtil.nowTs())) {
+          SetHashtagsOp op = hashtagsFactory.create(input);
+          bu.addOp(change.getId(), op);
+          bu.execute();
         }
       }
 
       HashtagsInput input = new HashtagsInput();
       input.add = new HashSet<>(changeInfo.hashtags);
-      try (BatchUpdate bu = batchUpdateFactory.create(db.get(),
-          change.getProject(), currentUser, TimeUtil.nowTs())) {
-                SetHashtagsOp op = hashtagsFactory.create(input);
-                bu.addOp(change.getId(), op);
-                bu.execute();
+      try (BatchUpdate bu =
+          batchUpdateFactory.create(db.get(), change.getProject(), currentUser, TimeUtil.nowTs())) {
+        SetHashtagsOp op = hashtagsFactory.create(input);
+        bu.addOp(change.getId(), op);
+        bu.execute();
       }
     } catch (AuthException e) {
-      log.warn(String.format(
-          "Hashtags cannot be set on change %s because the importing"
-              + " user %s doesn't have permissions to edit hashtags"
-              + " (e.g. assign the 'Edit Hashtags' global capability"
-              + " and resume the import with the force option).",
-          ChangeTriplet.format(change), currentUser.getUserName()));
+      log.warn(
+          String.format(
+              "Hashtags cannot be set on change %s because the importing"
+                  + " user %s doesn't have permissions to edit hashtags"
+                  + " (e.g. assign the 'Edit Hashtags' global capability"
+                  + " and resume the import with the force option).",
+              ChangeTriplet.format(change), currentUser.getUserName()));
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImport.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImport.java
index f5cabb9..731ec1c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImport.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImport.java
@@ -33,39 +33,32 @@
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.importer.CompleteProjectImport.Input;
-
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.internal.storage.file.LockFile;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.Repository;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
 @RequiresCapability(ImportCapability.ID)
 class CompleteProjectImport implements RestModifyView<ImportProjectResource, Input> {
-  public static class Input {
-  }
+  public static class Input {}
 
   private final ProjectsCollection projects;
   private final GitRepositoryManager repoManager;
 
   @Inject
-  CompleteProjectImport(
-      ProjectsCollection projects,
-      GitRepositoryManager repoManager) {
+  CompleteProjectImport(ProjectsCollection projects, GitRepositoryManager repoManager) {
     this.projects = projects;
     this.repoManager = repoManager;
   }
 
   @Override
   public Response<?> apply(ImportProjectResource rsrc, Input input)
-      throws ResourceConflictException, RepositoryNotFoundException,
-      IOException {
+      throws ResourceConflictException, RepositoryNotFoundException, IOException {
     LockFile lock = lockForDelete(rsrc.getName());
     try {
       deleteImportRefs(rsrc.getName());
@@ -76,16 +69,14 @@
     }
   }
 
-  private LockFile lockForDelete(Project.NameKey project)
-      throws ResourceConflictException {
+  private LockFile lockForDelete(Project.NameKey project) throws ResourceConflictException {
     File importStatus = projects.FS_LAYOUT.getImportStatusFile(project.get());
     LockFile lockFile = new LockFile(importStatus);
     try {
       if (lockFile.lock()) {
         return lockFile;
       }
-      throw new ResourceConflictException(
-          "project is being imported from another session");
+      throw new ResourceConflictException("project is being imported from another session");
     } catch (IOException e) {
       throw new ResourceConflictException("failed to lock project for delete");
     }
@@ -94,8 +85,7 @@
   private void deleteImportRefs(Project.NameKey project)
       throws RepositoryNotFoundException, IOException {
     try (Repository repo = repoManager.openRepository(project)) {
-      Map<String, Ref> refs = repo.getRefDatabase().getRefs(
-          ConfigureRepositoryStep.R_IMPORTS);
+      Map<String, Ref> refs = repo.getRefDatabase().getRefs(ConfigureRepositoryStep.R_IMPORTS);
       for (Ref ref : refs.values()) {
         RefUpdate ru = repo.updateRef(ref.getName());
         ru.setForceUpdate(true);
@@ -115,15 +105,15 @@
           case REJECTED_MISSING_OBJECT:
           case REJECTED_OTHER_REASON:
           default:
-            throw new IOException(String.format(
-                "Failed to delete %s, RefUpdate.Result = %s", ref, result));
+            throw new IOException(
+                String.format("Failed to delete %s, RefUpdate.Result = %s", ref, result));
         }
       }
     }
   }
 
-  public static class OnProjects implements
-      RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
+  public static class OnProjects
+      implements RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
     private final ProjectsCollection projectsCollection;
     private final CompleteProjectImport completeProjectImport;
     private final Provider<CurrentUser> currentUserProvider;
@@ -131,7 +121,8 @@
     private final PermissionBackend permissionBackend;
 
     @Inject
-    public OnProjects(ProjectsCollection projectsCollection,
+    public OnProjects(
+        ProjectsCollection projectsCollection,
         CompleteProjectImport completeProjectImport,
         Provider<CurrentUser> currentUserProvider,
         @PluginName String pluginName,
@@ -145,11 +136,10 @@
 
     @Override
     public Response<?> apply(ProjectResource rsrc, Input input)
-        throws ResourceNotFoundException, ResourceConflictException,
-        RepositoryNotFoundException, IOException {
+        throws ResourceNotFoundException, ResourceConflictException, RepositoryNotFoundException,
+            IOException {
       ImportProjectResource projectResource =
-          projectsCollection.parse(new ConfigResource(),
-              IdString.fromDecoded(rsrc.getName()));
+          projectsCollection.parse(new ConfigResource(), IdString.fromDecoded(rsrc.getName()));
       return completeProjectImport.apply(projectResource, input);
     }
 
@@ -158,16 +148,18 @@
       UiAction.Description desc = new UiAction.Description();
 
       try {
-        ImportProjectResource importRsrc = projectsCollection.parse(new ConfigResource(),
-            IdString.fromDecoded(rsrc.getName()));
+        ImportProjectResource importRsrc =
+            projectsCollection.parse(new ConfigResource(), IdString.fromDecoded(rsrc.getName()));
         if (importRsrc.getInfo().from != null) {
           desc.setLabel("Complete Import...")
-              .setTitle("Complete the project import."
-                  + " After completion, resume is not possible anymore.");
+              .setTitle(
+                  "Complete the project import."
+                      + " After completion, resume is not possible anymore.");
         } else {
           desc.setLabel("Complete Copy...")
-              .setTitle("Complete the project copy."
-                  + " After completion, resume is not possible anymore.");
+              .setTitle(
+                  "Complete the project copy."
+                      + " After completion, resume is not possible anymore.");
         }
         desc.setVisible(canCompleteImport(rsrc));
       } catch (IOException | ResourceNotFoundException e) {
@@ -178,10 +170,11 @@
     }
 
     private boolean canCompleteImport(ProjectResource rsrc) {
-      return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER) ||
-        (permissionBackend.user(currentUserProvider).testOrFalse(
-          new PluginPermission(pluginName, ImportCapability.ID))
-            && rsrc.getControl().isOwner());
+      return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER)
+          || (permissionBackend
+                  .user(currentUserProvider)
+                  .testOrFalse(new PluginPermission(pluginName, ImportCapability.ID))
+              && rsrc.getControl().isOwner());
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImportCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImportCommand.java
index 02ff97f..99faa68 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImportCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CompleteProjectImportCommand.java
@@ -19,29 +19,28 @@
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.inject.Inject;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.kohsuke.args4j.Argument;
 
-import java.io.IOException;
-
 @RequiresCapability(ImportCapability.ID)
 @CommandMetaData(name = "complete-project", description = "Completes project import")
 class CompleteProjectImportCommand extends SshCommand {
 
-  @Argument(index = 0, required = true, metaVar = "NAME",
-      usage = "name of the project in target system")
+  @Argument(
+    index = 0,
+    required = true,
+    metaVar = "NAME",
+    usage = "name of the project in target system"
+  )
   private String project;
 
-  @Inject
-  private CompleteProjectImport completeProjectImport;
+  @Inject private CompleteProjectImport completeProjectImport;
 
-  @Inject
-  private ProjectsCollection projects;
+  @Inject private ProjectsCollection projects;
 
   @Override
-  protected void run() throws UnloggedFailure, RepositoryNotFoundException,
-      IOException {
+  protected void run() throws UnloggedFailure, RepositoryNotFoundException, IOException {
     try {
       ImportProjectResource rsrc = projects.parse(project);
       completeProjectImport.apply(rsrc, new CompleteProjectImport.Input());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureProjectStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureProjectStep.java
index 9497262..0d26d31 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureProjectStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureProjectStep.java
@@ -24,10 +24,8 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
-import org.eclipse.jgit.lib.ProgressMonitor;
-
 import java.io.IOException;
+import org.eclipse.jgit.lib.ProgressMonitor;
 
 @Singleton
 class ConfigureProjectStep {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java
index aca47c3..8b199ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java
@@ -21,15 +21,13 @@
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
+import java.nio.file.Path;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 
-import java.io.IOException;
-import java.nio.file.Path;
-
 @Singleton
 class ConfigureRepositoryStep {
 
@@ -38,9 +36,7 @@
   private final Path gitDir;
 
   @Inject
-  ConfigureRepositoryStep(
-      SitePaths site,
-      @GerritServerConfig Config cfg) {
+  ConfigureRepositoryStep(SitePaths site, @GerritServerConfig Config cfg) {
     this.gitDir = site.resolve(cfg.getString("gerrit", null, "basePath"));
   }
 
@@ -49,13 +45,10 @@
     pm.beginTask("Configure repository", 1);
     StoredConfig config = repo.getConfig();
     if (originUrl != null) {
-      config.setString("remote", "origin", "url", originUrl
-          .concat("/a/")
-          .concat(name.get()));
+      config.setString("remote", "origin", "url", originUrl.concat("/a/").concat(name.get()));
     } else {
-      config.setString("remote", "origin", "url",
-          this.gitDir.resolve(name.get() + ".git").toString());
-
+      config.setString(
+          "remote", "origin", "url", this.gitDir.resolve(name.get() + ".git").toString());
     }
     config.setString("remote", "origin", "fetch", "+refs/*:" + R_IMPORTS + "*");
     config.setString("http", null, "sslVerify", Boolean.FALSE.toString());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
index 7d9f712..c429077 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
@@ -28,28 +28,24 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.importer.CopyProject.Input;
-
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 @RequiresCapability(CopyProjectCapability.ID)
-class CopyProject implements RestModifyView<ProjectResource, Input>,
-    UiAction<ProjectResource> {
+class CopyProject implements RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
   public static class Input {
     public String name;
   }
@@ -74,9 +70,9 @@
 
   @Override
   public ImportStatistic apply(ProjectResource rsrc, Input input)
-      throws RestApiException, OrmException, IOException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException, ConfigInvalidException, PermissionBackendException {
+      throws RestApiException, OrmException, IOException, ValidationException, GitAPIException,
+          NoSuchChangeException, NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     if (Strings.isNullOrEmpty(input.name)) {
       throw new BadRequestException("name is required");
     }
@@ -84,7 +80,8 @@
     ImportProject.Input in = new ImportProject.Input();
     in.name = rsrc.getName();
 
-    return importProjectFactory.create(new Project.NameKey(input.name))
+    return importProjectFactory
+        .create(new Project.NameKey(input.name))
         .setCopy(true)
         .setErr(err)
         .apply(new ConfigResource(), in);
@@ -99,9 +96,10 @@
   }
 
   private boolean canCopy() {
-    return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER) ||
-      permissionBackend.user(currentUserProvider).testOrFalse(
-      new PluginPermission(pluginName, CopyProjectCapability.ID));
+    return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER)
+        || permissionBackend
+            .user(currentUserProvider)
+            .testOrFalse(new PluginPermission(pluginName, CopyProjectCapability.ID));
   }
 
   void setErr(PrintWriter err) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCapability.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCapability.java
index fe75fa6..a1b31a9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCapability.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCapability.java
@@ -17,7 +17,7 @@
 import com.google.gerrit.extensions.config.CapabilityDefinition;
 
 public class CopyProjectCapability extends CapabilityDefinition {
-  public final static String ID = "copyProject";
+  public static final String ID = "copyProject";
 
   @Override
   public String getDescription() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCommand.java
index 8737d98..d94f4f1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProjectCommand.java
@@ -21,7 +21,6 @@
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.inject.Inject;
-
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -32,19 +31,15 @@
   @Option(name = "--quiet", usage = "suppress progress messages")
   private boolean quiet;
 
-  @Argument(index = 0, required = true, metaVar = "NAME",
-      usage = "name of the source project")
+  @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the source project")
   private String source;
 
-  @Argument(index = 1, required = true, metaVar = "COPY",
-      usage = "name of the project copy")
+  @Argument(index = 1, required = true, metaVar = "COPY", usage = "name of the project copy")
   private String target;
 
-  @Inject
-  private ProjectsCollection projects;
+  @Inject private ProjectsCollection projects;
 
-  @Inject
-  private CopyProject copy;
+  @Inject private CopyProject copy;
 
   @Override
   protected void run() throws UnloggedFailure, Failure, Exception {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
index ef1c1a6..ffa487c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
@@ -23,13 +23,11 @@
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 interface GerritApi {
 
@@ -49,31 +47,29 @@
     }
   }
 
-  public ProjectInfo getProject(String projectName) throws BadRequestException,
-      IOException;
+  public ProjectInfo getProject(String projectName) throws BadRequestException, IOException;
 
   public List<ChangeInfo> queryChanges(String projectName, int start, int limit)
       throws BadRequestException, IOException;
 
-  public GroupInfo getGroup(String groupName) throws BadRequestException,
-      IOException, OrmException;
+  public GroupInfo getGroup(String groupName) throws BadRequestException, IOException, OrmException;
 
   /**
    * Retrieves inline comments of a patch set.
    *
    * @param changeId numeric change ID
    * @param rev the revision
-   * @return Iterable that provides the inline comments, or {@code null} if the
-   *         revision does not exist
+   * @return Iterable that provides the inline comments, or {@code null} if the revision does not
+   *     exist
    * @throws IOException thrown if sending the request fails
-   * @throws BadRequestException thrown if the response is neither
-   *         {@code 200 OK} nor {@code 404 Not Found}
+   * @throws BadRequestException thrown if the response is neither {@code 200 OK} nor {@code 404 Not
+   *     Found}
    */
   public Iterable<CommentInfo> getComments(int changeId, String rev)
       throws BadRequestException, IOException, OrmException;
 
-  public List<SshKeyInfo> getSshKeys(String userId) throws BadRequestException,
-      IOException, OrmException, ConfigInvalidException;
+  public List<SshKeyInfo> getSshKeys(String userId)
+      throws BadRequestException, IOException, OrmException, ConfigInvalidException;
 
   public Version getVersion() throws BadRequestException, IOException;
 
@@ -88,8 +84,8 @@
     Version(String formatted) {
       this.formatted = formatted;
 
-      Matcher m = Pattern.compile("(\\d+)\\.(\\d+)(\\.(\\d+))?(\\.(\\d+))?(-(.+))?")
-          .matcher(formatted);
+      Matcher m =
+          Pattern.compile("(\\d+)\\.(\\d+)(\\.(\\d+))?(\\.(\\d+))?(-(.+))?").matcher(formatted);
       if (m.matches()) {
         this.major = Integer.parseInt(m.group(1));
         this.minor = Integer.parseInt(m.group(2));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GetImportedProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GetImportedProject.java
index ac72400..de6abd1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GetImportedProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GetImportedProject.java
@@ -17,7 +17,6 @@
 import com.google.gerrit.extensions.annotations.RequiresCapability;
 import com.google.gerrit.extensions.restapi.RestReadView;
 import com.google.inject.Singleton;
-
 import java.io.IOException;
 
 @Singleton
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GitFetchStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GitFetchStep.java
index a3421d1..e51544b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GitFetchStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GitFetchStep.java
@@ -17,7 +17,8 @@
 import static com.googlesource.gerrit.plugins.importer.ProgressMonitorUtil.updateAndEnd;
 
 import com.google.inject.Singleton;
-
+import java.io.IOException;
+import java.util.Map;
 import org.eclipse.jgit.api.FetchCommand;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -30,20 +31,15 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
 
-import java.io.IOException;
-import java.util.Map;
-
 @Singleton
 class GitFetchStep {
 
   void fetch(String user, String password, Repository repo, ProgressMonitor pm)
-      throws InvalidRemoteException, TransportException, GitAPIException,
-      IOException {
+      throws InvalidRemoteException, TransportException, GitAPIException, IOException {
     pm.beginTask("Fetch project", 1);
     FetchCommand fetch = Git.wrap(repo).fetch();
     if (user != null) {
-      fetch.setCredentialsProvider(
-          new UsernamePasswordCredentialsProvider(user, password));
+      fetch.setCredentialsProvider(new UsernamePasswordCredentialsProvider(user, password));
     }
     fetch.setRemote("origin").call();
     updateNonChangeRefs(repo);
@@ -51,8 +47,7 @@
   }
 
   private void updateNonChangeRefs(Repository repo) throws IOException {
-    Map<String, Ref> refs = repo.getRefDatabase().getRefs(
-        ConfigureRepositoryStep.R_IMPORTS);
+    Map<String, Ref> refs = repo.getRefDatabase().getRefs(ConfigureRepositoryStep.R_IMPORTS);
     for (Map.Entry<String, Ref> e : refs.entrySet()) {
       String name = e.getKey();
       if (name.startsWith("imports/")) {
@@ -86,8 +81,8 @@
         case REJECTED_MISSING_OBJECT:
         case REJECTED_OTHER_REASON:
         default:
-          throw new IOException(String.format(
-              "Failed to update %s, RefUpdate.Result = %s", targetRef, result));
+          throw new IOException(
+              String.format("Failed to update %s, RefUpdate.Result = %s", targetRef, result));
       }
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java
index 5b4c758..be42c1c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java
@@ -26,48 +26,71 @@
 import com.google.gerrit.sshd.SshCommand;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
 @RequiresCapability(ImportCapability.ID)
 @CommandMetaData(name = "group", description = "Imports a group")
 public class GroupCommand extends SshCommand {
-  @Option(name = "--from", aliases = {"-f"}, required = true, metaVar = "URL",
-      usage = "URL of the remote system from where the group is imported from")
+  @Option(
+    name = "--from",
+    aliases = {"-f"},
+    required = true,
+    metaVar = "URL",
+    usage = "URL of the remote system from where the group is imported from"
+  )
   private String url;
 
-  @Option(name = "--user", aliases = {"-u"}, required = true, metaVar = "NAME",
-      usage = "user on remote system")
+  @Option(
+    name = "--user",
+    aliases = {"-u"},
+    required = true,
+    metaVar = "NAME",
+    usage = "user on remote system"
+  )
   private String user;
 
-  @Option(name = "--pass", aliases = {"-p"}, required = true, metaVar = "-|PASS",
-      usage = "password of remote user")
+  @Option(
+    name = "--pass",
+    aliases = {"-p"},
+    required = true,
+    metaVar = "-|PASS",
+    usage = "password of remote user"
+  )
   private String pass;
 
-  @Option(name = "--import-owner-group", aliases = {"-o"},
-      usage = "whether missing owner groups should be imported automatically")
+  @Option(
+    name = "--import-owner-group",
+    aliases = {"-o"},
+    usage = "whether missing owner groups should be imported automatically"
+  )
   private boolean importOwnerGroup;
 
-  @Option(name = "--import-included-groups", aliases = {"-i"},
-      usage = "whether missing included groups should be imported automatically")
+  @Option(
+    name = "--import-included-groups",
+    aliases = {"-i"},
+    usage = "whether missing included groups should be imported automatically"
+  )
   private boolean importIncludedGroups;
 
-  @Argument(index = 0, required = true, metaVar = "NAME",
-      usage = "name of the group to be imported")
+  @Argument(
+    index = 0,
+    required = true,
+    metaVar = "NAME",
+    usage = "name of the group to be imported"
+  )
   private String group;
 
-  @Inject
-  private ImportGroup.Factory importGroupFactory;
+  @Inject private ImportGroup.Factory importGroupFactory;
 
   @Override
-  protected void run() throws UnloggedFailure, OrmException, IOException,
-      NoSuchAccountException, ConfigInvalidException {
+  protected void run()
+      throws UnloggedFailure, OrmException, IOException, NoSuchAccountException,
+          ConfigInvalidException {
     ImportGroup.Input input = new ImportGroup.Input();
     input.from = url;
     input.user = user;
@@ -76,9 +99,8 @@
     input.importIncludedGroups = importIncludedGroups;
 
     try {
-      importGroupFactory.create(new AccountGroup.NameKey(group)).apply(
-          new ConfigResource(), input);
-    } catch (RestApiException e){
+      importGroupFactory.create(new AccountGroup.NameKey(group)).apply(new ConfigResource(), input);
+    } catch (RestApiException e) {
       throw die(e.getMessage());
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GroupsCollection.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GroupsCollection.java
index c25f5b5..3e7dfa9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GroupsCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GroupsCollection.java
@@ -28,17 +28,15 @@
 import com.google.inject.Singleton;
 
 @Singleton
-public class GroupsCollection implements
-    ChildCollection<ConfigResource, ImportGroupResource>,
-    AcceptsCreate<ConfigResource> {
+public class GroupsCollection
+    implements ChildCollection<ConfigResource, ImportGroupResource>, AcceptsCreate<ConfigResource> {
 
   private final DynamicMap<RestView<ImportGroupResource>> views;
   private final ImportGroup.Factory importGroupFactory;
 
   @Inject
   GroupsCollection(
-      DynamicMap<RestView<ImportGroupResource>> views,
-      ImportGroup.Factory importGroupFactory) {
+      DynamicMap<RestView<ImportGroupResource>> views, ImportGroup.Factory importGroupFactory) {
     this.views = views;
     this.importGroupFactory = importGroupFactory;
   }
@@ -60,8 +58,7 @@
   }
 
   @Override
-  public ImportGroup create(ConfigResource parent, IdString id)
-      throws RestApiException {
+  public ImportGroup create(ConfigResource parent, IdString id) throws RestApiException {
     return importGroupFactory.create(new AccountGroup.NameKey(id.get()));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpModule.java
index 7b6edf0..79fe837 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpModule.java
@@ -32,7 +32,6 @@
     DynamicSet.bind(binder(), WebUiPlugin.class)
         .toInstance(new JavaScriptPlugin("complete-project-import.js"));
 
-    DynamicSet.bind(binder(), WebUiPlugin.class)
-        .toInstance(new GwtPlugin("importer"));
+    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new GwtPlugin("importer"));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpResponse.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpResponse.java
index 4966c3c..7403c58 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpResponse.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpResponse.java
@@ -15,15 +15,13 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.common.base.Preconditions;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.eclipse.jgit.util.IO;
-import org.eclipse.jgit.util.RawParseUtils;
-
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.nio.ByteBuffer;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.eclipse.jgit.util.IO;
+import org.eclipse.jgit.util.RawParseUtils;
 
 public class HttpResponse implements AutoCloseable {
 
@@ -61,15 +59,8 @@
 
   public String getEntityContent() throws IOException {
     Preconditions.checkNotNull(response, "Response is not initialized.");
-    Preconditions.checkNotNull(response.getEntity(),
-        "Response.Entity is not initialized.");
-    ByteBuffer buf = IO.readWholeStream(
-        response.getEntity().getContent(),
-        1024);
-    return RawParseUtils.decode(
-        buf.array(),
-        buf.arrayOffset(),
-        buf.limit())
-        .trim();
+    Preconditions.checkNotNull(response.getEntity(), "Response.Entity is not initialized.");
+    ByteBuffer buf = IO.readWholeStream(response.getEntity().getContent(), 1024);
+    return RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit()).trim();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
index af7af86..88fa9cd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
@@ -15,7 +15,16 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.common.base.CharMatcher;
-
+import java.io.IOException;
+import java.net.URI;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
 import org.apache.http.auth.AuthScope;
 import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.http.client.methods.HttpGet;
@@ -24,18 +33,6 @@
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 
-import java.io.IOException;
-import java.net.URI;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
 public class HttpSession {
 
   protected final String url;
@@ -58,13 +55,12 @@
     if (client == null) {
       URI uri = URI.create(url);
       BasicCredentialsProvider creds = new BasicCredentialsProvider();
-      creds.setCredentials(new AuthScope(uri.getHost(), uri.getPort()),
-          new UsernamePasswordCredentials(user, pass));
+      creds.setCredentials(
+          new AuthScope(uri.getHost(), uri.getPort()), new UsernamePasswordCredentials(user, pass));
 
       SSLContext context;
       try {
-        final TrustManager[] trustAllCerts =
-            new TrustManager[] {new DummyX509TrustManager()};
+        final TrustManager[] trustAllCerts = new TrustManager[] {new DummyX509TrustManager()};
         context = SSLContext.getInstance("TLS");
         context.init(null, trustAllCerts, null);
       } catch (KeyManagementException | NoSuchAlgorithmException e) {
@@ -73,14 +69,13 @@
 
       SSLConnectionSocketFactory sf;
       sf = new SSLConnectionSocketFactory(context, new DummyHostnameVerifier());
-      client = HttpClients
-          .custom()
-          .setSSLSocketFactory(sf)
-          .setDefaultCredentialsProvider(creds)
-          .setMaxConnPerRoute(10)
-          .setMaxConnTotal(1024)
-          .build();
-
+      client =
+          HttpClients.custom()
+              .setSSLSocketFactory(sf)
+              .setDefaultCredentialsProvider(creds)
+              .setMaxConnPerRoute(10)
+              .setMaxConnTotal(1024)
+              .build();
     }
     return client;
   }
@@ -109,5 +104,4 @@
       return true;
     }
   }
-
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportCapability.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportCapability.java
index bb18ef3..d2bd3e5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportCapability.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportCapability.java
@@ -17,7 +17,7 @@
 import com.google.gerrit.extensions.config.CapabilityDefinition;
 
 public class ImportCapability extends CapabilityDefinition {
-  public final static String ID = "import";
+  public static final String ID = "import";
 
   @Override
   public String getDescription() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
index 6c64783..c41fdbf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
@@ -48,14 +48,7 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
 import com.googlesource.gerrit.plugins.importer.ImportGroup.Input;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -63,6 +56,10 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @RequiresCapability(ImportCapability.ID)
 class ImportGroup implements RestModifyView<ConfigResource, Input> {
@@ -118,8 +115,8 @@
 
   @Override
   public Response<String> apply(ConfigResource rsrc, Input input)
-      throws NoSuchAccountException, OrmException, IOException,
-      RestApiException, ConfigInvalidException {
+      throws NoSuchAccountException, OrmException, IOException, RestApiException,
+          ConfigInvalidException {
     GroupInfo groupInfo;
     this.api = apiFactory.create(input.from, input.user, input.pass);
     groupInfo = api.getGroup(group.get());
@@ -130,22 +127,24 @@
   }
 
   private void validate(Input input, GroupInfo groupInfo)
-      throws IOException, OrmException, NoSuchAccountException,
-      RestApiException, ConfigInvalidException {
+      throws IOException, OrmException, NoSuchAccountException, RestApiException,
+          ConfigInvalidException {
     if (!isInternalGroup(new AccountGroup.UUID(groupInfo.id))) {
-      throw new MethodNotAllowedException(String.format(
-          "Group with name %s is not an internal group and cannot be imported",
-          groupInfo.name));
+      throw new MethodNotAllowedException(
+          String.format(
+              "Group with name %s is not an internal group and cannot be imported",
+              groupInfo.name));
     }
     if (getGroupByUUID(groupInfo.id) != null) {
-      throw new ResourceConflictException(String.format(
-          "Group with UUID %s already exists", groupInfo.id));
+      throw new ResourceConflictException(
+          String.format("Group with UUID %s already exists", groupInfo.id));
     }
     if (!groupInfo.id.equals(groupInfo.ownerId))
       if (!input.importOwnerGroup && getGroupByUUID(groupInfo.ownerId) == null) {
-        throw new PreconditionFailedException(String.format(
-            "Owner group %s with UUID %s does not exist",
-            getGroupName(groupInfo.ownerId), groupInfo.ownerId));
+        throw new PreconditionFailedException(
+            String.format(
+                "Owner group %s with UUID %s does not exist",
+                getGroupName(groupInfo.ownerId), groupInfo.ownerId));
       }
     if (groupInfo.members != null) {
       for (AccountInfo member : groupInfo.members) {
@@ -160,9 +159,10 @@
       if (groupInfo.includes != null) {
         for (GroupInfo include : groupInfo.includes) {
           if (getGroupByUUID(include.id) == null) {
-            throw new PreconditionFailedException(String.format(
-                "Included group %s with UUID %s does not exist",
-                getGroupName(include.id), include.id));
+            throw new PreconditionFailedException(
+                String.format(
+                    "Included group %s with UUID %s does not exist",
+                    getGroupName(include.id), include.id));
           }
         }
       }
@@ -186,8 +186,8 @@
   }
 
   private CreateGroupArgs toCreateGroupArgs(GroupInfo groupInfo)
-      throws IOException, OrmException, NoSuchAccountException,
-      RestApiException, ConfigInvalidException {
+      throws IOException, OrmException, NoSuchAccountException, RestApiException,
+          ConfigInvalidException {
     CreateGroupArgs args = new CreateGroupArgs();
     args.setGroupName(groupInfo.name);
     args.groupDescription = groupInfo.description;
@@ -204,12 +204,13 @@
   }
 
   private AccountGroup createGroup(Input input, GroupInfo info)
-      throws OrmException, NoSuchAccountException, IOException,
-      RestApiException, ConfigInvalidException {
+      throws OrmException, NoSuchAccountException, IOException, RestApiException,
+          ConfigInvalidException {
     String uniqueName = getUniqueGroupName(info.name);
     if (!info.name.equals(uniqueName)) {
-      log.warn(String.format("Group %s with UUID %s is imported with name %s",
-          info.name, info.id, uniqueName));
+      log.warn(
+          String.format(
+              "Group %s with UUID %s is imported with name %s", info.name, info.id, uniqueName));
       info.name = uniqueName;
     }
     AccountGroup group = createAccountGroup(info);
@@ -230,12 +231,14 @@
         if (isInternalGroup(new AccountGroup.UUID(info.ownerId))) {
           String ownerGroupName = getGroupName(info.ownerId);
           if (input.importOwnerGroup) {
-            importGroupFactory.create(new AccountGroup.NameKey(ownerGroupName))
+            importGroupFactory
+                .create(new AccountGroup.NameKey(ownerGroupName))
                 .apply(new ConfigResource(), input);
           } else {
-            throw new IllegalStateException(String.format(
-                "Cannot set non-existing group %s as owner of group %s.",
-                ownerGroupName, info.name));
+            throw new IllegalStateException(
+                String.format(
+                    "Cannot set non-existing group %s as owner of group %s.",
+                    ownerGroupName, info.name));
           }
         }
       }
@@ -269,23 +272,21 @@
       }
     }
     return getUniqueGroupName(String.format("%s_imported", name), true);
-
   }
+
   private AccountGroup createAccountGroup(GroupInfo info) throws OrmException {
     AccountGroup.Id groupId = new AccountGroup.Id(db.nextAccountGroupId());
     AccountGroup.UUID uuid = new AccountGroup.UUID(info.id);
     AccountGroup group =
-        new AccountGroup(new AccountGroup.NameKey(info.name), groupId, uuid,
-            TimeUtil.nowTs());
-    group.setVisibleToAll(cfg.getBoolean("groups", "newGroupsVisibleToAll",
-        false));
+        new AccountGroup(new AccountGroup.NameKey(info.name), groupId, uuid, TimeUtil.nowTs());
+    group.setVisibleToAll(cfg.getBoolean("groups", "newGroupsVisibleToAll", false));
     group.setDescription(info.description);
     return group;
   }
 
   private void addMembers(AccountGroup.Id groupId, List<AccountInfo> members)
-      throws OrmException, NoSuchAccountException, IOException,
-      RestApiException, ConfigInvalidException {
+      throws OrmException, NoSuchAccountException, IOException, RestApiException,
+          ConfigInvalidException {
     List<AccountGroupMember> memberships = new ArrayList<>();
     for (AccountInfo member : members) {
       Account.Id userId = accountUtil.resolveUser(api, member);
@@ -300,23 +301,24 @@
     }
   }
 
-  private void addGroups(Input input, AccountGroup.Id groupId, String groupName,
-      List<GroupInfo> includedGroups)
-          throws NoSuchAccountException, OrmException, IOException,
-          RestApiException, ConfigInvalidException {
+  private void addGroups(
+      Input input, AccountGroup.Id groupId, String groupName, List<GroupInfo> includedGroups)
+      throws NoSuchAccountException, OrmException, IOException, RestApiException,
+          ConfigInvalidException {
     List<AccountGroupById> includeList = new ArrayList<>();
     for (GroupInfo includedGroup : includedGroups) {
       if (isInternalGroup(new AccountGroup.UUID(includedGroup.id))) {
         if (getGroupByUUID(includedGroup.id) == null) {
           String includedGroupName = getGroupName(includedGroup.id);
           if (input.importIncludedGroups) {
-            importGroupFactory.create(
-                new AccountGroup.NameKey(includedGroupName)).apply(
-                new ConfigResource(), input);
+            importGroupFactory
+                .create(new AccountGroup.NameKey(includedGroupName))
+                .apply(new ConfigResource(), input);
           } else {
-            throw new IllegalStateException(String.format(
-                "Cannot include non-existing group %s into group %s.",
-                includedGroupName, groupName));
+            throw new IllegalStateException(
+                String.format(
+                    "Cannot include non-existing group %s into group %s.",
+                    includedGroupName, groupName));
           }
         }
       }
@@ -332,8 +334,7 @@
     }
   }
 
-  private String getGroupName(String uuid) throws BadRequestException,
-      IOException, OrmException {
+  private String getGroupName(String uuid) throws BadRequestException, IOException, OrmException {
     return api.getGroup(uuid).name;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
index e8b0288..308ba83 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
@@ -29,12 +29,10 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ProgressMonitor;
-
 import java.io.IOException;
 import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ProgressMonitor;
 
 public class ImportGroupsStep {
 
@@ -76,8 +74,9 @@
     this.pm = pm;
   }
 
-  void importGroups() throws NoSuchAccountException, OrmException, IOException,
-      RestApiException, ConfigInvalidException {
+  void importGroups()
+      throws NoSuchAccountException, OrmException, IOException, RestApiException,
+          ConfigInvalidException {
     ProjectConfig projectConfig = projectCache.get(project).getConfig();
     Set<AccountGroup.UUID> groupUUIDs = projectConfig.getAllGroupUUIDs();
     pm.beginTask("Import Groups", groupUUIDs.size());
@@ -91,9 +90,9 @@
           input.importOwnerGroup = true;
           input.importIncludedGroups = true;
           try {
-            importGroupFactory.create(
-                new AccountGroup.NameKey(projectConfig.getGroup(groupUUID)
-                    .getName())).apply(new ConfigResource(), input);
+            importGroupFactory
+                .create(new AccountGroup.NameKey(projectConfig.getGroup(groupUUID).getName()))
+                .apply(new ConfigResource(), input);
           } catch (ResourceConflictException | MethodNotAllowedException e) {
             // should not happen
             throw new IllegalStateException(e);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportInfo.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportInfo.java
index 16be1c6..97c50f6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportInfo.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.gerrit.extensions.common.AccountInfo;
-
 import java.sql.Timestamp;
 
 public class ImportInfo {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportJson.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportJson.java
index f5cd59a..d8db8e9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportJson.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportJson.java
@@ -27,18 +27,15 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.importer.ImportProject.Input;
-
-import org.eclipse.jgit.internal.storage.file.LockFile;
-import org.eclipse.jgit.lib.ProgressMonitor;
-
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.sql.Timestamp;
 import java.util.ArrayList;
+import org.eclipse.jgit.internal.storage.file.LockFile;
+import org.eclipse.jgit.lib.ProgressMonitor;
 
 @Singleton
 public class ImportJson {
@@ -47,15 +44,12 @@
   private final AccountLoader.Factory accountLoaderFactory;
 
   @Inject
-  ImportJson(
-      Provider<CurrentUser> currentUser,
-      AccountLoader.Factory accountLoaderFactory) {
+  ImportJson(Provider<CurrentUser> currentUser, AccountLoader.Factory accountLoaderFactory) {
     this.currentUser = currentUser;
     this.accountLoaderFactory = accountLoaderFactory;
   }
 
-  public ImportProjectInfo format(Input input, ImportProjectInfo info)
-      throws OrmException {
+  public ImportProjectInfo format(Input input, ImportProjectInfo info) throws OrmException {
     if (info == null) {
       info = new ImportProjectInfo();
       info.from = input.from;
@@ -72,15 +66,14 @@
     AccountLoader accountLoader = accountLoaderFactory.create(true);
     ImportInfo importInfo = new ImportInfo();
     importInfo.timestamp = new Timestamp(TimeUtil.nowMs());
-    importInfo.user =
-        accountLoader.get(((IdentifiedUser) currentUser.get()).getAccountId());
+    importInfo.user = accountLoader.get(((IdentifiedUser) currentUser.get()).getAccountId());
     importInfo.remoteUser = remoteUser;
     accountLoader.fill();
     return importInfo;
   }
 
-  public static void persist(LockFile lockFile, ImportProjectInfo info,
-      ProgressMonitor pm) throws IOException {
+  public static void persist(LockFile lockFile, ImportProjectInfo info, ProgressMonitor pm)
+      throws IOException {
     pm.beginTask("Persist parameters", 1);
     String s = OutputFormat.JSON_COMPACT.newGson().toJson(info);
     try (OutputStream out = lockFile.getOutputStream()) {
@@ -94,8 +87,9 @@
 
   public static ImportProjectInfo parse(File f) throws IOException {
     try (FileReader r = new FileReader(f)) {
-      return OutputFormat.JSON_COMPACT.newGson().fromJson(r,
-          new TypeToken<ImportProjectInfo>() {}.getType());
+      return OutputFormat.JSON_COMPACT
+          .newGson()
+          .fromJson(r, new TypeToken<ImportProjectInfo>() {}.getType());
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
index 597c4fc..c61e50d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
@@ -28,7 +28,6 @@
 import com.google.gerrit.server.util.SystemLog;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
@@ -50,7 +49,8 @@
   private final String canonicalWebUrl;
 
   @Inject
-  public ImportLog(SystemLog systemLog,
+  public ImportLog(
+      SystemLog systemLog,
       ServerInformation serverInfo,
       AuditService auditService,
       @CanonicalWebUrl String canonicalWebUrl) {
@@ -59,30 +59,35 @@
     this.canonicalWebUrl = canonicalWebUrl;
   }
 
-  public void onImport(IdentifiedUser user, Project.NameKey srcProject,
-      Project.NameKey targetProject, String from) {
+  public void onImport(
+      IdentifiedUser user, Project.NameKey srcProject, Project.NameKey targetProject, String from) {
     onImport(user, srcProject, targetProject, from, null);
   }
 
-  public void onImport(IdentifiedUser user, Project.NameKey srcProject,
-      Project.NameKey targetProject, String from, Exception ex) {
+  public void onImport(
+      IdentifiedUser user,
+      Project.NameKey srcProject,
+      Project.NameKey targetProject,
+      String from,
+      Exception ex) {
     long ts = TimeUtil.nowMs();
-    LoggingEvent event = new LoggingEvent( //
-        Logger.class.getName(), // fqnOfCategoryClass
-        log, // logger
-        ts, // when
-        ex == null // level
-            ? Level.INFO
-            : Level.ERROR,
-        ex == null // message text
-            ? "OK"
-            : "FAIL",
-        Thread.currentThread().getName(), // thread name
-        null, // exception information
-        null, // current NDC string
-        null, // caller location
-        null // MDC properties
-        );
+    LoggingEvent event =
+        new LoggingEvent( //
+            Logger.class.getName(), // fqnOfCategoryClass
+            log, // logger
+            ts, // when
+            ex == null // level
+                ? Level.INFO
+                : Level.ERROR,
+            ex == null // message text
+                ? "OK"
+                : "FAIL",
+            Thread.currentThread().getName(), // thread name
+            null, // exception information
+            null, // current NDC string
+            null, // caller location
+            null // MDC properties
+            );
 
     event.setProperty(ACCOUNT_ID, user.getAccountId().toString());
     event.setProperty(USER_NAME, user.getUserName());
@@ -105,10 +110,9 @@
     audit(user, ts, srcProject, from, ex);
   }
 
-  private void audit(IdentifiedUser user, long ts, Project.NameKey project,
-      String from, Exception ex) {
-    ListMultimap<String, Object> params =
-        MultimapBuilder.hashKeys().arrayListValues().build();
+  private void audit(
+      IdentifiedUser user, long ts, Project.NameKey project, String from, Exception ex) {
+    ListMultimap<String, Object> params = MultimapBuilder.hashKeys().arrayListValues().build();
     params.put("class", ImportLog.class);
     params.put("project", project.get());
     params.put("from", from);
@@ -124,7 +128,6 @@
             params, // params
             ex != null // result
                 ? ex.toString()
-                : "OK"
-        ));
+                : "OK"));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLogLayout.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLogLayout.java
index cc29340..7faceae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLogLayout.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLogLayout.java
@@ -14,14 +14,13 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
-import org.apache.log4j.Layout;
-import org.apache.log4j.spi.LoggingEvent;
-import org.eclipse.jgit.util.QuotedString;
-
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.TimeZone;
+import org.apache.log4j.Layout;
+import org.apache.log4j.spi.LoggingEvent;
+import org.eclipse.jgit.util.QuotedString;
 
 final class ImportLogLayout extends Layout {
   private final Calendar calendar;
@@ -29,7 +28,7 @@
   private final char[] lastTimeString = new char[20];
   private final char[] timeZone;
 
- public ImportLogLayout() {
+  public ImportLogLayout() {
     TimeZone tz = TimeZone.getDefault();
     calendar = Calendar.getInstance(tz);
 
@@ -41,14 +40,12 @@
   /**
    * Formats the events in the import log.
    *
-   * A successful project import will result in a log entry like this:
-   *   [2015-03-05 09:13:28,912 +0100] INFO 1000000 admin OK \
-   *   https://some-gerrit-server:8080 srcName targetName
+   * <p>A successful project import will result in a log entry like this: [2015-03-05 09:13:28,912
+   * +0100] INFO 1000000 admin OK \ https://some-gerrit-server:8080 srcName targetName
    *
-   * The log entry for a failed project import will look like this:
-   *   [2015-03-05 12:14:30,180 +0100] ERROR 1000000 admin FAIL \
-   *   https://some-gerrit-server:8080 srcName targetName \
-   *   com.google.gwtorm.server.OrmException: Failed to access the database
+   * <p>The log entry for a failed project import will look like this: [2015-03-05 12:14:30,180
+   * +0100] ERROR 1000000 admin FAIL \ https://some-gerrit-server:8080 srcName targetName \
+   * com.google.gwtorm.server.OrmException: Failed to access the database
    */
   @Override
   public String format(LoggingEvent event) {
@@ -139,6 +136,5 @@
   }
 
   @Override
-  public void activateOptions() {
-  }
+  public void activateOptions() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportMenu.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportMenu.java
index 2edfdc1..6e606d8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportMenu.java
@@ -25,7 +25,6 @@
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import java.util.List;
 
 public class ImportMenu implements TopMenu {
@@ -60,9 +59,10 @@
   }
 
   private boolean canImport() {
-    return permissionBackend.user(userProvider).testOrFalse(
-      new PluginPermission(pluginName, ImportCapability.ID)) ||
-      permissionBackend.user(userProvider).testOrFalse(ADMINISTRATE_SERVER);
+    return permissionBackend
+            .user(userProvider)
+            .testOrFalse(new PluginPermission(pluginName, ImportCapability.ID))
+        || permissionBackend.user(userProvider).testOrFalse(ADMINISTRATE_SERVER);
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
index 9e7c61b..b6750c0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
@@ -28,20 +28,21 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
-
 import com.googlesource.gerrit.plugins.importer.GerritApi.Version;
 import com.googlesource.gerrit.plugins.importer.ImportProject.Input;
-
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.storage.file.LockFile;
@@ -52,10 +53,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.Writer;
-
 @RequiresCapability(ImportCapability.ID)
 class ImportProject implements RestModifyView<ConfigResource, Input> {
   public static class Input {
@@ -165,9 +162,9 @@
 
   @Override
   public ImportStatistic apply(ConfigResource rsrc, Input input)
-      throws RestApiException, OrmException, IOException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException, ConfigInvalidException, PermissionBackendException {
+      throws RestApiException, OrmException, IOException, ValidationException, GitAPIException,
+          NoSuchChangeException, NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     if (input == null) {
       input = new Input();
     }
@@ -180,10 +177,10 @@
     }
   }
 
-  public ResumeImportStatistic resume(String user, String pass, boolean force,
-      File importStatus) throws RestApiException, OrmException, IOException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException, ConfigInvalidException, PermissionBackendException {
+  public ResumeImportStatistic resume(String user, String pass, boolean force, File importStatus)
+      throws RestApiException, OrmException, IOException, GitAPIException, NoSuchChangeException,
+          NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     LockFile lockFile = lockForImport();
     try {
       ImportProjectInfo info = ImportJson.parse(importStatus);
@@ -203,11 +200,10 @@
     }
   }
 
-  private ResumeImportStatistic apply(LockFile lockFile, Input input,
-      ImportProjectInfo info) throws RestApiException, OrmException,
-      IOException, GitAPIException, NoSuchChangeException,
-      NoSuchAccountException, UpdateException, ConfigInvalidException,
-      PermissionBackendException {
+  private ResumeImportStatistic apply(LockFile lockFile, Input input, ImportProjectInfo info)
+      throws RestApiException, OrmException, IOException, GitAPIException, NoSuchChangeException,
+          NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     boolean resume = info != null;
     api = apiFactory.create(input.from, input.user, input.pass);
 
@@ -217,49 +213,49 @@
       input.validateImport();
       Version v = api.getVersion();
       if (v.compareTo(v2_11_2) < 0) {
-        throw new BadRequestException(String.format(
-            "The version of the source Gerrit server %s is too old. "
-            + "Its version is %s, but required is a version >= %s.",
-            input.from, v.formatted, v2_11_2));
+        throw new BadRequestException(
+            String.format(
+                "The version of the source Gerrit server %s is too old. "
+                    + "Its version is %s, but required is a version >= %s.",
+                input.from, v.formatted, v2_11_2));
       }
     }
 
-    ProgressMonitor pm = err != null ? new TextProgressMonitor(err) :
-        NullProgressMonitor.INSTANCE;
+    ProgressMonitor pm = err != null ? new TextProgressMonitor(err) : NullProgressMonitor.INSTANCE;
 
     ResumeImportStatistic statistic = new ResumeImportStatistic();
     try {
-      srcProject = !Strings.isNullOrEmpty(input.name)
-          ? new Project.NameKey(input.name) : targetProject;
+      srcProject =
+          !Strings.isNullOrEmpty(input.name) ? new Project.NameKey(input.name) : targetProject;
       checkProjectInSource(pm);
       setParentProjectName(input, pm);
       checkPreconditions(pm);
-      try (Repository repo = openRepoStep.open(targetProject, resume, pm,
-          parent)) {
+      try (Repository repo = openRepoStep.open(targetProject, resume, pm, parent)) {
         ImportJson.persist(lockFile, importJson.format(input, info), pm);
         configRepoStep.configure(repo, srcProject, input.from, pm);
         gitFetchStep.fetch(input.user, input.pass, repo, pm);
         configProjectStep.configure(targetProject, parent, pm);
-        replayChangesFactory.create(input.from, api, repo,
-            srcProject, targetProject, force, resume, statistic, pm).replay();
+        replayChangesFactory
+            .create(input.from, api, repo, srcProject, targetProject, force, resume, statistic, pm)
+            .replay();
         if (!copy) {
-          importGroupsStepFactory.create(input.from, input.user, input.pass,
-              targetProject, pm).importGroups();
+          importGroupsStepFactory
+              .create(input.from, input.user, input.pass, targetProject, pm)
+              .importGroups();
         }
       }
-      importLog.onImport((IdentifiedUser) currentUser.get(), srcProject,
-          targetProject, input.from);
+      importLog.onImport((IdentifiedUser) currentUser.get(), srcProject, targetProject, input.from);
     } catch (BadRequestException e) {
       throw e;
     } catch (Exception e) {
-      importLog.onImport((IdentifiedUser) currentUser.get(), srcProject,
-          targetProject, input.from, e);
-      String msg = input.from != null
-          ? format("Unable to transfer project '%s' from"
-              + " source gerrit host '%s'.",
-              srcProject.get(), input.from)
-          : format("Unable to copy project '%s'.",
-              srcProject.get());
+      importLog.onImport(
+          (IdentifiedUser) currentUser.get(), srcProject, targetProject, input.from, e);
+      String msg =
+          input.from != null
+              ? format(
+                  "Unable to transfer project '%s' from" + " source gerrit host '%s'.",
+                  srcProject.get(), input.from)
+              : format("Unable to copy project '%s'.", srcProject.get());
       log.error(msg, e);
       throw e;
     }
@@ -267,8 +263,7 @@
     return statistic;
   }
 
-  private void checkProjectInSource(ProgressMonitor pm)
-      throws IOException, BadRequestException {
+  private void checkProjectInSource(ProgressMonitor pm) throws IOException, BadRequestException {
     pm.beginTask("Check source project", 1);
     api.getProject(srcProject.get());
     updateAndEnd(pm);
@@ -281,8 +276,7 @@
       if (!Strings.isNullOrEmpty(input.parent)) {
         parent = new Project.NameKey(input.parent);
       } else {
-        parent = new Project.NameKey(
-            api.getProject(srcProject.get()).parent);
+        parent = new Project.NameKey(api.getProject(srcProject.get()).parent);
       }
     }
     updateAndEnd(pm);
@@ -297,8 +291,8 @@
     }
     ProjectState p = projectCache.get(parent);
     if (p == null) {
-      throw new BadRequestException(format(
-          "Parent project '%s' does not exist in target.", parent.get()));
+      throw new BadRequestException(
+          format("Parent project '%s' does not exist in target.", parent.get()));
     }
     updateAndEnd(pm);
   }
@@ -310,8 +304,7 @@
       if (lockFile.lock()) {
         return lockFile;
       }
-      throw new ResourceConflictException(
-          "project is being imported from another session");
+      throw new ResourceConflictException("project is being imported from another session");
     } catch (IOException e1) {
       throw new ResourceConflictException("failed to lock project for import");
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectResource.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectResource.java
index 93b6a68..987b448 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectResource.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectResource.java
@@ -18,7 +18,6 @@
 import com.google.gerrit.extensions.restapi.RestView;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.TypeLiteral;
-
 import java.io.File;
 import java.io.IOException;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java
index eb3dbe9..337b36c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java
@@ -33,7 +33,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
 import java.io.IOException;
 
 class InsertLinkToOriginalChangeStep {
@@ -52,14 +51,12 @@
 
   interface Factory {
     InsertLinkToOriginalChangeStep create(
-        @Nullable String fromGerrit,
-        Change change,
-        ChangeInfo changeInfo,
-        boolean resume);
+        @Nullable String fromGerrit, Change change, ChangeInfo changeInfo, boolean resume);
   }
 
   @Inject
-  InsertLinkToOriginalChangeStep(CurrentUser currentUser,
+  InsertLinkToOriginalChangeStep(
+      CurrentUser currentUser,
       ChangeUpdate.Factory updateFactory,
       IdentifiedUser.GenericFactory genericUserFactory,
       ChangeData.Factory changeDataFactory,
@@ -84,14 +81,13 @@
   }
 
   void insert() throws NoSuchChangeException, OrmException, IOException {
-    insertMessage(change, (resume ? "Resumed import of " : "Imported from ")
-        + changeUrl(changeInfo));
+    insertMessage(
+        change, (resume ? "Resumed import of " : "Imported from ") + changeUrl(changeInfo));
   }
 
   private String changeUrl(ChangeInfo c) {
     StringBuilder url = new StringBuilder();
-    url.append(ensureSlash(
-        MoreObjects.firstNonNull(fromGerrit, canonicalWebUrl)));
+    url.append(ensureSlash(MoreObjects.firstNonNull(fromGerrit, canonicalWebUrl)));
     url.append(c._number);
     return url.toString();
   }
@@ -102,8 +98,10 @@
     ChangeData cd = changeDataFactory.create(db, change);
     ChangeUpdate update = updateFactory.create(cd.notes(), genericUserFactory.create(userId));
     ChangeMessage cmsg =
-        new ChangeMessage(new ChangeMessage.Key(change.getId(),
-            ChangeUtil.messageUuid()), userId, TimeUtil.nowTs(),
+        new ChangeMessage(
+            new ChangeMessage.Key(change.getId(), ChangeUtil.messageUuid()),
+            userId,
+            TimeUtil.nowTs(),
             change.currentPatchSetId());
     cmsg.setMessage(message);
     cmUtil.addChangeMessage(db, update, cmsg);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportedProjects.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportedProjects.java
index c63db70..be6f0c0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportedProjects.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportedProjects.java
@@ -21,9 +21,6 @@
 import com.google.gerrit.server.config.ConfigResource;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
-import org.kohsuke.args4j.Option;
-
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -31,6 +28,7 @@
 import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
+import org.kohsuke.args4j.Option;
 
 @Singleton
 @RequiresCapability(ImportCapability.ID)
@@ -38,8 +36,11 @@
 
   private final ProjectsCollection projects;
 
-  @Option(name = "--match", metaVar = "MATCH",
-      usage = "List only projects containing this substring, case insensitive")
+  @Option(
+    name = "--match",
+    metaVar = "MATCH",
+    usage = "List only projects containing this substring, case insensitive"
+  )
   public void setMatch(String match) {
     this.match = match.toLowerCase(Locale.ENGLISH);
   }
@@ -52,8 +53,7 @@
   }
 
   @Override
-  public Map<String, ImportProjectInfo> apply(ConfigResource rsrc)
-      throws IOException {
+  public Map<String, ImportProjectInfo> apply(ConfigResource rsrc) throws IOException {
     Map<String, ImportProjectInfo> importedProjects = Maps.newTreeMap();
     for (File f : listImportFiles()) {
       importedProjects.put(projects.FS_LAYOUT.resolveProjectName(f), ImportJson.parse(f));
@@ -76,7 +76,6 @@
   }
 
   private boolean matches(Path p) {
-    return match == null
-        || p.toString().toLowerCase(Locale.ENGLISH).contains(match);
+    return match == null || p.toString().toLowerCase(Locale.ENGLISH).contains(match);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportsCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportsCommand.java
index 701453a..c4d1c1b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportsCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ListImportsCommand.java
@@ -21,27 +21,32 @@
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.inject.Inject;
-
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
 import java.io.IOException;
 import java.util.Map;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
 
 @RequiresCapability(ImportCapability.ID)
 @CommandMetaData(name = "list-projects", description = "Lists project imports")
 class ListProjectImportsCommand extends SshCommand {
 
-  @Option(name = "--verbose", aliases = {"-v"}, required = false,
-      usage = "Print detailed info for each project import")
+  @Option(
+    name = "--verbose",
+    aliases = {"-v"},
+    required = false,
+    usage = "Print detailed info for each project import"
+  )
   private boolean verbose;
 
-  @Argument(index = 0, required = false, metaVar = "MATCH",
-      usage = "List only projects containing this substring, case insensitive")
+  @Argument(
+    index = 0,
+    required = false,
+    metaVar = "MATCH",
+    usage = "List only projects containing this substring, case insensitive"
+  )
   private String match;
 
-  @Inject
-  private ListImportedProjects list;
+  @Inject private ListImportedProjects list;
 
   @Override
   protected void run() throws IOException {
@@ -58,8 +63,7 @@
         stdout.println("  parent: " + info.parent);
         stdout.println(format("  %-23s %s:%s", "time", "user", "remote-user"));
         for (ImportInfo i : info.imports) {
-          stdout.println(
-              format("  %-23s %s:%s", i.timestamp, i.user.username, i.remoteUser));
+          stdout.println(format("  %-23s %s:%s", i.timestamp, i.user.username, i.remoteUser));
         }
         stdout.println();
       }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
index 9248b8c..e3030aa 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
@@ -34,12 +34,10 @@
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 public class LocalApi implements GerritApi {
   private final com.google.gerrit.extensions.api.GerritApi gApi;
@@ -57,8 +55,7 @@
   }
 
   @Override
-  public ProjectInfo getProject(String projectName) throws IOException,
-      BadRequestException {
+  public ProjectInfo getProject(String projectName) throws IOException, BadRequestException {
     try {
       return gApi.projects().name(projectName).get();
     } catch (RestApiException e) {
@@ -67,13 +64,11 @@
   }
 
   @Override
-  public List<ChangeInfo> queryChanges(String projectName, int start,
-      int limit) throws IOException,
-      BadRequestException {
+  public List<ChangeInfo> queryChanges(String projectName, int start, int limit)
+      throws IOException, BadRequestException {
     try {
 
-      QueryRequest query = gApi.changes()
-          .query("project:" + projectName);
+      QueryRequest query = gApi.changes().query("project:" + projectName);
       query
           .withStart(start)
           .withOptions(
@@ -83,7 +78,7 @@
               ListChangesOption.CURRENT_REVISION,
               ListChangesOption.ALL_REVISIONS,
               ListChangesOption.ALL_COMMITS);
-      if(limit > 0) {
+      if (limit > 0) {
         query.withLimit(limit);
       }
       return query.get();
@@ -93,8 +88,8 @@
   }
 
   @Override
-  public GroupInfo getGroup(String groupName) throws IOException,
-      BadRequestException, OrmException {
+  public GroupInfo getGroup(String groupName)
+      throws IOException, BadRequestException, OrmException {
     try {
       return gApi.groups().id(groupName).get();
     } catch (RestApiException e) {
@@ -106,8 +101,7 @@
   public Iterable<CommentInfo> getComments(int changeId, String rev)
       throws IOException, OrmException, BadRequestException {
     try {
-      Map<String, List<CommentInfo>> result =
-          gApi.changes().id(changeId).revision(rev).comments();
+      Map<String, List<CommentInfo>> result = gApi.changes().id(changeId).revision(rev).comments();
 
       for (Map.Entry<String, List<CommentInfo>> e : result.entrySet()) {
         for (CommentInfo i : e.getValue()) {
@@ -122,12 +116,11 @@
   }
 
   @Override
-  public List<SshKeyInfo> getSshKeys(String userId) throws BadRequestException,
-      IOException, OrmException, ConfigInvalidException {
+  public List<SshKeyInfo> getSshKeys(String userId)
+      throws BadRequestException, IOException, OrmException, ConfigInvalidException {
     try {
       AccountResource rsrc =
-          accounts.parse(TopLevelResource.INSTANCE,
-              IdString.fromDecoded(userId));
+          accounts.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(userId));
       return getSshKeys.apply(rsrc);
     } catch (ResourceNotFoundException | AuthException | PermissionBackendException e) {
       throw new BadRequestException(e.getMessage());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java b/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
index 7c2c2d4..e8f7189 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
@@ -38,28 +38,27 @@
     bind(CapabilityDefinition.class)
         .annotatedWith(Exports.named(CopyProjectCapability.ID))
         .to(CopyProjectCapability.class);
-    install(new RestApiModule() {
-      @Override
-      protected void configure() {
-        DynamicMap.mapOf(binder(), IMPORT_PROJECT_KIND);
-        DynamicMap.mapOf(binder(), IMPORT_GROUP_KIND);
+    install(
+        new RestApiModule() {
+          @Override
+          protected void configure() {
+            DynamicMap.mapOf(binder(), IMPORT_PROJECT_KIND);
+            DynamicMap.mapOf(binder(), IMPORT_GROUP_KIND);
 
-        child(CONFIG_KIND, "projects").to(ProjectsCollection.class);
-        get(IMPORT_PROJECT_KIND).to(GetImportedProject.class);
-        put(IMPORT_PROJECT_KIND, "resume").to(ResumeProjectImport.class);
-        delete(IMPORT_PROJECT_KIND).to(CompleteProjectImport.class);
+            child(CONFIG_KIND, "projects").to(ProjectsCollection.class);
+            get(IMPORT_PROJECT_KIND).to(GetImportedProject.class);
+            put(IMPORT_PROJECT_KIND, "resume").to(ResumeProjectImport.class);
+            delete(IMPORT_PROJECT_KIND).to(CompleteProjectImport.class);
 
-        put(PROJECT_KIND, "copy").to(CopyProject.class);
-        put(PROJECT_KIND, "copy.resume").to(ResumeCopyProject.class);
-        put(PROJECT_KIND, "import.resume").to(ResumeProjectImport.OnProjects.class);
-        post(PROJECT_KIND, "delete").to(CompleteProjectImport.OnProjects.class);
+            put(PROJECT_KIND, "copy").to(CopyProject.class);
+            put(PROJECT_KIND, "copy.resume").to(ResumeCopyProject.class);
+            put(PROJECT_KIND, "import.resume").to(ResumeProjectImport.OnProjects.class);
+            post(PROJECT_KIND, "delete").to(CompleteProjectImport.OnProjects.class);
 
-        child(CONFIG_KIND, "groups").to(GroupsCollection.class);
-      }
-    });
-    bind(LifecycleListener.class)
-      .annotatedWith(UniqueAnnotations.create())
-      .to(ImportLog.class);
+            child(CONFIG_KIND, "groups").to(GroupsCollection.class);
+          }
+        });
+    bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(ImportLog.class);
     bind(OpenRepositoryStep.class);
     bind(ConfigureRepositoryStep.class);
     bind(ConfigureProjectStep.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
index 06fb06c..16f63d6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
@@ -31,23 +31,21 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
 
-import java.io.IOException;
-
 @Singleton
 class OpenRepositoryStep {
   private final GitRepositoryManager git;
   private final ProjectCache projectCache;
-  private final DynamicSet<ProjectCreationValidationListener>
-      projectCreationValidationListeners;
+  private final DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners;
   private final Provider<ProjectsCollection> projectsCollection;
 
   @Inject
-  OpenRepositoryStep(GitRepositoryManager git,
+  OpenRepositoryStep(
+      GitRepositoryManager git,
       ProjectCache projectCache,
       DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners,
       Provider<ProjectsCollection> projectsCollection) {
@@ -57,23 +55,20 @@
     this.projectsCollection = projectsCollection;
   }
 
-  Repository open(Project.NameKey name, boolean resume, ProgressMonitor pm,
-      Project.NameKey parent)
+  Repository open(Project.NameKey name, boolean resume, ProgressMonitor pm, Project.NameKey parent)
       throws ResourceConflictException, IOException, UnprocessableEntityException,
-      PermissionBackendException {
+          PermissionBackendException {
     pm.beginTask("Open repository", 1);
     try {
       Repository repo = git.openRepository(name);
       if (resume) {
         return repo;
       }
-      throw new ResourceConflictException(format(
-          "repository %s already exists", name.get()));
+      throw new ResourceConflictException(format("repository %s already exists", name.get()));
     } catch (RepositoryNotFoundException e) {
       // Project doesn't exist
       if (resume) {
-        throw new ResourceConflictException(format(
-            "repository %s does not exist", name.get()));
+        throw new ResourceConflictException(format("repository %s does not exist", name.get()));
       }
     }
 
@@ -86,7 +81,7 @@
 
   private void beforeCreateProject(Project.NameKey name, Project.NameKey parent)
       throws ResourceConflictException, UnprocessableEntityException, IOException,
-      PermissionBackendException {
+          PermissionBackendException {
     CreateProjectArgs args = new CreateProjectArgs();
     args.setProjectName(name);
     args.newParent = projectsCollection.get().parse(parent.get()).getNameKey();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/PasswordUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/PasswordUtil.java
index 6409e72..f4705b3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/PasswordUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/PasswordUtil.java
@@ -18,7 +18,6 @@
 
 import com.google.common.base.Strings;
 import com.google.gerrit.sshd.BaseCommand.UnloggedFailure;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -30,8 +29,7 @@
   static String readPassword(InputStream in, String pass)
       throws UnsupportedEncodingException, IOException, UnloggedFailure {
     if ("-".equals(pass)) {
-      BufferedReader br = new BufferedReader(
-          new InputStreamReader(in, UTF_8));
+      BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8));
       pass = Strings.nullToEmpty(br.readLine());
       if (br.readLine() != null) {
         throw new UnloggedFailure(1, "multi-line password not allowed");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
index d55bb4c..8aca867 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
@@ -20,61 +20,86 @@
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-
+import java.io.IOException;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
-import java.io.IOException;
-
 @RequiresCapability(ImportCapability.ID)
 @CommandMetaData(name = "project", description = "Imports a project")
 public class ProjectCommand extends SshCommand {
-  @Option(name = "--from", aliases = {"-f"}, required = true, metaVar = "URL",
-      usage = "URL of the remote system from where the project should be imported")
+  @Option(
+    name = "--from",
+    aliases = {"-f"},
+    required = true,
+    metaVar = "URL",
+    usage = "URL of the remote system from where the project should be imported"
+  )
   private String url;
 
-  @Option(name = "--name", required = false, metaVar = "NAME",
-      usage = "name of project in source system (if not specified it is"
-          + " assumed to be the same name as in the target system)")
+  @Option(
+    name = "--name",
+    required = false,
+    metaVar = "NAME",
+    usage =
+        "name of project in source system (if not specified it is"
+            + " assumed to be the same name as in the target system)"
+  )
   private String name;
 
-  @Option(name = "--user", aliases = {"-u"}, required = true, metaVar = "NAME",
-      usage = "user on remote system")
+  @Option(
+    name = "--user",
+    aliases = {"-u"},
+    required = true,
+    metaVar = "NAME",
+    usage = "user on remote system"
+  )
   private String user;
 
-  @Option(name = "--pass", aliases = {"-p"}, required = true, metaVar = "-|PASS",
-      usage = "password of remote user")
+  @Option(
+    name = "--pass",
+    aliases = {"-p"},
+    required = true,
+    metaVar = "-|PASS",
+    usage = "password of remote user"
+  )
   private String pass;
 
-  @Option(name = "--parent", required = false, metaVar = "NAME",
-      usage = "name of parent project in target system")
+  @Option(
+    name = "--parent",
+    required = false,
+    metaVar = "NAME",
+    usage = "name of parent project in target system"
+  )
   private String parent;
 
   @Option(name = "--quiet", usage = "suppress progress messages")
   private boolean quiet;
 
-  @Argument(index = 0, required = true, metaVar = "NAME",
-      usage = "name of the project in target system")
+  @Argument(
+    index = 0,
+    required = true,
+    metaVar = "NAME",
+    usage = "name of the project in target system"
+  )
   private String project;
 
-  @Inject
-  private ImportProject.Factory importProjectFactory;
+  @Inject private ImportProject.Factory importProjectFactory;
 
   @Override
   protected void run()
-      throws OrmException, IOException, UnloggedFailure, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException, ConfigInvalidException, PermissionBackendException {
+      throws OrmException, IOException, UnloggedFailure, ValidationException, GitAPIException,
+          NoSuchChangeException, NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     ImportProject.Input input = new ImportProject.Input();
     input.from = url;
     input.name = name;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectsCollection.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectsCollection.java
index ded7130..cb50841 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectsCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectsCollection.java
@@ -30,16 +30,15 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
 
 @Singleton
 @RequiresCapability(ImportCapability.ID)
-public class ProjectsCollection implements
-    ChildCollection<ConfigResource, ImportProjectResource>,
-    AcceptsCreate<ConfigResource> {
+public class ProjectsCollection
+    implements ChildCollection<ConfigResource, ImportProjectResource>,
+        AcceptsCreate<ConfigResource> {
 
   class FileSystemLayout {
 
@@ -54,39 +53,40 @@
     }
 
     String resolveProjectName(File f) throws IOException {
-      if(! f.isFile()) {
-        throw new RuntimeException(format("'%s' is not a file. Project names"
-            + "can only be resolved for existing files, not for directories."
-            , f));
+      if (!f.isFile()) {
+        throw new RuntimeException(
+            format(
+                "'%s' is not a file. Project names"
+                    + "can only be resolved for existing files, not for directories.",
+                f));
       }
 
-      if(! f.getName().endsWith(SUFFIX_IMPORT_STATUS_FILE)) {
-        throw new RuntimeException(format("'%s' is not a valid import status"
-            + "file. Invalid appendix. Should be '%s'.", f,
-            SUFFIX_IMPORT_STATUS_FILE));
+      if (!f.getName().endsWith(SUFFIX_IMPORT_STATUS_FILE)) {
+        throw new RuntimeException(
+            format(
+                "'%s' is not a valid import status" + "file. Invalid appendix. Should be '%s'.",
+                f, SUFFIX_IMPORT_STATUS_FILE));
       }
       String diff = diff(lockRoot, f);
-      return diff.substring(0, diff.length() -
-          SUFFIX_IMPORT_STATUS_FILE.length());
+      return diff.substring(0, diff.length() - SUFFIX_IMPORT_STATUS_FILE.length());
     }
 
     /**
-     * Returns the path between two file instances. The child instance
-     * is expected to be a child of the parent instance.
+     * Returns the path between two file instances. The child instance is expected to be a child of
+     * the parent instance.
+     *
      * @param parent
      * @param child
      * @return The path between parent and child.
-     * @throws IOException in case <code>child</code> is not a child of
-     * <code>parent</code>.
+     * @throws IOException in case <code>child</code> is not a child of <code>parent</code>.
      */
     private String diff(File parent, File child) throws IOException {
       Path parentPath = parent.getAbsoluteFile().toPath();
-      Path childPath= child.getAbsoluteFile().toPath();
+      Path childPath = child.getAbsoluteFile().toPath();
       if (childPath.startsWith(parentPath)) {
         return parentPath.relativize(childPath).toString();
       }
-      throw new IOException(String.format("'%s' is not a child of '%s'.",
-          child, parent));
+      throw new IOException(String.format("'%s' is not a child of '%s'.", child, parent));
     }
   }
 
@@ -120,8 +120,7 @@
     return parse(id.get());
   }
 
-  public ImportProjectResource parse(String id)
-      throws ResourceNotFoundException {
+  public ImportProjectResource parse(String id) throws ResourceNotFoundException {
     File f = FS_LAYOUT.getImportStatusFile(id);
     if (!f.exists()) {
       throw new ResourceNotFoundException(id);
@@ -136,8 +135,7 @@
   }
 
   @Override
-  public ImportProject create(ConfigResource parent, IdString id)
-      throws RestApiException {
+  public ImportProject create(ConfigResource parent, IdString id) throws RestApiException {
     return importProjectFactory.create(new Project.NameKey(id.get()));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
index b83a142..061341e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
@@ -28,14 +28,12 @@
 import com.google.gerrit.server.OutputFormat;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-
-import org.apache.http.HttpStatus;
-
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
+import org.apache.http.HttpStatus;
 
 class RemoteApi implements GerritApi {
 
@@ -46,35 +44,37 @@
   }
 
   @Override
-  public ProjectInfo getProject(String projectName) throws IOException,
-      BadRequestException {
+  public ProjectInfo getProject(String projectName) throws IOException, BadRequestException {
     projectName = encode(projectName);
     String endPoint = "/projects/" + projectName;
     try (RestResponse r = checkedGet(endPoint)) {
-      return newGson().fromJson(r.getReader(),
-          new TypeToken<ProjectInfo>() {}.getType());
+      return newGson().fromJson(r.getReader(), new TypeToken<ProjectInfo>() {}.getType());
     }
   }
 
   @Override
-  public List<ChangeInfo> queryChanges(String projectName,
-      int start, int limit) throws IOException, BadRequestException {
+  public List<ChangeInfo> queryChanges(String projectName, int start, int limit)
+      throws IOException, BadRequestException {
     String endPoint =
-        "/changes/?S=" +
-        start + ((limit > 0) ? "&n=" + limit : "") + "&q=project:" + projectName +
-        "&O=" + Integer.toHexString(ListChangesOption.toBits(
-            EnumSet.of(
-                ListChangesOption.DETAILED_LABELS,
-                ListChangesOption.DETAILED_ACCOUNTS,
-                ListChangesOption.MESSAGES,
-                ListChangesOption.CURRENT_REVISION,
-                ListChangesOption.ALL_REVISIONS,
-                ListChangesOption.ALL_COMMITS)));
+        "/changes/?S="
+            + start
+            + ((limit > 0) ? "&n=" + limit : "")
+            + "&q=project:"
+            + projectName
+            + "&O="
+            + Integer.toHexString(
+                ListChangesOption.toBits(
+                    EnumSet.of(
+                        ListChangesOption.DETAILED_LABELS,
+                        ListChangesOption.DETAILED_ACCOUNTS,
+                        ListChangesOption.MESSAGES,
+                        ListChangesOption.CURRENT_REVISION,
+                        ListChangesOption.ALL_REVISIONS,
+                        ListChangesOption.ALL_COMMITS)));
 
     List<ChangeInfo> result;
     try (RestResponse r = checkedGet(endPoint)) {
-      result = newGson().fromJson(r.getReader(),
-            new TypeToken<List<ChangeInfo>>() {}.getType());
+      result = newGson().fromJson(r.getReader(), new TypeToken<List<ChangeInfo>>() {}.getType());
     }
 
     for (ChangeInfo c : result) {
@@ -87,13 +87,11 @@
   }
 
   @Override
-  public GroupInfo getGroup(String groupName) throws IOException,
-      BadRequestException {
+  public GroupInfo getGroup(String groupName) throws IOException, BadRequestException {
     groupName = encode(groupName);
     String endPoint = "/groups/" + groupName + "/detail";
     try (RestResponse r = checkedGet(endPoint)) {
-      return newGson().fromJson(r.getReader(),
-              new TypeToken<GroupInfo>() {}.getType());
+      return newGson().fromJson(r.getReader(), new TypeToken<GroupInfo>() {}.getType());
     }
   }
 
@@ -107,8 +105,10 @@
         return null;
       }
       assertOK(HttpMethod.GET, endPoint, r);
-      result = newGson().fromJson(r.getReader(),
-              new TypeToken<Map<String, List<CommentInfo>>>() {}.getType());
+      result =
+          newGson()
+              .fromJson(
+                  r.getReader(), new TypeToken<Map<String, List<CommentInfo>>>() {}.getType());
     }
     for (Map.Entry<String, List<CommentInfo>> e : result.entrySet()) {
       for (CommentInfo i : e.getValue()) {
@@ -122,8 +122,7 @@
   public List<SshKeyInfo> getSshKeys(String userId) throws BadRequestException, IOException {
     String endPoint = "/accounts/" + userId + "/sshkeys/";
     try (RestResponse r = checkedGet(endPoint)) {
-      return newGson().fromJson(r.getReader(),
-          new TypeToken<List<SshKeyInfo>>() {}.getType());
+      return newGson().fromJson(r.getReader(), new TypeToken<List<SshKeyInfo>>() {}.getType());
     }
   }
 
@@ -131,8 +130,8 @@
   public Version getVersion() throws BadRequestException, IOException {
     String endPoint = "/config/server/version";
     try (RestResponse r = checkedGet(endPoint)) {
-      return new Version((String)newGson().fromJson(
-          r.getReader(), new TypeToken<String>() {}.getType()));
+      return new Version(
+          (String) newGson().fromJson(r.getReader(), new TypeToken<String>() {}.getType()));
     }
   }
 
@@ -140,8 +139,7 @@
     return OutputFormat.JSON_COMPACT.newGson();
   }
 
-  private RestResponse checkedGet(String endPoint) throws IOException,
-      BadRequestException {
+  private RestResponse checkedGet(String endPoint) throws IOException, BadRequestException {
     try {
       RestResponse r = restSession.get(endPoint);
       assertOK(HttpMethod.GET, endPoint, r);
@@ -151,22 +149,25 @@
     }
   }
 
-  private static void assertOK(HttpMethod method, String endPoint,
-      RestResponse r) throws IOException, BadRequestException {
+  private static void assertOK(HttpMethod method, String endPoint, RestResponse r)
+      throws IOException, BadRequestException {
     if (r.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
       throw new BadRequestException(
           "invalid credentials: accessing source system failed with 401 Unauthorized");
     }
     if (r.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
-      throw new BadRequestException(String.format(
-          "missing permissions or invalid import entity identifier: Accessing "
-          + "REST endpoint %s on source system failed with 404 Not found", endPoint));
+      throw new BadRequestException(
+          String.format(
+              "missing permissions or invalid import entity identifier: Accessing "
+                  + "REST endpoint %s on source system failed with 404 Not found",
+              endPoint));
     }
 
     if (r.getStatusCode() < 200 || 300 <= r.getStatusCode()) {
-      throw new IOException(String.format(
-          "Unexpected response code for %s on %s : %s", method.name(),
-          endPoint, r.getStatusCode()));
+      throw new IOException(
+          String.format(
+              "Unexpected response code for %s on %s : %s",
+              method.name(), endPoint, r.getStatusCode()));
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
index 2820b15..7649d00 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
@@ -18,7 +18,6 @@
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.data.GlobalCapability;
 import com.google.gerrit.common.errors.NoSuchAccountException;
-import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.Url;
@@ -28,17 +27,19 @@
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.index.change.ChangeIndexer;
 import com.google.gerrit.server.notedb.NotesMigration;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
-
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
@@ -46,10 +47,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
 class ReplayChangesStep {
 
   interface Factory {
@@ -135,16 +132,15 @@
     this.isNoteDbEnabled = migration.readChanges();
   }
 
-  void replay() throws IOException, OrmException,
-      NoSuchAccountException, NoSuchChangeException, RestApiException,
-      UpdateException, ConfigInvalidException {
+  void replay()
+      throws IOException, OrmException, NoSuchAccountException, NoSuchChangeException,
+          RestApiException, UpdateException, ConfigInvalidException {
     int start = 0;
     int limit = GlobalCapability.DEFAULT_MAX_QUERY_LIMIT;
     pm.beginTask("Replay Changes", ProgressMonitor.UNKNOWN);
-    for(;;) {
-      List<ChangeInfo> changes = api.queryChanges(srcProject.get(),
-          start, limit);
-      if(changes.isEmpty()) {
+    for (; ; ) {
+      List<ChangeInfo> changes = api.queryChanges(srcProject.get(), start, limit);
+      if (changes.isEmpty()) {
         break;
       }
       start += changes.size();
@@ -154,14 +150,13 @@
           try {
             replayChange(rw, c);
           } catch (Exception e) {
-            log.error(String.format("Failed to replay change %s.",
-                Url.decode(c.id)), e);
+            log.error(String.format("Failed to replay change %s.", Url.decode(c.id)), e);
             throw e;
           }
           last = c;
           pm.update(1);
         }
-        if(!Boolean.TRUE.equals(last._moreChanges)) {
+        if (!Boolean.TRUE.equals(last._moreChanges)) {
           break;
         }
       }
@@ -170,9 +165,8 @@
   }
 
   private void replayChange(RevWalk rw, ChangeInfo c)
-      throws IOException, OrmException, NoSuchAccountException,
-      NoSuchChangeException, RestApiException, IllegalArgumentException,
-      UpdateException, ConfigInvalidException {
+      throws IOException, OrmException, NoSuchAccountException, NoSuchChangeException,
+          RestApiException, IllegalArgumentException, UpdateException, ConfigInvalidException {
     Change change = resume ? findChange(c) : null;
     boolean resumeChange;
     if (change == null) {
@@ -213,33 +207,38 @@
   }
 
   private Change findChange(ChangeInfo c) throws OrmException {
-    List<Change> changes = ChangeData.asChanges(
-        queryProvider.get().byBranchKey(
-            new Branch.NameKey(targetProject, RefNames.fullName(c.branch)),
-            new Change.Key(c.changeId)));
+    List<Change> changes =
+        ChangeData.asChanges(
+            queryProvider
+                .get()
+                .byBranchKey(
+                    new Branch.NameKey(targetProject, RefNames.fullName(c.branch)),
+                    new Change.Key(c.changeId)));
     if (changes.isEmpty()) {
       return null;
     }
-    return db.changes().get(
-        Iterators.getOnlyElement(changes.iterator()).getId());
+    return db.changes().get(Iterators.getOnlyElement(changes.iterator()).getId());
   }
 
   private Change createChange(ChangeInfo c)
-      throws OrmException, NoSuchAccountException, IOException,
-      RestApiException, ConfigInvalidException {
+      throws OrmException, NoSuchAccountException, IOException, RestApiException,
+          ConfigInvalidException {
     Change.Id changeId = new Change.Id(sequences.nextChangeId());
 
     Change change =
-        new Change(new Change.Key(c.changeId), changeId, accountUtil.resolveUser(api, c.owner),
-            new Branch.NameKey(targetProject, RefNames.fullName(c.branch)), c.created);
+        new Change(
+            new Change.Key(c.changeId),
+            changeId,
+            accountUtil.resolveUser(api, c.owner),
+            new Branch.NameKey(targetProject, RefNames.fullName(c.branch)),
+            c.created);
     change.setStatus(Change.Status.forChangeStatus(c.status));
     change.setTopic(c.topic);
     change.setLastUpdatedOn(c.updated);
     return change;
   }
 
-  private void upsertChange(boolean resumeChange, Change change, ChangeInfo c)
-      throws OrmException {
+  private void upsertChange(boolean resumeChange, Change change, ChangeInfo c) throws OrmException {
     if (resumeChange) {
       change.setStatus(Change.Status.forChangeStatus(c.status));
       change.setTopic(c.topic);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
index b1ec866..cd0e4fd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
@@ -48,11 +48,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.Collection;
 import java.util.HashSet;
@@ -60,16 +55,18 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class ReplayInlineCommentsStep {
 
   interface Factory {
-    ReplayInlineCommentsStep create(Change change, ChangeInfo changeInfo,
-        GerritApi api, boolean resume);
+    ReplayInlineCommentsStep create(
+        Change change, ChangeInfo changeInfo, GerritApi api, boolean resume);
   }
 
-  private static final Logger log = LoggerFactory
-      .getLogger(ReplayInlineCommentsStep.class);
+  private static final Logger log = LoggerFactory.getLogger(ReplayInlineCommentsStep.class);
 
   private final AccountUtil accountUtil;
   private final ReviewDb db;
@@ -86,7 +83,8 @@
   private final boolean resume;
 
   @Inject
-  public ReplayInlineCommentsStep(AccountUtil accountUtil,
+  public ReplayInlineCommentsStep(
+      AccountUtil accountUtil,
       ReviewDb db,
       IdentifiedUser.GenericFactory genericUserFactory,
       ChangeControl.GenericFactory changeControlFactory,
@@ -116,39 +114,38 @@
 
   void replay()
       throws RestApiException, OrmException, IOException, NoSuchChangeException,
-      NoSuchAccountException, ConfigInvalidException {
-    ChangeControl ctrl =  control(change, change.getOwner());
-    for (PatchSet ps : ChangeUtil.PS_ID_ORDER
-        .sortedCopy(psUtil.byChange(db, ctrl.getNotes()))) {
-      Iterable<CommentInfo> comments = api.getComments(
-          changeInfo._number, ps.getRevision().get());
+          NoSuchAccountException, ConfigInvalidException {
+    ChangeControl ctrl = control(change, change.getOwner());
+    for (PatchSet ps : ChangeUtil.PS_ID_ORDER.sortedCopy(psUtil.byChange(db, ctrl.getNotes()))) {
+      Iterable<CommentInfo> comments = api.getComments(changeInfo._number, ps.getRevision().get());
       if (resume) {
         if (comments == null) {
           // the revision does not exist in the source system,
           // it must be a revision that was created in the target system after
           // the initial import
-          log.warn(String.format(
-              "Project %s was modified in target system: "
-                  + "Skip replay inline comments for patch set %s"
-                  + " which doesn't exist in the source system.",
-              change.getProject().get(), ps.getId().toString()));
+          log.warn(
+              String.format(
+                  "Project %s was modified in target system: "
+                      + "Skip replay inline comments for patch set %s"
+                      + " which doesn't exist in the source system.",
+                  change.getProject().get(), ps.getId().toString()));
           continue;
         }
 
         comments = filterComments(ps, comments);
       } else if (comments == null) {
-        log.warn(String.format(
-            "Cannot retrieve comments for revision %s, "
-                + "revision not found in source system: "
-                + "Skip replay inline comments for patch set %s of project %s.",
-            ps.getRevision().get(), ps.getId().toString(),
-            change.getProject().get()));
+        log.warn(
+            String.format(
+                "Cannot retrieve comments for revision %s, "
+                    + "revision not found in source system: "
+                    + "Skip replay inline comments for patch set %s of project %s.",
+                ps.getRevision().get(), ps.getId().toString(), change.getProject().get()));
         continue;
       }
 
       Multimap<Account.Id, CommentInfo> commentsByAuthor = ArrayListMultimap.create();
       for (CommentInfo comment : comments) {
-        Account.Id id  = accountUtil.resolveUser(api, comment.author);
+        Account.Id id = accountUtil.resolveUser(api, comment.author);
         commentsByAuthor.put(id, comment);
       }
 
@@ -158,8 +155,8 @@
     }
   }
 
-  private Iterable<CommentInfo> filterComments(PatchSet ps,
-      Iterable<CommentInfo> comments) throws OrmException {
+  private Iterable<CommentInfo> filterComments(PatchSet ps, Iterable<CommentInfo> comments)
+      throws OrmException {
     Set<String> existingUuids = new HashSet<>();
     for (PatchLineComment c : db.patchComments().byPatchSet(ps.getId())) {
       existingUuids.add(c.getKey().get());
@@ -175,9 +172,8 @@
     return comments;
   }
 
-  private void insertComments(PatchSet ps, Account.Id author,
-      Collection<CommentInfo> comments) throws OrmException, IOException,
-      NoSuchChangeException {
+  private void insertComments(PatchSet ps, Account.Id author, Collection<CommentInfo> comments)
+      throws OrmException, IOException, NoSuchChangeException {
     ChangeControl ctrl = control(change, author);
 
     Map<String, Comment> drafts = scanDraftComments(ctrl, ps);
@@ -190,8 +186,9 @@
       Comment e = drafts.remove(Url.decode(c.id));
 
       if (e == null) {
-        e = new Comment(
-            new Comment.Key(Url.decode(c.id), c.path, ps.getId().get()),
+        e =
+            new Comment(
+                new Comment.Key(Url.decode(c.id), c.path, ps.getId().get()),
                 author,
                 c.updated,
                 c.side == Side.PARENT ? (short) 0 : (short) 1,
@@ -203,11 +200,9 @@
       }
       setCommentRevId(e, patchListCache, change, ps);
       if (c.range != null) {
-        e.setRange(new CommentRange(
-            c.range.startLine,
-            c.range.startCharacter,
-            c.range.endLine,
-            c.range.endCharacter));
+        e.setRange(
+            new CommentRange(
+                c.range.startLine, c.range.startCharacter, c.range.endLine, c.range.endCharacter));
         e.lineNbr = c.range.endLine;
       } else {
         e.lineNbr = c.line == null ? 0 : c.line;
@@ -224,24 +219,22 @@
     update.commit();
   }
 
-  private Map<String, Comment> scanDraftComments(ChangeControl ctrl,
-      PatchSet ps) throws OrmException {
+  private Map<String, Comment> scanDraftComments(ChangeControl ctrl, PatchSet ps)
+      throws OrmException {
     Map<String, Comment> drafts = Maps.newHashMap();
-    for (Comment c : commentsUtil.draftByPatchSetAuthor(db, ps.getId(),
-            ((IdentifiedUser) ctrl.getUser()).getAccountId(),
-            ctrl.getNotes())) {
+    for (Comment c :
+        commentsUtil.draftByPatchSetAuthor(
+            db, ps.getId(), ((IdentifiedUser) ctrl.getUser()).getAccountId(), ctrl.getNotes())) {
       drafts.put(c.key.uuid, c);
     }
     return drafts;
   }
 
-  private ChangeControl control(Change change, Account.Id id)
-      throws NoSuchChangeException {
+  private ChangeControl control(Change change, Account.Id id) throws NoSuchChangeException {
     try {
-      return changeControlFactory.controlFor(db, change,
-          genericUserFactory.create(id));
+      return changeControlFactory.controlFor(db, change, genericUserFactory.create(id));
     } catch (OrmException e) {
-       throw new NoSuchChangeException(change.getId());
-     }
+      throw new NoSuchChangeException(change.getId());
+    }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
index 9b1d130..d439b44 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
@@ -31,18 +31,15 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
 import java.sql.Timestamp;
 import java.util.Collections;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 class ReplayMessagesStep {
 
   interface Factory {
-    ReplayMessagesStep create(Change change, ChangeInfo changeInfo,
-        boolean resume);
+    ReplayMessagesStep create(Change change, ChangeInfo changeInfo, boolean resume);
   }
 
   private final AccountUtil accountUtil;
@@ -56,7 +53,8 @@
   private final boolean resume;
 
   @Inject
-  public ReplayMessagesStep(AccountUtil accountUtil,
+  public ReplayMessagesStep(
+      AccountUtil accountUtil,
       ChangeUpdate.Factory updateFactory,
       ChangeMessagesUtil cmUtil,
       IdentifiedUser.GenericFactory genericUserFactory,
@@ -76,9 +74,9 @@
     this.resume = resume;
   }
 
-  void replay(GerritApi api) throws NoSuchAccountException,
-      NoSuchChangeException, OrmException, IOException, RestApiException,
-      ConfigInvalidException {
+  void replay(GerritApi api)
+      throws NoSuchAccountException, NoSuchChangeException, OrmException, IOException,
+          RestApiException, ConfigInvalidException {
     for (ChangeMessageInfo msg : changeInfo.messages) {
       ChangeMessage.Key msgKey = new ChangeMessage.Key(change.getId(), msg.id);
       if (resume && db.changeMessages().get(msgKey) != null) {
@@ -87,9 +85,8 @@
       }
 
       Timestamp ts = msg.date;
-      PatchSet.Id psId = msg._revisionNumber != null
-          ? new PatchSet.Id(change.getId(),  msg._revisionNumber)
-          : null;
+      PatchSet.Id psId =
+          msg._revisionNumber != null ? new PatchSet.Id(change.getId(), msg._revisionNumber) : null;
       if (msg.author != null) {
         Account.Id userId = accountUtil.resolveUser(api, msg.author);
         ChangeControl ctrl = control(change, userId);
@@ -101,19 +98,16 @@
       } else {
         // Message create by the GerritPersonIdent user
         ChangeMessage cmsg =
-            new ChangeMessage(new ChangeMessage.Key(change.getId(), msg.id),
-                null, ts, psId);
+            new ChangeMessage(new ChangeMessage.Key(change.getId(), msg.id), null, ts, psId);
         cmsg.setMessage(msg.message);
         db.changeMessages().insert(Collections.singleton(cmsg));
       }
     }
   }
 
-  private ChangeControl control(Change change, Account.Id id)
-      throws NoSuchChangeException {
+  private ChangeControl control(Change change, Account.Id id) throws NoSuchChangeException {
     try {
-      return changeControlFactory.controlFor(db, change,
-        genericUserFactory.create(id));
+      return changeControlFactory.controlFor(db, change, genericUserFactory.create(id));
     } catch (OrmException e) {
       throw new NoSuchChangeException(change.getId());
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
index d98df7d..be52f2d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
@@ -27,7 +27,9 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -38,19 +40,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
 class ReplayRevisionsStep {
 
   interface Factory {
-    ReplayRevisionsStep create(Repository repo, RevWalk rw, Change change,
-        ChangeInfo changeInfo);
+    ReplayRevisionsStep create(Repository repo, RevWalk rw, Change change, ChangeInfo changeInfo);
   }
 
-  private static final Logger log = LoggerFactory
-      .getLogger(ReplayRevisionsStep.class);
+  private static final Logger log = LoggerFactory.getLogger(ReplayRevisionsStep.class);
 
   private final AccountUtil accountUtil;
   private final ReviewDb db;
@@ -61,7 +57,8 @@
   private final ChangeInfo changeInfo;
 
   @Inject
-  public ReplayRevisionsStep(AccountUtil accountUtil,
+  public ReplayRevisionsStep(
+      AccountUtil accountUtil,
       ReviewDb db,
       PatchSetInfoFactory patchSetInfoFactory,
       @Assisted Repository repo,
@@ -78,8 +75,8 @@
   }
 
   void replay(GerritApi api)
-      throws IOException, OrmException, NoSuchAccountException,
-      RestApiException, ConfigInvalidException {
+      throws IOException, OrmException, NoSuchAccountException, RestApiException,
+          ConfigInvalidException {
     List<RevisionInfo> revisions = new ArrayList<>(changeInfo.revisions.values());
     sortRevisionInfoByNumber(revisions);
     List<PatchSet> patchSets = new ArrayList<>();
@@ -105,10 +102,11 @@
           }
           // a patch set with the same number was created both in the source
           // and in the target system
-          log.warn(String.format(
-              "Project %s was modified in target system: "
-                  + "Skip replay revision for patch set %s.",
-              change.getProject().get(), ps.getId().toString()));
+          log.warn(
+              String.format(
+                  "Project %s was modified in target system: "
+                      + "Skip replay revision for patch set %s.",
+                  change.getProject().get(), ps.getId().toString()));
           continue;
         }
 
@@ -128,15 +126,17 @@
 
       if (change.currentPatchSetId() == null) {
         if (changeInfo.currentRevision != null) {
-          log.warn(String.format(
-              "Current revision %s of change %s not found."
-              + " Setting lastest revision %s as current patch set.",
-              changeInfo.currentRevision, changeInfo.id, info.getRevId()));
+          log.warn(
+              String.format(
+                  "Current revision %s of change %s not found."
+                      + " Setting lastest revision %s as current patch set.",
+                  changeInfo.currentRevision, changeInfo.id, info.getRevId()));
         } else {
-          log.warn(String.format(
-              "Change %s has no current revision."
-              + " Setting lastest revision %s as current patch set.",
-              changeInfo.id, info.getRevId()));
+          log.warn(
+              String.format(
+                  "Change %s has no current revision."
+                      + " Setting lastest revision %s as current patch set.",
+                  changeInfo.id, info.getRevId()));
         }
         change.setCurrentPatchSet(info);
       }
@@ -149,16 +149,14 @@
   }
 
   private static String imported(String ref) {
-    return ConfigureRepositoryStep.R_IMPORTS
-        + ref.substring(Constants.R_REFS.length());
+    return ConfigureRepositoryStep.R_IMPORTS + ref.substring(Constants.R_REFS.length());
   }
 
   private static void sortRevisionInfoByNumber(List<RevisionInfo> list) {
     list.sort((a, b) -> a._number - b._number);
   }
 
-  private void updateRef(Repository repo, PatchSet ps)
-      throws IOException {
+  private void updateRef(Repository repo, PatchSet ps) throws IOException {
     String ref = ps.getId().toRefName();
     RefUpdate ru = repo.updateRef(ref);
     ru.setExpectedOldObjectId(ObjectId.zeroId());
@@ -179,8 +177,8 @@
       case REJECTED_MISSING_OBJECT:
       case REJECTED_OTHER_REASON:
       default:
-        throw new IOException(String.format(
-            "Failed to create ref %s, RefUpdate.Result = %s", ref, result));
+        throw new IOException(
+            String.format("Failed to create ref %s, RefUpdate.Result = %s", ref, result));
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RestResponse.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RestResponse.java
index 24f6831..27ca570 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/RestResponse.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/RestResponse.java
@@ -16,11 +16,10 @@
 
 import static com.google.gerrit.httpd.restapi.RestApiServlet.JSON_MAGIC;
 
-import org.apache.http.client.methods.CloseableHttpResponse;
-
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import org.apache.http.client.methods.CloseableHttpResponse;
 
 public class RestResponse extends HttpResponse {
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RestSession.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RestSession.java
index d2ca5c7..39e5c38 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/RestSession.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/RestSession.java
@@ -18,7 +18,10 @@
 import com.google.common.base.Preconditions;
 import com.google.gerrit.extensions.restapi.RawInput;
 import com.google.gerrit.server.OutputFormat;
-
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import org.apache.http.client.methods.HttpDelete;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
@@ -28,11 +31,6 @@
 import org.apache.http.entity.StringEntity;
 import org.apache.http.message.BasicHeader;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-
 public class RestSession extends HttpSession {
 
   public RestSession(String url, String user, String pass) {
@@ -53,9 +51,9 @@
     HttpPut put = new HttpPut(url + "/a" + endPoint);
     if (content != null) {
       put.addHeader(new BasicHeader("Content-Type", "application/json"));
-      put.setEntity(new StringEntity(
-          OutputFormat.JSON_COMPACT.newGson().toJson(content),
-          Charsets.UTF_8.name()));
+      put.setEntity(
+          new StringEntity(
+              OutputFormat.JSON_COMPACT.newGson().toJson(content), Charsets.UTF_8.name()));
     }
     return new RestResponse(getClient().execute(put));
   }
@@ -64,10 +62,9 @@
     Preconditions.checkNotNull(stream);
     HttpPut put = new HttpPut(url + "/a" + endPoint);
     put.addHeader(new BasicHeader("Content-Type", stream.getContentType()));
-    put.setEntity(new BufferedHttpEntity(
-        new InputStreamEntity(
-            stream.getInputStream(),
-            stream.getContentLength())));
+    put.setEntity(
+        new BufferedHttpEntity(
+            new InputStreamEntity(stream.getInputStream(), stream.getContentLength())));
     return new RestResponse(getClient().execute(put));
   }
 
@@ -79,9 +76,9 @@
     HttpPost post = new HttpPost(url + "/a" + endPoint);
     if (content != null) {
       post.addHeader(new BasicHeader("Content-Type", "application/json"));
-      post.setEntity(new StringEntity(
-          OutputFormat.JSON_COMPACT.newGson().toJson(content),
-          Charsets.UTF_8.name()));
+      post.setEntity(
+          new StringEntity(
+              OutputFormat.JSON_COMPACT.newGson().toJson(content), Charsets.UTF_8.name()));
     }
     return new RestResponse(getClient().execute(post));
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyCommand.java
index fa70cba..17f186e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyCommand.java
@@ -23,7 +23,6 @@
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.inject.Inject;
-
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -37,22 +36,18 @@
   @Option(name = "--quiet", usage = "suppress progress messages")
   private boolean quiet;
 
-  @Argument(index = 0, required = true, metaVar = "NAME",
-      usage = "name of the target project")
+  @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the target project")
   private String project;
 
-  @Inject
-  private ResumeCopyProject resume;
+  @Inject private ResumeCopyProject resume;
 
-  @Inject
-  private ProjectsCollection projects;
+  @Inject private ProjectsCollection projects;
 
   @Override
   protected void run() throws UnloggedFailure, Failure, Exception {
     try {
       ProjectResource rsrc =
-          projects.parse(TopLevelResource.INSTANCE,
-              IdString.fromDecoded(project));
+          projects.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(project));
       if (!quiet) {
         resume.setErr(stderr);
       }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
index ae6ed9f..5342508 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
@@ -28,28 +28,25 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.importer.ResumeCopyProject.Input;
-
+import java.io.IOException;
+import java.io.Writer;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 
-import java.io.IOException;
-import java.io.Writer;
-
 @RequiresCapability(CopyProjectCapability.ID)
-class ResumeCopyProject implements RestModifyView<ProjectResource, Input>,
-    UiAction<ProjectResource> {
+class ResumeCopyProject
+    implements RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
   public static class Input {
     public boolean force;
   }
@@ -86,23 +83,18 @@
 
   @Override
   public ResumeImportStatistic apply(ProjectResource rsrc, Input input)
-      throws RestApiException, IOException, OrmException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException, ConfigInvalidException, PermissionBackendException {
+      throws RestApiException, IOException, OrmException, ValidationException, GitAPIException,
+          NoSuchChangeException, NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     ImportProjectResource projectResource =
-        projectsCollection.parse(new ConfigResource(),
-            IdString.fromDecoded(rsrc.getName()));
+        projectsCollection.parse(new ConfigResource(), IdString.fromDecoded(rsrc.getName()));
     ResumeProjectImport.Input in = new ResumeProjectImport.Input();
     in.force = input.force;
-    return resumeProjectImport.get()
-        .setCopy(true)
-        .setErr(err)
-        .apply(projectResource, in);
+    return resumeProjectImport.get().setCopy(true).setErr(err).apply(projectResource, in);
   }
 
   @Override
-  public UiAction.Description getDescription(
-      ProjectResource rsrc) {
+  public UiAction.Description getDescription(ProjectResource rsrc) {
     return new UiAction.Description()
         .setLabel("Resume Copy...")
         .setTitle(String.format("Resume copy for project %s", rsrc.getName()))
@@ -110,17 +102,17 @@
   }
 
   private boolean canResumeCopy(ProjectResource rsrc) {
-    return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER) ||
-      (permissionBackend.user(currentUserProvider).testOrFalse(
-      new PluginPermission(pluginName, CopyProjectCapability.ID)) &&
-      rsrc.getControl().isOwner());
+    return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER)
+        || (permissionBackend
+                .user(currentUserProvider)
+                .testOrFalse(new PluginPermission(pluginName, CopyProjectCapability.ID))
+            && rsrc.getControl().isOwner());
   }
 
   private boolean isCopied(ProjectResource rsrc) {
     try {
       ImportProjectResource projectResource =
-          projectsCollection.parse(new ConfigResource(),
-              IdString.fromDecoded(rsrc.getName()));
+          projectsCollection.parse(new ConfigResource(), IdString.fromDecoded(rsrc.getName()));
       ImportProjectInfo info = projectResource.getInfo();
       if (info.from != null) {
         // no copy, but an import from another system
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectCommand.java
index fb2a4a4..301600f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectCommand.java
@@ -19,7 +19,6 @@
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.inject.Inject;
-
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -27,12 +26,22 @@
 @CommandMetaData(name = "resume-project", description = "Resumes project import")
 public class ResumeProjectCommand extends SshCommand {
 
-  @Option(name = "--user", aliases = {"-u"}, required = true, metaVar = "NAME",
-      usage = "user on remote system")
+  @Option(
+    name = "--user",
+    aliases = {"-u"},
+    required = true,
+    metaVar = "NAME",
+    usage = "user on remote system"
+  )
   private String user;
 
-  @Option(name = "--pass", aliases = {"-p"}, required = true, metaVar = "-|PASS",
-      usage = "password of remote user")
+  @Option(
+    name = "--pass",
+    aliases = {"-p"},
+    required = true,
+    metaVar = "-|PASS",
+    usage = "password of remote user"
+  )
   private String pass;
 
   @Option(name = "--force", usage = "Whether the resume should be done forcefully.")
@@ -41,15 +50,17 @@
   @Option(name = "--quiet", usage = "suppress progress messages")
   private boolean quiet;
 
-  @Argument(index = 0, required = true, metaVar = "NAME",
-      usage = "name of the project in target system")
+  @Argument(
+    index = 0,
+    required = true,
+    metaVar = "NAME",
+    usage = "name of the project in target system"
+  )
   private String project;
 
-  @Inject
-  private ResumeProjectImport resume;
+  @Inject private ResumeProjectImport resume;
 
-  @Inject
-  private ProjectsCollection projects;
+  @Inject private ProjectsCollection projects;
 
   @Override
   protected void run() throws UnloggedFailure, Failure, Exception {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
index 996c7e4..82a5b53 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
@@ -29,23 +29,20 @@
 import com.google.gerrit.extensions.webui.UiAction;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.update.UpdateException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.importer.ResumeProjectImport.Input;
-
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
 import java.io.Writer;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 @RequiresCapability(ImportCapability.ID)
 public class ResumeProjectImport implements RestModifyView<ImportProjectResource, Input> {
@@ -97,24 +94,24 @@
 
   @Override
   public ResumeImportStatistic apply(ImportProjectResource rsrc, Input input)
-      throws RestApiException, IOException, OrmException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException, ConfigInvalidException, PermissionBackendException {
+      throws RestApiException, IOException, OrmException, ValidationException, GitAPIException,
+          NoSuchChangeException, NoSuchAccountException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
     if (copy) {
       input.validateResumeCopy();
     } else {
       input.validateResumeImport();
     }
 
-    return importProjectFactory.create(rsrc.getName())
+    return importProjectFactory
+        .create(rsrc.getName())
         .setCopy(copy)
         .setErr(err)
-        .resume(input.user, input.pass, input.force,
-            rsrc.getImportStatus());
+        .resume(input.user, input.pass, input.force, rsrc.getImportStatus());
   }
 
-  public static class OnProjects implements
-      RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
+  public static class OnProjects
+      implements RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
     private final ProjectsCollection projectsCollection;
     private final ResumeProjectImport resumeProjectImport;
     private final Provider<CurrentUser> currentUserProvider;
@@ -137,12 +134,11 @@
 
     @Override
     public ResumeImportStatistic apply(ProjectResource rsrc, Input input)
-        throws RestApiException, IOException, OrmException, ValidationException,
-        GitAPIException, NoSuchChangeException, NoSuchAccountException,
-        UpdateException, ConfigInvalidException, PermissionBackendException {
+        throws RestApiException, IOException, OrmException, ValidationException, GitAPIException,
+            NoSuchChangeException, NoSuchAccountException, UpdateException, ConfigInvalidException,
+            PermissionBackendException {
       ImportProjectResource projectResource =
-          projectsCollection.parse(new ConfigResource(),
-              IdString.fromDecoded(rsrc.getName()));
+          projectsCollection.parse(new ConfigResource(), IdString.fromDecoded(rsrc.getName()));
       return resumeProjectImport.apply(projectResource, input);
     }
 
@@ -155,17 +151,17 @@
     }
 
     private boolean canResumeImport(ProjectResource rsrc) {
-      return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER) ||
-        (permissionBackend.user(currentUserProvider).testOrFalse(
-        new PluginPermission(pluginName, ImportCapability.ID)) &&
-        rsrc.getControl().isOwner());
+      return permissionBackend.user(currentUserProvider).testOrFalse(ADMINISTRATE_SERVER)
+          || (permissionBackend
+                  .user(currentUserProvider)
+                  .testOrFalse(new PluginPermission(pluginName, ImportCapability.ID))
+              && rsrc.getControl().isOwner());
     }
 
     private boolean isImported(ProjectResource rsrc) {
       try {
         ImportProjectResource projectResource =
-            projectsCollection.parse(new ConfigResource(),
-                IdString.fromDecoded(rsrc.getName()));
+            projectsCollection.parse(new ConfigResource(), IdString.fromDecoded(rsrc.getName()));
         ImportProjectInfo info = projectResource.getInfo();
         if (info.from == null) {
           // no import, but a copy within the same system
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/AccountInfo.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/AccountInfo.java
index 18b44fa..7beb7aa 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/AccountInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/AccountInfo.java
@@ -18,10 +18,12 @@
 
 public class AccountInfo extends JavaScriptObject {
   public final native int _account_id() /*-{ return this._account_id || 0; }-*/;
+
   public final native String name() /*-{ return this.name; }-*/;
+
   public final native String username() /*-{ return this.username; }-*/;
+
   public final native String email() /*-{ return this.email; }-*/;
 
-  protected AccountInfo() {
-  }
+  protected AccountInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
index e0339fa..a67964d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
@@ -33,7 +33,7 @@
   private final Button completeButton;
 
   public CompleteImportDialog(final String project, final boolean copy) {
-    super(/* auto hide */false, /* modal */true);
+    super(/* auto hide */ false, /* modal */ true);
     setGlassEnabled(true);
     setText("Complete Project " + (copy ? "Copy" : "Import"));
 
@@ -41,40 +41,43 @@
 
     completeButton = new Button();
     completeButton.setText("Complete");
-    completeButton.addClickHandler(event -> {
-      hide();
+    completeButton.addClickHandler(
+        event -> {
+          hide();
 
-      new RestApi("config").id("server")
-          .view(Plugin.get().getName(), "projects").id(project)
-          .delete(new AsyncCallback<NoContent>() {
-            @Override
-            public void onSuccess(NoContent result) {
-              Plugin.get().go("/x/" + Plugin.get().getName() + "/list");
+          new RestApi("config")
+              .id("server")
+              .view(Plugin.get().getName(), "projects")
+              .id(project)
+              .delete(
+                  new AsyncCallback<NoContent>() {
+                    @Override
+                    public void onSuccess(NoContent result) {
+                      Plugin.get().go("/x/" + Plugin.get().getName() + "/list");
 
-              final DialogBox successDialog = new DialogBox();
-              successDialog.setText("Project "
-                  + (copy ? "Copy" : "Import") + " Completed");
-              successDialog.setAnimationEnabled(true);
+                      final DialogBox successDialog = new DialogBox();
+                      successDialog.setText("Project " + (copy ? "Copy" : "Import") + " Completed");
+                      successDialog.setAnimationEnabled(true);
 
-              Panel p = new VerticalPanel();
-              p.setStyleName("importer-message-panel");
-              p.add(new Label("The project "
-                + (copy ? "copy" : "import") + " was completed."));
-              Button okButton = new Button("OK");
-              okButton.addClickHandler(event -> successDialog.hide());
+                      Panel p = new VerticalPanel();
+                      p.setStyleName("importer-message-panel");
+                      p.add(
+                          new Label(
+                              "The project " + (copy ? "copy" : "import") + " was completed."));
+                      Button okButton = new Button("OK");
+                      okButton.addClickHandler(event -> successDialog.hide());
 
-              p.add(okButton);
-              successDialog.add(p);
+                      p.add(okButton);
+                      successDialog.add(p);
 
-              successDialog.center();
-              successDialog.show();
-            }
+                      successDialog.center();
+                      successDialog.show();
+                    }
 
-            @Override
-            public void onFailure(Throwable caught) {
-            }
-          });
-    });
+                    @Override
+                    public void onFailure(Throwable caught) {}
+                  });
+        });
     buttons.add(completeButton);
 
     cancelButton = new Button();
@@ -84,8 +87,8 @@
     buttons.add(cancelButton);
 
     FlowPanel center = new FlowPanel();
-    Label msg = new Label("Complete " + (copy ? "copy" : "import")
-        + " of project '" + project + "'");
+    Label msg =
+        new Label("Complete " + (copy ? "copy" : "import") + " of project '" + project + "'");
     msg.addStyleName("importer-complete-message");
     center.add(msg);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportActionPanel.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportActionPanel.java
index 2dc3e57..7ee5431 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportActionPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportActionPanel.java
@@ -22,11 +22,12 @@
 
   ImportActionPanel(final String project, final boolean copy) {
     setStyleName("importer-action-panel");
-    add(new Button("Resume...",
-        (ClickHandler) event -> (new ResumeImportDialog(project, copy))
-            .center()));
-    add(new Button("Complete...",
-        (ClickHandler) event -> (new CompleteImportDialog(project, copy))
-            .center()));
+    add(
+        new Button(
+            "Resume...", (ClickHandler) event -> (new ResumeImportDialog(project, copy)).center()));
+    add(
+        new Button(
+            "Complete...",
+            (ClickHandler) event -> (new CompleteImportDialog(project, copy)).center()));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupInput.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupInput.java
index 4c12a81..6832e23 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupInput.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupInput.java
@@ -18,15 +18,18 @@
 
 public class ImportGroupInput extends JavaScriptObject {
   final native void from(String f) /*-{ this.from = f; }-*/;
+
   final native void user(String u) /*-{ this.user = u; }-*/;
+
   final native void pass(String p) /*-{ this.pass = p; }-*/;
+
   final native void importOwnerGroup(boolean i) /*-{ this.import_owner_group = i; }-*/;
+
   final native void importIncludedGroups(boolean i) /*-{ this.import_included_groups = i; }-*/;
 
   static ImportGroupInput create() {
     return (ImportGroupInput) createObject();
   }
 
-  protected ImportGroupInput() {
-  }
+  protected ImportGroupInput() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
index a4e9cea..eef8892 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
@@ -52,12 +52,16 @@
   ImportGroupScreen() {
     setStyleName("importer-import-panel");
 
-    fromTxt = addTextBox(this, "From*", "URL of the remote system from where the group should be imported");
+    fromTxt =
+        addTextBox(
+            this, "From*", "URL of the remote system from where the group should be imported");
     nameTxt = addTextBox(this, "Group Name*", "name of the group");
     userTxt = addTextBox(this, "Remote User*", "user on remote system");
     passTxt = addPasswordTextBox(this, "Password*", "password of remote user");
-    importOwnerGroupCheckBox = addCheckBox(this, "import owner group", "also import missing owner groups");
-    importIncludedGroupsCheckBox = addCheckBox(this, "import included groups", "also import missing included groups");
+    importOwnerGroupCheckBox =
+        addCheckBox(this, "import owner group", "also import missing owner groups");
+    importIncludedGroupsCheckBox =
+        addCheckBox(this, "import included groups", "also import missing included groups");
 
     HorizontalPanel buttons = new HorizontalPanel();
     add(buttons);
@@ -82,35 +86,39 @@
     in.importIncludedGroups(importIncludedGroupsCheckBox.getValue());
 
     final String groupName = getValue(nameTxt);
-    new RestApi("config").id("server").view(Plugin.get().getName(), "groups")
-        .id(groupName).put(in, new AsyncCallback<JavaScriptObject>() {
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getName(), "groups")
+        .id(groupName)
+        .put(
+            in,
+            new AsyncCallback<JavaScriptObject>() {
 
-      @Override
-      public void onSuccess(JavaScriptObject result) {
-        clearForm();
-        Plugin.get().go("/admin/groups/" + groupName);
+              @Override
+              public void onSuccess(JavaScriptObject result) {
+                clearForm();
+                Plugin.get().go("/admin/groups/" + groupName);
 
-        final DialogBox successDialog = new DialogBox();
-        successDialog.setText("Group Import");
-        successDialog.setAnimationEnabled(true);
+                final DialogBox successDialog = new DialogBox();
+                successDialog.setText("Group Import");
+                successDialog.setAnimationEnabled(true);
 
-        Panel p = new VerticalPanel();
-        p.setStyleName("importer-message-panel");
-        p.add(new Label("The group was imported."));
-        Button okButton = new Button("OK");
-        okButton.addClickHandler(event -> successDialog.hide());
+                Panel p = new VerticalPanel();
+                p.setStyleName("importer-message-panel");
+                p.add(new Label("The group was imported."));
+                Button okButton = new Button("OK");
+                okButton.addClickHandler(event -> successDialog.hide());
 
-        p.add(okButton);
-        successDialog.add(p);
+                p.add(okButton);
+                successDialog.add(p);
 
-        successDialog.center();
-        successDialog.show();
-      }
+                successDialog.center();
+                successDialog.show();
+              }
 
-      @Override
-      public void onFailure(Throwable caught) {
-      }
-    });
+              @Override
+              public void onFailure(Throwable caught) {}
+            });
   }
 
   private void clearForm() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportInfo.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportInfo.java
index 82978f0..812236b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportInfo.java
@@ -18,9 +18,10 @@
 
 public class ImportInfo extends JavaScriptObject {
   public final native String timestamp() /*-{ return this.timestamp; }-*/;
+
   public final native AccountInfo user() /*-{ return this.user; }-*/;
+
   public final native String remoteUser() /*-{ return this.remote_user; }-*/;
 
-  protected ImportInfo() {
-  }
+  protected ImportInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInfo.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInfo.java
index e89f058..3d93c91 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInfo.java
@@ -19,10 +19,12 @@
 
 public class ImportProjectInfo extends JavaScriptObject {
   public final native String from() /*-{ return this.from; }-*/;
+
   public final native String name() /*-{ return this.name; }-*/;
+
   public final native String parent() /*-{ return this.parent; }-*/;
+
   public final native JsArray<ImportInfo> imports() /*-{ return this.imports; }-*/;
 
-  protected ImportProjectInfo() {
-  }
+  protected ImportProjectInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInput.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInput.java
index a355e6a..6ae25cf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInput.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectInput.java
@@ -18,15 +18,18 @@
 
 public class ImportProjectInput extends JavaScriptObject {
   final native void from(String f) /*-{ this.from = f; }-*/;
+
   final native void name(String n) /*-{ this.name = n; }-*/;
+
   final native void user(String u) /*-{ this.user = u; }-*/;
+
   final native void pass(String p) /*-{ this.pass = p; }-*/;
+
   final native void parent(String p) /*-{ this.parent = p; }-*/;
 
   static ImportProjectInput create() {
     return (ImportProjectInput) createObject();
   }
 
-  protected ImportProjectInput() {
-  }
+  protected ImportProjectInput() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectListScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectListScreen.java
index bd86574..3239acb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectListScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectListScreen.java
@@ -25,7 +25,6 @@
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
 import com.google.gwt.user.client.ui.InlineHyperlink;
 import com.google.gwt.user.client.ui.VerticalPanel;
-
 import java.util.List;
 
 public class ImportProjectListScreen extends VerticalPanel {
@@ -40,19 +39,21 @@
   ImportProjectListScreen() {
     setStyleName("importer-imports-panel");
 
-    new RestApi("config").id("server")
+    new RestApi("config")
+        .id("server")
         .view(Plugin.get().getPluginName(), "projects")
-        .get(new AsyncCallback<NativeMap<ImportProjectInfo>>() {
-          @Override
-          public void onSuccess(NativeMap<ImportProjectInfo> info) {
-            display(info);
-          }
+        .get(
+            new AsyncCallback<NativeMap<ImportProjectInfo>>() {
+              @Override
+              public void onSuccess(NativeMap<ImportProjectInfo> info) {
+                display(info);
+              }
 
-          @Override
-          public void onFailure(Throwable caught) {
-            // never invoked
-          }
-        });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 
   private void display(NativeMap<ImportProjectInfo> map) {
@@ -82,16 +83,17 @@
         fmt.addStyleName(row, 0, "leftMostCell");
       }
 
-      t.setWidget(row, 0, new InlineHyperlink(
-          project, "/x/" + Plugin.get().getName() + "/projects/" + project));
+      t.setWidget(
+          row,
+          0,
+          new InlineHyperlink(project, "/x/" + Plugin.get().getName() + "/projects/" + project));
       t.setText(row, 1, info.from() != null ? "IMPORT" : "COPY");
 
       if (info.from() != null) {
         String srcProjectUrl = projectUrl(info, project);
         t.setWidget(row, 2, new Anchor(srcProjectUrl, srcProjectUrl));
       } else {
-        t.setWidget(row, 2,
-            new InlineHyperlink(project, "/admin/projects/" + project));
+        t.setWidget(row, 2, new InlineHyperlink(project, "/admin/projects/" + project));
       }
 
       List<ImportInfo> importList = Natives.asList(info.imports());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
index 206f12d..6f3c785 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
@@ -49,14 +49,24 @@
   ImportProjectScreen() {
     setStyleName("importer-import-panel");
 
-    fromTxt = addTextBox(this, "From*", "URL of the remote system from where the project should be imported");
+    fromTxt =
+        addTextBox(
+            this, "From*", "URL of the remote system from where the project should be imported");
     srcNameTxt = addTextBox(this, "Project Name in Source*", "name of project in source system");
-    targetNameTxt = addTextBox(this, "Target Project Name", "name of project in target system"
-        + " (if not specified it is assumed to be the same name as in the source system)");
+    targetNameTxt =
+        addTextBox(
+            this,
+            "Target Project Name",
+            "name of project in target system"
+                + " (if not specified it is assumed to be the same name as in the source system)");
     userTxt = addTextBox(this, "Remote User*", "user on remote system");
     passTxt = addPasswordTextBox(this, "Password*", "password of remote user");
-    parentTxt = addTextBox(this, "Parent", "name of parent project in target system"
-        + "(if not specified it is assumed to be the same parent as in the source system)");
+    parentTxt =
+        addTextBox(
+            this,
+            "Parent",
+            "name of parent project in target system"
+                + "(if not specified it is assumed to be the same parent as in the source system)");
 
     HorizontalPanel buttons = new HorizontalPanel();
     add(buttons);
@@ -73,8 +83,8 @@
   }
 
   private void doImport() {
-    final String targetName = getValue(targetNameTxt).length() == 0
-        ? getValue(srcNameTxt) : getValue(targetNameTxt);
+    final String targetName =
+        getValue(targetNameTxt).length() == 0 ? getValue(srcNameTxt) : getValue(targetNameTxt);
 
     ImportProjectInput in = ImportProjectInput.create();
     in.from(getValue(fromTxt));
@@ -83,36 +93,40 @@
     in.pass(getValue(passTxt));
     in.parent(getValue(parentTxt));
 
-    new RestApi("config").id("server").view(Plugin.get().getName(), "projects")
-        .id(targetName).put(in, new AsyncCallback<ImportStatisticInfo>() {
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getName(), "projects")
+        .id(targetName)
+        .put(
+            in,
+            new AsyncCallback<ImportStatisticInfo>() {
 
-      @Override
-      public void onSuccess(ImportStatisticInfo result) {
-        clearForm();
-        Plugin.get().go("/admin/projects/" + targetName);
+              @Override
+              public void onSuccess(ImportStatisticInfo result) {
+                clearForm();
+                Plugin.get().go("/admin/projects/" + targetName);
 
-        final DialogBox successDialog = new DialogBox();
-        successDialog.setText("Project Import");
-        successDialog.setAnimationEnabled(true);
+                final DialogBox successDialog = new DialogBox();
+                successDialog.setText("Project Import");
+                successDialog.setAnimationEnabled(true);
 
-        Panel p = new VerticalPanel();
-        p.setStyleName("importer-message-panel");
-        p.add(new Label("The project was imported."));
-        p.add(new Label("Created Changes: " + result.numChangesCreated()));
-        Button okButton = new Button("OK");
-        okButton.addClickHandler(event -> successDialog.hide());
+                Panel p = new VerticalPanel();
+                p.setStyleName("importer-message-panel");
+                p.add(new Label("The project was imported."));
+                p.add(new Label("Created Changes: " + result.numChangesCreated()));
+                Button okButton = new Button("OK");
+                okButton.addClickHandler(event -> successDialog.hide());
 
-        p.add(okButton);
-        successDialog.add(p);
+                p.add(okButton);
+                successDialog.add(p);
 
-        successDialog.center();
-        successDialog.show();
-      }
+                successDialog.center();
+                successDialog.show();
+              }
 
-      @Override
-      public void onFailure(Throwable caught) {
-      }
-    });
+              @Override
+              public void onFailure(Throwable caught) {}
+            });
   }
 
   private void clearForm() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportStatisticInfo.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportStatisticInfo.java
index 2d82432..dfd5daf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportStatisticInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportStatisticInfo.java
@@ -19,6 +19,5 @@
 public class ImportStatisticInfo extends JavaScriptObject {
   public final native int numChangesCreated() /*-{ return this.num_changes_created; }-*/;
 
-  protected ImportStatisticInfo() {
-  }
+  protected ImportStatisticInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/InputUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/InputUtil.java
index 1f9d55d..da7402d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/InputUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/InputUtil.java
@@ -53,21 +53,23 @@
   private static TextBox createTextBox(boolean isPassword) {
     TextBox tb;
     if (isPassword) {
-      tb = new PasswordTextBox() {
-        @Override
-        public void onBrowserEvent(Event event) {
-          super.onBrowserEvent(event);
-          handlePaste(this, event);
-        }
-      };
+      tb =
+          new PasswordTextBox() {
+            @Override
+            public void onBrowserEvent(Event event) {
+              super.onBrowserEvent(event);
+              handlePaste(this, event);
+            }
+          };
     } else {
-      tb = new TextBox() {
-        @Override
-        public void onBrowserEvent(Event event) {
-          super.onBrowserEvent(event);
-          handlePaste(this, event);
-        }
-      };
+      tb =
+          new TextBox() {
+            @Override
+            public void onBrowserEvent(Event event) {
+              super.onBrowserEvent(event);
+              handlePaste(this, event);
+            }
+          };
     }
     tb.addKeyPressHandler(event -> event.stopPropagation());
     tb.sinkEvents(Event.ONPASTE);
@@ -77,11 +79,13 @@
 
   private static void handlePaste(final TextBox tb, Event event) {
     if (event.getTypeInt() == Event.ONPASTE) {
-      Scheduler.get().scheduleDeferred(() -> {
-        if (getValue(tb).length() != 0) {
-          tb.setEnabled(true);
-        }
-      });
+      Scheduler.get()
+          .scheduleDeferred(
+              () -> {
+                if (getValue(tb).length() != 0) {
+                  tb.setEnabled(true);
+                }
+              });
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
index d632652..986fc64 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
@@ -31,22 +31,23 @@
 import com.google.gwt.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.TextBoxBase;
 import com.google.gwt.user.client.ui.ValueBoxBase;
-
 import java.util.HashMap;
 import java.util.Map;
 
-
-/** Enables a FocusWidget (e.g. a Button) if an edit is detected from any
- *  registered input widget.
+/**
+ * Enables a FocusWidget (e.g. a Button) if an edit is detected from any registered input widget.
  */
-public class OnEditEnabler implements KeyPressHandler, KeyDownHandler,
-   MouseUpHandler, ChangeHandler, ValueChangeHandler<Object> {
+public class OnEditEnabler
+    implements KeyPressHandler,
+        KeyDownHandler,
+        MouseUpHandler,
+        ChangeHandler,
+        ValueChangeHandler<Object> {
 
   private final FocusWidget widget;
   private Map<TextBoxBase, String> strings = new HashMap<>();
   private String originalValue;
 
-
   // The first parameter to the contructors must be the FocusWidget to enable,
   // subsequent parameters are widgets to listenTo.
 
@@ -70,7 +71,6 @@
     widget = w;
   }
 
-
   // Register input widgets to be listened to
 
   public void listenTo(final TextBoxBase tb) {
@@ -101,7 +101,6 @@
     cb.addValueChangeHandler((ValueChangeHandler) this);
   }
 
-
   // Handlers
 
   @Override
@@ -131,16 +130,18 @@
   }
 
   private void on(final GwtEvent<?> e) {
-    if (widget.isEnabled() ||
-        ! (e.getSource() instanceof FocusWidget) ||
-        ! ((FocusWidget) e.getSource()).isEnabled() ) {
+    if (widget.isEnabled()
+        || !(e.getSource() instanceof FocusWidget)
+        || !((FocusWidget) e.getSource()).isEnabled()) {
       if (e.getSource() instanceof ValueBoxBase) {
         final TextBoxBase box = ((TextBoxBase) e.getSource());
-        Scheduler.get().scheduleDeferred(() -> {
-          if (box.getValue().trim().equals(originalValue)) {
-            widget.setEnabled(false);
-          }
-        });
+        Scheduler.get()
+            .scheduleDeferred(
+                () -> {
+                  if (box.getValue().trim().equals(originalValue)) {
+                    widget.setEnabled(false);
+                  }
+                });
       }
       return;
     }
@@ -157,14 +158,16 @@
 
   private void onTextBoxBase(final TextBoxBase tb) {
     // The text appears to not get updated until the handlers complete.
-    Scheduler.get().scheduleDeferred(() -> {
-      String orig = strings.get(tb);
-      if (orig == null) {
-        orig = "";
-      }
-      if (! orig.equals(tb.getText().trim())) {
-        widget.setEnabled(true);
-      }
-    });
+    Scheduler.get()
+        .scheduleDeferred(
+            () -> {
+              String orig = strings.get(tb);
+              if (orig == null) {
+                orig = "";
+              }
+              if (!orig.equals(tb.getText().trim())) {
+                widget.setEnabled(true);
+              }
+            });
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ProjectImportsScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ProjectImportsScreen.java
index 8cbb2eb..879b09c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ProjectImportsScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ProjectImportsScreen.java
@@ -29,7 +29,6 @@
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
-
 import java.util.Collections;
 import java.util.List;
 
@@ -45,18 +44,22 @@
   ProjectImportsScreen(final String project) {
     setStyleName("importer-import-panel");
 
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "projects")
-        .id(project).get(new AsyncCallback<ImportProjectInfo>() {
-            @Override
-            public void onSuccess(ImportProjectInfo importProjectInfo) {
-              display(project, importProjectInfo);
-            }
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "projects")
+        .id(project)
+        .get(
+            new AsyncCallback<ImportProjectInfo>() {
+              @Override
+              public void onSuccess(ImportProjectInfo importProjectInfo) {
+                display(project, importProjectInfo);
+              }
 
-            @Override
-            public void onFailure(Throwable caught) {
-              // never invoked
-            }
-          });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 
   private void display(final String project, ImportProjectInfo info) {
@@ -69,11 +72,9 @@
       String srcProjectUrl = projectUrl(info, project);
       t.addRow("From", new Anchor(srcProjectUrl, srcProjectUrl));
     } else {
-      t.addRow("From",
-          new InlineHyperlink(project, "/admin/projects/" + project));
+      t.addRow("From", new InlineHyperlink(project, "/admin/projects/" + project));
     }
 
-
     t.addRow("Parent", info.parent());
     t.addRow("Actions", new ImportActionPanel(project, info.from() == null));
     add(t);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeCopyProjectInput.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeCopyProjectInput.java
index fa101f0..cc1f880 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeCopyProjectInput.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeCopyProjectInput.java
@@ -23,6 +23,5 @@
     return (ResumeCopyProjectInput) createObject();
   }
 
-  protected ResumeCopyProjectInput() {
-  }
+  protected ResumeCopyProjectInput() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportDialog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportDialog.java
index b56f46d..a8264c1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportDialog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportDialog.java
@@ -42,7 +42,7 @@
   private CheckBox forceCheckBox;
 
   public ResumeImportDialog(final String project, final boolean copy) {
-    super(/* auto hide */false, /* modal */true);
+    super(/* auto hide */ false, /* modal */ true);
     setGlassEnabled(true);
     setText("Resume Project " + (copy ? "Copy" : "Import"));
 
@@ -50,52 +50,57 @@
 
     resumeButton = new Button();
     resumeButton.setText("Resume");
-    resumeButton.addClickHandler(event -> {
-        hide();
+    resumeButton.addClickHandler(
+        event -> {
+          hide();
 
-        RestApi restApi;
-        ResumeImportProjectInput in = ResumeImportProjectInput.create();
-        in.force(forceCheckBox.getValue());
-        if (copy) {
-          restApi = new RestApi("projects").id(project)
-              .view(Plugin.get().getName(), "copy.resume");
-        } else {
-          restApi = new RestApi("config").id("server")
-              .view(Plugin.get().getName(), "projects").id(project)
-              .view("resume");
-          in.user(getValue(userTxt));
-          in.pass(getValue(passTxt));
-        }
+          RestApi restApi;
+          ResumeImportProjectInput in = ResumeImportProjectInput.create();
+          in.force(forceCheckBox.getValue());
+          if (copy) {
+            restApi =
+                new RestApi("projects").id(project).view(Plugin.get().getName(), "copy.resume");
+          } else {
+            restApi =
+                new RestApi("config")
+                    .id("server")
+                    .view(Plugin.get().getName(), "projects")
+                    .id(project)
+                    .view("resume");
+            in.user(getValue(userTxt));
+            in.pass(getValue(passTxt));
+          }
 
-        restApi.put(in, new AsyncCallback<ResumeImportStatisticInfo>() {
-              @Override
-              public void onSuccess(ResumeImportStatisticInfo result) {
-                Plugin.get().go("/x/" + Plugin.get().getName() + "/list");
+          restApi.put(
+              in,
+              new AsyncCallback<ResumeImportStatisticInfo>() {
+                @Override
+                public void onSuccess(ResumeImportStatisticInfo result) {
+                  Plugin.get().go("/x/" + Plugin.get().getName() + "/list");
 
-                final DialogBox successDialog = new DialogBox();
-                successDialog.setText("Resume " + (copy ? "Copy" : "Import") + " Import");
-                successDialog.setAnimationEnabled(true);
+                  final DialogBox successDialog = new DialogBox();
+                  successDialog.setText("Resume " + (copy ? "Copy" : "Import") + " Import");
+                  successDialog.setAnimationEnabled(true);
 
-                Panel p = new VerticalPanel();
-                p.setStyleName("importer-message-panel");
-                p.add(new Label("The project " + (copy ? "copy" : "import") + " was resumed."));
-                p.add(new Label("Created Changes: " + result.numChangesCreated()));
-                p.add(new Label("Updated Changes: " + result.numChangesUpdated()));
-                Button okButton = new Button("OK");
-                okButton.addClickHandler(event -> successDialog.hide());
+                  Panel p = new VerticalPanel();
+                  p.setStyleName("importer-message-panel");
+                  p.add(new Label("The project " + (copy ? "copy" : "import") + " was resumed."));
+                  p.add(new Label("Created Changes: " + result.numChangesCreated()));
+                  p.add(new Label("Updated Changes: " + result.numChangesUpdated()));
+                  Button okButton = new Button("OK");
+                  okButton.addClickHandler(event -> successDialog.hide());
 
-                p.add(okButton);
-                successDialog.add(p);
+                  p.add(okButton);
+                  successDialog.add(p);
 
-                successDialog.center();
-                successDialog.show();
-              }
+                  successDialog.center();
+                  successDialog.show();
+                }
 
-              @Override
-              public void onFailure(Throwable caught) {
-              }
-            });
-    });
+                @Override
+                public void onFailure(Throwable caught) {}
+              });
+        });
     buttons.add(resumeButton);
 
     cancelButton = new Button();
@@ -105,8 +110,7 @@
     buttons.add(cancelButton);
 
     FlowPanel center = new FlowPanel();
-    Label msg = new Label("Resume " + (copy ? "copy" : "import")
-        + " of project '" + project + "'");
+    Label msg = new Label("Resume " + (copy ? "copy" : "import") + " of project '" + project + "'");
     msg.addStyleName("importer-resume-message");
     center.add(msg);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportProjectInput.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportProjectInput.java
index 47bdaf7..cb8d20f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportProjectInput.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportProjectInput.java
@@ -16,12 +16,12 @@
 
 public class ResumeImportProjectInput extends ResumeCopyProjectInput {
   final native void user(String u) /*-{ this.user = u; }-*/;
+
   final native void pass(String p) /*-{ this.pass = p; }-*/;
 
   static ResumeImportProjectInput create() {
     return (ResumeImportProjectInput) createObject();
   }
 
-  protected ResumeImportProjectInput() {
-  }
+  protected ResumeImportProjectInput() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportStatisticInfo.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportStatisticInfo.java
index 73d99f1..354e682 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportStatisticInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ResumeImportStatisticInfo.java
@@ -14,10 +14,8 @@
 
 package com.googlesource.gerrit.plugins.importer.client;
 
-
 public class ResumeImportStatisticInfo extends ImportStatisticInfo {
   public final native int numChangesUpdated() /*-{ return this.num_changes_updated; }-*/;
 
-  protected ResumeImportStatisticInfo() {
-  }
+  protected ResumeImportStatisticInfo() {}
 }
