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 9494bfb..6ea433c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
@@ -44,8 +44,7 @@
 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;
@@ -54,7 +53,8 @@
   private final PermissionBackend permissionBackend;
 
   @Inject
-  public DeleteImage(@PluginName String pluginName,
+  public DeleteImage(
+      @PluginName String pluginName,
       Provider<IdentifiedUser> self,
       GitRepositoryManager repoManager,
       GitReferenceUpdated referenceUpdated,
@@ -68,19 +68,20 @@
 
   @Override
   public Response<?> apply(ImageResource rsrc, Input input)
-      throws AuthException, ResourceConflictException,
-      RepositoryNotFoundException, IOException, ResourceNotFoundException,
-      PermissionBackendException {
+      throws AuthException, ResourceConflictException, RepositoryNotFoundException, IOException,
+          ResourceNotFoundException, PermissionBackendException {
 
-    if (!permissionBackend.user(self).ref(rsrc.getBranchKey()).testOrFalse(
-        RefPermission.DELETE)) {
-      permissionBackend.user(self).test(new PluginPermission(pluginName,
-          DeleteOwnImagesCapability.DELETE_OWN_IMAGES));
+    if (!permissionBackend.user(self).ref(rsrc.getBranchKey()).testOrFalse(RefPermission.DELETE)) {
+      permissionBackend
+          .user(self)
+          .test(new PluginPermission(pluginName, DeleteOwnImagesCapability.DELETE_OWN_IMAGES));
     }
 
     try (Repository r = repoManager.openRepository(rsrc.getProject())) {
-      if (!permissionBackend.user(self).ref(rsrc.getBranchKey()).testOrFalse(
-          RefPermission.DELETE)) {
+      if (!permissionBackend
+          .user(self)
+          .ref(rsrc.getBranchKey())
+          .testOrFalse(RefPermission.DELETE)) {
         validateOwnImage(r, rsrc.getRef());
       }
 
@@ -128,8 +129,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 177d502..4c5041b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
@@ -28,9 +28,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> {
@@ -46,8 +44,11 @@
   private final PermissionBackend permissionBackend;
 
   @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,
       PermissionBackend permissionBackend) {
     this.self = self;
     this.projectCache = projectCache;
@@ -66,25 +67,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 fd2ce65..185ae63 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
@@ -38,8 +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;
@@ -52,17 +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;
@@ -91,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);
@@ -106,9 +103,8 @@
       return;
     }
 
-    MimeType mimeType = fileTypeRegistry.getMimeType(key.file, (byte[])null);
-    if (!("image".equals(mimeType.getMediaType())
-          && fileTypeRegistry.isSafeInline(mimeType))) {
+    MimeType mimeType = fileTypeRegistry.getMimeType(key.file, (byte[]) null);
+    if (!("image".equals(mimeType.getMediaType()) && fileTypeRegistry.isSafeInline(mimeType))) {
       notFound(res);
       return;
     }
@@ -118,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;
@@ -130,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;
@@ -183,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;
@@ -196,8 +189,11 @@
           return;
         }
       }
-    } catch (RepositoryNotFoundException | NoSuchProjectException
-        | ResourceNotFoundException | AuthException | RevisionSyntaxException e) {
+    } catch (RepositoryNotFoundException
+        | NoSuchProjectException
+        | ResourceNotFoundException
+        | AuthException
+        | RevisionSyntaxException e) {
       notFound(res);
       return;
     }
@@ -212,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 2304a68..992bbff 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
@@ -28,15 +28,15 @@
 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;
   private final PermissionBackend permissionBackend;
 
   @Inject
-  public ImagesCollection(DynamicMap<RestView<ImageResource>> views,
+  public ImagesCollection(
+      DynamicMap<RestView<ImageResource>> views,
       Provider<PostImage> createImage,
       PermissionBackend permissionBackend) {
     this.views = views;
@@ -50,8 +50,7 @@
   }
 
   @Override
-  public ImageResource parse(ProjectResource parent, IdString id)
-      throws ResourceNotFoundException {
+  public ImageResource parse(ProjectResource parent, IdString id) throws ResourceNotFoundException {
     Branch.NameKey branchName = new Branch.NameKey(parent.getNameKey(), id.get());
     if (permissionBackend
         .user(parent.getControl().getUser())
@@ -69,8 +68,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 1de0838..f94f3ac 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
@@ -38,6 +38,9 @@
 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;
@@ -52,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 {
@@ -74,7 +73,8 @@
   private final String pluginName;
 
   @Inject
-  public PostImage(FileTypeRegistry registry,
+  public PostImage(
+      FileTypeRegistry registry,
       Provider<IdentifiedUser> self,
       GitRepositoryManager repoManager,
       GitReferenceUpdated referenceUpdated,
@@ -95,8 +95,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();
     }
@@ -109,9 +109,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);
@@ -129,8 +129,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");
         }
@@ -184,8 +183,8 @@
         oi.flush();
 
         if (!rc.canCreate(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);
@@ -193,12 +192,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);
@@ -208,8 +207,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 4a45db4..025475a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
@@ -15,10 +15,10 @@
 package com.googlesource.gerrit.plugins.imagare;
 
 import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
-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;
@@ -36,14 +36,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;
@@ -52,8 +49,11 @@
   private final PermissionBackend permissionBackend;
 
   @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,
       PermissionBackend permissionBackend) {
     this.self = self;
     this.projectCache = projectCache;
@@ -64,8 +64,8 @@
 
   @Override
   public Response<String> apply(AccountResource rsrc, Input input)
-      throws AuthException, RepositoryNotFoundException, IOException,
-      UnprocessableEntityException, PermissionBackendException {
+      throws AuthException, RepositoryNotFoundException, IOException, UnprocessableEntityException,
+          PermissionBackendException {
     if (self.get() != rsrc.getUser()) {
       permissionBackend.user(self).check(ADMINISTRATE_SERVER);
     }
@@ -75,20 +75,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 {
@@ -100,11 +98,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 {
@@ -128,13 +124,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 5fd4588..a146a2e 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) {
@@ -117,8 +120,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);
     }
 
