diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
index 7a6449e..dd8cf0f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
@@ -25,9 +25,8 @@
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.imagare.DeleteImage.Input;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Ref;
@@ -38,13 +37,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
 public class DeleteImage implements RestModifyView<ImageResource, Input> {
   private static final Logger log = LoggerFactory.getLogger(DeleteImage.class);
 
-  public static class Input {
-  }
+  public static class Input {}
 
   private final String pluginName;
   private final Provider<IdentifiedUser> self;
@@ -52,7 +48,8 @@
   private final GitReferenceUpdated referenceUpdated;
 
   @Inject
-  public DeleteImage(@PluginName String pluginName,
+  public DeleteImage(
+      @PluginName String pluginName,
       Provider<IdentifiedUser> self,
       GitRepositoryManager repoManager,
       GitReferenceUpdated referenceUpdated) {
@@ -64,10 +61,11 @@
 
   @Override
   public Response<?> apply(ImageResource rsrc, Input input)
-      throws AuthException, ResourceConflictException,
-      RepositoryNotFoundException, IOException, ResourceNotFoundException {
+      throws AuthException, ResourceConflictException, RepositoryNotFoundException, IOException,
+          ResourceNotFoundException {
     if (!rsrc.getControl().canDelete()
-        && !self.get().getCapabilities()
+        && !self.get()
+            .getCapabilities()
             .canPerform(pluginName + "-" + DeleteOwnImagesCapability.DELETE_OWN_IMAGES)) {
       throw new AuthException("not allowed to delete image");
     }
@@ -116,8 +114,7 @@
     }
     try (RevWalk rw = new RevWalk(repo)) {
       RevCommit commit = rw.parseCommit(r.getObjectId());
-      if (!self.get().getNameEmail()
-          .equals(getNameEmail(commit.getCommitterIdent()))) {
+      if (!self.get().getNameEmail().equals(getNameEmail(commit.getCommitterIdent()))) {
         throw new AuthException("not allowed to delete image");
       }
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetConfig.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetConfig.java
index 426a855..4ddd017 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetConfig.java
@@ -30,7 +30,8 @@
   private final String canonicalWebUrl;
 
   @Inject
-  public GetConfig(PluginConfigFactory cfgFactory,
+  public GetConfig(
+      PluginConfigFactory cfgFactory,
       @PluginName String pluginName,
       @PluginCanonicalWebUrl String canonicalWebUrl) {
     this.cfg = cfgFactory.getFromGerritConfig(pluginName);
@@ -41,8 +42,7 @@
   @Override
   public ConfigInfo apply(ConfigResource resource) {
     ConfigInfo info = new ConfigInfo();
-    info.defaultProject =
-        MoreObjects.firstNonNull(cfg.getString("defaultProject"), "All-Projects");
+    info.defaultProject = MoreObjects.firstNonNull(cfg.getString("defaultProject"), "All-Projects");
     info.linkDecoration = cfg.getEnum("linkDecoration", LinkDecoration.INLINE);
     if (LinkDecoration.NONE.equals(info.linkDecoration)) {
       info.linkDecoration = null;
@@ -58,8 +58,9 @@
     }
 
     if (enableImageServer) {
-      info.pattern = escapeRegexpForJavaScript(canonicalWebUrl)
-          + "project/.*/rev/.*/.*\\.(jpg|jpeg|png|gif|bmp|ico|svg|tif|tiff)";
+      info.pattern =
+          escapeRegexpForJavaScript(canonicalWebUrl)
+              + "project/.*/rev/.*/.*\\.(jpg|jpeg|png|gif|bmp|ico|svg|tif|tiff)";
       info.uploadUrl = "#/x/" + pluginName + "/upload";
     } else {
       info.pattern = cfg.getString("pattern");
@@ -70,8 +71,9 @@
   }
 
   /**
-   * Escapes a string for being used in a JavaScript regexp.
-   * The following characters must be escaped: . * + ? ^ $ { } ( ) | [ ] / \
+   * Escapes a string for being used in a JavaScript regexp. The following characters must be
+   * escaped: . * + ? ^ $ { } ( ) | [ ] / \
+   *
    * @param s string to be escaped
    * @return the escaped string
    */
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
index 0711af9..0fc0732 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
@@ -24,9 +24,7 @@
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.imagare.GetConfig.ConfigInfo;
-
 import org.eclipse.jgit.lib.Config;
 
 public class GetPreference implements RestReadView<AccountResource> {
@@ -41,8 +39,11 @@
   private final Provider<GetConfig> getConfig;
 
   @Inject
-  GetPreference(Provider<IdentifiedUser> self, ProjectCache projectCache,
-      @PluginName String pluginName, Provider<GetConfig> getConfig) {
+  GetPreference(
+      Provider<IdentifiedUser> self,
+      ProjectCache projectCache,
+      @PluginName String pluginName,
+      Provider<GetConfig> getConfig) {
     this.self = self;
     this.projectCache = projectCache;
     this.pluginName = pluginName;
@@ -51,8 +52,7 @@
 
   @Override
   public ConfigInfo apply(AccountResource rsrc) throws AuthException {
-    if (self.get() != rsrc.getUser()
-        && !self.get().getCapabilities().canAdministrateServer()) {
+    if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) {
       throw new AuthException("not allowed to get preference");
     }
 
@@ -60,25 +60,26 @@
 
     ConfigInfo globalCfg = getConfig.get().apply(new ConfigResource());
 
-    Config db =
-        projectCache.getAllProjects().getConfig(pluginName + ".config").get();
+    Config db = projectCache.getAllProjects().getConfig(pluginName + ".config").get();
     ConfigInfo info = new ConfigInfo();
 
     info.defaultProject =
         MoreObjects.firstNonNull(
-            db.getString(PREFERENCE, username, KEY_DEFAULT_PROJECT),
-            globalCfg.defaultProject);
+            db.getString(PREFERENCE, username, KEY_DEFAULT_PROJECT), globalCfg.defaultProject);
 
     info.linkDecoration =
-        db.getEnum(PREFERENCE, username, KEY_LINK_DECORATION,
+        db.getEnum(
+            PREFERENCE,
+            username,
+            KEY_LINK_DECORATION,
             MoreObjects.firstNonNull(globalCfg.linkDecoration, LinkDecoration.NONE));
     if (LinkDecoration.NONE.equals(info.linkDecoration)) {
       info.linkDecoration = null;
     }
 
     info.stage =
-        db.getBoolean(PREFERENCE, username, KEY_STAGE,
-            (globalCfg.stage != null ? globalCfg.stage : false));
+        db.getBoolean(
+            PREFERENCE, username, KEY_STAGE, (globalCfg.stage != null ? globalCfg.stage : false));
     if (!info.stage) {
       info.stage = null;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/HttpModule.java
index f83a243..d719e66 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/HttpModule.java
@@ -29,23 +29,18 @@
   private final String pluginName;
 
   @Inject
-  HttpModule(PluginConfigFactory cfgFactory,
-      @PluginName String pluginName) {
+  HttpModule(PluginConfigFactory cfgFactory, @PluginName String pluginName) {
     this.cfgFactory = cfgFactory;
     this.pluginName = pluginName;
   }
 
   @Override
   protected void configureServlets() {
-    if (cfgFactory.getFromGerritConfig(pluginName, true)
-        .getBoolean("enableImageServer", true)) {
-      serveRegex("^" + ImageServlet.PATH_PREFIX + "(.+)?$")
-          .with(ImageServlet.class);
+    if (cfgFactory.getFromGerritConfig(pluginName, true).getBoolean("enableImageServer", true)) {
+      serveRegex("^" + ImageServlet.PATH_PREFIX + "(.+)?$").with(ImageServlet.class);
     }
 
-    DynamicSet.bind(binder(), WebUiPlugin.class)
-        .toInstance(new GwtPlugin("imagare"));
-    DynamicSet.bind(binder(), WebUiPlugin.class)
-        .toInstance(new JavaScriptPlugin("imagare.js"));
+    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new GwtPlugin("imagare"));
+    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin("imagare.js"));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagareMenu.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagareMenu.java
index 2dbc0a9..e2d2d5a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagareMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagareMenu.java
@@ -20,7 +20,6 @@
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.inject.Inject;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -29,18 +28,21 @@
   private final List<MenuEntry> menuEntries;
 
   @Inject
-  public ImagareMenu(PluginConfigFactory cfgFactory,
-      @PluginName String pluginName) {
+  public ImagareMenu(PluginConfigFactory cfgFactory, @PluginName String pluginName) {
     menuEntries = new ArrayList<>();
     PluginConfig cfg = cfgFactory.getFromGerritConfig(pluginName, true);
     if (cfg.getBoolean("enableImageServer", true)) {
-      menuEntries.add(new MenuEntry("Tools", Collections
-          .singletonList(new MenuItem("Image Upload", "#/x/" + pluginName + "/upload", ""))));
+      menuEntries.add(
+          new MenuEntry(
+              "Tools",
+              Collections.singletonList(
+                  new MenuItem("Image Upload", "#/x/" + pluginName + "/upload", ""))));
     } else {
       String uploadUrl = cfg.getString("uploadUrl");
       if (uploadUrl != null) {
-        menuEntries.add(new MenuEntry("Tools", Collections
-            .singletonList(new MenuItem("Image Upload", uploadUrl))));
+        menuEntries.add(
+            new MenuEntry(
+                "Tools", Collections.singletonList(new MenuItem("Image Upload", uploadUrl))));
       }
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
index 69ef8d1..5131f1c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
@@ -38,9 +38,12 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import eu.medsea.mimeutil.MimeType;
-
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.errors.RevisionSyntaxException;
 import org.eclipse.jgit.lib.Constants;
@@ -53,18 +56,11 @@
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 @Singleton
 public class ImageServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
 
-  public  static final String PATH_PREFIX = "/project/";
+  public static final String PATH_PREFIX = "/project/";
 
   private final String pluginName;
   private final Provider<ReviewDb> db;
@@ -93,8 +89,7 @@
   }
 
   @Override
-  public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {
     if (!"GET".equals(req.getMethod()) && !"HEAD".equals(req.getMethod())) {
       CacheHeaders.setNotCacheable(res);
       res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
@@ -109,8 +104,7 @@
     }
 
     MimeType mimeType = fileTypeRegistry.getMimeType(key.file, null);
-    if (!("image".equals(mimeType.getMediaType())
-          && fileTypeRegistry.isSafeInline(mimeType))) {
+    if (!("image".equals(mimeType.getMediaType()) && fileTypeRegistry.isSafeInline(mimeType))) {
       notFound(res);
       return;
     }
@@ -120,7 +114,7 @@
       String rev = key.revision;
       if (rev == null || Constants.HEAD.equals(rev)) {
         rev = getHead.get().apply(new ProjectResource(projectControl));
-      } else  {
+      } else {
         if (!ObjectId.isId(rev)) {
           if (!rev.startsWith(Constants.R_REFS)) {
             rev = Constants.R_HEADS + rev;
@@ -132,8 +126,7 @@
         }
       }
       try (Repository repo = repoManager.openRepository(key.project)) {
-        ObjectId revId =
-            repo.resolve(rev != null ? rev : Constants.HEAD);
+        ObjectId revId = repo.resolve(rev != null ? rev : Constants.HEAD);
         if (revId == null) {
           notFound(res);
           return;
@@ -185,10 +178,8 @@
               notFound(res);
               return;
             }
-            res.setHeader(HttpHeaders.ETAG,
-                eTag != null
-                    ? eTag
-                    : computeETag(key.project, revId, key.file));
+            res.setHeader(
+                HttpHeaders.ETAG, eTag != null ? eTag : computeETag(key.project, revId, key.file));
             CacheHeaders.setCacheablePrivate(res, 7, TimeUnit.DAYS, false);
             send(req, res, content, mimeType.toString(), commit.getCommitTime());
             return;
@@ -198,8 +189,11 @@
           return;
         }
       }
-    } catch (RepositoryNotFoundException | NoSuchProjectException
-        | ResourceNotFoundException | AuthException | RevisionSyntaxException e) {
+    } catch (RepositoryNotFoundException
+        | NoSuchProjectException
+        | ResourceNotFoundException
+        | AuthException
+        | RevisionSyntaxException e) {
       notFound(res);
       return;
     }
@@ -214,17 +208,23 @@
     return path;
   }
 
-  private static String computeETag(Project.NameKey project, ObjectId revId,
-      String file) {
-    return Hashing.md5().newHasher()
+  private static String computeETag(Project.NameKey project, ObjectId revId, String file) {
+    return Hashing.md5()
+        .newHasher()
         .putUnencodedChars(project.get())
         .putUnencodedChars(revId.getName())
         .putUnencodedChars(file)
-        .hash().toString();
+        .hash()
+        .toString();
   }
 
-  private void send(HttpServletRequest req, HttpServletResponse res,
-      byte[] content, String contentType, long lastModified) throws IOException {
+  private void send(
+      HttpServletRequest req,
+      HttpServletResponse res,
+      byte[] content,
+      String contentType,
+      long lastModified)
+      throws IOException {
     if (0 < lastModified) {
       long ifModifiedSince = req.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
       if (ifModifiedSince > 0 && ifModifiedSince == lastModified) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
index 33e2ab6..6c51520 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
@@ -27,15 +27,14 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
-public class ImagesCollection implements
-    ChildCollection<ProjectResource, ImageResource>,
-    AcceptsPost<ProjectResource> {
+public class ImagesCollection
+    implements ChildCollection<ProjectResource, ImageResource>, AcceptsPost<ProjectResource> {
   private final DynamicMap<RestView<ImageResource>> views;
   private final Provider<PostImage> createImage;
 
   @Inject
-  public ImagesCollection(DynamicMap<RestView<ImageResource>> views,
-      Provider<PostImage> createImage) {
+  public ImagesCollection(
+      DynamicMap<RestView<ImageResource>> views, Provider<PostImage> createImage) {
     this.views = views;
     this.createImage = createImage;
   }
@@ -46,11 +45,9 @@
   }
 
   @Override
-  public ImageResource parse(ProjectResource parent, IdString id)
-      throws ResourceNotFoundException {
+  public ImageResource parse(ProjectResource parent, IdString id) throws ResourceNotFoundException {
     RefControl refControl =
-        parent.getControl().controlForRef(
-            new Branch.NameKey(parent.getNameKey(), id.get()));
+        parent.getControl().controlForRef(new Branch.NameKey(parent.getNameKey(), id.get()));
     if (refControl.canRead()) {
       return new ImageResource(refControl);
     } else {
@@ -65,8 +62,7 @@
 
   @Override
   @SuppressWarnings("unchecked")
-  public PostImage post(ProjectResource parent)
-      throws RestApiException {
+  public PostImage post(ProjectResource parent) throws RestApiException {
     return createImage.get();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/LinkDecoration.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/LinkDecoration.java
index d710e0d..6f09156 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/LinkDecoration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/LinkDecoration.java
@@ -15,5 +15,7 @@
 package com.googlesource.gerrit.plugins.imagare;
 
 public enum LinkDecoration {
-  NONE, TOOLTIP, INLINE
+  NONE,
+  TOOLTIP,
+  INLINE
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
index 11c221a..b9ecf0a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
@@ -14,9 +14,9 @@
 
 package com.googlesource.gerrit.plugins.imagare;
 
+import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
 import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
 import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;
-import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
 import static com.googlesource.gerrit.plugins.imagare.DeleteOwnImagesCapability.DELETE_OWN_IMAGES;
 import static com.googlesource.gerrit.plugins.imagare.ImageResource.IMAGE_KIND;
 
@@ -36,39 +36,39 @@
   private final String pluginName;
 
   @Inject
-  Module(PluginConfigFactory cfgFactory,
-      @PluginName String pluginName) {
+  Module(PluginConfigFactory cfgFactory, @PluginName String pluginName) {
     this.cfgFactory = cfgFactory;
     this.pluginName = pluginName;
   }
 
   @Override
   protected void configure() {
-    if (cfgFactory.getFromGerritConfig(pluginName, true)
-        .getBoolean("enableImageServer", true)) {
+    if (cfgFactory.getFromGerritConfig(pluginName, true).getBoolean("enableImageServer", true)) {
       bind(com.google.gerrit.extensions.config.CapabilityDefinition.class)
-        .annotatedWith(Exports.named(DELETE_OWN_IMAGES))
-        .to(DeleteOwnImagesCapability.class);
-      install(new RestApiModule() {
-        @Override
-        protected void configure() {
-          DynamicMap.mapOf(binder(), IMAGE_KIND);
-          bind(ImagesCollection.class);
-          child(PROJECT_KIND, "images").to(ImagesCollection.class);
-          delete(IMAGE_KIND).to(DeleteImage.class);
-        }
-      });
+          .annotatedWith(Exports.named(DELETE_OWN_IMAGES))
+          .to(DeleteOwnImagesCapability.class);
+      install(
+          new RestApiModule() {
+            @Override
+            protected void configure() {
+              DynamicMap.mapOf(binder(), IMAGE_KIND);
+              bind(ImagesCollection.class);
+              child(PROJECT_KIND, "images").to(ImagesCollection.class);
+              delete(IMAGE_KIND).to(DeleteImage.class);
+            }
+          });
     }
 
     DynamicSet.bind(binder(), TopMenu.class).to(ImagareMenu.class);
-    install(new RestApiModule() {
-      @Override
-      protected void configure() {
-        get(CONFIG_KIND, "config").to(GetConfig.class);
-        put(CONFIG_KIND, "config").to(PutConfig.class);
-        get(ACCOUNT_KIND, "preference").to(GetPreference.class);
-        put(ACCOUNT_KIND, "preference").to(PutPreference.class);
-      }
-    });
+    install(
+        new RestApiModule() {
+          @Override
+          protected void configure() {
+            get(CONFIG_KIND, "config").to(GetConfig.class);
+            put(CONFIG_KIND, "config").to(PutConfig.class);
+            get(ACCOUNT_KIND, "preference").to(GetPreference.class);
+            put(ACCOUNT_KIND, "preference").to(PutPreference.class);
+          }
+        });
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
index f47b0a6..9f9f39e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
@@ -24,24 +24,23 @@
 import com.google.gerrit.extensions.restapi.RestModifyView;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.mime.FileTypeRegistry;
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.CanonicalWebUrl;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.mime.FileTypeRegistry;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.project.RefControl;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.imagare.PostImage.Input;
-
 import eu.medsea.mimeutil.MimeType;
-
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import org.apache.commons.lang.ArrayUtils;
 import org.eclipse.jgit.lib.CommitBuilder;
 import org.eclipse.jgit.lib.Config;
@@ -56,10 +55,6 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.util.Base64;
 
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 public class PostImage implements RestModifyView<ProjectResource, Input> {
 
   public static class Input {
@@ -79,7 +74,8 @@
   private final String pluginName;
 
   @Inject
-  public PostImage(FileTypeRegistry registry,
+  public PostImage(
+      FileTypeRegistry registry,
       Provider<IdentifiedUser> self,
       GitRepositoryManager repoManager,
       GitReferenceUpdated referenceUpdated,
@@ -102,8 +98,8 @@
 
   @Override
   public Response<ImageInfo> apply(ProjectResource rsrc, Input input)
-      throws MethodNotAllowedException, BadRequestException, AuthException,
-      IOException, ResourceConflictException {
+      throws MethodNotAllowedException, BadRequestException, AuthException, IOException,
+          ResourceConflictException {
     if (input == null) {
       input = new Input();
     }
@@ -116,9 +112,9 @@
     return Response.created(info);
   }
 
-  private ImageInfo storeImage(ProjectControl pc, String imageData,
-      String fileName) throws MethodNotAllowedException, BadRequestException,
-      AuthException, IOException, ResourceConflictException {
+  private ImageInfo storeImage(ProjectControl pc, String imageData, String fileName)
+      throws MethodNotAllowedException, BadRequestException, AuthException, IOException,
+          ResourceConflictException {
     Matcher m = imageDataPattern.matcher(imageData);
     if (m.matches()) {
       String receivedMimeType = m.group(1);
@@ -136,8 +132,7 @@
 
       if ("base64".equals(encoding)) {
         byte[] content = Base64.decode(encodedContent);
-        MimeType mimeType =
-            registry.getMimeType("img." + receivedMimeType, content);
+        MimeType mimeType = registry.getMimeType("img." + receivedMimeType, content);
         if (!"image".equals(mimeType.getMediaType())) {
           throw new MethodNotAllowedException("no image");
         }
@@ -193,8 +188,8 @@
         oi.flush();
 
         if (!rc.canCreate(db.get(), repo, rw.parseCommit(commitId))) {
-          throw new AuthException(String.format(
-              "Project %s doesn't allow image upload.", pc.getProject().getName()));
+          throw new AuthException(
+              String.format("Project %s doesn't allow image upload.", pc.getProject().getName()));
         }
 
         RefUpdate ru = repo.updateRef(ref);
@@ -202,12 +197,12 @@
         ru.setNewObjectId(commitId);
         ru.disableRefLog();
         if (ru.update(rw) == RefUpdate.Result.NEW) {
-          referenceUpdated.fire(pc.getProject().getNameKey(), ru,
-              self.get().getAccount());
+          referenceUpdated.fire(pc.getProject().getNameKey(), ru, self.get().getAccount());
         } else {
-          throw new IOException(String.format(
-              "Failed to create ref %s in %s: %s", ref,
-              pc.getProject().getName(), ru.getResult()));
+          throw new IOException(
+              String.format(
+                  "Failed to create ref %s in %s: %s",
+                  ref, pc.getProject().getName(), ru.getResult()));
         }
 
         return getUrl(pc.getProject().getNameKey(), ref, fileName);
@@ -217,8 +212,8 @@
 
   private String getRef(byte[] content, String fileName) {
     try (ObjectInserter oi = new ObjectInserter.Formatter()) {
-      String id = oi.idFor(Constants.OBJ_BLOB,
-          ArrayUtils.addAll(content, fileName.getBytes())).getName();
+      String id =
+          oi.idFor(Constants.OBJ_BLOB, ArrayUtils.addAll(content, fileName.getBytes())).getName();
       StringBuilder ref = new StringBuilder();
       ref.append(Constants.R_REFS);
       ref.append("images/");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java
index 1227810..8443094 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java
@@ -28,17 +28,14 @@
 import com.google.gerrit.server.config.SitePaths;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
-
 import com.googlesource.gerrit.plugins.imagare.PutConfig.Input;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
 
-import java.io.IOException;
-
 @RequiresCapability(value = GlobalCapability.ADMINISTRATE_SERVER, scope = CapabilityScope.CORE)
-public class PutConfig implements RestModifyView<ConfigResource, Input>{
+public class PutConfig implements RestModifyView<ConfigResource, Input> {
   public static class Input {
     public String defaultProject;
     public LinkDecoration linkDecoration;
@@ -53,8 +50,11 @@
   private final ProjectCache projectCache;
 
   @Inject
-  PutConfig(PluginConfigFactory cfgFactory, SitePaths sitePaths,
-      @PluginName String pluginName, ProjectCache projectCache) {
+  PutConfig(
+      PluginConfigFactory cfgFactory,
+      SitePaths sitePaths,
+      @PluginName String pluginName,
+      ProjectCache projectCache) {
     this.cfgFactory = cfgFactory;
     this.sitePaths = sitePaths;
     this.pluginName = pluginName;
@@ -67,25 +67,23 @@
     if (input == null) {
       input = new Input();
     }
-    FileBasedConfig cfg =
-        new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
+    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
     cfg.load();
 
     if (input.defaultProject != null) {
       if (projectCache.get(new Project.NameKey(input.defaultProject)) == null) {
-        throw new UnprocessableEntityException("project '"
-            + input.defaultProject + "' does not exist");
+        throw new UnprocessableEntityException(
+            "project '" + input.defaultProject + "' does not exist");
       }
-      cfg.setString("plugin", pluginName, "defaultProject",
-          Strings.emptyToNull(input.defaultProject));
+      cfg.setString(
+          "plugin", pluginName, "defaultProject", Strings.emptyToNull(input.defaultProject));
     }
 
     if (input.linkDecoration != null) {
       if (LinkDecoration.NONE.equals(input.linkDecoration)) {
         cfg.unset("plugin", pluginName, "linkDecoration");
       } else {
-        cfg.setEnum("plugin", pluginName, "linkDecoration",
-            input.linkDecoration);
+        cfg.setEnum("plugin", pluginName, "linkDecoration", input.linkDecoration);
       }
     }
 
@@ -107,6 +105,6 @@
 
     cfg.save();
     cfgFactory.getFromGerritConfig(pluginName, true);
-    return Response.<String> ok("OK");
+    return Response.<String>ok("OK");
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
index cf81032..bebef61 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
@@ -14,10 +14,10 @@
 
 package com.googlesource.gerrit.plugins.imagare;
 
-import static com.googlesource.gerrit.plugins.imagare.GetPreference.PREFERENCE;
 import static com.googlesource.gerrit.plugins.imagare.GetPreference.KEY_DEFAULT_PROJECT;
 import static com.googlesource.gerrit.plugins.imagare.GetPreference.KEY_LINK_DECORATION;
 import static com.googlesource.gerrit.plugins.imagare.GetPreference.KEY_STAGE;
+import static com.googlesource.gerrit.plugins.imagare.GetPreference.PREFERENCE;
 
 import com.google.common.base.Strings;
 import com.google.gerrit.extensions.annotations.PluginName;
@@ -33,14 +33,11 @@
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-
 import com.googlesource.gerrit.plugins.imagare.PutConfig.Input;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Config;
 
-import java.io.IOException;
-
 public class PutPreference implements RestModifyView<AccountResource, Input> {
   private final Provider<IdentifiedUser> self;
   private final ProjectCache projectCache;
@@ -48,8 +45,11 @@
   private final String pluginName;
 
   @Inject
-  PutPreference(Provider<IdentifiedUser> self, ProjectCache projectCache,
-      MetaDataUpdate.User metaDataUpdateFactory, @PluginName String pluginName) {
+  PutPreference(
+      Provider<IdentifiedUser> self,
+      ProjectCache projectCache,
+      MetaDataUpdate.User metaDataUpdateFactory,
+      @PluginName String pluginName) {
     this.self = self;
     this.projectCache = projectCache;
     this.metaDataUpdateFactory = metaDataUpdateFactory;
@@ -58,10 +58,8 @@
 
   @Override
   public Response<String> apply(AccountResource rsrc, Input input)
-      throws AuthException, RepositoryNotFoundException, IOException,
-      UnprocessableEntityException {
-    if (self.get() != rsrc.getUser()
-        && !self.get().getCapabilities().canAdministrateServer()) {
+      throws AuthException, RepositoryNotFoundException, IOException, UnprocessableEntityException {
+    if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) {
       throw new AuthException("not allowed to change preference");
     }
     if (input == null) {
@@ -70,20 +68,18 @@
 
     String username = self.get().getUserName();
 
-    ProjectLevelConfig storage =
-        projectCache.getAllProjects().getConfig(pluginName + ".config");
+    ProjectLevelConfig storage = projectCache.getAllProjects().getConfig(pluginName + ".config");
     Config db = storage.get();
     boolean modified = false;
 
     String defaultProject = db.getString(PREFERENCE, username, KEY_DEFAULT_PROJECT);
     if (Strings.emptyToNull(input.defaultProject) != null) {
       if (projectCache.get(new Project.NameKey(input.defaultProject)) == null) {
-        throw new UnprocessableEntityException("project '"
-            + input.defaultProject + "' does not exist");
+        throw new UnprocessableEntityException(
+            "project '" + input.defaultProject + "' does not exist");
       }
       if (!input.defaultProject.equals(defaultProject)) {
-        db.setString(PREFERENCE, username, KEY_DEFAULT_PROJECT,
-            input.defaultProject);
+        db.setString(PREFERENCE, username, KEY_DEFAULT_PROJECT, input.defaultProject);
         modified = true;
       }
     } else {
@@ -95,11 +91,9 @@
 
     if (input.linkDecoration != null) {
       LinkDecoration linkDecoration =
-          db.getEnum(PREFERENCE, username, KEY_LINK_DECORATION,
-              LinkDecoration.NONE);
+          db.getEnum(PREFERENCE, username, KEY_LINK_DECORATION, LinkDecoration.NONE);
       if (!input.linkDecoration.equals(linkDecoration)) {
-        db.setEnum(PREFERENCE, username, KEY_LINK_DECORATION,
-            input.linkDecoration);
+        db.setEnum(PREFERENCE, username, KEY_LINK_DECORATION, input.linkDecoration);
         modified = true;
       }
     } else {
@@ -123,13 +117,12 @@
     }
 
     if (modified) {
-      MetaDataUpdate md = metaDataUpdateFactory.create(
-          projectCache.getAllProjects().getProject().getNameKey());
-      md.setMessage("Update " + pluginName + " Preferences for '"
-          + username + "'\n");
+      MetaDataUpdate md =
+          metaDataUpdateFactory.create(projectCache.getAllProjects().getProject().getNameKey());
+      md.setMessage("Update " + pluginName + " Preferences for '" + username + "'\n");
       storage.commit(md);
     }
 
-    return Response.<String> ok("OK");
+    return Response.<String>ok("OK");
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfigInfo.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfigInfo.java
index 901856a..65d9b96 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfigInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfigInfo.java
@@ -25,13 +25,18 @@
     }
     return LinkDecoration.valueOf(link_decoration());
   }
+
   private final native String link_decoration() /*-{ return this.link_decoration; }-*/;
 
   final native boolean stage() /*-{ return this.stage ? true : false; }-*/;
-  final native boolean enableImageServer() /*-{ return this.enable_image_server ? true : false; }-*/;
+
+  final native boolean
+      enableImageServer() /*-{ return this.enable_image_server ? true : false; }-*/;
 
   final native void setDefaultProject(String p) /*-{ this.default_project = p; }-*/;
+
   final native void setLinkDecoration(String d) /*-{ this.link_decoration = d; }-*/;
+
   final native void setStage(boolean s) /*-{ this.stage = s; }-*/;
 
   static ConfigInfo create() {
@@ -39,6 +44,5 @@
     return g;
   }
 
-  protected ConfigInfo() {
-  }
+  protected ConfigInfo() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationCallback.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationCallback.java
index 05ae8f3..209d14f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationCallback.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationCallback.java
@@ -15,21 +15,19 @@
 package com.googlesource.gerrit.plugins.imagare.client;
 
 /**
- * Interface that a caller must implement to react on the result of a
- * {@link ConfirmationDialog}.
+ * Interface that a caller must implement to react on the result of a {@link ConfirmationDialog}.
  */
 public abstract class ConfirmationCallback {
 
   /**
-   * Called when the {@link ConfirmationDialog} is finished with OK.
-   * To be overwritten by subclasses.
+   * Called when the {@link ConfirmationDialog} is finished with OK. To be overwritten by
+   * subclasses.
    */
   public abstract void onOk();
 
   /**
-   * Called when the {@link ConfirmationDialog} is finished with Cancel.
-   * To be overwritten by subclasses.
+   * Called when the {@link ConfirmationDialog} is finished with Cancel. To be overwritten by
+   * subclasses.
    */
-  public void onCancel() {
-  }
+  public void onCancel() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationDialog.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationDialog.java
index 0b8dd70..062f8df 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationDialog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ConfirmationDialog.java
@@ -26,9 +26,9 @@
 
   private Button cancelButton;
 
-  public ConfirmationDialog(final String dialogTitle, final SafeHtml message,
-      final ConfirmationCallback callback) {
-    super(/* auto hide */false, /* modal */true);
+  public ConfirmationDialog(
+      final String dialogTitle, final SafeHtml message, final ConfirmationCallback callback) {
+    super(/* auto hide */ false, /* modal */ true);
     setGlassEnabled(true);
     setText(dialogTitle);
 
@@ -36,25 +36,27 @@
 
     final Button okButton = new Button();
     okButton.setText("OK");
-    okButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        hide();
-        callback.onOk();
-      }
-    });
+    okButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            hide();
+            callback.onOk();
+          }
+        });
     buttons.add(okButton);
 
     cancelButton = new Button();
     cancelButton.getElement().getStyle().setProperty("marginLeft", "300px");
     cancelButton.setText("Cancel");
-    cancelButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(ClickEvent event) {
-        hide();
-        callback.onCancel();
-      }
-    });
+    cancelButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            hide();
+            callback.onCancel();
+          }
+        });
     buttons.add(cancelButton);
 
     final FlowPanel center = new FlowPanel();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareAdminScreen.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareAdminScreen.java
index ff9218f..78d6945 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareAdminScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareAdminScreen.java
@@ -35,8 +35,8 @@
   }
 
   ImagareAdminScreen(boolean enableImageServer) {
-    super(enableImageServer,
-        new RestApi("config").id("server").view(
-            Plugin.get().getPluginName(), "config"));
+    super(
+        enableImageServer,
+        new RestApi("config").id("server").view(Plugin.get().getPluginName(), "config"));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java
index f0a2faf..cc261c9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java
@@ -41,17 +41,18 @@
     this.enableImageServer = enableImageServer;
     this.restApi = restApi;
     setStyleName("imagare-config-screen");
-    restApi.get(new AsyncCallback<ConfigInfo>() {
-        @Override
-        public void onSuccess(ConfigInfo info) {
-          display(info);
-        }
+    restApi.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
+          }
+        });
   }
 
   protected void display(ConfigInfo info) {
@@ -59,10 +60,11 @@
     p.setStyleName("imagare-label-panel");
     p.add(new Label("Link Decoration"));
     Image linkDecorationInfo = new Image(ImagarePlugin.RESOURCES.info());
-    linkDecorationInfo.setTitle("Decoration for image links in the Gerrit WebUI."
-        + " 'NONE': no decoration, 'TOOLTIP': the image is shown as tooltip on"
-        + " mouse over an image link, 'INLINE': the image is inlined instead of"
-        + " the URL.");
+    linkDecorationInfo.setTitle(
+        "Decoration for image links in the Gerrit WebUI."
+            + " 'NONE': no decoration, 'TOOLTIP': the image is shown as tooltip on"
+            + " mouse over an image link, 'INLINE': the image is inlined instead of"
+            + " the URL.");
     p.add(linkDecorationInfo);
     p.add(new Label(":"));
     linkDecorationBox = new ListBox();
@@ -96,8 +98,9 @@
       stageBox.setValue(info.stage());
       p.add(stageBox);
       Image stageInfo = new Image(ImagarePlugin.RESOURCES.info());
-      stageInfo.setTitle("Images are not uploaded immediately but put into a "
-          + "staging area. The upload must be triggered explicitely.");
+      stageInfo.setTitle(
+          "Images are not uploaded immediately but put into a "
+              + "staging area. The upload must be triggered explicitely.");
       p.add(stageInfo);
       add(p);
     }
@@ -107,12 +110,13 @@
 
     saveButton = new Button("Save");
     saveButton.setStyleName("imagare-save-button");
-    saveButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        doSave();
-      }
-    });
+    saveButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            doSave();
+          }
+        });
     buttons.add(saveButton);
     saveButton.setEnabled(false);
     OnEditEnabler onEditEnabler = new OnEditEnabler(saveButton, linkDecorationBox);
@@ -132,20 +136,21 @@
       in.setDefaultProject(projectBox.getValue());
       in.setStage(stageBox.getValue());
     }
-    restApi.put(in, new AsyncCallback<JavaScriptObject>() {
-        @Override
-        public void onSuccess(JavaScriptObject result) {
-          saveButton.setEnabled(false);
-          onSave();
-        }
+    restApi.put(
+        in,
+        new AsyncCallback<JavaScriptObject>() {
+          @Override
+          public void onSuccess(JavaScriptObject result) {
+            saveButton.setEnabled(false);
+            onSave();
+          }
 
-        @Override
-        public void onFailure(Throwable caught) {
-          // never invoked
-        }
-      });
+          @Override
+          public void onFailure(Throwable caught) {
+            // never invoked
+          }
+        });
   }
 
-  protected void onSave() {
-  }
+  protected void onSave() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePlugin.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePlugin.java
index 5b04b81..086bd13 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePlugin.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePlugin.java
@@ -25,26 +25,30 @@
 
   @Override
   public void onPluginLoad() {
-    new RestApi("config").id("server").view(Plugin.get().getPluginName(),
-        "config").get(new AsyncCallback<ConfigInfo>() {
-          @Override
-          public void onSuccess(ConfigInfo info) {
-            if (info.enableImageServer()) {
-              Plugin.get().screen("upload", new ImageUploadScreen.Factory());
-            }
+    new RestApi("config")
+        .id("server")
+        .view(Plugin.get().getPluginName(), "config")
+        .get(
+            new AsyncCallback<ConfigInfo>() {
+              @Override
+              public void onSuccess(ConfigInfo info) {
+                if (info.enableImageServer()) {
+                  Plugin.get().screen("upload", new ImageUploadScreen.Factory());
+                }
 
-            Plugin.get().screen("settings",
-                new ImagareAdminScreen.Factory(info.enableImageServer()));
-            Plugin.get().settingsScreen("preferences",
-                Plugin.get().getName() + " Preferences",
-                new ImagarePreferenceScreen.Factory(info.enableImageServer()));
-          }
+                Plugin.get()
+                    .screen("settings", new ImagareAdminScreen.Factory(info.enableImageServer()));
+                Plugin.get()
+                    .settingsScreen(
+                        "preferences",
+                        Plugin.get().getName() + " Preferences",
+                        new ImagarePreferenceScreen.Factory(info.enableImageServer()));
+              }
 
-          @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/imagare/client/ImagarePreferenceScreen.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java
index a86ffc8..a9cd182 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java
@@ -39,9 +39,9 @@
   }
 
   ImagarePreferenceScreen(boolean enableImageServer) {
-    super(enableImageServer,
-        new RestApi("accounts").id("self").view(
-            Plugin.get().getPluginName(), "preference"));
+    super(
+        enableImageServer,
+        new RestApi("accounts").id("self").view(Plugin.get().getPluginName(), "preference"));
   }
 
   @Override
@@ -49,9 +49,10 @@
     if (enableImageServer) {
       HorizontalPanel p = new HorizontalPanel();
       p.setStyleName("imagare-menu-panel");
-      Anchor uploadAnchor = new Anchor(new ImageResourceRenderer().render(
-          ImagarePlugin.RESOURCES.image()),
-          "#/x/" + Plugin.get().getPluginName() + "/upload");
+      Anchor uploadAnchor =
+          new Anchor(
+              new ImageResourceRenderer().render(ImagarePlugin.RESOURCES.image()),
+              "#/x/" + Plugin.get().getPluginName() + "/upload");
       uploadAnchor.setTitle("Upload Image");
       p.add(uploadAnchor);
       add(p);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploadScreen.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploadScreen.java
index 5d5116b..1176a79 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploadScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploadScreen.java
@@ -27,7 +27,6 @@
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.VerticalPanel;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -54,9 +53,10 @@
 
     HorizontalPanel p = new HorizontalPanel();
     p.setStyleName("imagare-menu-panel");
-    Anchor prefsAnchor = new Anchor(new ImageResourceRenderer().render(
-        ImagarePlugin.RESOURCES.gear()),
-        "#/settings/x/" + Plugin.get().getPluginName() + "/preferences");
+    Anchor prefsAnchor =
+        new Anchor(
+            new ImageResourceRenderer().render(ImagarePlugin.RESOURCES.gear()),
+            "#/settings/x/" + Plugin.get().getPluginName() + "/preferences");
     prefsAnchor.setTitle("Edit Preferences");
     p.add(prefsAnchor);
     add(p);
@@ -80,25 +80,28 @@
     uploadedPanel = new UploadedImagesPanel();
     add(uploadedPanel);
 
-    new RestApi("accounts").id("self").view(Plugin.get().getPluginName(), "preference")
-        .get(new AsyncCallback<ConfigInfo>() {
-          @Override
-          public void onSuccess(ConfigInfo info) {
-            ImageUploader.setStage(info.stage());
-            String project = getParameter("project");
-            if (project != null) {
-              projectBox.setValue(project);
-            } else {
-              projectBox.setValue(info.getDefaultProject());
-            }
-            uploadPanel.focus();
-          }
+    new RestApi("accounts")
+        .id("self")
+        .view(Plugin.get().getPluginName(), "preference")
+        .get(
+            new AsyncCallback<ConfigInfo>() {
+              @Override
+              public void onSuccess(ConfigInfo info) {
+                ImageUploader.setStage(info.stage());
+                String project = getParameter("project");
+                if (project != null) {
+                  projectBox.setValue(project);
+                } else {
+                  projectBox.setValue(info.getDefaultProject());
+                }
+                uploadPanel.focus();
+              }
 
-          @Override
-          public void onFailure(Throwable caught) {
-            // never invoked
-          }
-        });
+              @Override
+              public void onFailure(Throwable caught) {
+                // never invoked
+              }
+            });
   }
 
   private static String getParameter(String name) {
@@ -118,8 +121,7 @@
     }
 
     String queryString =
-        Window.Location.getHash().substring(
-            Window.Location.getHash().indexOf('?') + 1);
+        Window.Location.getHash().substring(Window.Location.getHash().indexOf('?') + 1);
     for (String kvPair : queryString.split("&")) {
       String[] kv = kvPair.split("=", 2);
       if (kv[0].length() == 0) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploader.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploader.java
index b055ea4..057f615 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImageUploader.java
@@ -55,36 +55,38 @@
     in.image_data(imageData);
     in.file_name(fileName);
 
-    new RestApi("projects").id(project).view(Plugin.get().getPluginName(), "images")
-        .post(in, new AsyncCallback<ImageInfo>() {
+    new RestApi("projects")
+        .id(project)
+        .view(Plugin.get().getPluginName(), "images")
+        .post(
+            in,
+            new AsyncCallback<ImageInfo>() {
 
-          @Override
-          public void onSuccess(ImageInfo result) {
-            ImageUploadScreen.uploadedPanel.add(result.url());
-          }
+              @Override
+              public void onSuccess(ImageInfo result) {
+                ImageUploadScreen.uploadedPanel.add(result.url());
+              }
 
-          @Override
-          public void onFailure(Throwable caught) {
-          }
-        });
+              @Override
+              public void onFailure(Throwable caught) {}
+            });
   }
 
   private static class ImageInput extends JavaScriptObject {
     final native void image_data(String d) /*-{ this.image_data = d; }-*/;
+
     final native void file_name(String n) /*-{ this.file_name = n; }-*/;
 
     static ImageInput create() {
       return (ImageInput) createObject();
     }
 
-    protected ImageInput() {
-    }
+    protected ImageInput() {}
   }
 
   private static class ImageInfo extends JavaScriptObject {
     final native String url() /*-{ return this.url }-*/;
 
-    protected ImageInfo() {
-    }
+    protected ImageInfo() {}
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/LinkDecoration.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/LinkDecoration.java
index e208af6..b44b075 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/LinkDecoration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/LinkDecoration.java
@@ -15,5 +15,7 @@
 package com.googlesource.gerrit.plugins.imagare.client;
 
 public enum LinkDecoration {
-  NONE, TOOLTIP, INLINE
+  NONE,
+  TOOLTIP,
+  INLINE
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/OnEditEnabler.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/OnEditEnabler.java
index 60816e8..7be0614 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/OnEditEnabler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/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/imagare/client/UploadByDropOrPastePanel.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadByDropOrPastePanel.java
index 3b6b0ce..c4ed0d5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadByDropOrPastePanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadByDropOrPastePanel.java
@@ -158,5 +158,4 @@
     sel.addRange(range);
     elem.focus();
   }-*/;
-
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java
index 179631a..4ff11b0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java
@@ -62,23 +62,25 @@
 
     Button uploadButton = new Button("Upload");
     uploadButton.setStyleName("imagare-upload-button");
-    uploadButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        doUpload();
-      }
-    });
+    uploadButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            doUpload();
+          }
+        });
     buttons.add(uploadButton);
 
     Button cleanButton = new Button("Clean");
     cleanButton.setStyleName("imagare-clean-button");
-    cleanButton.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        stagedImagesPanel.clear();
-        setVisible(false);
-      }
-    });
+    cleanButton.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(final ClickEvent event) {
+            stagedImagesPanel.clear();
+            setVisible(false);
+          }
+        });
     buttons.add(cleanButton);
 
     popup = new PopupPanel();
@@ -94,7 +96,7 @@
 
   boolean isStaged(String project, String dataUrl, String fileName) {
     for (int i = 0; i < stagedImagesPanel.getWidgetCount(); i++) {
-      ImagePreview ip = (ImagePreview)stagedImagesPanel.getWidget(i);
+      ImagePreview ip = (ImagePreview) stagedImagesPanel.getWidget(i);
       if (project.equals(ip.project)
           && dataUrl.endsWith(ip.dataUrl)
           && (fileName != null ? fileName.equals(ip.fileName) : ip.fileName == null)) {
@@ -106,7 +108,7 @@
 
   private void doUpload() {
     for (int i = 0; i < stagedImagesPanel.getWidgetCount(); i++) {
-      ImagePreview ip = (ImagePreview)stagedImagesPanel.getWidget(i);
+      ImagePreview ip = (ImagePreview) stagedImagesPanel.getWidget(i);
       ImageUploader.uploadImage(ip.project, ip.dataUrl, ip.fileName);
     }
     stagedImagesPanel.clear();
@@ -141,62 +143,81 @@
       deleteIcon.setVisible(false);
       add(deleteIcon);
 
-      img.addMouseOverHandler(new MouseOverHandler() {
-        @Override
-        public void onMouseOver(MouseOverEvent event) {
-          if (!popup.isVisible()) {
-            Image previewImg = new Image(dataUrl);
-            previewImg.setStyleName("imagare-image-popup");
-            previewImg.getElement().setAttribute("style",
-                previewImg.getElement().getAttribute("style")
-                    + "position: absolute; top: " + (img.getAbsoluteTop() + img.getHeight() + 20) + "px; "
-                    + "left: " + img.getAbsoluteLeft() + "px;");
-            popup.add(previewImg);
+      img.addMouseOverHandler(
+          new MouseOverHandler() {
+            @Override
+            public void onMouseOver(MouseOverEvent event) {
+              if (!popup.isVisible()) {
+                Image previewImg = new Image(dataUrl);
+                previewImg.setStyleName("imagare-image-popup");
+                previewImg
+                    .getElement()
+                    .setAttribute(
+                        "style",
+                        previewImg.getElement().getAttribute("style")
+                            + "position: absolute; top: "
+                            + (img.getAbsoluteTop() + img.getHeight() + 20)
+                            + "px; "
+                            + "left: "
+                            + img.getAbsoluteLeft()
+                            + "px;");
+                popup.add(previewImg);
 
-            popup.show();
-            popup.setVisible(true);
-          }
+                popup.show();
+                popup.setVisible(true);
+              }
 
-          cancelHideDeleteIcon();
-          deleteIcon.getElement().setAttribute("style",
-              deleteIcon.getElement().getAttribute("style")
-                  + "position: absolute; top: " + img.getAbsoluteTop() + "px; "
-                  + "left: " + img.getAbsoluteLeft() + "px;");
-          deleteIcon.setVisible(true);
-        }
-      });
-      img.addMouseOutHandler(new MouseOutHandler() {
-        @Override
-        public void onMouseOut(MouseOutEvent event) {
-          popup.setVisible(false);
-          popup.clear();
-          hideDeleteIcon();
-        }
-      });
+              cancelHideDeleteIcon();
+              deleteIcon
+                  .getElement()
+                  .setAttribute(
+                      "style",
+                      deleteIcon.getElement().getAttribute("style")
+                          + "position: absolute; top: "
+                          + img.getAbsoluteTop()
+                          + "px; "
+                          + "left: "
+                          + img.getAbsoluteLeft()
+                          + "px;");
+              deleteIcon.setVisible(true);
+            }
+          });
+      img.addMouseOutHandler(
+          new MouseOutHandler() {
+            @Override
+            public void onMouseOut(MouseOutEvent event) {
+              popup.setVisible(false);
+              popup.clear();
+              hideDeleteIcon();
+            }
+          });
 
-      deleteIcon.addMouseOverHandler(new MouseOverHandler() {
-        @Override
-        public void onMouseOver(MouseOverEvent event) {
-          cancelHideDeleteIcon();
-        }
-      });
+      deleteIcon.addMouseOverHandler(
+          new MouseOverHandler() {
+            @Override
+            public void onMouseOver(MouseOverEvent event) {
+              cancelHideDeleteIcon();
+            }
+          });
 
-      deleteIcon.addMouseOutHandler(new MouseOutHandler() {
-        @Override
-        public void onMouseOut(MouseOutEvent event) {
-          hideDeleteIcon();
-        }
-      });
+      deleteIcon.addMouseOutHandler(
+          new MouseOutHandler() {
+            @Override
+            public void onMouseOut(MouseOutEvent event) {
+              hideDeleteIcon();
+            }
+          });
 
-      deleteIcon.addClickHandler(new ClickHandler() {
-        @Override
-        public void onClick(ClickEvent event) {
-          stagedImagesPanel.remove(ImagePreview.this);
-          UploadStagePanel.this.setVisible(stagedImagesPanel.getWidgetCount() != 0);
-          popup.setVisible(false);
-          popup.clear();
-        }
-      });
+      deleteIcon.addClickHandler(
+          new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+              stagedImagesPanel.remove(ImagePreview.this);
+              UploadStagePanel.this.setVisible(stagedImagesPanel.getWidgetCount() != 0);
+              popup.setVisible(false);
+              popup.clear();
+            }
+          });
 
       Label projectLabel = new Label("Project: " + project);
       projectLabel.setStyleName("imagare-stage-label");
@@ -204,12 +225,13 @@
     }
 
     private void hideDeleteIcon() {
-      deleteIconHideTimer = new Timer() {
-        @Override
-        public void run() {
-          deleteIcon.setVisible(false);
-        }
-      };
+      deleteIconHideTimer =
+          new Timer() {
+            @Override
+            public void run() {
+              deleteIcon.setVisible(false);
+            }
+          };
       deleteIconHideTimer.schedule(20);
     }
 
@@ -225,15 +247,17 @@
       fileNameLabel.setStyleName("imagare-stage-image-title");
       add(fileNameLabel);
 
-      fileNameLabel.addDoubleClickHandler(new DoubleClickHandler() {
-        @Override
-        public void onDoubleClick(DoubleClickEvent event) {
-          fileNameLabel.setVisible(false);
-          FileNameEditPanel fileNameEditPanel = new FileNameEditPanel(ImagePreview.this, fileNameLabel);
-          insert(fileNameEditPanel, getWidgetIndex(fileNameLabel));
-          fileNameEditPanel.focusAndSelectAll();
-        }
-      });
+      fileNameLabel.addDoubleClickHandler(
+          new DoubleClickHandler() {
+            @Override
+            public void onDoubleClick(DoubleClickEvent event) {
+              fileNameLabel.setVisible(false);
+              FileNameEditPanel fileNameEditPanel =
+                  new FileNameEditPanel(ImagePreview.this, fileNameLabel);
+              insert(fileNameEditPanel, getWidgetIndex(fileNameLabel));
+              fileNameEditPanel.focusAndSelectAll();
+            }
+          });
     }
 
     private class FileNameEditPanel extends HorizontalPanel {
@@ -262,23 +286,25 @@
         add(fileNameBox);
         add(new Label(extension));
 
-        fileNameBox.addBlurHandler(new BlurHandler() {
-          @Override
-          public void onBlur(BlurEvent event) {
-            saveChanges();
-          }
-        });
+        fileNameBox.addBlurHandler(
+            new BlurHandler() {
+              @Override
+              public void onBlur(BlurEvent event) {
+                saveChanges();
+              }
+            });
 
-        fileNameBox.addKeyDownHandler(new KeyDownHandler() {
-          @Override
-          public void onKeyDown(KeyDownEvent event) {
-            if (event.getNativeKeyCode() == KEY_ESCAPE) {
-              discardChanges();
-            } else if (event.getNativeKeyCode() == KEY_ENTER) {
-              saveChanges();
-            }
-          }
-        });
+        fileNameBox.addKeyDownHandler(
+            new KeyDownHandler() {
+              @Override
+              public void onKeyDown(KeyDownEvent event) {
+                if (event.getNativeKeyCode() == KEY_ESCAPE) {
+                  discardChanges();
+                } else if (event.getNativeKeyCode() == KEY_ENTER) {
+                  saveChanges();
+                }
+              }
+            });
       }
 
       private void saveChanges() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadedImagesPanel.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadedImagesPanel.java
index 86884e3..2e010c3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadedImagesPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadedImagesPanel.java
@@ -92,118 +92,155 @@
       deleteIcon.setVisible(false);
       add(deleteIcon);
 
-      img.addMouseOverHandler(new MouseOverHandler() {
-        @Override
-        public void onMouseOver(MouseOverEvent event) {
-          if (!popup.isVisible()) {
-            Image previewImg = new Image(url);
-            previewImg.setStyleName("imagare-image-popup");
-            previewImg.getElement().setAttribute("style",
-                previewImg.getElement().getAttribute("style")
-                    + "position: absolute; top: " + (img.getAbsoluteTop() + img.getHeight() + 20) + "px; "
-                    + "left: " + img.getAbsoluteLeft() + "px;");
-            popup.add(previewImg);
+      img.addMouseOverHandler(
+          new MouseOverHandler() {
+            @Override
+            public void onMouseOver(MouseOverEvent event) {
+              if (!popup.isVisible()) {
+                Image previewImg = new Image(url);
+                previewImg.setStyleName("imagare-image-popup");
+                previewImg
+                    .getElement()
+                    .setAttribute(
+                        "style",
+                        previewImg.getElement().getAttribute("style")
+                            + "position: absolute; top: "
+                            + (img.getAbsoluteTop() + img.getHeight() + 20)
+                            + "px; "
+                            + "left: "
+                            + img.getAbsoluteLeft()
+                            + "px;");
+                popup.add(previewImg);
 
-            popup.show();
-            popup.setVisible(true);
-          }
+                popup.show();
+                popup.setVisible(true);
+              }
 
-          cancelHideFullScreenIcon();
-          fullScreenIcon.getElement().setAttribute("style",
-              fullScreenIcon.getElement().getAttribute("style")
-                  + "position: absolute; top: " + img.getAbsoluteTop() + "px; "
-                  + "left: " + img.getAbsoluteLeft() + "px;");
-          fullScreenIcon.setVisible(true);
+              cancelHideFullScreenIcon();
+              fullScreenIcon
+                  .getElement()
+                  .setAttribute(
+                      "style",
+                      fullScreenIcon.getElement().getAttribute("style")
+                          + "position: absolute; top: "
+                          + img.getAbsoluteTop()
+                          + "px; "
+                          + "left: "
+                          + img.getAbsoluteLeft()
+                          + "px;");
+              fullScreenIcon.setVisible(true);
 
-          cancelHideDeleteIcon();
-          deleteIcon.getElement().setAttribute("style",
-              deleteIcon.getElement().getAttribute("style")
-                  + "position: absolute; top: " + img.getAbsoluteTop() + "px; "
-                  + "left: " + (img.getAbsoluteLeft() + fullScreenIcon.getWidth()) + "px;");
-          deleteIcon.setVisible(true);
-        }
-      });
-      img.addMouseOutHandler(new MouseOutHandler() {
-        @Override
-        public void onMouseOut(MouseOutEvent event) {
-          popup.setVisible(false);
-          popup.clear();
-          hideFullScreenIcon();
-          hideDeleteIcon();
-        }
-      });
+              cancelHideDeleteIcon();
+              deleteIcon
+                  .getElement()
+                  .setAttribute(
+                      "style",
+                      deleteIcon.getElement().getAttribute("style")
+                          + "position: absolute; top: "
+                          + img.getAbsoluteTop()
+                          + "px; "
+                          + "left: "
+                          + (img.getAbsoluteLeft() + fullScreenIcon.getWidth())
+                          + "px;");
+              deleteIcon.setVisible(true);
+            }
+          });
+      img.addMouseOutHandler(
+          new MouseOutHandler() {
+            @Override
+            public void onMouseOut(MouseOutEvent event) {
+              popup.setVisible(false);
+              popup.clear();
+              hideFullScreenIcon();
+              hideDeleteIcon();
+            }
+          });
 
-      fullScreenIcon.addMouseOverHandler(new MouseOverHandler() {
-        @Override
-        public void onMouseOver(MouseOverEvent event) {
-          cancelHideFullScreenIcon();
-          cancelHideDeleteIcon();
-        }
-      });
+      fullScreenIcon.addMouseOverHandler(
+          new MouseOverHandler() {
+            @Override
+            public void onMouseOver(MouseOverEvent event) {
+              cancelHideFullScreenIcon();
+              cancelHideDeleteIcon();
+            }
+          });
 
-      fullScreenIcon.addMouseOutHandler(new MouseOutHandler() {
-        @Override
-        public void onMouseOut(MouseOutEvent event) {
-          hideFullScreenIcon();
-          hideDeleteIcon();
-        }
-      });
+      fullScreenIcon.addMouseOutHandler(
+          new MouseOutHandler() {
+            @Override
+            public void onMouseOut(MouseOutEvent event) {
+              hideFullScreenIcon();
+              hideDeleteIcon();
+            }
+          });
 
-      fullScreenIcon.addClickHandler(new ClickHandler() {
-        @Override
-        public void onClick(ClickEvent event) {
-          Window.open(url, "_blank", "");
-          popup.setVisible(false);
-          popup.clear();
-        }
-      });
+      fullScreenIcon.addClickHandler(
+          new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+              Window.open(url, "_blank", "");
+              popup.setVisible(false);
+              popup.clear();
+            }
+          });
 
-      deleteIcon.addMouseOverHandler(new MouseOverHandler() {
-        @Override
-        public void onMouseOver(MouseOverEvent event) {
-          cancelHideFullScreenIcon();
-          cancelHideDeleteIcon();
-        }
-      });
+      deleteIcon.addMouseOverHandler(
+          new MouseOverHandler() {
+            @Override
+            public void onMouseOver(MouseOverEvent event) {
+              cancelHideFullScreenIcon();
+              cancelHideDeleteIcon();
+            }
+          });
 
-      deleteIcon.addMouseOutHandler(new MouseOutHandler() {
-        @Override
-        public void onMouseOut(MouseOutEvent event) {
-          hideDeleteIcon();
-          hideFullScreenIcon();
-        }
-      });
+      deleteIcon.addMouseOutHandler(
+          new MouseOutHandler() {
+            @Override
+            public void onMouseOut(MouseOutEvent event) {
+              hideDeleteIcon();
+              hideFullScreenIcon();
+            }
+          });
 
-      deleteIcon.addClickHandler(new ClickHandler() {
-        @Override
-        public void onClick(ClickEvent event) {
-          new ConfirmationDialog("Delete Image",
-              new SafeHtmlBuilder().append("Are you sure you want to delete '" + fileName + "'?").br().br(),
-              new ConfirmationCallback() {
-                @Override
-                public void onOk() {
-                  new RestApi("projects").view(project)
-                      .view(Plugin.get().getPluginName(), "images").view(ref)
-                      .delete(new AsyncCallback<NoContent>() {
+      deleteIcon.addClickHandler(
+          new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+              new ConfirmationDialog(
+                      "Delete Image",
+                      new SafeHtmlBuilder()
+                          .append("Are you sure you want to delete '" + fileName + "'?")
+                          .br()
+                          .br(),
+                      new ConfirmationCallback() {
                         @Override
-                        public void onSuccess(NoContent info) {
-                          UploadedImagesPanel.this.remove(ImagePreview.this);
-                          uploadedImagesLabel.setVisible(
-                              UploadedImagesPanel.this.getWidgetCount() > 1);
+                        public void onOk() {
+                          new RestApi("projects")
+                              .view(project)
+                              .view(Plugin.get().getPluginName(), "images")
+                              .view(ref)
+                              .delete(
+                                  new AsyncCallback<NoContent>() {
+                                    @Override
+                                    public void onSuccess(NoContent info) {
+                                      UploadedImagesPanel.this.remove(ImagePreview.this);
+                                      uploadedImagesLabel.setVisible(
+                                          UploadedImagesPanel.this.getWidgetCount() > 1);
 
-                          popup.setVisible(false);
-                          popup.clear();
-                        }
+                                      popup.setVisible(false);
+                                      popup.clear();
+                                    }
 
-                        @Override
-                        public void onFailure(Throwable caught) {
-                          // never invoked
+                                    @Override
+                                    public void onFailure(Throwable caught) {
+                                      // never invoked
+                                    }
+                                  });
                         }
-                      });
-                }
-              }).center();
-        }
-      });
+                      })
+                  .center();
+            }
+          });
 
       CopyableLabel copyLabel = new CopyableLabel(url);
       copyLabel.setStyleName("imagare-uploaded-copy-label");
@@ -211,12 +248,13 @@
     }
 
     private void hideFullScreenIcon() {
-      fullScreenIconHideTimer = new Timer() {
-        @Override
-        public void run() {
-          fullScreenIcon.setVisible(false);
-        }
-      };
+      fullScreenIconHideTimer =
+          new Timer() {
+            @Override
+            public void run() {
+              fullScreenIcon.setVisible(false);
+            }
+          };
       fullScreenIconHideTimer.schedule(20);
     }
 
@@ -228,12 +266,13 @@
     }
 
     private void hideDeleteIcon() {
-      deleteIconHideTimer = new Timer() {
-        @Override
-        public void run() {
-          deleteIcon.setVisible(false);
-        }
-      };
+      deleteIconHideTimer =
+          new Timer() {
+            @Override
+            public void run() {
+              deleteIcon.setVisible(false);
+            }
+          };
       deleteIconHideTimer.schedule(20);
     }
 
