diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/AddSshKey.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/AddSshKey.java
index c230aaf..f6a18e0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/AddSshKey.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/AddSshKey.java
@@ -24,10 +24,8 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 @Singleton
 class AddSshKey implements RestModifyView<ServiceUserResource, Input> {
@@ -40,8 +38,7 @@
 
   @Override
   public Response<SshKeyInfo> apply(ServiceUserResource rsrc, Input input)
-      throws AuthException, BadRequestException, OrmException, IOException,
-      ConfigInvalidException {
+      throws AuthException, BadRequestException, OrmException, IOException, ConfigInvalidException {
     return addSshKey.get().apply(rsrc.getUser(), input);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java
index 4c3c591..04c945c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java
@@ -52,16 +52,8 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
-
 import com.googlesource.gerrit.plugins.serviceuser.CreateServiceUser.Input;
 import com.googlesource.gerrit.plugins.serviceuser.GetServiceUser.ServiceUserInfo;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -71,11 +63,15 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @RequiresCapability(CreateServiceUserCapability.ID)
 class CreateServiceUser implements RestModifyView<ConfigResource, Input> {
-  private static final Logger log =
-      LoggerFactory.getLogger(CreateServiceUser.class);
+  private static final Logger log = LoggerFactory.getLogger(CreateServiceUser.class);
 
   public static final String USER = "user";
   public static final String KEY_CREATED_BY = "createdBy";
@@ -110,7 +106,8 @@
   private final AccountLoader.Factory accountLoader;
 
   @Inject
-  CreateServiceUser(PluginConfigFactory cfgFactory,
+  CreateServiceUser(
+      PluginConfigFactory cfgFactory,
       @PluginName String pluginName,
       CreateAccount.Factory createAccountFactory,
       GroupCache groupCache,
@@ -132,7 +129,8 @@
     this.db = db;
     this.username = username;
     this.blockedNames =
-        Lists.transform(Arrays.asList(cfg.getStringList("block")),
+        Lists.transform(
+            Arrays.asList(cfg.getStringList("block")),
             new Function<String, String>() {
               @Override
               public String apply(String blockedName) {
@@ -143,10 +141,9 @@
     this.metaDataUpdateFactory = metaDataUpdateFactory;
     this.storage = projectCache.getAllProjects().getConfig(pluginName + ".db");
     this.allProjects = projectCache.getAllProjects().getProject().getNameKey();
-    this.rfc2822DateFormatter =
-        new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
-    this.rfc2822DateFormatter.setCalendar(Calendar.getInstance(
-        gerritIdent.getTimeZone(), Locale.US));
+    this.rfc2822DateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
+    this.rfc2822DateFormatter.setCalendar(
+        Calendar.getInstance(gerritIdent.getTimeZone(), Locale.US));
     this.getConfig = getConfig;
     this.accountLoader = accountLoader;
   }
@@ -154,8 +151,7 @@
   @Override
   public Response<ServiceUserInfo> apply(ConfigResource resource, Input input)
       throws AuthException, BadRequestException, ResourceConflictException,
-      UnprocessableEntityException, OrmException, IOException,
-      ConfigInvalidException {
+          UnprocessableEntityException, OrmException, IOException, ConfigInvalidException {
     CurrentUser user = userProvider.get();
     if (user == null || !user.isIdentifiedUser()) {
       throw new AuthException("authentication required");
@@ -172,8 +168,8 @@
     }
 
     if (blockedNames.contains(username.toLowerCase())) {
-      throw new BadRequestException("The username '" + username
-          + "' is not allowed as name for service users.");
+      throw new BadRequestException(
+          "The username '" + username + "' is not allowed as name for service users.");
     }
 
     input.email = Strings.emptyToNull(input.email);
@@ -184,16 +180,14 @@
       }
     }
 
-    AccountInput in =
-        new ServiceUserInput(username, input.email, input.sshKey);
+    AccountInput in = new ServiceUserInput(username, input.email, input.sshKey);
     Response<AccountInfo> response =
         createAccountFactory.create(username).apply(TopLevelResource.INSTANCE, in);
 
-    addToGroups(new Account.Id(response.value()._accountId),
-        cfg.getStringList("group"));
+    addToGroups(new Account.Id(response.value()._accountId), cfg.getStringList("group"));
 
     String creator = user.getUserName();
-    Account.Id creatorId = ((IdentifiedUser)user).getAccountId();
+    Account.Id creatorId = ((IdentifiedUser) user).getAccountId();
     String creationDate = rfc2822DateFormatter.format(new Date());
 
     Config db = storage.get();
@@ -221,16 +215,19 @@
       AccountGroup group = groupCache.get(new AccountGroup.NameKey(groupName));
       if (group != null) {
         AccountGroupMember m =
-            new AccountGroupMember(new AccountGroupMember.Key(
-                accountId, group.getId()));
-        db.get().accountGroupMembersAudit().insert(Collections.singleton(
-            new AccountGroupMemberAudit(
-                m, currentUser.get().getAccountId(), TimeUtil.nowTs())));
+            new AccountGroupMember(new AccountGroupMember.Key(accountId, group.getId()));
+        db.get()
+            .accountGroupMembersAudit()
+            .insert(
+                Collections.singleton(
+                    new AccountGroupMemberAudit(
+                        m, currentUser.get().getAccountId(), TimeUtil.nowTs())));
         db.get().accountGroupMembers().insert(Collections.singleton(m));
       } else {
-        log.error(String.format(
-            "Could not add new service user %s to group %s: group not found",
-            username, groupName));
+        log.error(
+            String.format(
+                "Could not add new service user %s to group %s: group not found",
+                username, groupName));
       }
     }
     if (groupNames.length > 0) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCapability.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCapability.java
index ae782ec..eb7c789 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCapability.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCapability.java
@@ -18,10 +18,10 @@
 
 class CreateServiceUserCapability extends CapabilityDefinition {
 
-  public final static String ID = "createServiceUser";
+  public static final String ID = "createServiceUser";
 
   @Override
   public String getDescription() {
-      return "Create Service User";
+    return "Create Service User";
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCommand.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCommand.java
index 98a0556..c102c50 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserCommand.java
@@ -21,15 +21,13 @@
 import com.google.gerrit.sshd.SshCommand;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-
-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;
 import java.io.UnsupportedEncodingException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
 
 @RequiresCapability(CreateServiceUserCapability.ID)
 @CommandMetaData(name = "create", description = "Create Service User")
@@ -38,15 +36,18 @@
   @Argument(index = 0, required = true, metaVar = "USERNAME", usage = "name of the service user")
   private String username;
 
-  @Option(name = "--ssh-key", required = true, metaVar = "-|KEY", usage = "public key for SSH authentication")
+  @Option(
+    name = "--ssh-key",
+    required = true,
+    metaVar = "-|KEY",
+    usage = "public key for SSH authentication"
+  )
   private String sshKey;
 
-  @Inject
-  private CreateServiceUser.Factory createServiceUser;
+  @Inject private CreateServiceUser.Factory createServiceUser;
 
   @Override
-  protected void run() throws OrmException, IOException, UnloggedFailure,
-      ConfigInvalidException {
+  protected void run() throws OrmException, IOException, UnloggedFailure, ConfigInvalidException {
     CreateServiceUser.Input input = new CreateServiceUser.Input();
     input.sshKey = readSshKey();
 
@@ -63,8 +64,7 @@
     }
     if ("-".equals(sshKey)) {
       sshKey = "";
-      BufferedReader br =
-          new BufferedReader(new InputStreamReader(in, "UTF-8"));
+      BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
       String line;
       while ((line = br.readLine()) != null) {
         sshKey += line + "\n";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserNotes.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserNotes.java
index 7c8140c..b2a018b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUserNotes.java
@@ -25,9 +25,8 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
 import com.googlesource.gerrit.plugins.serviceuser.GetServiceUser.ServiceUserInfo;
-
+import java.io.IOException;
 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -41,11 +40,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
 class CreateServiceUserNotes {
-  private static final Logger log =
-      LoggerFactory.getLogger(CreateServiceUserNotes.class);
+  private static final Logger log = LoggerFactory.getLogger(CreateServiceUserNotes.class);
 
   interface Factory {
     CreateServiceUserNotes create(Project.NameKey project, Repository git);
@@ -65,7 +61,8 @@
   private StringBuilder message;
 
   @Inject
-  CreateServiceUserNotes(@GerritPersonIdent PersonIdent gerritIdent,
+  CreateServiceUserNotes(
+      @GerritPersonIdent PersonIdent gerritIdent,
       NotesBranchUtil.Factory notesBranchUtilFactory,
       ServiceUserResolver serviceUserResolver,
       @AnonymousCowardName String anonymousCowardName,
@@ -100,8 +97,7 @@
       }
 
       for (RevCommit c : rw) {
-        ServiceUserInfo serviceUser =
-            serviceUserResolver.getAsServiceUser(c.getCommitterIdent());
+        ServiceUserInfo serviceUser = serviceUserResolver.getAsServiceUser(c.getCommitterIdent());
         if (serviceUser != null) {
           ObjectId content = createNoteContent(branch, serviceUser);
           getNotes().set(c, content);
@@ -118,9 +114,10 @@
       }
 
       message.insert(0, "Update notes for service user commits\n\n");
-      notesBranchUtilFactory.create(project, git, inserter)
-          .commitAllNotes(serviceUserNotes, REFS_NOTES_SERVICEUSER, gerritServerIdent,
-              message.toString());
+      notesBranchUtilFactory
+          .create(project, git, inserter)
+          .commitAllNotes(
+              serviceUserNotes, REFS_NOTES_SERVICEUSER, gerritServerIdent, message.toString());
     } finally {
       if (inserter != null) {
         inserter.close();
@@ -128,8 +125,7 @@
     }
   }
 
-  private void markUninteresting(Repository git, String branch, RevWalk rw,
-      ObjectId oldObjectId) {
+  private void markUninteresting(Repository git, String branch, RevWalk rw, ObjectId oldObjectId) {
     for (Ref r : git.getAllRefs().values()) {
       try {
         if (r.getName().equals(branch)) {
@@ -150,15 +146,13 @@
 
   private ObjectId createNoteContent(String branch, ServiceUserInfo serviceUser)
       throws IOException, OrmException {
-    return getInserter().insert(Constants.OBJ_BLOB,
-        createServiceUserNote(branch, serviceUser).getBytes("UTF-8"));
+    return getInserter()
+        .insert(Constants.OBJ_BLOB, createServiceUserNote(branch, serviceUser).getBytes("UTF-8"));
   }
 
-  private String createServiceUserNote(String branch,
-      ServiceUserInfo serviceUser) throws OrmException {
-    HeaderFormatter fmt =
-        new HeaderFormatter(gerritServerIdent.getTimeZone(),
-            anonymousCowardName);
+  private String createServiceUserNote(String branch, ServiceUserInfo serviceUser)
+      throws OrmException {
+    HeaderFormatter fmt = new HeaderFormatter(gerritServerIdent.getTimeZone(), anonymousCowardName);
     fmt.appendDate();
     fmt.append("Project", project.get());
     fmt.append("Branch", branch);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteActive.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteActive.java
index fd4a7f5..126df90 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteActive.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteActive.java
@@ -22,7 +22,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import java.io.IOException;
 
 @Singleton
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteSshKey.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteSshKey.java
index 24c05e8..09031bc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteSshKey.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteSshKey.java
@@ -24,29 +24,25 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 
-import java.io.IOException;
-
 @Singleton
-class DeleteSshKey
-    implements RestModifyView<ServiceUserResource.SshKey, Input> {
+class DeleteSshKey implements RestModifyView<ServiceUserResource.SshKey, Input> {
   private final Provider<com.google.gerrit.server.account.DeleteSshKey> deleteSshKey;
 
   @Inject
-  DeleteSshKey(
-      Provider<com.google.gerrit.server.account.DeleteSshKey> deleteSshKey) {
+  DeleteSshKey(Provider<com.google.gerrit.server.account.DeleteSshKey> deleteSshKey) {
     this.deleteSshKey = deleteSshKey;
   }
 
   @Override
   public Response<?> apply(ServiceUserResource.SshKey rsrc, Input input)
-      throws OrmException, AuthException, RepositoryNotFoundException,
-      IOException, ConfigInvalidException,
-      PermissionBackendException {
-    return deleteSshKey.get().apply(
-        new AccountResource.SshKey(rsrc.getUser(), rsrc.getSshKey()), input);
+      throws OrmException, AuthException, RepositoryNotFoundException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    return deleteSshKey
+        .get()
+        .apply(new AccountResource.SshKey(rsrc.getUser(), rsrc.getSshKey()), input);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetConfig.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetConfig.java
index 86bf244..71c3b99 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetConfig.java
@@ -28,14 +28,12 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 class GetConfig implements RestReadView<ConfigResource> {
@@ -47,8 +45,11 @@
   private final GroupJson groupJson;
 
   @Inject
-  public GetConfig(PluginConfigFactory cfgFactory,
-      @PluginName String pluginName, GroupCache groupCache, GroupJson groupJson) {
+  public GetConfig(
+      PluginConfigFactory cfgFactory,
+      @PluginName String pluginName,
+      GroupCache groupCache,
+      GroupJson groupJson) {
     this.cfgFactory = cfgFactory;
     this.pluginName = pluginName;
     this.groupCache = groupCache;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetOwner.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetOwner.java
index de8ccc2..10d0546 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetOwner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetOwner.java
@@ -39,8 +39,11 @@
   private final GroupJson json;
 
   @Inject
-  GetOwner(GroupsCollection groups, @PluginName String pluginName,
-      ProjectCache projectCache, GroupJson json) {
+  GetOwner(
+      GroupsCollection groups,
+      @PluginName String pluginName,
+      ProjectCache projectCache,
+      GroupJson json) {
     this.groups = groups;
     this.pluginName = pluginName;
     this.projectCache = projectCache;
@@ -54,7 +57,7 @@
     String owner = storage.get().getString(USER, rsrc.getUser().getUserName(), KEY_OWNER);
     if (owner != null) {
       GroupDescription.Basic group = groups.parseId(owner);
-      return Response.<GroupInfo> ok(json.format(group));
+      return Response.<GroupInfo>ok(json.format(group));
     } else {
       return Response.none();
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetServiceUser.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetServiceUser.java
index 2f9d56b..5ce479e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetServiceUser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetServiceUser.java
@@ -34,7 +34,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import org.eclipse.jgit.lib.Config;
 
 @Singleton
@@ -46,9 +45,12 @@
   private final AccountLoader.Factory accountLoader;
 
   @Inject
-  GetServiceUser(Provider<GetAccount> getAccount,
-      @PluginName String pluginName, ProjectCache projectCache,
-      GetOwner getOwner, AccountLoader.Factory accountLoader) {
+  GetServiceUser(
+      Provider<GetAccount> getAccount,
+      @PluginName String pluginName,
+      ProjectCache projectCache,
+      GetOwner getOwner,
+      AccountLoader.Factory accountLoader) {
     this.getAccount = getAccount;
     this.pluginName = pluginName;
     this.projectCache = projectCache;
@@ -68,8 +70,7 @@
 
     ServiceUserInfo info = new ServiceUserInfo(getAccount.get().apply(rsrc));
     AccountLoader al = accountLoader.create(true);
-    info.createdBy =
-        al.get(new Account.Id(db.getInt(USER, username, KEY_CREATOR_ID, -1)));
+    info.createdBy = al.get(new Account.Id(db.getInt(USER, username, KEY_CREATOR_ID, -1)));
     al.fill();
     info.createdAt = db.getString(USER, username, KEY_CREATED_AT);
     info.inactive = !rsrc.getUser().getAccount().isActive() ? true : null;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKey.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKey.java
index b9f55f7..baab715 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKey.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKey.java
@@ -32,7 +32,6 @@
 
   @Override
   public SshKeyInfo apply(ServiceUserResource.SshKey rsrc) {
-    return getSshKey.get().apply(
-        new AccountResource.SshKey(rsrc.getUser(), rsrc.getSshKey()));
+    return getSshKey.get().apply(new AccountResource.SshKey(rsrc.getUser(), rsrc.getSshKey()));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKeys.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKeys.java
index 1948329..be08a69 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKeys.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/GetSshKeys.java
@@ -21,12 +21,10 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
 import java.io.IOException;
 import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
 
 @Singleton
 class GetSshKeys implements RestReadView<ServiceUserResource> {
@@ -39,8 +37,8 @@
 
   @Override
   public List<SshKeyInfo> apply(ServiceUserResource rsrc)
-      throws AuthException, OrmException, RepositoryNotFoundException,
-      IOException, ConfigInvalidException {
+      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
+          ConfigInvalidException {
     return getSshKeys.get().apply(rsrc.getUser());
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HeaderFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HeaderFormatter.java
index 44bc973..38e9197 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HeaderFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HeaderFormatter.java
@@ -16,7 +16,6 @@
 
 import com.google.common.base.Strings;
 import com.google.gerrit.extensions.common.AccountInfo;
-
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -31,8 +30,7 @@
 
   HeaderFormatter(TimeZone tz, String anonymousCowardName) {
     this.anonymousCowardName = anonymousCowardName;
-    rfc2822DateFormatter =
-        new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
+    rfc2822DateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
     rfc2822DateFormatter.setCalendar(Calendar.getInstance(tz, Locale.US));
   }
 
@@ -41,8 +39,7 @@
   }
 
   void appendDate() {
-    sb.append("Date: ").append(rfc2822DateFormatter.format(new Date()))
-        .append("\n");
+    sb.append("Date: ").append(rfc2822DateFormatter.format(new Date())).append("\n");
   }
 
   void appendUser(String key, AccountInfo user) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HttpModule.java
index 53ef9b0..47196c3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/HttpModule.java
@@ -23,7 +23,6 @@
 
   @Override
   protected void configureServlets() {
-    DynamicSet.bind(binder(), WebUiPlugin.class)
-        .toInstance(new GwtPlugin("serviceuser"));
+    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new GwtPlugin("serviceuser"));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ListServiceUsers.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ListServiceUsers.java
index d48be6e..90551a5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ListServiceUsers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ListServiceUsers.java
@@ -33,12 +33,9 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.GetServiceUser.ServiceUserInfo;
-
-import org.eclipse.jgit.lib.Config;
-
 import java.util.Map;
+import org.eclipse.jgit.lib.Config;
 
 @Singleton
 class ListServiceUsers implements RestReadView<ConfigResource> {
@@ -50,9 +47,12 @@
   private final Provider<GetServiceUser> getServiceUser;
 
   @Inject
-  ListServiceUsers(Provider<CurrentUser> userProvider,
-      @PluginName String pluginName, ProjectCache projectCache,
-      AccountCache accountCache, Provider<ServiceUserCollection> serviceUsers,
+  ListServiceUsers(
+      Provider<CurrentUser> userProvider,
+      @PluginName String pluginName,
+      ProjectCache projectCache,
+      AccountCache accountCache,
+      Provider<ServiceUserCollection> serviceUsers,
       Provider<GetServiceUser> getServiceUser) {
     this.userProvider = userProvider;
     this.pluginName = pluginName;
@@ -79,8 +79,7 @@
         ServiceUserInfo info;
         try {
           ServiceUserResource serviceUserResource =
-              serviceUsers.get().parse(new ConfigResource(),
-                  IdString.fromDecoded(username));
+              serviceUsers.get().parse(new ConfigResource(), IdString.fromDecoded(username));
           info = getServiceUser.get().apply(serviceUserResource);
           info.username = null;
           accounts.put(username, info);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/Module.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/Module.java
index 33a4024..97cda35 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/Module.java
@@ -37,41 +37,40 @@
         .annotatedWith(Exports.named(CreateServiceUserCapability.ID))
         .to(CreateServiceUserCapability.class);
     DynamicSet.bind(binder(), TopMenu.class).to(ServiceUserMenu.class);
-    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
-        .to(RefUpdateListener.class);
-    DynamicSet.bind(binder(), CommitValidationListener.class)
-        .to(ValidateServiceUserCommits.class);
+    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(RefUpdateListener.class);
+    DynamicSet.bind(binder(), CommitValidationListener.class).to(ValidateServiceUserCommits.class);
     install(new FactoryModuleBuilder().build(CreateServiceUserNotes.Factory.class));
-    install(new RestApiModule() {
-      @Override
-      protected void configure() {
-        DynamicMap.mapOf(binder(), SERVICE_USER_KIND);
-        DynamicMap.mapOf(binder(), SERVICE_USER_SSH_KEY_KIND);
-        bind(ServiceUserCollection.class);
-        child(CONFIG_KIND, "serviceusers").to(ServiceUserCollection.class);
-        get(SERVICE_USER_KIND).to(GetServiceUser.class);
-        install(new FactoryModuleBuilder().build(CreateServiceUser.Factory.class));
-        get(CONFIG_KIND, "config").to(GetConfig.class);
-        put(CONFIG_KIND, "config").to(PutConfig.class);
-        child(SERVICE_USER_KIND, "sshkeys").to(SshKeys.class);
-        get(SERVICE_USER_SSH_KEY_KIND).to(GetSshKey.class);
-        post(SERVICE_USER_KIND, "sshkeys").to(AddSshKey.class);
-        delete(SERVICE_USER_SSH_KEY_KIND).to(DeleteSshKey.class);
-        get(SERVICE_USER_KIND, "name").to(GetName.class);
-        put(SERVICE_USER_KIND, "name").to(PutName.class);
-        delete(SERVICE_USER_KIND, "name").to(PutName.class);
-        get(SERVICE_USER_KIND, "email").to(GetEmail.class);
-        put(SERVICE_USER_KIND, "email").to(PutEmail.class);
-        delete(SERVICE_USER_KIND, "email").to(PutEmail.class);
-        put(SERVICE_USER_KIND, "password.http").to(PutHttpPassword.class);
-        delete(SERVICE_USER_KIND, "password.http").to(PutHttpPassword.class);
-        get(SERVICE_USER_KIND, "active").to(GetActive.class);
-        put(SERVICE_USER_KIND, "active").to(PutActive.class);
-        delete(SERVICE_USER_KIND, "active").to(DeleteActive.class);
-        get(SERVICE_USER_KIND, "owner").to(GetOwner.class);
-        put(SERVICE_USER_KIND, "owner").to(PutOwner.class);
-        delete(SERVICE_USER_KIND, "owner").to(PutOwner.class);
-      }
-    });
+    install(
+        new RestApiModule() {
+          @Override
+          protected void configure() {
+            DynamicMap.mapOf(binder(), SERVICE_USER_KIND);
+            DynamicMap.mapOf(binder(), SERVICE_USER_SSH_KEY_KIND);
+            bind(ServiceUserCollection.class);
+            child(CONFIG_KIND, "serviceusers").to(ServiceUserCollection.class);
+            get(SERVICE_USER_KIND).to(GetServiceUser.class);
+            install(new FactoryModuleBuilder().build(CreateServiceUser.Factory.class));
+            get(CONFIG_KIND, "config").to(GetConfig.class);
+            put(CONFIG_KIND, "config").to(PutConfig.class);
+            child(SERVICE_USER_KIND, "sshkeys").to(SshKeys.class);
+            get(SERVICE_USER_SSH_KEY_KIND).to(GetSshKey.class);
+            post(SERVICE_USER_KIND, "sshkeys").to(AddSshKey.class);
+            delete(SERVICE_USER_SSH_KEY_KIND).to(DeleteSshKey.class);
+            get(SERVICE_USER_KIND, "name").to(GetName.class);
+            put(SERVICE_USER_KIND, "name").to(PutName.class);
+            delete(SERVICE_USER_KIND, "name").to(PutName.class);
+            get(SERVICE_USER_KIND, "email").to(GetEmail.class);
+            put(SERVICE_USER_KIND, "email").to(PutEmail.class);
+            delete(SERVICE_USER_KIND, "email").to(PutEmail.class);
+            put(SERVICE_USER_KIND, "password.http").to(PutHttpPassword.class);
+            delete(SERVICE_USER_KIND, "password.http").to(PutHttpPassword.class);
+            get(SERVICE_USER_KIND, "active").to(GetActive.class);
+            put(SERVICE_USER_KIND, "active").to(PutActive.class);
+            delete(SERVICE_USER_KIND, "active").to(DeleteActive.class);
+            get(SERVICE_USER_KIND, "owner").to(GetOwner.class);
+            put(SERVICE_USER_KIND, "owner").to(PutOwner.class);
+            delete(SERVICE_USER_KIND, "owner").to(PutOwner.class);
+          }
+        });
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutActive.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutActive.java
index 07c33d9..9a5ffcd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutActive.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutActive.java
@@ -22,7 +22,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import java.io.IOException;
 
 @Singleton
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutConfig.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutConfig.java
index 47c41ee..09a559e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutConfig.java
@@ -28,17 +28,14 @@
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.PutConfig.Input;
-
+import java.io.IOException;
+import java.util.List;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
 
-import java.io.IOException;
-import java.util.List;
-
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
 @Singleton
 class PutConfig implements RestModifyView<ConfigResource, Input> {
@@ -60,8 +57,11 @@
   private final GroupCache groupCache;
 
   @Inject
-  PutConfig(PluginConfigFactory cfgFactory, SitePaths sitePaths,
-      @PluginName String pluginName, GroupCache groupCache) {
+  PutConfig(
+      PluginConfigFactory cfgFactory,
+      SitePaths sitePaths,
+      @PluginName String pluginName,
+      GroupCache groupCache) {
     this.cfgFactory = cfgFactory;
     this.sitePaths = sitePaths;
     this.pluginName = pluginName;
@@ -71,16 +71,13 @@
   @Override
   public Response<String> apply(ConfigResource rsrc, Input input)
       throws IOException, ConfigInvalidException, UnprocessableEntityException {
-    FileBasedConfig cfg =
-        new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
+    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
     cfg.load();
     if (input.info != null) {
-      cfg.setString("plugin", pluginName, "infoMessage",
-          Strings.emptyToNull(input.info));
+      cfg.setString("plugin", pluginName, "infoMessage", Strings.emptyToNull(input.info));
     }
     if (input.onSuccess != null) {
-      cfg.setString("plugin", pluginName, "onSuccessMessage",
-          Strings.emptyToNull(input.onSuccess));
+      cfg.setString("plugin", pluginName, "onSuccessMessage", Strings.emptyToNull(input.onSuccess));
     }
     if (input.allowEmail != null) {
       setBoolean(cfg, "allowEmail", input.allowEmail);
@@ -103,15 +100,14 @@
     if (input.groups != null) {
       for (String g : input.groups) {
         if (groupCache.get(new AccountGroup.NameKey(g)) == null) {
-          throw new UnprocessableEntityException(
-              String.format("Group %s does not exist.", g));
+          throw new UnprocessableEntityException(String.format("Group %s does not exist.", g));
         }
       }
       cfg.setStringList("plugin", pluginName, "group", input.groups);
     }
     cfg.save();
     cfgFactory.getFromGerritConfig(pluginName, true);
-    return Response.<String> ok("OK");
+    return Response.<String>ok("OK");
   }
 
   private void setBoolean(Config cfg, String name, boolean value) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutEmail.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutEmail.java
index 941d337..6e30ea9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutEmail.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutEmail.java
@@ -18,10 +18,10 @@
 
 import com.google.common.base.Strings;
 import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.api.accounts.EmailInput;
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -38,18 +38,14 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.PutEmail.Input;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 @Singleton
 class PutEmail implements RestModifyView<ServiceUserResource, Input> {
   public static class Input {
-    @DefaultInput
-    public String email;
+    @DefaultInput public String email;
   }
 
   private final Provider<GetConfig> getConfig;
@@ -61,7 +57,8 @@
   private final PermissionBackend permissionBackend;
 
   @Inject
-  PutEmail(Provider<GetConfig> getConfig,
+  PutEmail(
+      Provider<GetConfig> getConfig,
       Provider<GetEmail> getEmail,
       Provider<CreateEmail.Factory> createEmailFactory,
       Provider<DeleteEmail> deleteEmail,
@@ -79,10 +76,9 @@
 
   @Override
   public Response<?> apply(ServiceUserResource rsrc, Input input)
-      throws AuthException, ResourceNotFoundException,
-      ResourceConflictException, MethodNotAllowedException, OrmException,
-      BadRequestException, ConfigInvalidException, EmailException, IOException,
-      PermissionBackendException {
+      throws AuthException, ResourceNotFoundException, ResourceConflictException,
+          MethodNotAllowedException, OrmException, BadRequestException, ConfigInvalidException,
+          EmailException, IOException, PermissionBackendException {
     Boolean emailAllowed = getConfig.get().apply(new ConfigResource()).allowEmail;
     if ((emailAllowed == null || !emailAllowed)) {
       permissionBackend.user(self).check(ADMINISTRATE_SERVER);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutHttpPassword.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutHttpPassword.java
index 358ac13..a920f62 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutHttpPassword.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutHttpPassword.java
@@ -29,17 +29,12 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.PutHttpPassword.Input;
-
-import org.apache.commons.codec.binary.Base64;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
 import java.io.IOException;
-
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 @Singleton
 public class PutHttpPassword implements RestModifyView<ServiceUserResource, Input> {
@@ -65,9 +60,11 @@
   private final PermissionBackend permissionBackend;
 
   @Inject
-  PutHttpPassword(Provider<GetConfig> getConfig,
+  PutHttpPassword(
+      Provider<GetConfig> getConfig,
       com.google.gerrit.server.account.PutHttpPassword putHttpPassword,
-      Provider<CurrentUser> self, PermissionBackend permissionBackend) {
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend) {
     this.getConfig = getConfig;
     this.putHttpPassword = putHttpPassword;
     this.self = self;
@@ -77,7 +74,7 @@
   @Override
   public Response<String> apply(ServiceUserResource rsrc, Input input)
       throws AuthException, ResourceConflictException, ConfigInvalidException,
-      ResourceNotFoundException, OrmException, IOException, PermissionBackendException {
+          ResourceNotFoundException, OrmException, IOException, PermissionBackendException {
     if (input == null) {
       input = new Input();
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutName.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutName.java
index 5558efc..cae013d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutName.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutName.java
@@ -23,7 +23,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import java.io.IOException;
 
 @Singleton
@@ -37,8 +36,7 @@
 
   @Override
   public Response<String> apply(ServiceUserResource rsrc, Input input)
-      throws MethodNotAllowedException, ResourceNotFoundException, OrmException,
-      IOException {
+      throws MethodNotAllowedException, ResourceNotFoundException, OrmException, IOException {
     return putName.get().apply(rsrc.getUser(), input);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java
index c379487..19d84a2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java
@@ -44,19 +44,15 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.PutOwner.Input;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Config;
 
-import java.io.IOException;
-
 @Singleton
 class PutOwner implements RestModifyView<ServiceUserResource, Input> {
   public static class Input {
-    @DefaultInput
-    public String group;
+    @DefaultInput public String group;
   }
 
   private final Provider<GetConfig> getConfig;
@@ -70,10 +66,15 @@
   private final PermissionBackend permissionBackend;
 
   @Inject
-  PutOwner(Provider<GetConfig> getConfig, GroupsCollection groups,
-      @PluginName String pluginName, ProjectCache projectCache,
-      MetaDataUpdate.User metaDataUpdateFactory, GroupJson json,
-      Provider<CurrentUser> self, PermissionBackend permissionBackend) {
+  PutOwner(
+      Provider<GetConfig> getConfig,
+      GroupsCollection groups,
+      @PluginName String pluginName,
+      ProjectCache projectCache,
+      MetaDataUpdate.User metaDataUpdateFactory,
+      GroupJson json,
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend) {
     this.getConfig = getConfig;
     this.groups = groups;
     this.pluginName = pluginName;
@@ -87,9 +88,9 @@
 
   @Override
   public Response<GroupInfo> apply(ServiceUserResource rsrc, Input input)
-      throws UnprocessableEntityException, RepositoryNotFoundException,
-      MethodNotAllowedException, IOException, OrmException, ResourceConflictException,
-      AuthException, PermissionBackendException {
+      throws UnprocessableEntityException, RepositoryNotFoundException, MethodNotAllowedException,
+          IOException, OrmException, ResourceConflictException, AuthException,
+          PermissionBackendException {
     ProjectLevelConfig storage = projectCache.getAllProjects().getConfig(pluginName + ".db");
     Boolean ownerAllowed = getConfig.get().apply(new ConfigResource()).allowOwner;
     if ((ownerAllowed == null || !ownerAllowed)) {
@@ -98,7 +99,6 @@
 
     if (input == null) {
       input = new Input();
-
     }
     Config db = storage.get();
     String oldGroup = db.getString(USER, rsrc.getUser().getUserName(), KEY_OWNER);
@@ -110,14 +110,15 @@
       if (GroupDescriptions.toAccountGroup(group) == null) {
         throw new MethodNotAllowedException();
       }
-      db.setString(USER, rsrc.getUser().getUserName(), KEY_OWNER,
-          group.getGroupUUID().get());
+      db.setString(USER, rsrc.getUser().getUserName(), KEY_OWNER, group.getGroupUUID().get());
     }
     MetaDataUpdate md = metaDataUpdateFactory.create(allProjects);
     md.setMessage("Set owner for service user '" + rsrc.getUser().getUserName() + "'\n");
     storage.commit(md);
     return group != null
-        ? (oldGroup != null ? Response.ok(json.format(group)) : Response.created(json.format(group)))
-        : Response.<GroupInfo> none();
+        ? (oldGroup != null
+            ? Response.ok(json.format(group))
+            : Response.created(json.format(group)))
+        : Response.<GroupInfo>none();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/RefUpdateListener.java
index 6d79586..b60e8e5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/RefUpdateListener.java
@@ -25,19 +25,16 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
 @Singleton
 class RefUpdateListener implements GitReferenceUpdatedListener {
-  private static final Logger log = LoggerFactory
-      .getLogger(RefUpdateListener.class);
+  private static final Logger log = LoggerFactory.getLogger(RefUpdateListener.class);
 
   private final CreateServiceUserNotes.Factory serviceUserNotesFactory;
   private final GitRepositoryManager repoManager;
@@ -46,9 +43,12 @@
   private final String pluginName;
 
   @Inject
-  RefUpdateListener(CreateServiceUserNotes.Factory serviceUserNotesFactory,
-      GitRepositoryManager repoManager, WorkQueue workQueue,
-      PluginConfigFactory cfgFactory, @PluginName String pluginName) {
+  RefUpdateListener(
+      CreateServiceUserNotes.Factory serviceUserNotesFactory,
+      GitRepositoryManager repoManager,
+      WorkQueue workQueue,
+      PluginConfigFactory cfgFactory,
+      @PluginName String pluginName) {
     this.serviceUserNotesFactory = serviceUserNotesFactory;
     this.repoManager = repoManager;
     this.workQueue = workQueue;
@@ -63,32 +63,33 @@
       return;
     }
 
-    Runnable task = new ProjectRunnable() {
-      @Override
-      public void run() {
-        createServiceUserNotes(event);
-      }
+    Runnable task =
+        new ProjectRunnable() {
+          @Override
+          public void run() {
+            createServiceUserNotes(event);
+          }
 
-      @Override
-      public Project.NameKey getProjectNameKey() {
-        return new Project.NameKey(event.getProjectName());
-      }
+          @Override
+          public Project.NameKey getProjectNameKey() {
+            return new Project.NameKey(event.getProjectName());
+          }
 
-      @Override
-      public String getRemoteName() {
-        return null;
-      }
+          @Override
+          public String getRemoteName() {
+            return null;
+          }
 
-      @Override
-      public boolean hasCustomizedPrint() {
-        return true;
-      }
+          @Override
+          public boolean hasCustomizedPrint() {
+            return true;
+          }
 
-      @Override
-      public String toString() {
-        return "create-service-user-notes";
-      }
-    };
+          @Override
+          public String toString() {
+            return "create-service-user-notes";
+          }
+        };
     if (cfg.getBoolean("createNotesAsync", false)) {
       workQueue.getDefaultQueue().submit(task);
     } else {
@@ -98,10 +99,10 @@
 
   private void createServiceUserNotes(Event e) {
     Project.NameKey projectName = new Project.NameKey(e.getProjectName());
-    try (Repository git = repoManager.openRepository(projectName)){
-      CreateServiceUserNotes crn = serviceUserNotesFactory.create(
-          projectName, git);
-      crn.createNotes(e.getRefName(),
+    try (Repository git = repoManager.openRepository(projectName)) {
+      CreateServiceUserNotes crn = serviceUserNotesFactory.create(projectName, git);
+      crn.createNotes(
+          e.getRefName(),
           ObjectId.fromString(e.getOldObjectId()),
           ObjectId.fromString(e.getNewObjectId()));
       crn.commitNotes();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserCollection.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserCollection.java
index 666577b..8ba978a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserCollection.java
@@ -45,9 +45,8 @@
 import com.google.inject.Singleton;
 
 @Singleton
-class ServiceUserCollection implements
-    ChildCollection<ConfigResource, ServiceUserResource>,
-    AcceptsCreate<ConfigResource> {
+class ServiceUserCollection
+    implements ChildCollection<ConfigResource, ServiceUserResource>, AcceptsCreate<ConfigResource> {
 
   private final DynamicMap<RestView<ServiceUserResource>> views;
   private final CreateServiceUser.Factory createServiceUserFactory;
@@ -60,11 +59,15 @@
   private final PermissionBackend permissionBackend;
 
   @Inject
-  ServiceUserCollection(DynamicMap<RestView<ServiceUserResource>> views,
+  ServiceUserCollection(
+      DynamicMap<RestView<ServiceUserResource>> views,
       CreateServiceUser.Factory createServiceUserFactory,
-      Provider<ListServiceUsers> list, Provider<AccountsCollection> accounts,
-      @PluginName String pluginName, ProjectCache projectCache,
-      Provider<CurrentUser> userProvider, GroupsCollection groups,
+      Provider<ListServiceUsers> list,
+      Provider<AccountsCollection> accounts,
+      @PluginName String pluginName,
+      ProjectCache projectCache,
+      Provider<CurrentUser> userProvider,
+      GroupsCollection groups,
       PermissionBackend permissionBackend) {
     this.views = views;
     this.createServiceUserFactory = createServiceUserFactory;
@@ -83,8 +86,7 @@
     ProjectLevelConfig storage = projectCache.getAllProjects().getConfig(pluginName + ".db");
     IdentifiedUser serviceUser = accounts.get().parseId(id.get());
     if (serviceUser == null
-        || !storage.get().getSubsections(USER)
-            .contains(serviceUser.getUserName())) {
+        || !storage.get().getSubsections(USER).contains(serviceUser.getUserName())) {
       throw new ResourceNotFoundException(id);
     }
     CurrentUser user = userProvider.get();
@@ -102,8 +104,9 @@
         } catch (UnprocessableEntityException e) {
           throw new ResourceNotFoundException(id);
         }
-      } else if (!((IdentifiedUser)user).getAccountId().equals(
-          new Account.Id(storage.get().getInt(USER, id.get(), KEY_CREATOR_ID, -1)))) {
+      } else if (!((IdentifiedUser) user)
+          .getAccountId()
+          .equals(new Account.Id(storage.get().getInt(USER, id.get(), KEY_CREATOR_ID, -1)))) {
         throw new ResourceNotFoundException(id);
       }
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserMenu.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserMenu.java
index 6d5f5f1..e715917 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserMenu.java
@@ -29,7 +29,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import java.util.List;
 
 class ServiceUserMenu implements TopMenu {
@@ -40,10 +39,12 @@
   private final PermissionBackend permissionBackend;
 
   @Inject
-  ServiceUserMenu(@PluginName String pluginName,
+  ServiceUserMenu(
+      @PluginName String pluginName,
       Provider<CurrentUser> userProvider,
       Provider<ListServiceUsers> listServiceUsers,
-      PermissionBackend permissionBackend) throws PermissionBackendException {
+      PermissionBackend permissionBackend)
+      throws PermissionBackendException {
     this.pluginName = pluginName;
     this.userProvider = userProvider;
     this.listServiceUsers = listServiceUsers;
@@ -64,9 +65,10 @@
 
   private boolean canCreateServiceUser() {
     if (userProvider.get().isIdentifiedUser()) {
-      return permissionBackend.user(userProvider).testOrFalse(
-        new PluginPermission(pluginName, CreateServiceUserCapability.ID)) ||
-          permissionBackend.user(userProvider).testOrFalse(ADMINISTRATE_SERVER);
+      return permissionBackend
+              .user(userProvider)
+              .testOrFalse(new PluginPermission(pluginName, CreateServiceUserCapability.ID))
+          || permissionBackend.user(userProvider).testOrFalse(ADMINISTRATE_SERVER);
     } else {
       return false;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserResolver.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserResolver.java
index fd360cc..772acde 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserResolver.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ServiceUserResolver.java
@@ -33,15 +33,12 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.GetServiceUser.ServiceUserInfo;
-
-import org.eclipse.jgit.lib.PersonIdent;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import org.eclipse.jgit.lib.PersonIdent;
 
 @Singleton
 class ServiceUserResolver {
@@ -54,11 +51,14 @@
   private final AccountCache accountCache;
 
   @Inject
-  ServiceUserResolver(AccountResolver resolver,
+  ServiceUserResolver(
+      AccountResolver resolver,
       IdentifiedUser.GenericFactory genericUserFactory,
       Provider<GetServiceUser> getServiceUser,
-      Provider<ListMembers> listMembers, SchemaFactory<ReviewDb> schema,
-      ThreadLocalRequestContext tl, AccountCache accountCache) {
+      Provider<ListMembers> listMembers,
+      SchemaFactory<ReviewDb> schema,
+      ThreadLocalRequestContext tl,
+      AccountCache accountCache) {
     this.resolver = resolver;
     this.genericUserFactory = genericUserFactory;
     this.getServiceUser = getServiceUser;
@@ -68,22 +68,22 @@
     this.accountCache = accountCache;
   }
 
-  ServiceUserInfo getAsServiceUser(PersonIdent committerIdent)
-      throws OrmException {
+  ServiceUserInfo getAsServiceUser(PersonIdent committerIdent) throws OrmException {
     StringBuilder committer = new StringBuilder();
     committer.append(committerIdent.getName());
     committer.append(" <");
     committer.append(committerIdent.getEmailAddress());
     committer.append("> ");
 
-    try (ReviewDb db = schema.open())  {
+    try (ReviewDb db = schema.open()) {
       Account account = resolver.find(db, committer.toString());
       if (account == null) {
         return null;
       }
       try {
-        return getServiceUser.get().apply(
-            new ServiceUserResource(genericUserFactory.create(account.getId())));
+        return getServiceUser
+            .get()
+            .apply(new ServiceUserResource(genericUserFactory.create(account.getId())));
       } catch (ResourceNotFoundException e) {
         return null;
       }
@@ -96,47 +96,50 @@
     }
 
     try (ReviewDb db = schema.open()) {
-      RequestContext context = new RequestContext() {
-        @Override
-        public CurrentUser getUser() {
-          return new CurrentUser(null) {
+      RequestContext context =
+          new RequestContext() {
+            @Override
+            public CurrentUser getUser() {
+              return new CurrentUser(null) {
+
+                @Override
+                public GroupMembership getEffectiveGroups() {
+                  return new GroupMembership() {
+                    @Override
+                    public Set<AccountGroup.UUID> intersection(
+                        Iterable<AccountGroup.UUID> groupIds) {
+                      return null;
+                    }
+
+                    @Override
+                    public Set<AccountGroup.UUID> getKnownGroups() {
+                      return null;
+                    }
+
+                    @Override
+                    public boolean containsAnyOf(Iterable<AccountGroup.UUID> groupIds) {
+                      return true;
+                    }
+
+                    @Override
+                    public boolean contains(AccountGroup.UUID groupId) {
+                      return true;
+                    }
+                  };
+                }
+              };
+            }
 
             @Override
-            public GroupMembership getEffectiveGroups() {
-              return new GroupMembership() {
+            public Provider<ReviewDb> getReviewDbProvider() {
+              return new Provider<ReviewDb>() {
                 @Override
-                public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds) {
-                  return null;
-                }
-
-                @Override
-                public Set<AccountGroup.UUID> getKnownGroups() {
-                  return null;
-                }
-
-                @Override
-                public boolean containsAnyOf(Iterable<AccountGroup.UUID> groupIds) {
-                  return true;
-                }
-
-                @Override
-                public boolean contains(AccountGroup.UUID groupId) {
-                  return true;
+                public ReviewDb get() {
+                  return db;
                 }
               };
             }
           };
-        }
-
-        @Override
-        public Provider<ReviewDb> getReviewDbProvider() {
-          return new Provider<ReviewDb>() {
-            @Override
-            public ReviewDb get() {
-              return db;
-            }};
-        }
-      };
       RequestContext old = tl.setContext(context);
       try {
         ListMembers lm = listMembers.get();
@@ -152,8 +155,7 @@
     }
   }
 
-  List<AccountInfo> listActiveOwners(ServiceUserInfo serviceUser)
-      throws OrmException {
+  List<AccountInfo> listActiveOwners(ServiceUserInfo serviceUser) throws OrmException {
     List<AccountInfo> activeOwners = new ArrayList<>();
     for (AccountInfo owner : listOwners(serviceUser)) {
       AccountState accountState = accountCache.get(new Account.Id(owner._accountId));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/SshKeys.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/SshKeys.java
index 74ea24f..ac64ebb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/SshKeys.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/SshKeys.java
@@ -23,20 +23,18 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 
-import java.io.IOException;
-
 @Singleton
-class SshKeys implements
-    ChildCollection<ServiceUserResource, ServiceUserResource.SshKey> {
+class SshKeys implements ChildCollection<ServiceUserResource, ServiceUserResource.SshKey> {
   private final DynamicMap<RestView<ServiceUserResource.SshKey>> views;
   private final Provider<GetSshKeys> list;
   private final Provider<com.google.gerrit.server.account.SshKeys> sshKeys;
 
   @Inject
-  SshKeys(DynamicMap<RestView<ServiceUserResource.SshKey>> views,
+  SshKeys(
+      DynamicMap<RestView<ServiceUserResource.SshKey>> views,
       Provider<GetSshKeys> list,
       Provider<com.google.gerrit.server.account.SshKeys> sshKeys) {
     this.views = views;
@@ -51,8 +49,7 @@
 
   @Override
   public ServiceUserResource.SshKey parse(ServiceUserResource parent, IdString id)
-      throws ResourceNotFoundException, OrmException, IOException,
-      ConfigInvalidException {
+      throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException {
     return new ServiceUserResource.SshKey(sshKeys.get().parse(parent.getUser(), id));
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ValidateServiceUserCommits.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ValidateServiceUserCommits.java
index c0684e7..7eec82f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ValidateServiceUserCommits.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/ValidateServiceUserCommits.java
@@ -24,13 +24,10 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.serviceuser.GetServiceUser.ServiceUserInfo;
-
-import org.eclipse.jgit.lib.PersonIdent;
-
 import java.util.Collections;
 import java.util.List;
+import org.eclipse.jgit.lib.PersonIdent;
 
 @Singleton
 class ValidateServiceUserCommits implements CommitValidationListener {
@@ -38,36 +35,37 @@
   private final AccountCache accountCache;
 
   @Inject
-  ValidateServiceUserCommits(ServiceUserResolver serviceUserResolver,
-      AccountCache accountCache) {
+  ValidateServiceUserCommits(ServiceUserResolver serviceUserResolver, AccountCache accountCache) {
     this.serviceUserResolver = serviceUserResolver;
     this.accountCache = accountCache;
   }
 
   @Override
-  public List<CommitValidationMessage> onCommitReceived(
-      CommitReceivedEvent receiveEvent) throws CommitValidationException {
+  public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+      throws CommitValidationException {
     try {
       PersonIdent committer = receiveEvent.commit.getCommitterIdent();
-      ServiceUserInfo serviceUser =
-          serviceUserResolver.getAsServiceUser(committer);
+      ServiceUserInfo serviceUser = serviceUserResolver.getAsServiceUser(committer);
       if (serviceUser != null) {
         if (serviceUser.owner != null
             && serviceUserResolver.listActiveOwners(serviceUser).isEmpty()) {
-          throw new CommitValidationException(String.format(
-              "Commit %s of service user %s (%s) is rejected because "
-              + "all service user owner accounts are inactive.",
-              receiveEvent.commit.getId().getName(), committer.getName(),
-              committer.getEmailAddress()));
+          throw new CommitValidationException(
+              String.format(
+                  "Commit %s of service user %s (%s) is rejected because "
+                      + "all service user owner accounts are inactive.",
+                  receiveEvent.commit.getId().getName(),
+                  committer.getName(),
+                  committer.getEmailAddress()));
         } else {
-          AccountState creator = accountCache.get(
-              new Account.Id(serviceUser.createdBy._accountId));
+          AccountState creator = accountCache.get(new Account.Id(serviceUser.createdBy._accountId));
           if (creator == null || !creator.getAccount().isActive()) {
-            throw new CommitValidationException(String.format(
-                "Commit %s of service user %s (%s) is rejected because "
-                + "the account of the service creator is inactive.",
-                receiveEvent.commit.getId().getName(), committer.getName(),
-                committer.getEmailAddress()));
+            throw new CommitValidationException(
+                String.format(
+                    "Commit %s of service user %s (%s) is rejected because "
+                        + "the account of the service creator is inactive.",
+                    receiveEvent.commit.getId().getName(),
+                    committer.getName(),
+                    committer.getEmailAddress()));
           }
         }
       }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountCapabilities.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountCapabilities.java
index c705d53..4a377d6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountCapabilities.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountCapabilities.java
@@ -18,17 +18,13 @@
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
-/** Capabilities the caller has from {@code /accounts/self/capabilities}.  */
+/** Capabilities the caller has from {@code /accounts/self/capabilities}. */
 public class AccountCapabilities extends JavaScriptObject {
   public static void all(AsyncCallback<AccountCapabilities> cb, String... filter) {
-    new RestApi("/accounts/self/capabilities")
-      .addParameter("q", filter)
-      .get(cb);
+    new RestApi("/accounts/self/capabilities").addParameter("q", filter).get(cb);
   }
 
-  protected AccountCapabilities() {
-  }
+  protected AccountCapabilities() {}
 
-  public final native boolean canPerform(String name)
-  /*-{ return this[name] ? true : false; }-*/;
+  public final native boolean canPerform(String name)/*-{ return this[name] ? true : false; }-*/ ;
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountInfo.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountInfo.java
index 962b2e9..ffc1953 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/AccountInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/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/serviceuser/client/ConfigInfo.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ConfigInfo.java
index 7ba2428..6291319 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ConfigInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ConfigInfo.java
@@ -17,26 +17,41 @@
 import com.google.gerrit.client.rpc.NativeMap;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArrayString;
-
 import java.util.List;
 
 public class ConfigInfo extends JavaScriptObject {
   final native String getInfoMessage() /*-{ return this.info }-*/;
+
   final native String getOnSuccessMessage() /*-{ return this.on_success }-*/;
+
   final native boolean getAllowEmail() /*-{ return this.allow_email ? true : false; }-*/;
-  final native boolean getAllowHttpPassword() /*-{ return this.allow_http_password ? true : false; }-*/;
+
+  final native boolean
+      getAllowHttpPassword() /*-{ return this.allow_http_password ? true : false; }-*/;
+
   final native boolean getAllowOwner() /*-{ return this.allow_owner ? true : false; }-*/;
+
   final native boolean getCreateNotes() /*-{ return this.create_notes ? true : false; }-*/;
-  final native boolean getCreateNotesAsync() /*-{ return this.create_notes_async ? true : false; }-*/;
+
+  final native boolean
+      getCreateNotesAsync() /*-{ return this.create_notes_async ? true : false; }-*/;
+
   final native JsArrayString getBlockedNames() /*-{ return this.blocked_names; }-*/;
+
   final native NativeMap<GroupInfo> getGroups() /*-{ return this.groups; }-*/;
 
   final native void setInfoMessage(String s) /*-{ this.info = s; }-*/;
+
   final native void setOnSuccessMessage(String s) /*-{ this.on_success = s; }-*/;
+
   final native void setAllowEmail(boolean s) /*-{ this.allow_email = s; }-*/;
+
   final native void setAllowHttpPassword(boolean s) /*-{ this.allow_http_password = s; }-*/;
+
   final native void setAllowOwner(boolean s) /*-{ this.allow_owner = s; }-*/;
+
   final native void setCreateNotes(boolean s) /*-{ this.create_notes = s; }-*/;
+
   final native void setCreateNotesAsync(boolean s) /*-{ this.create_notes_async = s; }-*/;
 
   final void setBlockedNames(List<String> blockedNames) {
@@ -44,9 +59,10 @@
     for (String n : blockedNames) {
       addBlockedName(n);
     }
-
   }
+
   final native void initBlockedNames() /*-{ this.blocked_names = []; }-*/;
+
   final native void addBlockedName(String n) /*-{ this.blocked_names.push(n); }-*/;
 
   final void setGroups(List<String> groups) {
@@ -54,9 +70,10 @@
     for (String g : groups) {
       addGroup(g);
     }
-
   }
+
   final native void initGroups() /*-{ this.groups = []; }-*/;
+
   final native void addGroup(String g) /*-{ this.groups.push(g); }-*/;
 
   static ConfigInfo create() {
@@ -64,6 +81,5 @@
     return g;
   }
 
-  protected ConfigInfo() {
-  }
+  protected ConfigInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java
index 65ce461..c57eb5f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/CreateServiceUserScreen.java
@@ -55,28 +55,32 @@
 
     Panel usernamePanel = new VerticalPanel();
     usernamePanel.add(new Label("Username:"));
-    usernameTxt = new TextBox() {
-      @Override
-      public void onBrowserEvent(Event event) {
-        super.onBrowserEvent(event);
-        if (event.getTypeInt() == Event.ONPASTE) {
-          Scheduler.get().scheduleDeferred(new ScheduledCommand() {
-            @Override
-            public void execute() {
-              if (getValue().trim().length() != 0) {
-                setEnabled(true);
-              }
+    usernameTxt =
+        new TextBox() {
+          @Override
+          public void onBrowserEvent(Event event) {
+            super.onBrowserEvent(event);
+            if (event.getTypeInt() == Event.ONPASTE) {
+              Scheduler.get()
+                  .scheduleDeferred(
+                      new ScheduledCommand() {
+                        @Override
+                        public void execute() {
+                          if (getValue().trim().length() != 0) {
+                            setEnabled(true);
+                          }
+                        }
+                      });
             }
-          });
-        }
-      }
-    };
-    usernameTxt.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(final KeyPressEvent event) {
-        event.stopPropagation();
-      }
-    });
+          }
+        };
+    usernameTxt.addKeyPressHandler(
+        new KeyPressHandler() {
+          @Override
+          public void onKeyPress(final KeyPressEvent event) {
+            event.stopPropagation();
+          }
+        });
     usernameTxt.sinkEvents(Event.ONPASTE);
     usernameTxt.setVisibleLength(40);
     usernamePanel.add(usernameTxt);
@@ -86,12 +90,13 @@
     sshKeyPanel.add(new Label("Public SSH Key:"));
     sshKeyPanel.add(new SshKeyHelpPanel());
     sshKeyTxt = new TextArea();
-    sshKeyTxt.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(final KeyPressEvent event) {
-        event.stopPropagation();
-      }
-    });
+    sshKeyTxt.addKeyPressHandler(
+        new KeyPressHandler() {
+          @Override
+          public void onKeyPress(final KeyPressEvent event) {
+            event.stopPropagation();
+          }
+        });
     sshKeyTxt.setVisibleLines(12);
     sshKeyTxt.setCharacterWidth(80);
     sshKeyTxt.getElement().setPropertyBoolean("spellcheck", false);
@@ -103,12 +108,13 @@
 
     final Button createButton = new Button("Create");
     createButton.addStyleName("serviceuser-createButton");
-    createButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        doCreate();
-      }
-    });
+    createButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            doCreate();
+          }
+        });
     buttons.add(createButton);
     createButton.setEnabled(false);
     new OnEditEnabler(createButton, usernameTxt);
@@ -116,54 +122,61 @@
     usernameTxt.setFocus(true);
     createButton.setEnabled(false);
 
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "config")
-        .get(new AsyncCallback<ConfigInfo>() {
-          @Override
-          public void onSuccess(ConfigInfo info) {
-            onSuccessMessage = info.getOnSuccessMessage();
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "config")
+        .get(
+            new AsyncCallback<ConfigInfo>() {
+              @Override
+              public void onSuccess(ConfigInfo info) {
+                onSuccessMessage = info.getOnSuccessMessage();
 
-            String infoMessage = info.getInfoMessage();
-            if (infoMessage != null && !"".equals(infoMessage)) {
-              insert(new HTML(infoMessage), 0);
-            }
+                String infoMessage = info.getInfoMessage();
+                if (infoMessage != null && !"".equals(infoMessage)) {
+                  insert(new HTML(infoMessage), 0);
+                }
 
-            if (info.getAllowEmail()) {
-              Panel emailPanel = new VerticalPanel();
-              emailPanel.add(new Label("Email:"));
-              emailTxt = new TextBox() {
-                @Override
-                public void onBrowserEvent(Event event) {
-                  super.onBrowserEvent(event);
-                  if (event.getTypeInt() == Event.ONPASTE) {
-                    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
-                      @Override
-                      public void execute() {
-                        if (getValue().trim().length() != 0) {
-                          setEnabled(true);
+                if (info.getAllowEmail()) {
+                  Panel emailPanel = new VerticalPanel();
+                  emailPanel.add(new Label("Email:"));
+                  emailTxt =
+                      new TextBox() {
+                        @Override
+                        public void onBrowserEvent(Event event) {
+                          super.onBrowserEvent(event);
+                          if (event.getTypeInt() == Event.ONPASTE) {
+                            Scheduler.get()
+                                .scheduleDeferred(
+                                    new ScheduledCommand() {
+                                      @Override
+                                      public void execute() {
+                                        if (getValue().trim().length() != 0) {
+                                          setEnabled(true);
+                                        }
+                                      }
+                                    });
+                          }
                         }
-                      }
-                    });
-                  }
+                      };
+                  emailTxt.addKeyPressHandler(
+                      new KeyPressHandler() {
+                        @Override
+                        public void onKeyPress(final KeyPressEvent event) {
+                          event.stopPropagation();
+                        }
+                      });
+                  emailTxt.sinkEvents(Event.ONPASTE);
+                  emailTxt.setVisibleLength(40);
+                  emailPanel.add(emailTxt);
+                  insert(emailPanel, 2);
                 }
-              };
-              emailTxt.addKeyPressHandler(new KeyPressHandler() {
-                @Override
-                public void onKeyPress(final KeyPressEvent event) {
-                  event.stopPropagation();
-                }
-              });
-              emailTxt.sinkEvents(Event.ONPASTE);
-              emailTxt.setVisibleLength(40);
-              emailPanel.add(emailTxt);
-              insert(emailPanel, 2);
-            }
-          }
+              }
 
-          @Override
-          public void onFailure(Throwable caught) {
-            // never invoked
-          }
-    });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 
   private void doCreate() {
@@ -178,44 +191,49 @@
     if (emailTxt != null) {
       in.email(emailTxt.getValue().trim());
     }
-    new RestApi("config").id("server").view("serviceuser", "serviceusers")
-        .id(username).post(in, new AsyncCallback<JavaScriptObject>() {
+    new RestApi("config")
+        .id("server")
+        .view("serviceuser", "serviceusers")
+        .id(username)
+        .post(
+            in,
+            new AsyncCallback<JavaScriptObject>() {
 
-      @Override
-      public void onSuccess(JavaScriptObject result) {
-        clearForm();
-        Plugin.get().go("/x/" + Plugin.get().getName() + "/user/" + username);
+              @Override
+              public void onSuccess(JavaScriptObject result) {
+                clearForm();
+                Plugin.get().go("/x/" + Plugin.get().getName() + "/user/" + username);
 
-        final DialogBox successDialog = new DialogBox();
-        successDialog.setText("Service User Created");
-        successDialog.setAnimationEnabled(true);
+                final DialogBox successDialog = new DialogBox();
+                successDialog.setText("Service User Created");
+                successDialog.setAnimationEnabled(true);
 
-        Panel p = new VerticalPanel();
-        p.setStyleName("serviceuser-panel");
-        p.add(new Label("The service user '" + username + "' was created."));
-        Button okButton = new Button("OK");
-        okButton.addClickHandler(new ClickHandler() {
-          @Override
-          public void onClick(ClickEvent event) {
-            successDialog.hide();
-          }
-        });
+                Panel p = new VerticalPanel();
+                p.setStyleName("serviceuser-panel");
+                p.add(new Label("The service user '" + username + "' was created."));
+                Button okButton = new Button("OK");
+                okButton.addClickHandler(
+                    new ClickHandler() {
+                      @Override
+                      public void onClick(ClickEvent event) {
+                        successDialog.hide();
+                      }
+                    });
 
-        if (onSuccessMessage != null && !"".equals(onSuccessMessage)) {
-          p.add(new HTML(onSuccessMessage));
-        }
+                if (onSuccessMessage != null && !"".equals(onSuccessMessage)) {
+                  p.add(new HTML(onSuccessMessage));
+                }
 
-        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() {
@@ -228,6 +246,7 @@
 
   private static class ServiceUserInput extends JavaScriptObject {
     final native void ssh_key(String s) /*-{ this.ssh_key = s; }-*/;
+
     final native void email(String e) /*-{ this.email = e; }-*/;
 
     static ServiceUserInput create() {
@@ -235,7 +254,6 @@
       return g;
     }
 
-    protected ServiceUserInput() {
-    }
+    protected ServiceUserInput() {}
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/EditableValue.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/EditableValue.java
index eda6b4f..0ab741f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/EditableValue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/EditableValue.java
@@ -65,44 +65,48 @@
     OnEditEnabler e = new OnEditEnabler(save);
     e.listenTo(input);
 
-    edit.addClickHandler(new  ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        labelWidget.setVisible(false);
-        edit.setVisible(false);
-        input.setVisible(true);
-        input.setFocus(true);
-        save.setVisible(true);
-        if (warning != null) {
-          warning.setVisible(true);
-        }
-        cancel.setVisible(true);
-      }
-    });
-    save.addClickHandler(new  ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        save.setEnabled(false);
-        save(serviceUser, input.getValue().trim());
-      }
-    });
-    input.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(KeyPressEvent event) {
-        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
-          save.setEnabled(false);
-          save(serviceUser, input.getValue().trim());
-        } else if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) {
-          cancel();
-        }
-      }
-    });
-    cancel.addClickHandler(new  ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        cancel();
-      }
-    });
+    edit.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            labelWidget.setVisible(false);
+            edit.setVisible(false);
+            input.setVisible(true);
+            input.setFocus(true);
+            save.setVisible(true);
+            if (warning != null) {
+              warning.setVisible(true);
+            }
+            cancel.setVisible(true);
+          }
+        });
+    save.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            save.setEnabled(false);
+            save(serviceUser, input.getValue().trim());
+          }
+        });
+    input.addKeyPressHandler(
+        new KeyPressHandler() {
+          @Override
+          public void onKeyPress(KeyPressEvent event) {
+            if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
+              save.setEnabled(false);
+              save(serviceUser, input.getValue().trim());
+            } else if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) {
+              cancel();
+            }
+          }
+        });
+    cancel.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            cancel();
+          }
+        });
 
     add(labelWidget);
     add(edit);
@@ -116,9 +120,9 @@
     edit.setVisible(true);
     input.setVisible(false);
     if (labelWidget instanceof Label) {
-      input.setValue(((Label)labelWidget).getText());
+      input.setValue(((Label) labelWidget).getText());
     } else {
-      input.setValue(((Anchor)labelWidget).getText());
+      input.setValue(((Anchor) labelWidget).getText());
     }
     save.setVisible(false);
     save.setEnabled(false);
@@ -139,9 +143,9 @@
 
   protected void updateValue(String newValue) {
     if (labelWidget instanceof Label) {
-      ((Label)labelWidget).setText(newValue);
+      ((Label) labelWidget).setText(newValue);
     } else {
-      ((Anchor)labelWidget).setText(newValue);
+      ((Anchor) labelWidget).setText(newValue);
     }
     labelWidget.setVisible(true);
     edit.setVisible(true);
@@ -157,7 +161,7 @@
 
   protected void updateHref(String newHref) {
     if (labelWidget instanceof Anchor) {
-      ((Anchor)labelWidget).setHref(newHref);
+      ((Anchor) labelWidget).setHref(newHref);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/GroupInfo.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/GroupInfo.java
index 67bf13c..b398092 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/GroupInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/GroupInfo.java
@@ -18,8 +18,8 @@
 
 public class GroupInfo extends JavaScriptObject {
   public final native String name() /*-{ return this.name; }-*/;
+
   public final native String url() /*-{ return this.url; }-*/;
 
-  protected GroupInfo() {
-  }
+  protected GroupInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/HttpPasswordInput.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/HttpPasswordInput.java
index 1a95251..5549597 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/HttpPasswordInput.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/HttpPasswordInput.java
@@ -23,6 +23,5 @@
     return createObject().cast();
   }
 
-  protected HttpPasswordInput() {
-  }
+  protected HttpPasswordInput() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/OnEditEnabler.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/OnEditEnabler.java
index 233ca30..815962c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/OnEditEnabler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/OnEditEnabler.java
@@ -34,22 +34,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 constructors must be the FocusWidget to enable,
   // subsequent parameters are widgets to listenTo.
 
@@ -73,7 +74,6 @@
     widget = w;
   }
 
-
   // Register input widgets to be listened to
 
   public void listenTo(final TextBoxBase tb) {
@@ -88,12 +88,13 @@
     // up to date with non-user updates of the text (calls to
     // setText()...) and also up to date with user changes which
     // occured after enabling "widget".
-    tb.addFocusHandler(new FocusHandler() {
-        @Override
-        public void onFocus(FocusEvent event) {
-          strings.put(tb, tb.getText().trim());
-        }
-      });
+    tb.addFocusHandler(
+        new FocusHandler() {
+          @Override
+          public void onFocus(FocusEvent event) {
+            strings.put(tb, tb.getText().trim());
+          }
+        });
 
     // CTRL-V Pastes in Chrome seem only detectable via BrowserEvents or
     // KeyDownEvents, the latter is better.
@@ -109,7 +110,6 @@
     cb.addValueChangeHandler((ValueChangeHandler) this);
   }
 
-
   // Handlers
 
   @Override
@@ -139,19 +139,21 @@
   }
 
   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(new ScheduledCommand() {
-          @Override
-          public void execute() {
-            if (box.getValue().trim().equals(originalValue)) {
-              widget.setEnabled(false);
-            }
-          }
-        });
+        Scheduler.get()
+            .scheduleDeferred(
+                new ScheduledCommand() {
+                  @Override
+                  public void execute() {
+                    if (box.getValue().trim().equals(originalValue)) {
+                      widget.setEnabled(false);
+                    }
+                  }
+                });
       }
       return;
     }
@@ -168,17 +170,19 @@
 
   private void onTextBoxBase(final TextBoxBase tb) {
     // The text appears to not get updated until the handlers complete.
-    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
-      @Override
-      public void execute() {
-        String orig = strings.get(tb);
-        if (orig == null) {
-          orig = "";
-        }
-        if (! orig.equals(tb.getText().trim())) {
-          widget.setEnabled(true);
-        }
-      }
-    });
+    Scheduler.get()
+        .scheduleDeferred(
+            new ScheduledCommand() {
+              @Override
+              public void execute() {
+                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/serviceuser/client/ServiceUserInfo.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserInfo.java
index b412e95..f5c5bdf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserInfo.java
@@ -30,14 +30,20 @@
   }
 
   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; }-*/;
+
   public final native AccountInfo created_by() /*-{ return this.created_by; }-*/;
+
   public final native String created_at() /*-{ return this.created_at; }-*/;
+
   public final native boolean active() /*-{ return this.inactive ? false : true; }-*/;
+
   public final native GroupInfo owner() /*-{ return this.owner; }-*/;
 
-  protected ServiceUserInfo() {
-  }
+  protected ServiceUserInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserListScreen.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserListScreen.java
index aae6a29..5c30bea 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserListScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserListScreen.java
@@ -37,19 +37,23 @@
   ServiceUserListScreen() {
     setStyleName("serviceuser-panel");
 
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "serviceusers")
-        .get(NativeMap.copyKeysIntoChildren("username",
-            new AsyncCallback<NativeMap<ServiceUserInfo>>() {
-              @Override
-              public void onSuccess(NativeMap<ServiceUserInfo> info) {
-                display(info);
-              }
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "serviceusers")
+        .get(
+            NativeMap.copyKeysIntoChildren(
+                "username",
+                new AsyncCallback<NativeMap<ServiceUserInfo>>() {
+                  @Override
+                  public void onSuccess(NativeMap<ServiceUserInfo> info) {
+                    display(info);
+                  }
 
-              @Override
-              public void onFailure(Throwable caught) {
-                // never invoked
-              }
-            }));
+                  @Override
+                  public void onFailure(Throwable caught) {
+                    // never invoked
+                  }
+                }));
   }
 
   private void display(NativeMap<ServiceUserInfo> info) {
@@ -80,15 +84,16 @@
         fmt.addStyleName(row, 0, "leftMostCell");
       }
 
-      t.setWidget(row, 0, new InlineHyperlink(
-          username, "/x/" + Plugin.get().getName() + "/user/" + username));
+      t.setWidget(
+          row,
+          0,
+          new InlineHyperlink(username, "/x/" + Plugin.get().getName() + "/user/" + username));
       t.setText(row, 1, a.name());
       t.setText(row, 2, a.email());
 
       if (a.owner() != null) {
         if (a.owner().url() != null) {
-          t.setWidget(row, 3,
-              new Anchor(a.owner().name(), a.owner().url()));
+          t.setWidget(row, 3, new Anchor(a.owner().name(), a.owner().url()));
         } else {
           t.setText(row, 3, a.owner().name());
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserScreen.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserScreen.java
index bece2c3..f76d272 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserScreen.java
@@ -46,73 +46,64 @@
   ServiceUserScreen(final String serviceUser) {
     setStyleName("serviceuser-panel");
 
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "serviceusers")
-        .id(serviceUser).get(new AsyncCallback<ServiceUserInfo>() {
-            @Override
-            public void onSuccess(final ServiceUserInfo serviceUserInfo) {
-              new RestApi("config").id("server").view(Plugin.get().getPluginName(), "serviceusers")
-                  .id(serviceUser).view("password.http").get(new AsyncCallback<NativeString>() {
-                      @Override
-                      public void onSuccess(final NativeString httpPassword) {
-                        new RestApi("config").id("server")
-                            .view(Plugin.get().getPluginName(), "config")
-                            .get(new AsyncCallback<ConfigInfo>() {
-                              @Override
-                              public void onSuccess(final ConfigInfo configInfo) {
-                                AccountCapabilities.all(new AsyncCallback<AccountCapabilities>() {
-                                  @Override
-                                  public void onSuccess(AccountCapabilities ac) {
-                                    boolean isAdmin = ac.canPerform("administrateServer");
-                                    display(serviceUserInfo,
-                                        httpPassword.asString(),
-                                        configInfo.getAllowEmail() || isAdmin,
-                                        configInfo.getAllowOwner() || isAdmin,
-                                        configInfo.getAllowHttpPassword() || isAdmin);
-                                  }
-
-                                  @Override
-                                  public void onFailure(Throwable caught) {
-                                    // never invoked
-                                  }
-                                }, "administrateServer");
-                              }
-
-                              @Override
-                              public void onFailure(Throwable caught) {
-                                // never invoked
-                              }
-                            });
-                      }
-
-                      @Override
-                      public void onFailure(Throwable caught) {
-                        // never invoked
-                      }
-                });
-            }
-
-            @Override
-            public void onFailure(Throwable caught) {
-              // never invoked
-            }
-          });
-  }
-
-  private void display(ServiceUserInfo info, String httpPassword,
-      boolean allowEmail, boolean allowOwner, boolean allowHttpPassword) {
-    MyTable t = new MyTable();
-    t.setStyleName("serviceuser-serviceUserInfoTable");
-    t.addRow("Account State", createActiveToggle(info));
-    t.addRow("Username", info.username());
-    t.addRow("Full Name", new EditableValue(info.username(), info.name()) {
-      @Override
-      protected void save(String serviceUser, final String newValue) {
-        new RestApi("config").id("server")
-            .view(Plugin.get().getPluginName(), "serviceusers").id(serviceUser)
-            .view("name").put(newValue, new AsyncCallback<NativeString>() {
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "serviceusers")
+        .id(serviceUser)
+        .get(
+            new AsyncCallback<ServiceUserInfo>() {
               @Override
-              public void onSuccess(NativeString result) {
-                updateValue(newValue);
+              public void onSuccess(final ServiceUserInfo serviceUserInfo) {
+                new RestApi("config")
+                    .id("server")
+                    .view(Plugin.get().getPluginName(), "serviceusers")
+                    .id(serviceUser)
+                    .view("password.http")
+                    .get(
+                        new AsyncCallback<NativeString>() {
+                          @Override
+                          public void onSuccess(final NativeString httpPassword) {
+                            new RestApi("config")
+                                .id("server")
+                                .view(Plugin.get().getPluginName(), "config")
+                                .get(
+                                    new AsyncCallback<ConfigInfo>() {
+                                      @Override
+                                      public void onSuccess(final ConfigInfo configInfo) {
+                                        AccountCapabilities.all(
+                                            new AsyncCallback<AccountCapabilities>() {
+                                              @Override
+                                              public void onSuccess(AccountCapabilities ac) {
+                                                boolean isAdmin =
+                                                    ac.canPerform("administrateServer");
+                                                display(
+                                                    serviceUserInfo,
+                                                    httpPassword.asString(),
+                                                    configInfo.getAllowEmail() || isAdmin,
+                                                    configInfo.getAllowOwner() || isAdmin,
+                                                    configInfo.getAllowHttpPassword() || isAdmin);
+                                              }
+
+                                              @Override
+                                              public void onFailure(Throwable caught) {
+                                                // never invoked
+                                              }
+                                            },
+                                            "administrateServer");
+                                      }
+
+                                      @Override
+                                      public void onFailure(Throwable caught) {
+                                        // never invoked
+                                      }
+                                    });
+                          }
+
+                          @Override
+                          public void onFailure(Throwable caught) {
+                            // never invoked
+                          }
+                        });
               }
 
               @Override
@@ -120,34 +111,75 @@
                 // never invoked
               }
             });
-      }
-    });
-    if (allowEmail) {
-      t.addRow("Email Address", new EditableValue(info.username(), info.email()) {
-        @Override
-        protected void save(String serviceUser, final String newValue) {
-          new RestApi("config").id("server")
-              .view(Plugin.get().getPluginName(), "serviceusers").id(serviceUser)
-              .view("email").put(newValue, new AsyncCallback<NativeString>() {
-                @Override
-                public void onSuccess(NativeString result) {
-                  updateValue(newValue);
-                }
+  }
 
-                @Override
-                public void onFailure(Throwable caught) {
-                  // never invoked
-                }
-              });
-        }
-      });
+  private void display(
+      ServiceUserInfo info,
+      String httpPassword,
+      boolean allowEmail,
+      boolean allowOwner,
+      boolean allowHttpPassword) {
+    MyTable t = new MyTable();
+    t.setStyleName("serviceuser-serviceUserInfoTable");
+    t.addRow("Account State", createActiveToggle(info));
+    t.addRow("Username", info.username());
+    t.addRow(
+        "Full Name",
+        new EditableValue(info.username(), info.name()) {
+          @Override
+          protected void save(String serviceUser, final String newValue) {
+            new RestApi("config")
+                .id("server")
+                .view(Plugin.get().getPluginName(), "serviceusers")
+                .id(serviceUser)
+                .view("name")
+                .put(
+                    newValue,
+                    new AsyncCallback<NativeString>() {
+                      @Override
+                      public void onSuccess(NativeString result) {
+                        updateValue(newValue);
+                      }
+
+                      @Override
+                      public void onFailure(Throwable caught) {
+                        // never invoked
+                      }
+                    });
+          }
+        });
+    if (allowEmail) {
+      t.addRow(
+          "Email Address",
+          new EditableValue(info.username(), info.email()) {
+            @Override
+            protected void save(String serviceUser, final String newValue) {
+              new RestApi("config")
+                  .id("server")
+                  .view(Plugin.get().getPluginName(), "serviceusers")
+                  .id(serviceUser)
+                  .view("email")
+                  .put(
+                      newValue,
+                      new AsyncCallback<NativeString>() {
+                        @Override
+                        public void onSuccess(NativeString result) {
+                          updateValue(newValue);
+                        }
+
+                        @Override
+                        public void onFailure(Throwable caught) {
+                          // never invoked
+                        }
+                      });
+            }
+          });
     } else {
       t.addRow("Email Address", info.email());
     }
     t.addRow(
         "HTTP Password",
-        createHttpPasswordWidget(info.username(), httpPassword,
-            allowHttpPassword));
+        createHttpPasswordWidget(info.username(), httpPassword, allowHttpPassword));
     t.addRow("Owner Group", createOwnerWidget(info, allowOwner));
     t.addRow("Created By", info.getDisplayName());
     t.addRow("Created At", info.created_at());
@@ -167,46 +199,51 @@
     activeToggle.setValue(info.active());
     activeToggle.setVisible(true);
 
-    activeToggle.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
-      @Override
-      public void onValueChange(ValueChangeEvent<Boolean> event) {
-        if (event.getValue()) {
-          new RestApi("config").id("server")
-              .view(Plugin.get().getPluginName(), "serviceusers")
-              .id(info.username()).view("active")
-              .put(new AsyncCallback<NoContent>() {
-                @Override
-                public void onSuccess(NoContent result) {
-                }
+    activeToggle.addValueChangeHandler(
+        new ValueChangeHandler<Boolean>() {
+          @Override
+          public void onValueChange(ValueChangeEvent<Boolean> event) {
+            if (event.getValue()) {
+              new RestApi("config")
+                  .id("server")
+                  .view(Plugin.get().getPluginName(), "serviceusers")
+                  .id(info.username())
+                  .view("active")
+                  .put(
+                      new AsyncCallback<NoContent>() {
+                        @Override
+                        public void onSuccess(NoContent result) {}
 
-                @Override
-                public void onFailure(Throwable caught) {
-                  // never invoked
-                }
-              });
-        } else {
-          new RestApi("config").id("server")
-              .view(Plugin.get().getPluginName(), "serviceusers")
-              .id(info.username()).view("active")
-              .delete(new AsyncCallback<NoContent>() {
-                @Override
-                public void onSuccess(NoContent result) {
-                }
+                        @Override
+                        public void onFailure(Throwable caught) {
+                          // never invoked
+                        }
+                      });
+            } else {
+              new RestApi("config")
+                  .id("server")
+                  .view(Plugin.get().getPluginName(), "serviceusers")
+                  .id(info.username())
+                  .view("active")
+                  .delete(
+                      new AsyncCallback<NoContent>() {
+                        @Override
+                        public void onSuccess(NoContent result) {}
 
-                @Override
-                public void onFailure(Throwable caught) {
-                  // never invoked
-                }
-              });
-        }
-      }
-    });
+                        @Override
+                        public void onFailure(Throwable caught) {
+                          // never invoked
+                        }
+                      });
+            }
+          }
+        });
 
     return activeToggle;
   }
 
-  private Widget createHttpPasswordWidget(final String serviceUser,
-      String httpPassword, boolean allowHttpPassword) {
+  private Widget createHttpPasswordWidget(
+      final String serviceUser, String httpPassword, boolean allowHttpPassword) {
     if (allowHttpPassword) {
       HorizontalPanel p = new HorizontalPanel();
       final CopyableLabel label = new CopyableLabel(httpPassword);
@@ -218,52 +255,65 @@
       final Image delete = new Image(ServiceUserPlugin.RESOURCES.redNot());
       delete.addStyleName("serviceuser-deleteButton");
       delete.setTitle("Clear HTTP password");
-      delete.addClickHandler(new  ClickHandler() {
-        @Override
-        public void onClick(ClickEvent event) {
-          new RestApi("config").id("server").view(Plugin.get().getPluginName(), "serviceusers")
-              .id(serviceUser).view("password.http").delete(new AsyncCallback<NoContent>() {
-                  @Override
-                  public void onSuccess(NoContent noContent) {
-                    label.setText("");
-                    label.setVisible(false);
-                    delete.setVisible(false);
-                  }
+      delete.addClickHandler(
+          new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+              new RestApi("config")
+                  .id("server")
+                  .view(Plugin.get().getPluginName(), "serviceusers")
+                  .id(serviceUser)
+                  .view("password.http")
+                  .delete(
+                      new AsyncCallback<NoContent>() {
+                        @Override
+                        public void onSuccess(NoContent noContent) {
+                          label.setText("");
+                          label.setVisible(false);
+                          delete.setVisible(false);
+                        }
 
-                  @Override
-                  public void onFailure(Throwable caught) {
-                    // never invoked
-                  }
-              });
-        }
-      });
+                        @Override
+                        public void onFailure(Throwable caught) {
+                          // never invoked
+                        }
+                      });
+            }
+          });
       delete.setVisible(!httpPassword.isEmpty());
       p.add(delete);
 
       Image generate = new Image(ServiceUserPlugin.RESOURCES.gear());
       generate.addStyleName("serviceuser-generateButton");
       generate.setTitle("Generate new HTTP password");
-      generate.addClickHandler(new  ClickHandler() {
-        @Override
-        public void onClick(ClickEvent event) {
-          HttpPasswordInput in = HttpPasswordInput.create();
-          in.generate(true);
-          new RestApi("config").id("server").view(Plugin.get().getPluginName(), "serviceusers")
-              .id(serviceUser).view("password.http").put(in, new AsyncCallback<NativeString>() {
-                  @Override
-                  public void onSuccess(NativeString newPassword) {
-                    label.setText(newPassword.asString());
-                    label.setVisible(true);
-                    delete.setVisible(true);
-                  }
+      generate.addClickHandler(
+          new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+              HttpPasswordInput in = HttpPasswordInput.create();
+              in.generate(true);
+              new RestApi("config")
+                  .id("server")
+                  .view(Plugin.get().getPluginName(), "serviceusers")
+                  .id(serviceUser)
+                  .view("password.http")
+                  .put(
+                      in,
+                      new AsyncCallback<NativeString>() {
+                        @Override
+                        public void onSuccess(NativeString newPassword) {
+                          label.setText(newPassword.asString());
+                          label.setVisible(true);
+                          delete.setVisible(true);
+                        }
 
-                  @Override
-                  public void onFailure(Throwable caught) {
-                    // never invoked
-                  }
-              });
-        }
-      });
+                        @Override
+                        public void onFailure(Throwable caught) {
+                          // never invoked
+                        }
+                      });
+            }
+          });
       p.add(generate);
       return p;
     } else {
@@ -273,45 +323,52 @@
 
   private Widget createOwnerWidget(ServiceUserInfo info, boolean allowOwner) {
     if (allowOwner) {
-      EditableValue ownerWidget = new EditableValue(info.username(),
-          info.owner() != null ? info.owner().name() : "",
-          info.owner() != null ? info.owner().url() : null) {
-        @Override
-        protected void save(String serviceUser, final String newValue) {
-          new RestApi("config").id("server")
-              .view(Plugin.get().getPluginName(), "serviceusers").id(serviceUser)
-              .view("owner").put(newValue, new AsyncCallback<GroupInfo>() {
-                @Override
-                public void onSuccess(GroupInfo result) {
-                  updateValue(result != null ? result.name() : "");
-                  updateHref(result != null ? result.url() : "");
-                  Plugin.get().refresh();
-                }
+      EditableValue ownerWidget =
+          new EditableValue(
+              info.username(),
+              info.owner() != null ? info.owner().name() : "",
+              info.owner() != null ? info.owner().url() : null) {
+            @Override
+            protected void save(String serviceUser, final String newValue) {
+              new RestApi("config")
+                  .id("server")
+                  .view(Plugin.get().getPluginName(), "serviceusers")
+                  .id(serviceUser)
+                  .view("owner")
+                  .put(
+                      newValue,
+                      new AsyncCallback<GroupInfo>() {
+                        @Override
+                        public void onSuccess(GroupInfo result) {
+                          updateValue(result != null ? result.name() : "");
+                          updateHref(result != null ? result.url() : "");
+                          Plugin.get().refresh();
+                        }
 
-                @Override
-                public void onFailure(Throwable caught) {
-                  // never invoked
-                }
-              });
-        }
-      };
+                        @Override
+                        public void onFailure(Throwable caught) {
+                          // never invoked
+                        }
+                      });
+            }
+          };
       StringBuilder ownerWarning = new StringBuilder();
       ownerWarning.append("If ");
-      ownerWarning.append(info.owner() != null
-          ? "the owner group is changed"
-          : "an owner group is set");
+      ownerWarning.append(
+          info.owner() != null ? "the owner group is changed" : "an owner group is set");
       ownerWarning.append(" only members of the ");
       ownerWarning.append(info.owner() != null ? "new " : "");
-      ownerWarning.append("owner group can see and administrate"
-          + " the service user.");
+      ownerWarning.append("owner group can see and administrate" + " the service user.");
       if (info.owner() != null) {
-        ownerWarning.append(" If the owner group is removed only the"
-            + " creator of the service user can see and administrate"
-            + " the service user.");
+        ownerWarning.append(
+            " If the owner group is removed only the"
+                + " creator of the service user can see and administrate"
+                + " the service user.");
       } else {
-        ownerWarning.append(" The creator of the service user can no"
-            + " longer see and administrate the service user if she/he"
-            + " is not member of the owner group.");
+        ownerWarning.append(
+            " The creator of the service user can no"
+                + " longer see and administrate the service user if she/he"
+                + " is not member of the owner group.");
       }
       ownerWidget.setWarning(ownerWarning.toString());
       return ownerWidget;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserSettingsScreen.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserSettingsScreen.java
index ccd5fb3..1755cda 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserSettingsScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/ServiceUserSettingsScreen.java
@@ -57,18 +57,21 @@
   ServiceUserSettingsScreen() {
     setStyleName("serviceuser-panel");
 
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "config")
-        .get(new AsyncCallback<ConfigInfo>() {
-          @Override
-          public void onSuccess(ConfigInfo info) {
-            display(info);
-          }
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "config")
+        .get(
+            new AsyncCallback<ConfigInfo>() {
+              @Override
+              public void onSuccess(ConfigInfo info) {
+                display(info);
+              }
 
-          @Override
-          public void onFailure(Throwable caught) {
-            // never invoked
-          }
-        });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 
   private void display(ConfigInfo info) {
@@ -76,19 +79,21 @@
     Panel infoMsgTitelPanel = new HorizontalPanel();
     infoMsgTitelPanel.add(new Label("Info Message"));
     Image infoMsgInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    infoMsgInfo.setTitle("HTML formatted message that should be"
-        + " displayed on the service user creation screen.");
+    infoMsgInfo.setTitle(
+        "HTML formatted message that should be"
+            + " displayed on the service user creation screen.");
     infoMsgTitelPanel.add(infoMsgInfo);
     infoMsgTitelPanel.add(new Label(":"));
     infoMsgPanel.add(infoMsgTitelPanel);
     infoMsgTxt = new TextArea();
     infoMsgTxt.setValue(info.getInfoMessage());
-    infoMsgTxt.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(final KeyPressEvent event) {
-        event.stopPropagation();
-      }
-    });
+    infoMsgTxt.addKeyPressHandler(
+        new KeyPressHandler() {
+          @Override
+          public void onKeyPress(final KeyPressEvent event) {
+            event.stopPropagation();
+          }
+        });
     infoMsgTxt.setVisibleLines(12);
     infoMsgTxt.setCharacterWidth(80);
     infoMsgTxt.getElement().setPropertyBoolean("spellcheck", false);
@@ -99,19 +104,21 @@
     Panel onSuccessMsgTitelPanel = new HorizontalPanel();
     onSuccessMsgTitelPanel.add(new Label("On Success Message"));
     Image onSuccessMsgInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    onSuccessMsgInfo.setTitle("HTML formatted message that should be"
-        + " displayed after a service user was successfully created.");
+    onSuccessMsgInfo.setTitle(
+        "HTML formatted message that should be"
+            + " displayed after a service user was successfully created.");
     onSuccessMsgTitelPanel.add(onSuccessMsgInfo);
     onSuccessMsgTitelPanel.add(new Label(":"));
     onSuccessMsgPanel.add(onSuccessMsgTitelPanel);
     onSuccessMsgTxt = new TextArea();
     onSuccessMsgTxt.setValue(info.getOnSuccessMessage());
-    onSuccessMsgTxt.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(final KeyPressEvent event) {
-        event.stopPropagation();
-      }
-    });
+    onSuccessMsgTxt.addKeyPressHandler(
+        new KeyPressHandler() {
+          @Override
+          public void onKeyPress(final KeyPressEvent event) {
+            event.stopPropagation();
+          }
+        });
     onSuccessMsgTxt.setVisibleLines(12);
     onSuccessMsgTxt.setCharacterWidth(80);
     onSuccessMsgTxt.getElement().setPropertyBoolean("spellcheck", false);
@@ -123,9 +130,10 @@
     allowEmailCheckBox.setValue(info.getAllowEmail());
     allowEmailPanel.add(allowEmailCheckBox);
     Image allowEmailInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    allowEmailInfo.setTitle("Whether it is allowed to provide an email address "
-        + "for a service user. E.g. having an email address allows a service user "
-        + "to push commits and tags.");
+    allowEmailInfo.setTitle(
+        "Whether it is allowed to provide an email address "
+            + "for a service user. E.g. having an email address allows a service user "
+            + "to push commits and tags.");
     allowEmailPanel.add(allowEmailInfo);
     add(allowEmailPanel);
 
@@ -134,9 +142,10 @@
     allowHttpPasswordCheckBox.setValue(info.getAllowHttpPassword());
     allowHttpPasswordPanel.add(allowHttpPasswordCheckBox);
     Image allowHttpPasswordInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    allowHttpPasswordInfo.setTitle("Whether it is allowed to generate an HTTP password "
-        + "for a service user. E.g. having an HTTP password allows a service user "
-        + "to use the Gerrit REST API.");
+    allowHttpPasswordInfo.setTitle(
+        "Whether it is allowed to generate an HTTP password "
+            + "for a service user. E.g. having an HTTP password allows a service user "
+            + "to use the Gerrit REST API.");
     allowHttpPasswordPanel.add(allowHttpPasswordInfo);
     add(allowHttpPasswordPanel);
 
@@ -145,8 +154,7 @@
     allowOwnerCheckBox.setValue(info.getAllowOwner());
     allowOwnerPanel.add(allowOwnerCheckBox);
     Image allowOwnerInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    allowOwnerInfo.setTitle("Whether it is allowed to set an owner group "
-        + "for a service user.");
+    allowOwnerInfo.setTitle("Whether it is allowed to set an owner group " + "for a service user.");
     allowOwnerPanel.add(allowOwnerInfo);
     add(allowOwnerPanel);
 
@@ -155,12 +163,13 @@
     createNotesCheckBox.setValue(info.getCreateNotes());
     createNotesPanel.add(createNotesCheckBox);
     Image createNotesInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    createNotesInfo.setTitle("Whether commits of a service user should be "
-        + "annotated by a Git note that contains information about the current "
-        + "owners of the service user. This allows to find a real person that "
-        + "is responsible for this commit. To get such a Git note for each commit "
-        + "of a service user the 'Forge Committer' access right must be blocked "
-        + "for service users.");
+    createNotesInfo.setTitle(
+        "Whether commits of a service user should be "
+            + "annotated by a Git note that contains information about the current "
+            + "owners of the service user. This allows to find a real person that "
+            + "is responsible for this commit. To get such a Git note for each commit "
+            + "of a service user the 'Forge Committer' access right must be blocked "
+            + "for service users.");
     createNotesPanel.add(createNotesInfo);
     add(createNotesPanel);
 
@@ -170,40 +179,42 @@
     createNotesAsyncCheckBox.setEnabled(info.getCreateNotes());
     createNotesAsyncPanel.add(createNotesAsyncCheckBox);
     Image createNotesAsyncInfo = new Image(ServiceUserPlugin.RESOURCES.info());
-    createNotesAsyncInfo.setTitle("Whether the Git notes on commits that are "
-        + "pushed by a service user should be created asynchronously.");
+    createNotesAsyncInfo.setTitle(
+        "Whether the Git notes on commits that are "
+            + "pushed by a service user should be created asynchronously.");
     createNotesAsyncPanel.add(createNotesAsyncInfo);
     add(createNotesAsyncPanel);
 
-    createNotesCheckBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
-      @Override
-      public void onValueChange(ValueChangeEvent<Boolean> event) {
-        createNotesAsyncCheckBox.setEnabled(event.getValue());
-      }
-    });
+    createNotesCheckBox.addValueChangeHandler(
+        new ValueChangeHandler<Boolean>() {
+          @Override
+          public void onValueChange(ValueChangeEvent<Boolean> event) {
+            createNotesAsyncCheckBox.setEnabled(event.getValue());
+          }
+        });
 
     saveButton = new Button("Save");
     saveButton.addStyleName("serviceuser-saveButton");
-    saveButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        doSave();
-      }
-    });
+    saveButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            doSave();
+          }
+        });
 
     blockedUsernamesPanel =
-        new StringListPanel("Blocked Usernames", "Username",
-            info.getBlockedNames(), saveButton);
-    blockedUsernamesPanel.setInfo("List of usernames which are "
-        + "forbidden to be used as name for a service user. "
-        + "The blocked usernames are case insensitive.");
+        new StringListPanel("Blocked Usernames", "Username", info.getBlockedNames(), saveButton);
+    blockedUsernamesPanel.setInfo(
+        "List of usernames which are "
+            + "forbidden to be used as name for a service user. "
+            + "The blocked usernames are case insensitive.");
     add(blockedUsernamesPanel);
 
     groupsPanel =
-        new StringListPanel("Groups", "Group Name",
-            info.getGroups().keySet(), saveButton);
-    groupsPanel.setInfo("Names of groups to which newly created "
-        + "service users should be added automatically.");
+        new StringListPanel("Groups", "Group Name", info.getGroups().keySet(), saveButton);
+    groupsPanel.setInfo(
+        "Names of groups to which newly created " + "service users should be added automatically.");
     add(groupsPanel);
 
     HorizontalPanel buttons = new HorizontalPanel();
@@ -236,18 +247,22 @@
     }
     in.setBlockedNames(blockedUsernamesPanel.getValues());
     in.setGroups(groupsPanel.getValues());
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(), "config")
-        .put(in, new AsyncCallback<JavaScriptObject>() {
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "config")
+        .put(
+            in,
+            new AsyncCallback<JavaScriptObject>() {
 
-          @Override
-          public void onSuccess(JavaScriptObject result) {
-            saveButton.setEnabled(false);
-          }
+              @Override
+              public void onSuccess(JavaScriptObject result) {
+                saveButton.setEnabled(false);
+              }
 
-          @Override
-          public void onFailure(Throwable caught) {
-            // never invoked
-          }
-        });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyHelpPanel.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyHelpPanel.java
index 134b110..9845b23 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyHelpPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyHelpPanel.java
@@ -26,20 +26,22 @@
     b.append("<ol>")
         .append("<li>From the Terminal or Git Bash, run <em>ssh-keygen</em></li>")
         .append("<li>")
-            .append("Enter a path for the key, e.g. <em>id_rsa</em>. If you are generating the key<br />")
-            .append("on your local system take care to not overwrite your own SSH key.")
+        .append(
+            "Enter a path for the key, e.g. <em>id_rsa</em>. If you are generating the key<br />")
+        .append("on your local system take care to not overwrite your own SSH key.")
         .append("</li>")
         .append("<li>")
-            .append("Enter a passphrase only if the service where you intend to use this<br />")
-            .append("service user is able to deal with passphrases, otherwise leave it blank.<br />")
-            .append("Remember this passphrase, as you will need it to unlock the key.")
+        .append("Enter a passphrase only if the service where you intend to use this<br />")
+        .append("service user is able to deal with passphrases, otherwise leave it blank.<br />")
+        .append("Remember this passphrase, as you will need it to unlock the key.")
         .append("</li>")
         .append("<li>")
-            .append("Open <em>id_rsa.pub</em> and copy &amp; paste the contents into the box below.<br />")
-            .append("Note that <em>id_rsa.pub</em> is your public key and can be shared,<br />")
-            .append("while <em>id_rsa</em> is your private key and should be kept secret.")
+        .append(
+            "Open <em>id_rsa.pub</em> and copy &amp; paste the contents into the box below.<br />")
+        .append("Note that <em>id_rsa.pub</em> is your public key and can be shared,<br />")
+        .append("while <em>id_rsa</em> is your private key and should be kept secret.")
         .append("</li>")
-     .append("</ol>");
+        .append("</ol>");
     dp.add(new HTML(b.toString()));
     add(dp);
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyInfo.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyInfo.java
index 238e548..52a7044 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshKeyInfo.java
@@ -18,12 +18,16 @@
 
 public class SshKeyInfo extends JavaScriptObject {
   public final native int seq() /*-{ return this.seq || 0; }-*/;
+
   public final native String sshPublicKey() /*-{ return this.ssh_public_key; }-*/;
+
   public final native String encodedKey() /*-{ return this.encoded_key; }-*/;
+
   public final native String algorithm() /*-{ return this.algorithm; }-*/;
+
   public final native String comment() /*-{ return this.comment; }-*/;
+
   public final native boolean isValid() /*-{ return this['valid'] ? true : false; }-*/;
 
-  protected SshKeyInfo() {
-  }
+  protected SshKeyInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshPanel.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshPanel.java
index 7764554..10acc65 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/SshPanel.java
@@ -36,7 +36,6 @@
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwtexpui.clippy.client.CopyableLabel;
 import com.google.gwtexpui.globalkey.client.NpTextArea;
-
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -66,12 +65,13 @@
     FlowPanel body = new FlowPanel();
 
     showAddKeyBlock = new Button("Add Key ...");
-    showAddKeyBlock.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        showAddKeyBlock(true);
-      }
-    });
+    showAddKeyBlock.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            showAddKeyBlock(true);
+          }
+        });
 
     keys = new SshKeyTable();
     body.add(keys);
@@ -79,12 +79,13 @@
       final FlowPanel fp = new FlowPanel();
       deleteKey = new Button("Delete");
       deleteKey.setEnabled(false);
-      deleteKey.addClickHandler(new ClickHandler() {
-        @Override
-        public void onClick(final ClickEvent event) {
-          keys.deleteChecked();
-        }
-      });
+      deleteKey.addClickHandler(
+          new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent event) {
+              keys.deleteChecked();
+            }
+          });
       fp.add(deleteKey);
       fp.add(showAddKeyBlock);
       body.add(fp);
@@ -106,35 +107,37 @@
     addKeyBlock.add(buttons);
 
     clearNew = new Button("Clear");
-    clearNew.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        addTxt.setText("");
-        addTxt.setFocus(true);
-      }
-    });
+    clearNew.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            addTxt.setText("");
+            addTxt.setFocus(true);
+          }
+        });
     buttons.add(clearNew);
 
     addNew = new Button("Add");
-    addNew.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        doAddNew();
-      }
-    });
+    addNew.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            doAddNew();
+          }
+        });
     buttons.add(addNew);
 
     closeAddKeyBlock = new Button("Close");
-    closeAddKeyBlock.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        showAddKeyBlock(false);
-      }
-    });
+    closeAddKeyBlock.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            showAddKeyBlock(false);
+          }
+        });
     buttons.add(closeAddKeyBlock);
     buttons.setCellWidth(closeAddKeyBlock, "100%");
-    buttons.setCellHorizontalAlignment(closeAddKeyBlock,
-        HasHorizontalAlignment.ALIGN_RIGHT);
+    buttons.setCellHorizontalAlignment(closeAddKeyBlock, HasHorizontalAlignment.ALIGN_RIGHT);
 
     body.add(addKeyBlock);
 
@@ -153,25 +156,30 @@
   void doAddNew() {
     final String txt = addTxt.getText();
     if (txt != null && txt.length() > 0) {
-      new RestApi("config").id("server")
-          .view(Plugin.get().getPluginName(), "serviceusers").id(serviceUser)
-          .view("sshkeys").post(txt, new AsyncCallback<SshKeyInfo>() {
-        @Override
-        public void onSuccess(SshKeyInfo k) {
-          addTxt.setText("");
-          keys.addOneKey(k);
-          if (!keys.isVisible()) {
-            showAddKeyBlock(false);
-            setKeyTableVisible(true);
-            keys.updateDeleteButton();
-          }
-        }
+      new RestApi("config")
+          .id("server")
+          .view(Plugin.get().getPluginName(), "serviceusers")
+          .id(serviceUser)
+          .view("sshkeys")
+          .post(
+              txt,
+              new AsyncCallback<SshKeyInfo>() {
+                @Override
+                public void onSuccess(SshKeyInfo k) {
+                  addTxt.setText("");
+                  keys.addOneKey(k);
+                  if (!keys.isVisible()) {
+                    showAddKeyBlock(false);
+                    setKeyTableVisible(true);
+                    keys.updateDeleteButton();
+                  }
+                }
 
-        @Override
-        public void onFailure(final Throwable caught) {
-          // never invoked
-        }
-      });
+                @Override
+                public void onFailure(final Throwable caught) {
+                  // never invoked
+                }
+              });
     }
   }
 
@@ -182,29 +190,32 @@
   }
 
   private void refreshSshKeys() {
-    new RestApi("config").id("server")
-        .view(Plugin.get().getPluginName(), "serviceusers").id(serviceUser)
-        .view("sshkeys").get(new AsyncCallback<JsArray<SshKeyInfo>>() {
-      @Override
-      public void onSuccess(JsArray<SshKeyInfo> result) {
-        keys.display(Natives.asList(result));
-        if (result.length() == 0 && keys.isVisible()) {
-          showAddKeyBlock(true);
-        }
-        if (++loadCount == 2) {
-          display();
-        }
-      }
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "serviceusers")
+        .id(serviceUser)
+        .view("sshkeys")
+        .get(
+            new AsyncCallback<JsArray<SshKeyInfo>>() {
+              @Override
+              public void onSuccess(JsArray<SshKeyInfo> result) {
+                keys.display(Natives.asList(result));
+                if (result.length() == 0 && keys.isVisible()) {
+                  showAddKeyBlock(true);
+                }
+                if (++loadCount == 2) {
+                  display();
+                }
+              }
 
-      @Override
-      public void onFailure(Throwable caught) {
-        // never invoked
-      }
-    });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 
-  void display() {
-  }
+  void display() {}
 
   private void showAddKeyBlock(boolean show) {
     showAddKeyBlock.setVisible(!show);
@@ -237,12 +248,13 @@
       fmt.addStyleName(0, 4, "topMostCell");
       fmt.addStyleName(0, 5, "topMostCell");
 
-      updateDeleteHandler = new ValueChangeHandler<Boolean>() {
-        @Override
-        public void onValueChange(ValueChangeEvent<Boolean> event) {
-          updateDeleteButton();
-        }
-      };
+      updateDeleteHandler =
+          new ValueChangeHandler<Boolean>() {
+            @Override
+            public void onValueChange(ValueChangeEvent<Boolean> event) {
+              updateDeleteButton();
+            }
+          };
     }
 
     void deleteChecked() {
@@ -257,31 +269,36 @@
         updateDeleteButton();
       } else {
         for (int seq : sequenceNumbers) {
-          new RestApi("config").id("server")
-              .view(Plugin.get().getPluginName(), "serviceusers").id(serviceUser)
-              .view("sshkeys").id(seq).delete(new AsyncCallback<NoContent>() {
-                @Override
-                public void onSuccess(NoContent result) {
-                  for (int row = 1; row < getRowCount();) {
-                    SshKeyInfo k = getRowItem(row);
-                    if (k != null && sequenceNumbers.contains(k.seq())) {
-                      removeRow(row);
-                    } else {
-                      row++;
+          new RestApi("config")
+              .id("server")
+              .view(Plugin.get().getPluginName(), "serviceusers")
+              .id(serviceUser)
+              .view("sshkeys")
+              .id(seq)
+              .delete(
+                  new AsyncCallback<NoContent>() {
+                    @Override
+                    public void onSuccess(NoContent result) {
+                      for (int row = 1; row < getRowCount(); ) {
+                        SshKeyInfo k = getRowItem(row);
+                        if (k != null && sequenceNumbers.contains(k.seq())) {
+                          removeRow(row);
+                        } else {
+                          row++;
+                        }
+                      }
+                      if (getRowCount() == 1) {
+                        display(Collections.<SshKeyInfo>emptyList());
+                      } else {
+                        updateDeleteButton();
+                      }
                     }
-                  }
-                  if (getRowCount() == 1) {
-                    display(Collections.<SshKeyInfo> emptyList());
-                  } else {
-                    updateDeleteButton();
-                  }
-                }
 
-                @Override
-                public void onFailure(Throwable caught) {
-                  // never invoked
-                }
-              });
+                    @Override
+                    public void onFailure(Throwable caught) {
+                      // never invoked
+                    }
+                  });
         }
       }
     }
@@ -291,8 +308,7 @@
         setKeyTableVisible(false);
         showAddKeyBlock(true);
       } else {
-        while (1 < getRowCount())
-          removeRow(getRowCount() - 1);
+        while (1 < getRowCount()) removeRow(getRowCount() - 1);
         for (SshKeyInfo k : result) {
           addOneKey(k);
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/StringListPanel.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/StringListPanel.java
index a809a6d..c2fff99 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/StringListPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/client/StringListPanel.java
@@ -32,7 +32,6 @@
 import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwtexpui.globalkey.client.NpTextBox;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -44,40 +43,40 @@
   private final HorizontalPanel titlePanel;
   private Image info;
 
-  StringListPanel(String title, String fieldName, JsArrayString values,
-      final FocusWidget w) {
+  StringListPanel(String title, String fieldName, JsArrayString values, final FocusWidget w) {
     this(title, fieldName, Natives.asList(values), w);
   }
 
-  StringListPanel(String title, String fieldName, Collection<String> values,
-      final FocusWidget w) {
+  StringListPanel(String title, String fieldName, Collection<String> values, final FocusWidget w) {
     titlePanel = new HorizontalPanel();
     Label titleLabel = new Label(title);
     titleLabel.setStyleName("serviceuser-smallHeading");
     titlePanel.add(titleLabel);
     add(titlePanel);
     input = new NpTextBox();
-    input.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(KeyPressEvent event) {
-        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
-          w.setEnabled(true);
-          add();
-        }
-      }
-    });
+    input.addKeyPressHandler(
+        new KeyPressHandler() {
+          @Override
+          public void onKeyPress(KeyPressEvent event) {
+            if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
+              w.setEnabled(true);
+              add();
+            }
+          }
+        });
     HorizontalPanel p = new HorizontalPanel();
     p.add(input);
     Button addButton = new Button("Add");
     addButton.setEnabled(false);
     new OnEditEnabler(addButton, input);
-    addButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        w.setEnabled(true);
-        add();
-      }
-    });
+    addButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            w.setEnabled(true);
+            add();
+          }
+        });
     p.add(addButton);
     add(p);
 
@@ -87,13 +86,14 @@
     deleteButton = new Button("Delete");
     deleteButton.setEnabled(false);
     add(deleteButton);
-    deleteButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        w.setEnabled(true);
-        t.deleteChecked();
-      }
-    });
+    deleteButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            w.setEnabled(true);
+            t.deleteChecked();
+          }
+        });
 
     t.display(values);
   }
@@ -154,12 +154,13 @@
       fmt.addStyleName(row, 1, "dataCell");
 
       CheckBox checkBox = new CheckBox();
-      checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
-        @Override
-        public void onValueChange(ValueChangeEvent<Boolean> event) {
-          enableDelete();
-        }
-      });
+      checkBox.addValueChangeHandler(
+          new ValueChangeHandler<Boolean>() {
+            @Override
+            public void onValueChange(ValueChangeEvent<Boolean> event) {
+              enableDelete();
+            }
+          });
       setWidget(row, 0, checkBox);
       setText(row, 1, value);
     }
@@ -168,7 +169,7 @@
       int insertPos = getRowCount();
       for (int row = 1; row < getRowCount(); row++) {
         int compareResult = v.compareTo(getText(row, 1));
-        if (compareResult < 0)  {
+        if (compareResult < 0) {
           insertPos = row;
           break;
         } else if (compareResult == 0) {
