Merge "[CSS] Fix `pre` element overflow"
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index d4218a5..2176a47 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -1,10 +1,9 @@
-#Wed Jul 29 11:31:38 PDT 2009
 eclipse.preferences.version=1
 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 formatter_profile=_Google Format
 formatter_settings_version=11
 org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax;
+org.eclipse.jdt.ui.importorder=;
 org.eclipse.jdt.ui.ondemandthreshold=99
 org.eclipse.jdt.ui.staticondemandthreshold=99
 org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/blame-cache/src/main/java/com/google/gitiles/blame/BlameCache.java b/blame-cache/src/main/java/com/google/gitiles/blame/BlameCache.java
index 415cbdb..9ea4023 100644
--- a/blame-cache/src/main/java/com/google/gitiles/blame/BlameCache.java
+++ b/blame-cache/src/main/java/com/google/gitiles/blame/BlameCache.java
@@ -14,20 +14,15 @@
 
 package com.google.gitiles.blame;
 
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
 import java.io.IOException;
 import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
 
 public interface BlameCache {
   /** @return the blame of a path at a given commit. */
   List<Region> get(Repository repo, ObjectId commitId, String path) throws IOException;
 
-  /**
-   * @return the last commit that modified a path, starting at the given
-   *     commit.
-   */
-  ObjectId findLastCommit(Repository repo, ObjectId commitId, String path)
-      throws IOException;
+  /** @return the last commit that modified a path, starting at the given commit. */
+  ObjectId findLastCommit(Repository repo, ObjectId commitId, String path) throws IOException;
 }
diff --git a/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java b/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
index 66363b7..c088d81 100644
--- a/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
+++ b/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
@@ -25,7 +25,13 @@
 import com.google.common.collect.Interners;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import org.eclipse.jgit.blame.BlameGenerator;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
@@ -36,14 +42,6 @@
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.jgit.util.QuotedString;
 
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-
 /** Guava implementation of BlameCache, weighted by number of blame regions. */
 public class BlameCacheImpl implements BlameCache {
   public static CacheBuilder<Key, List<Region>> defaultBuilder() {
diff --git a/blame-cache/src/main/java/com/google/gitiles/blame/Region.java b/blame-cache/src/main/java/com/google/gitiles/blame/Region.java
index fbc9eb4..10ec0e3 100644
--- a/blame-cache/src/main/java/com/google/gitiles/blame/Region.java
+++ b/blame-cache/src/main/java/com/google/gitiles/blame/Region.java
@@ -16,11 +16,10 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
+import java.io.Serializable;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
 
-import java.io.Serializable;
-
 /** Region of the blame of a file. */
 public class Region implements Serializable, Comparable<Region> {
   private static final long serialVersionUID = 1L;
diff --git a/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java b/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
index 6cf73ad..1c4410a 100644
--- a/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
+++ b/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
@@ -24,7 +24,20 @@
 import com.google.gitiles.PathServlet;
 import com.google.gitiles.RepositoryDescription;
 import com.google.gitiles.RootedDocServlet;
-
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandler;
@@ -46,22 +59,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.URISyntaxException;
-import java.net.UnknownHostException;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.Servlet;
-import javax.servlet.http.HttpServletRequest;
-
 class DevServer {
   private static final Logger log = LoggerFactory.getLogger(PathServlet.class);
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/AbstractHttpFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/AbstractHttpFilter.java
index 275a427..f1a7657 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/AbstractHttpFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/AbstractHttpFilter.java
@@ -15,7 +15,6 @@
 package com.google.gitiles;
 
 import java.io.IOException;
-
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveFormat.java b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveFormat.java
index a44aa96..f29db45 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveFormat.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveFormat.java
@@ -18,7 +18,6 @@
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.archive.TarFormat;
 import org.eclipse.jgit.archive.Tbz2Format;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
index 8a3b1e2..f004c9f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
@@ -19,7 +19,10 @@
 
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
-
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -31,12 +34,6 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
 
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 public class ArchiveServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
index e839a9f..70c48f1 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
@@ -32,9 +32,6 @@
 import com.google.common.net.HttpHeaders;
 import com.google.gson.FieldNamingPolicy;
 import com.google.gson.GsonBuilder;
-
-import org.joda.time.Instant;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -43,11 +40,11 @@
 import java.lang.reflect.Type;
 import java.util.Map;
 import java.util.zip.GZIPOutputStream;
-
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.joda.time.Instant;
 
 /** Base servlet class for Gitiles servlets that serve Soy templates. */
 public abstract class BaseServlet extends HttpServlet {
@@ -135,8 +132,7 @@
 
   /**
    * @param req in-progress request.
-   * @return the default {@link FormatType} used when {@code ?format=} is not
-   *     specified.
+   * @return the default {@link FormatType} used when {@code ?format=} is not specified.
    */
   protected FormatType getDefaultFormat(HttpServletRequest req) {
     return HTML;
@@ -195,8 +191,8 @@
    *
    * @param req in-progress request.
    * @param res in-progress response.
-   * @param templateName Soy template name; must be in one of the template files
-   *     defined in {@link Renderer}.
+   * @param templateName Soy template name; must be in one of the template files defined in {@link
+   *     Renderer}.
    * @param soyData data for Soy.
    * @throws IOException an error occurred during rendering.
    */
@@ -208,20 +204,18 @@
 
   /**
    * Start a streaming HTML response with header and footer rendered by Soy.
-   * <p>
-   * A streaming template includes the special template
-   * {@code gitiles.streamingPlaceholder} at the point where data is to be
-   * streamed. The template before and after this placeholder is rendered using
-   * the provided data map.
+   *
+   * <p>A streaming template includes the special template {@code gitiles.streamingPlaceholder} at
+   * the point where data is to be streamed. The template before and after this placeholder is
+   * rendered using the provided data map.
    *
    * @param req in-progress request.
    * @param res in-progress response.
-   * @param templateName Soy template name; must be in one of the template files
-   *     defined in {@link Renderer}.
+   * @param templateName Soy template name; must be in one of the template files defined in {@link
+   *     Renderer}.
    * @param soyData data for Soy.
-   * @return output stream to render to. The portion of the template before the
-   *     placeholder is already written and flushed; the portion after is
-   *     written only on calling {@code close()}.
+   * @return output stream to render to. The portion of the template before the placeholder is
+   *     already written and flushed; the portion after is written only on calling {@code close()}.
    * @throws IOException an error occurred during rendering the header.
    */
   protected OutputStream startRenderStreamingHtml(
@@ -298,14 +292,11 @@
 
   /**
    * Prepare the response to render plain text.
-   * <p>
-   * Unlike
-   * {@link #renderHtml(HttpServletRequest, HttpServletResponse, String, Map)}
-   * and
-   * {@link #renderJson(HttpServletRequest, HttpServletResponse, Object, Type)},
-   * which assume the data to render is already completely prepared, this method
-   * does not write any data, only headers, and returns the response's
-   * ready-to-use writer.
+   *
+   * <p>Unlike {@link #renderHtml(HttpServletRequest, HttpServletResponse, String, Map)} and {@link
+   * #renderJson(HttpServletRequest, HttpServletResponse, Object, Type)}, which assume the data to
+   * render is already completely prepared, this method does not write any data, only headers, and
+   * returns the response's ready-to-use writer.
    *
    * @param req in-progress request.
    * @param res in-progress response.
@@ -323,7 +314,6 @@
    * @param res in-progress response.
    * @param statusCode HTTP status code.
    * @param message full message text.
-   *
    * @throws IOException
    */
   protected void renderTextError(
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
index 41e0701..c505ed4 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
@@ -22,7 +22,9 @@
 import com.google.common.collect.Maps;
 import com.google.template.soy.data.SoyListData;
 import com.google.template.soy.data.SoyMapData;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 import org.eclipse.jgit.diff.RawText;
 import org.eclipse.jgit.errors.LargeObjectException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -33,11 +35,6 @@
 import org.eclipse.jgit.util.RawParseUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
 import prettify.parser.Prettify;
 import syntaxhighlight.ParseResult;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommentLinkInfo.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommentLinkInfo.java
index cf10241..2280c0f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommentLinkInfo.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommentLinkInfo.java
@@ -19,25 +19,25 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
-
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
- * Converts commit message text to soy data in accordance with
- * a commentlink rule.
- * <p>
- * Example:
+ * Converts commit message text to soy data in accordance with a commentlink rule.
+ *
+ * <p>Example:
+ *
  * <pre>
  *  new CommentLinkInfo(
  *      Pattern.compile("bug (\d+)"),
  *      "http://bugs/$1")
  *    .linkify("do something nice\n\nbug 5")
  * </pre>
- * <p>
- * returns a list of soy data objects:
+ *
+ * <p>returns a list of soy data objects:
+ *
  * <pre>
  * ImmutableList.of(
  *   ImmutableMap.of("text", "do something nice\n\n"),
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
index 429acae..4e917c4 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
@@ -25,7 +25,13 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Sets;
-
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.http.server.ServletUtils;
@@ -44,15 +50,6 @@
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 import org.eclipse.jgit.util.io.NullOutputStream;
 
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-
 /** Format-independent data about a single commit. */
 class CommitData {
   enum Field {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
index 4b75ffd..96f7f2f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -20,19 +20,16 @@
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.DiffList;
 import com.google.gitiles.CommitData.Field;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-
 public class CommitJsonData {
   static final ImmutableSet<Field> DEFAULT_FIELDS =
       Sets.immutableEnumSet(
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
index d5bd8fd..40c5f74 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -27,7 +27,12 @@
 import com.google.gitiles.CommitData.DiffList;
 import com.google.gitiles.CommitData.Field;
 import com.google.template.soy.data.restricted.NullData;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.lib.Constants;
@@ -37,14 +42,6 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.util.RelativeDateFormatter;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-
 /** Soy data converter for git commits. */
 public class CommitSoyData {
   static final ImmutableSet<Field> DEFAULT_FIELDS =
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java b/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
index 1915d73..0c7c942 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
@@ -17,28 +17,20 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
 import com.google.common.base.Optional;
-import com.google.common.base.Predicates;
 import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-import org.eclipse.jgit.lib.Config;
-import org.joda.time.Duration;
-
 import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 import javax.annotation.Nullable;
+import org.eclipse.jgit.lib.Config;
+import org.joda.time.Duration;
 
 /** Utilities for working with {@link Config} objects. */
 public class ConfigUtil {
   /**
    * Read a duration value from the configuration.
-   * <p>
-   * Durations can be written with unit suffixes, for example {@code "1 s"} or
-   * {@code "5 days"}. If units are not specified, milliseconds are assumed.
+   *
+   * <p>Durations can be written with unit suffixes, for example {@code "1 s"} or {@code "5 days"}.
+   * If units are not specified, milliseconds are assumed.
    *
    * @param config JGit config object.
    * @param section section to read, e.g. "google"
@@ -48,7 +40,10 @@
    * @return a standard duration representing the time read, or defaultValue.
    */
   public static Duration getDuration(
-      Config config, String section, String subsection, String name,
+      Config config,
+      String section,
+      String subsection,
+      String name,
       @Nullable Duration defaultValue) {
     long m = config.getTimeUnit(section, subsection, name, -1, MILLISECONDS);
     return m == -1 ? defaultValue : Duration.millis(m);
@@ -94,10 +89,9 @@
    * @param section section to read, e.g. "gitiles".
    * @param subsection subsection to read, e.g. "subsection".
    * @param name variable to read, e.g. "fixedTimeZone".
-   * @return a time zone read from parsing the specified config string value, or
-   *     {@link Optional#absent()} if not present. As in the behavior of
-   *     {@link TimeZone#getTimeZone(String)}, unknown time zones are treated as
-   *     GMT.
+   * @return a time zone read from parsing the specified config string value, or {@link
+   *     Optional#absent()} if not present. As in the behavior of {@link
+   *     TimeZone#getTimeZone(String)}, unknown time zones are treated as GMT.
    */
   public static Optional<TimeZone> getTimeZone(
       Config config, String section, String subsection, String name) {
@@ -105,13 +99,5 @@
     return id != null ? Optional.of(TimeZone.getTimeZone(id)) : Optional.<TimeZone>absent();
   }
 
-  private static Matcher matcher(String pattern, String valStr) {
-    return Pattern.compile(pattern).matcher(valStr);
-  }
-
-  private static boolean anyOf(String a, String... cases) {
-    return Iterables.any(ImmutableList.copyOf(cases), Predicates.equalTo(a.toLowerCase()));
-  }
-
   private ConfigUtil() {}
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java b/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java
index affe508..1f847a8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java
@@ -15,14 +15,12 @@
 package com.google.gitiles;
 
 import com.google.common.base.Optional;
-
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.util.SystemReader;
-
 import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.TimeZone;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.util.SystemReader;
 
 /** Date formatter similar in spirit to JGit's {@code GitDateFormatter}. */
 public class DateFormatter {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DebugRenderer.java b/gitiles-servlet/src/main/java/com/google/gitiles/DebugRenderer.java
index dd6830d..5a54cea 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DebugRenderer.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DebugRenderer.java
@@ -21,7 +21,6 @@
 import com.google.common.hash.HashCode;
 import com.google.template.soy.SoyFileSet;
 import com.google.template.soy.tofu.SoyTofu;
-
 import java.io.File;
 import java.net.URISyntaxException;
 import java.net.URL;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
index f912c3e..0953923 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
@@ -21,7 +21,17 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Queues;
-
+import java.io.File;
+import java.io.IOException;
+import java.text.Collator;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.http.server.ServletUtils;
@@ -33,25 +43,11 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 import org.eclipse.jgit.util.IO;
 
-import java.io.File;
-import java.io.IOException;
-import java.text.Collator;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
 /**
  * Default implementation of {@link GitilesAccess} with local repositories.
- * <p>
- * Repositories are scanned on-demand under the given path, configured by
- * default from {@code gitiles.basePath}. There is no access control beyond what
- * user the JVM is running under.
+ *
+ * <p>Repositories are scanned on-demand under the given path, configured by default from {@code
+ * gitiles.basePath}. There is no access control beyond what user the JVM is running under.
  */
 public class DefaultAccess implements GitilesAccess {
   private static final String ANONYMOUS_USER_KEY = "anonymous user";
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultRenderer.java b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultRenderer.java
index 238aa74..0d78e24 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultRenderer.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultRenderer.java
@@ -20,7 +20,6 @@
 import com.google.common.io.Resources;
 import com.google.template.soy.SoyFileSet;
 import com.google.template.soy.tofu.SoyTofu;
-
 import java.net.URL;
 import java.util.Map;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultUrls.java b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultUrls.java
index 7218a4b..67e42c0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultUrls.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultUrls.java
@@ -18,14 +18,13 @@
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-
 import javax.servlet.http.HttpServletRequest;
 
 /**
  * Default implementation of {@link GitilesUrls}.
- * <p>
- * This implementation uses statically-configured defaults, and thus assumes
- * that the servlet is running a single virtual host.
+ *
+ * <p>This implementation uses statically-configured defaults, and thus assumes that the servlet is
+ * running a single virtual host.
  */
 public class DefaultUrls implements GitilesUrls {
   private final String canonicalHostName;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
index fb4aa0f..785d452 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
@@ -20,7 +20,12 @@
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.reflect.TypeToken;
-
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.NameRevCommand;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -31,14 +36,6 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an API result describing an object. */
 public class DescribeServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
@@ -100,8 +97,7 @@
           SC_BAD_REQUEST,
           String.format(
               "Ambiguous short SHA-1 %s (%s)",
-              e.getAbbreviatedObjectId(),
-              Joiner.on(", ").join(e.getCandidates())));
+              e.getAbbreviatedObjectId(), Joiner.on(", ").join(e.getCandidates())));
       return null;
     }
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index 27b9852..273b0be 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -20,7 +20,14 @@
 import com.google.common.io.BaseEncoding;
 import com.google.gitiles.CommitData.Field;
 import com.google.gitiles.DateFormatter.Format;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -36,16 +43,6 @@
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an HTML page with all the diffs for a commit. */
 public class DiffServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/FormatType.java b/gitiles-servlet/src/main/java/com/google/gitiles/FormatType.java
index 4eca18d..7f8d62a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/FormatType.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/FormatType.java
@@ -18,7 +18,6 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.net.HttpHeaders;
-
 import javax.servlet.http.HttpServletRequest;
 
 /** Type of formatting to use in the response to the client. */
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
index 3b5427d..ec3b5ff 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
@@ -14,22 +14,20 @@
 
 package com.google.gitiles;
 
+import java.io.IOException;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
-import java.io.IOException;
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-
 /**
  * Git storage interface for Gitiles.
- * <p>
- * Each instance is associated with a single end-user request, which implicitly
- * includes information about the host and repository.
+ *
+ * <p>Each instance is associated with a single end-user request, which implicitly includes
+ * information about the host and repository.
  */
 public interface GitilesAccess {
   /** Factory for per-request access. */
@@ -40,26 +38,22 @@
   /**
    * List repositories on the host.
    *
-   * @param prefix repository base path to list. Trailing "/" is implicitly
-   *        added if missing. Null or empty string will match all repositories.
+   * @param prefix repository base path to list. Trailing "/" is implicitly added if missing. Null
+   *     or empty string will match all repositories.
    * @param branches branches to list along with each repository.
    * @return map of repository names to descriptions.
-   * @throws ServiceNotEnabledException to trigger an HTTP 403 Forbidden
-   *         (matching behavior in
-   *         {@link org.eclipse.jgit.http.server.RepositoryFilter}).
-   * @throws ServiceNotAuthorizedException to trigger an HTTP 401 Unauthorized
-   *         (matching behavior in
-   *         {@link org.eclipse.jgit.http.server.RepositoryFilter}).
+   * @throws ServiceNotEnabledException to trigger an HTTP 403 Forbidden (matching behavior in
+   *     {@link org.eclipse.jgit.http.server.RepositoryFilter}).
+   * @throws ServiceNotAuthorizedException to trigger an HTTP 401 Unauthorized (matching behavior in
+   *     {@link org.eclipse.jgit.http.server.RepositoryFilter}).
    * @throws IOException if an error occurred.
    */
-  Map<String, RepositoryDescription> listRepositories(
-      @Nullable String prefix, Set<String> branches)
+  Map<String, RepositoryDescription> listRepositories(@Nullable String prefix, Set<String> branches)
       throws ServiceNotEnabledException, ServiceNotAuthorizedException, IOException;
 
   /**
-   * @return an opaque object that uniquely identifies the end-user making the
-   *     request, and supports {@link Object#equals(Object)} and
-   *     {@link Object#hashCode()}. Never null.
+   * @return an opaque object that uniquely identifies the end-user making the request, and supports
+   *     {@link Object#equals(Object)} and {@link Object#hashCode()}. Never null.
    */
   Object getUserKey();
 
@@ -68,8 +62,7 @@
 
   /**
    * @return the description attached to the repository of this request.
-   * @throws IOException an error occurred reading the description string from
-   *         the repository.
+   * @throws IOException an error occurred reading the description string from the repository.
    */
   RepositoryDescription getRepositoryDescription() throws IOException;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesConfig.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesConfig.java
index 9793163..40fd6d0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesConfig.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesConfig.java
@@ -16,17 +16,15 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+import javax.servlet.FilterConfig;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
-import javax.servlet.FilterConfig;
-
 public class GitilesConfig {
   private static final String FILTER_CONFIG_PARAM = "configPath";
   private static final String PROPERTY_NAME = "com.google.gitiles.configPath";
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
index 4e5da10..3820521 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
@@ -30,14 +30,6 @@
 import com.google.gitiles.blame.BlameCacheImpl;
 import com.google.gitiles.blame.BlameServlet;
 import com.google.gitiles.doc.DocServlet;
-
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.http.server.glue.MetaFilter;
-import org.eclipse.jgit.http.server.glue.ServletBinder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.transport.resolver.FileResolver;
-import org.eclipse.jgit.transport.resolver.RepositoryResolver;
-
 import java.io.File;
 import java.io.IOException;
 import java.net.UnknownHostException;
@@ -45,7 +37,6 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.regex.Pattern;
-
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -55,11 +46,17 @@
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.http.server.glue.MetaFilter;
+import org.eclipse.jgit.http.server.glue.ServletBinder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.transport.resolver.FileResolver;
+import org.eclipse.jgit.transport.resolver.RepositoryResolver;
 
 /**
  * MetaFilter to serve Gitiles.
- * <p>
- * Do not use directly; use {@link GitilesServlet}.
+ *
+ * <p>Do not use directly; use {@link GitilesServlet}.
  */
 class GitilesFilter extends MetaFilter {
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesServlet.java
index 7a14ba2..3cf4fd2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesServlet.java
@@ -15,13 +15,7 @@
 package com.google.gitiles;
 
 import com.google.gitiles.blame.BlameCache;
-
-import org.eclipse.jgit.http.server.glue.MetaServlet;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.transport.resolver.RepositoryResolver;
-
 import java.util.Enumeration;
-
 import javax.annotation.Nullable;
 import javax.servlet.Filter;
 import javax.servlet.FilterConfig;
@@ -30,14 +24,16 @@
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
+import org.eclipse.jgit.http.server.glue.MetaServlet;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.transport.resolver.RepositoryResolver;
 
 /**
  * Servlet to serve Gitiles.
- * <p>
- * This servlet can either be constructed manually with its dependencies, or
- * configured to use default implementations for the Gitiles interfaces. To
- * configure the defaults, you must provide a single init parameter
- * "configPath", which is the path to a git config file containing additional
+ *
+ * <p>This servlet can either be constructed manually with its dependencies, or configured to use
+ * default implementations for the Gitiles interfaces. To configure the defaults, you must provide a
+ * single init parameter "configPath", which is the path to a git config file containing additional
  * configuration.
  */
 public class GitilesServlet extends MetaServlet {
@@ -108,8 +104,8 @@
 
   /**
    * Add a custom filter for a view.
-   * <p>
-   * Must be called before initializing the servlet.
+   *
+   * <p>Must be called before initializing the servlet.
    *
    * @param view view type.
    * @param filter filter.
@@ -120,8 +116,8 @@
 
   /**
    * Set a custom handler for a view.
-   * <p>
-   * Must be called before initializing the servlet.
+   *
+   * <p>Must be called before initializing the servlet.
    *
    * @param view view type.
    * @param handler handler.
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesUrls.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesUrls.java
index 53dddc9..2d07c49 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesUrls.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesUrls.java
@@ -17,23 +17,20 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.google.common.base.Function;
-
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
-
 import javax.servlet.http.HttpServletRequest;
 
 /** Interface for URLs displayed on source browsing pages. */
 public interface GitilesUrls {
   /**
    * Escapes repository or path names to be safely embedded into a URL.
-   * <p>
-   * This escape implementation escapes a repository or path name such as
-   * "foo/bar&lt;/child" to appear as "foo/bar%3C/child". Spaces are escaped as
-   * "%20". Its purpose is to escape a repository name to be safe for inclusion
-   * in the path component of the URL, where "/" is a valid character that
-   * should not be encoded, while almost any other non-alpha, non-numeric
-   * character will be encoded using URL style encoding.
+   *
+   * <p>This escape implementation escapes a repository or path name such as "foo/bar&lt;/child" to
+   * appear as "foo/bar%3C/child". Spaces are escaped as "%20". Its purpose is to escape a
+   * repository name to be safe for inclusion in the path component of the URL, where "/" is a valid
+   * character that should not be encoded, while almost any other non-alpha, non-numeric character
+   * will be encoded using URL style encoding.
    */
   Function<String, String> NAME_ESCAPER =
       new Function<String, String>() {
@@ -55,7 +52,7 @@
   /**
    * Return the name of the host from the request.
    *
-   * Used in various user-visible text, like "MyHost Git Repositories".
+   * <p>Used in various user-visible text, like "MyHost Git Repositories".
    *
    * @param req request.
    * @return host name; may be null.
@@ -74,8 +71,7 @@
    * Return the base URL for Gerrit projects on this host.
    *
    * @param req request.
-   * @return base URL for Gerrit Code Review, or null if Gerrit is not
-   *     configured.
+   * @return base URL for Gerrit Code Review, or null if Gerrit is not configured.
    */
   String getBaseGerritUrl(HttpServletRequest req);
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
index 057ebf4..c792634 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -32,10 +32,6 @@
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
-
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.revwalk.RevObject;
-
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
@@ -43,16 +39,16 @@
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
-
 import javax.servlet.http.HttpServletRequest;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.revwalk.RevObject;
 
 /**
  * Information about a view in Gitiles.
- * <p>
- * Views are uniquely identified by a type, and dispatched to servlet types by
- * {@link GitilesServlet}. This class contains the list of all types, as
- * well as some methods containing basic information parsed from the URL.
- * Construction happens in {@link ViewFilter}.
+ *
+ * <p>Views are uniquely identified by a type, and dispatched to servlet types by {@link
+ * GitilesServlet}. This class contains the list of all types, as well as some methods containing
+ * basic information parsed from the URL. Construction happens in {@link ViewFilter}.
  */
 public class GitilesView {
   private static final String DEFAULT_ARCHIVE_EXTENSION = ".tar.gz";
@@ -170,9 +166,8 @@
 
     public Builder setRepositoryPrefix(String prefix) {
       if (type == Type.HOST_INDEX) {
-        this.repositoryPrefix = prefix != null
-            ? Strings.emptyToNull(maybeTrimLeadingAndTrailingSlash(prefix))
-            : null;
+        this.repositoryPrefix =
+            prefix != null ? Strings.emptyToNull(maybeTrimLeadingAndTrailingSlash(prefix)) : null;
         return this;
       }
       throw new IllegalStateException(
@@ -731,9 +726,8 @@
   }
 
   /**
-   * @return a list of maps with "text" and "url" keys for all file paths
-   *     leading up to the path represented by this view. All URLs allow
-   *     auto-diving into one-entry subtrees; see also
+   * @return a list of maps with "text" and "url" keys for all file paths leading up to the path
+   *     represented by this view. All URLs allow auto-diving into one-entry subtrees; see also
    *     {@link #getBreadcrumbs(List)}.
    */
   public List<Map<String, String>> getBreadcrumbs() {
@@ -743,13 +737,12 @@
   private static final EnumSet<Type> NON_HTML_TYPES = EnumSet.of(Type.DESCRIBE, Type.ARCHIVE);
 
   /**
-   * @param hasSingleTree list of booleans, one per path entry in this view's
-   *     path excluding the leaf. True entries indicate the tree at that path
-   *     only has a single entry that is another tree.
-   * @return a list of maps with "text" and "url" keys for all file paths
-   *     leading up to the path represented by this view. URLs whose
-   *     corresponding entry in {@code hasSingleTree} is true will disable
-   *     auto-diving into one-entry subtrees.
+   * @param hasSingleTree list of booleans, one per path entry in this view's path excluding the
+   *     leaf. True entries indicate the tree at that path only has a single entry that is another
+   *     tree.
+   * @return a list of maps with "text" and "url" keys for all file paths leading up to the path
+   *     represented by this view. URLs whose corresponding entry in {@code hasSingleTree} is true
+   *     will disable auto-diving into one-entry subtrees.
    */
   public List<Map<String, String>> getBreadcrumbs(List<Boolean> hasSingleTree) {
     checkArgument(!NON_HTML_TYPES.contains(type), "breadcrumbs for %s view not supported", type);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitwebRedirectFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitwebRedirectFilter.java
index 6578891..f1e01bc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitwebRedirectFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitwebRedirectFilter.java
@@ -27,19 +27,16 @@
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.gitiles.GitilesView.InvalidViewException;
-
-import org.eclipse.jgit.lib.ObjectId;
-
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.util.List;
 import java.util.regex.Pattern;
-
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.ObjectId;
 
 /** Filter to redirect Gitweb-style URLs to Gitiles-style URLs. */
 public class GitwebRedirectFilter extends AbstractHttpFilter {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
index ca35727..da79ea9 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
@@ -26,17 +26,9 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import com.google.gson.reflect.TypeToken;
-import com.google.template.soy.data.SoyData;
 import com.google.template.soy.data.SoyListData;
 import com.google.template.soy.data.SoyMapData;
-
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
-import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import com.google.template.soy.data.restricted.NullData;
 import java.io.IOException;
 import java.io.Writer;
 import java.util.Collections;
@@ -44,10 +36,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
 import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
+import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Serves the top level index page for a Gitiles host. */
 public class HostIndexServlet extends BaseServlet {
@@ -163,7 +160,7 @@
             "hostName",
             hostName,
             "breadcrumbs",
-            SoyData.createFromExistingData(breadcrumbs),
+            breadcrumbs != null ? new SoyListData(breadcrumbs) : NullData.INSTANCE,
             "prefix",
             prefix != null ? prefix + '/' : "",
             "repositories",
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/HtmlDiffFormatter.java b/gitiles-servlet/src/main/java/com/google/gitiles/HtmlDiffFormatter.java
index 4998f94..a290642 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/HtmlDiffFormatter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/HtmlDiffFormatter.java
@@ -20,7 +20,10 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
@@ -30,11 +33,6 @@
 import org.eclipse.jgit.patch.FileHeader.PatchType;
 import org.eclipse.jgit.util.RawParseUtils;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Map;
-
 /** Formats a unified format patch as UTF-8 encoded HTML. */
 final class HtmlDiffFormatter extends DiffFormatter {
   private static final byte[] DIFF_BEGIN = "<pre class=\"u-pre Diff-unified\">".getBytes(UTF_8);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/IdentRevFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/IdentRevFilter.java
index 5493452..745debd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/IdentRevFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/IdentRevFilter.java
@@ -15,7 +15,7 @@
 package com.google.gitiles;
 
 import com.google.common.annotations.VisibleForTesting;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.errors.StopWalkException;
@@ -24,8 +24,6 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.revwalk.filter.RevFilter;
 
-import java.io.IOException;
-
 /** Filter which only includes commits matching a person identity. */
 public abstract class IdentRevFilter extends RevFilter {
   public static IdentRevFilter author(String author) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java b/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
index e513ec4..e3110dd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
@@ -20,11 +20,6 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
-
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -32,8 +27,10 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
-
 import javax.servlet.http.HttpServletRequest;
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Linkifier for blocks of text such as commit message descriptions. */
 public class Linkifier {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index fd3f3f9..5f17081 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -29,7 +29,16 @@
 import com.google.gitiles.CommitData.Field;
 import com.google.gitiles.DateFormatter.Format;
 import com.google.gson.reflect.TypeToken;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.diff.DiffConfig;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -44,6 +53,7 @@
 import org.eclipse.jgit.revwalk.FollowFilter;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevSort;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.revwalk.filter.AndRevFilter;
@@ -55,18 +65,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an HTML page with a shortlog for commits and paths. */
 public class LogServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
@@ -97,7 +95,7 @@
     Paginator paginator = null;
     try {
       GitilesAccess access = getAccess(req);
-      paginator = newPaginator(repo, view, getAccess(req));
+      paginator = newPaginator(repo, view, access);
       if (paginator == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
@@ -158,12 +156,13 @@
 
     Paginator paginator = null;
     try {
-      paginator = newPaginator(repo, view, getAccess(req));
+      GitilesAccess access = getAccess(req);
+      paginator = newPaginator(repo, view, access);
       if (paginator == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
       }
-      DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
+      DateFormatter df = new DateFormatter(access, Format.DEFAULT);
       CommitJsonData.Log result = new CommitJsonData.Log();
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
@@ -236,24 +235,37 @@
       return null;
     }
     setTreeFilter(walk, view, access);
+    setRevFilter(walk, view);
+    if (isTrue(view, "topo-order")) {
+      walk.sort(RevSort.TOPO, true);
+    }
+    if (isTrue(view, "reverse")) {
+      walk.sort(RevSort.REVERSE, true);
+    }
+    return walk;
+  }
+
+  private static void setRevFilter(RevWalk walk, GitilesView view) {
     List<RevFilter> filters = new ArrayList<>(3);
-    if (isTrue(Iterables.getFirst(view.getParameters().get("no-merges"), null))) {
+    if (isTrue(view, "no-merges")) {
       filters.add(RevFilter.NO_MERGES);
     }
+
     String author = Iterables.getFirst(view.getParameters().get("author"), null);
     if (author != null) {
       filters.add(IdentRevFilter.author(author));
     }
+
     String committer = Iterables.getFirst(view.getParameters().get("committer"), null);
     if (committer != null) {
       filters.add(IdentRevFilter.committer(committer));
     }
+
     if (filters.size() > 1) {
       walk.setRevFilter(AndRevFilter.create(filters));
     } else if (filters.size() == 1) {
       walk.setRevFilter(filters.get(0));
     }
-    return walk;
   }
 
   private static void setTreeFilter(RevWalk walk, GitilesView view, GitilesAccess access)
@@ -277,6 +289,10 @@
     }
   }
 
+  private static boolean isTrue(GitilesView view, String param) {
+    return isTrue(Iterables.getFirst(view.getParameters().get(param), null));
+  }
+
   private static boolean isTrue(String v) {
     if (v == null) {
       return false;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
index 6d1a1c8..56ddb8f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -23,21 +23,18 @@
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.Field;
 import com.google.template.soy.tofu.SoyTofu;
-
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-
 public class LogSoyData {
   private static final ImmutableSet<Field> FIELDS =
       Sets.immutableEnumSet(
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/MimeTypes.java b/gitiles-servlet/src/main/java/com/google/gitiles/MimeTypes.java
index ed219ce..440503c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/MimeTypes.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/MimeTypes.java
@@ -16,7 +16,6 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableMap;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Map;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java b/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
index 019d33c..3060e45 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
@@ -18,6 +18,13 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -29,26 +36,15 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.annotation.Nullable;
-
 /**
  * Wrapper around {@link RevWalk} that paginates for Gitiles.
  *
- * A single page of a shortlog is defined by a revision range, such as "master"
- * or "master..next", a page size, and a start commit, such as "c0ffee". The
- * distance between the first commit in the walk ("next") and the first commit
- * in the page may be arbitrarily long, but in order to present the commit list
- * in a stable way, we must always start from the first commit in the walk. This
- * is because there may be arbitrary merge commits between "c0ffee" and "next"
- * that effectively insert arbitrary commits into the history starting from
- * "c0ffee".
+ * <p>A single page of a shortlog is defined by a revision range, such as "master" or
+ * "master..next", a page size, and a start commit, such as "c0ffee". The distance between the first
+ * commit in the walk ("next") and the first commit in the page may be arbitrarily long, but in
+ * order to present the commit list in a stable way, we must always start from the first commit in
+ * the walk. This is because there may be arbitrary merge commits between "c0ffee" and "next" that
+ * effectively insert arbitrary commits into the history starting from "c0ffee".
  */
 class Paginator implements Iterable<RevCommit> {
   private static class RenameWatcher extends RenameCallback {
@@ -82,8 +78,7 @@
    *
    * @param walk revision walk; must be fully initialized before calling.
    * @param limit page size.
-   * @param start commit at which to start the walk, or null to start at the
-   *     beginning.
+   * @param start commit at which to start the walk, or null to start at the beginning.
    */
   Paginator(RevWalk walk, int limit, @Nullable ObjectId start)
       throws MissingObjectException, IncorrectObjectTypeException, IOException {
@@ -122,7 +117,6 @@
    * Get the next element in this page of the walk.
    *
    * @return the next element, or null if the walk is finished.
-   *
    * @throws MissingObjectException See {@link RevWalk#next()}.
    * @throws IncorrectObjectTypeException See {@link RevWalk#next()}.
    * @throws IOException See {@link RevWalk#next()}.
@@ -166,33 +160,31 @@
   }
 
   /**
-   * @return the ID at the start of the page of results preceding this one, or
-   *     null if this is the first page.
+   * @return the ID at the start of the page of results preceding this one, or null if this is the
+   *     first page.
    */
   public ObjectId getPreviousStart() {
     return prevStart;
   }
 
   /**
-   * @return the ID at the start of the page of results after this one, or null
-   *     if this is the last page.
+   * @return the ID at the start of the page of results after this one, or null if this is the last
+   *     page.
    */
   public ObjectId getNextStart() {
     checkState(done, "getNextStart() invalid before walk done");
     return nextStart;
   }
 
-  /**
-   * @return entry corresponding to a rename or copy at the given commit.
-   */
+  /** @return entry corresponding to a rename or copy at the given commit. */
   public DiffEntry getRename(ObjectId commitId) {
     return renamed != null ? renamed.get(commitId) : null;
   }
 
   /**
    * @return an iterator over the commits in this walk.
-   * @throws RevWalkException if an error occurred, wrapping the checked
-   *     exception from {@link #next()}.
+   * @throws RevWalkException if an error occurred, wrapping the checked exception from {@link
+   *     #next()}.
    */
   @Override
   public Iterator<RevCommit> iterator() {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
index 91e7060..804d5b3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
@@ -29,7 +29,14 @@
 import com.google.common.collect.Maps;
 import com.google.common.io.BaseEncoding;
 import com.google.common.primitives.Bytes;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.LargeObjectException;
@@ -57,16 +64,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an HTML page with detailed information about a path within a tree. */
 // TODO(dborowitz): Handle non-UTF-8 names.
 public class PathServlet extends BaseServlet {
@@ -77,8 +74,8 @@
   static final String TYPE_HEADER = "X-Gitiles-Object-Type";
 
   /**
-   * Submodule URLs where we know there is a web page if the user visits the
-   * repository URL verbatim in a web browser.
+   * Submodule URLs where we know there is a web page if the user visits the repository URL verbatim
+   * in a web browser.
    */
   private static final Pattern VERBATIM_SUBMODULE_URL_PATTERN =
       Pattern.compile(
@@ -347,9 +344,9 @@
 
   /**
    * Encapsulate the result of walking to a single tree.
-   * <p>
-   * Unlike {@link TreeWalk} itself, supports positioning at the root tree.
-   * Includes information to help the auto-dive routine as well.
+   *
+   * <p>Unlike {@link TreeWalk} itself, supports positioning at the root tree. Includes information
+   * to help the auto-dive routine as well.
    */
   private static class WalkResult implements AutoCloseable {
     private static WalkResult recursivePath(RevWalk rw, GitilesView view) throws IOException {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/PathUtil.java b/gitiles-servlet/src/main/java/com/google/gitiles/PathUtil.java
index e67223f..2df8cdc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathUtil.java
@@ -18,7 +18,6 @@
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.io.Files;
-
 import java.util.StringTokenizer;
 
 /** Static utilities for dealing with pathnames. */
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java b/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
index 3dcf1ea..e6c5736 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
@@ -13,11 +13,12 @@
 // limitations under the License.
 
 package com.google.gitiles;
+
 import com.google.gitiles.doc.GitilesMarkdown;
 import com.google.gitiles.doc.MarkdownConfig;
 import com.google.gitiles.doc.MarkdownToHtml;
 import com.google.template.soy.data.SanitizedContent;
-
+import java.io.IOException;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -30,8 +31,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
 class ReadmeHelper {
   private static final Logger log = LoggerFactory.getLogger(ReadmeHelper.class);
 
@@ -103,10 +102,7 @@
       log.error(
           String.format(
               "error rendering %s/%s %s:%s",
-              view.getHostName(),
-              view.getRepositoryName(),
-              view.getRevision(),
-              readmePath),
+              view.getHostName(), view.getRepositoryName(), view.getRevision(), readmePath),
           err);
       return null;
     }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
index f434586..5aa4119 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -25,7 +25,15 @@
 import com.google.common.primitives.Ints;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.google.gson.reflect.TypeToken;
-
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.Constants;
@@ -35,17 +43,6 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.transport.RefAdvertiser;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an HTML page with all the refs in a repository. */
 public class RefServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/Renderer.java b/gitiles-servlet/src/main/java/com/google/gitiles/Renderer.java
index 694a3c3..7030694 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Renderer.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Renderer.java
@@ -31,7 +31,6 @@
 import com.google.common.io.ByteStreams;
 import com.google.common.net.HttpHeaders;
 import com.google.template.soy.tofu.SoyTofu;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -41,15 +40,14 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 /**
  * Renderer for Soy templates used by Gitiles.
- * <p>
- * Most callers should not use the methods in this class directly, and instead
- * use one of the HTML methods in {@link BaseServlet}.
+ *
+ * <p>Most callers should not use the methods in this class directly, and instead use one of the
+ * HTML methods in {@link BaseServlet}.
  */
 public abstract class Renderer {
   // Must match .streamingPlaceholder.
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
index bbaabc5..ffb4a55 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
@@ -21,6 +21,11 @@
 import static org.eclipse.jgit.http.server.GitSmartHttpTools.sendError;
 import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
 
+import java.io.IOException;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.transport.ServiceMayNotContinueException;
@@ -28,13 +33,6 @@
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
-import java.io.IOException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 class RepositoryFilter extends AbstractHttpFilter {
   private final RepositoryResolver<HttpServletRequest> resolver;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index 3b754df..7ce3720 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -26,7 +26,13 @@
 import com.google.gitiles.doc.MarkdownConfig;
 import com.google.gson.reflect.TypeToken;
 import com.google.template.soy.data.SanitizedContent;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.Config;
@@ -38,15 +44,6 @@
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves the index page for a repository, if accessed directly by a browser. */
 public class RepositoryIndexServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/Revision.java b/gitiles-servlet/src/main/java/com/google/gitiles/Revision.java
index 356fbc7..3fc8d37 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Revision.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Revision.java
@@ -21,7 +21,8 @@
 import static org.eclipse.jgit.lib.Constants.OBJ_TAG;
 
 import com.google.common.annotations.VisibleForTesting;
-
+import java.io.IOException;
+import java.util.Objects;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.Constants;
@@ -29,14 +30,11 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-import java.io.IOException;
-import java.util.Objects;
-
 /**
  * Object encapsulating a single revision as seen by Gitiles.
- * <p>
- * A single revision consists of a name, an ID, and a type. Name parsing is done
- * once per request by {@link RevisionParser}.
+ *
+ * <p>A single revision consists of a name, an ID, and a type. Name parsing is done once per request
+ * by {@link RevisionParser}.
  */
 public class Revision {
   /** Sentinel indicating a missing or empty revision. */
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
index f837bca..9b2d044 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
@@ -21,7 +21,8 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Splitter;
-
+import java.io.IOException;
+import java.util.Objects;
 import org.eclipse.jgit.errors.AmbiguousObjectException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.errors.RevisionSyntaxException;
@@ -32,9 +33,6 @@
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-import java.io.IOException;
-import java.util.Objects;
-
 /** Object to parse revisions out of Gitiles paths. */
 class RevisionParser {
   private static final Splitter OPERATOR_SPLITTER = Splitter.on(CharMatcher.anyOf("^~"));
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
index cc80490..a126c7e 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -28,7 +28,13 @@
 import com.google.gitiles.CommitData.Field;
 import com.google.gitiles.CommitJsonData.Commit;
 import com.google.gitiles.DateFormatter.Format;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.http.server.ServletUtils;
@@ -46,15 +52,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an HTML page with detailed information about a ref. */
 public class RevisionServlet extends BaseServlet {
   private static final ImmutableSet<Field> COMMIT_SOY_FIELDS =
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RootedDocServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RootedDocServlet.java
index 057aba8..90c6e07 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RootedDocServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RootedDocServlet.java
@@ -17,7 +17,12 @@
 import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
 
 import com.google.gitiles.doc.DocServlet;
-
+import java.io.IOException;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+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.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
@@ -30,14 +35,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves Markdown at the root of a host. */
 public class RootedDocServlet extends HttpServlet {
   private static final Logger log = LoggerFactory.getLogger(ViewFilter.class);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
index 8401551..831cb8e 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
@@ -15,14 +15,11 @@
 package com.google.gitiles;
 
 import com.google.common.collect.Maps;
-
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevTag;
 
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
 /** Soy data converter for git tags. */
 public class TagSoyData {
   private final Linkifier linkifier;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ThreadSafePrettifyParser.java b/gitiles-servlet/src/main/java/com/google/gitiles/ThreadSafePrettifyParser.java
index 36646aa..b529ea8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ThreadSafePrettifyParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ThreadSafePrettifyParser.java
@@ -15,7 +15,6 @@
 package com.google.gitiles;
 
 import java.util.Collections;
-
 import prettify.PrettifyParser;
 import prettify.parser.Prettify;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TimeCache.java b/gitiles-servlet/src/main/java/com/google/gitiles/TimeCache.java
index 7021733..1a931e3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TimeCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TimeCache.java
@@ -17,7 +17,9 @@
 import com.google.common.base.Throwables;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
-
+import java.io.IOException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
@@ -26,16 +28,12 @@
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-import java.io.IOException;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-
 /**
  * Cache of the time associated with Git objects.
- * <p>
- * Uses the time as stored in annotated tags if available, or else the commit
- * time of the tagged commit. Non-commits are given {@link Long#MIN_VALUE},
- * rather than searching for occurrences in the entire repository.
+ *
+ * <p>Uses the time as stored in annotated tags if available, or else the commit time of the tagged
+ * commit. Non-commits are given {@link Long#MIN_VALUE}, rather than searching for occurrences in
+ * the entire repository.
  */
 public class TimeCache {
   public static CacheBuilder<Object, Object> defaultBuilder() {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
index 998d546..212099c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
@@ -17,16 +17,14 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.google.common.collect.Lists;
-
+import java.io.IOException;
+import java.util.List;
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.treewalk.TreeWalk;
 
-import java.io.IOException;
-import java.util.List;
-
 class TreeJsonData {
   static class Tree {
     String id;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
index f32e2cf..1e4e4b7 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
@@ -23,7 +23,9 @@
 import com.google.common.collect.Maps;
 import com.google.gitiles.PathServlet.FileType;
 import com.google.gitiles.doc.MarkdownConfig;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
@@ -31,22 +33,17 @@
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.treewalk.TreeWalk;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
 /** Soy data converter for git trees. */
 public class TreeSoyData {
   /**
-   * Number of characters to display for a symlink target. Targets longer than
-   * this are abbreviated for display in a tree listing.
+   * Number of characters to display for a symlink target. Targets longer than this are abbreviated
+   * for display in a tree listing.
    */
   private static final int MAX_SYMLINK_TARGET_LENGTH = 72;
 
   /**
-   * Maximum number of bytes to load from a blob that claims to be a symlink. If
-   * the blob is larger than this byte limit it will be displayed as a binary
-   * file instead of as a symlink.
+   * Maximum number of bytes to load from a blob that claims to be a symlink. If the blob is larger
+   * than this byte limit it will be displayed as a binary file instead of as a symlink.
    */
   static final int MAX_SYMLINK_SIZE = 16 << 10;
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
index dbc9436..51e248e 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -21,19 +21,16 @@
 import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
 
 import com.google.common.base.Strings;
-
-import org.eclipse.jgit.http.server.ServletUtils;
-import org.eclipse.jgit.http.server.glue.WrappedRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.Map;
-
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.http.server.ServletUtils;
+import org.eclipse.jgit.http.server.glue.WrappedRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Filter to parse URLs and convert them to {@link GitilesView}s. */
 public class ViewFilter extends AbstractHttpFilter {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
index 6c1a7a2..657bba8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
@@ -30,7 +30,13 @@
 import com.google.common.cache.CacheBuilder;
 import com.google.common.collect.Collections2;
 import com.google.common.util.concurrent.ExecutionError;
-
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.lib.ObjectId;
@@ -41,14 +47,6 @@
 import org.eclipse.jgit.revwalk.RevSort;
 import org.eclipse.jgit.revwalk.RevWalk;
 
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Objects;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
 /** Cache of per-user object visibility. */
 public class VisibilityCache {
   private static class Key {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
index 2bb9dd3..bff70c2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
@@ -34,7 +34,12 @@
 import com.google.gson.reflect.TypeToken;
 import com.google.template.soy.data.SoyListData;
 import com.google.template.soy.data.SoyMapData;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.FileMode;
@@ -48,14 +53,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /** Serves an HTML page with blame data for a commit. */
 public class BlameServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/RegionAdapter.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/RegionAdapter.java
index eed270f..f2f1855 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/RegionAdapter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/RegionAdapter.java
@@ -20,10 +20,8 @@
 import com.google.gson.TypeAdapter;
 import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonWriter;
-
-import org.eclipse.jgit.lib.ObjectId;
-
 import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
 
 class RegionAdapter extends TypeAdapter<Region> {
   private final DateFormatter df;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/BlockNoteExtension.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/BlockNoteExtension.java
index 3ae747d..deda75a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/BlockNoteExtension.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/BlockNoteExtension.java
@@ -15,7 +15,6 @@
 package com.google.gitiles.doc;
 
 import com.google.common.collect.ImmutableSet;
-
 import org.commonmark.Extension;
 import org.commonmark.node.Block;
 import org.commonmark.parser.Parser;
@@ -29,6 +28,7 @@
 
 /**
  * CommonMark extension for block notes.
+ *
  * <pre>
  * *** note
  * This is a note.
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
index 9007928..a55084f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
@@ -34,7 +34,12 @@
 import com.google.gitiles.GitilesView;
 import com.google.gitiles.Renderer;
 import com.google.gitiles.ViewFilter;
-
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.commonmark.node.Node;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.LargeObjectException;
@@ -49,14 +54,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 public class DocServlet extends BaseServlet {
   private static final Logger log = LoggerFactory.getLogger(DocServlet.class);
   private static final long serialVersionUID = 1L;
@@ -275,10 +272,7 @@
     log.error(
         String.format(
             "cannot load markdown %s/%s %s %s",
-            view.getHostName(),
-            view.getRepositoryName(),
-            view.getRevision(),
-            view.getPathPart()),
+            view.getHostName(), view.getRepositoryName(), view.getRevision(), view.getPathPart()),
         err);
     res.setStatus(SC_INTERNAL_SERVER_ERROR);
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesHtmlExtension.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesHtmlExtension.java
index 2127400..435bb16 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesHtmlExtension.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesHtmlExtension.java
@@ -15,7 +15,8 @@
 package com.google.gitiles.doc;
 
 import com.google.gitiles.doc.html.HtmlBuilder;
-
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import org.commonmark.Extension;
 import org.commonmark.node.AbstractVisitor;
 import org.commonmark.node.HardLineBreak;
@@ -27,15 +28,13 @@
 import org.commonmark.parser.Parser.ParserExtension;
 import org.commonmark.parser.PostProcessor;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /**
  * Convert some {@link HtmlInline} and {@link HtmlBlock} to safe types.
- * <p>
- * Gitiles style Markdown accepts only a very small subset of HTML that is safe
- * for use within the document. This {@code PostProcessor} scans parsed nodes
- * and converts them to safer types for rendering:
+ *
+ * <p>Gitiles style Markdown accepts only a very small subset of HTML that is safe for use within
+ * the document. This {@code PostProcessor} scans parsed nodes and converts them to safer types for
+ * rendering:
+ *
  * <ul>
  * <li>{@link HardLineBreak}
  * <li>{@link ThematicBreak}
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java
index fcd00dc..cc50048 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java
@@ -15,7 +15,6 @@
 package com.google.gitiles.doc;
 
 import com.google.common.collect.ImmutableList;
-
 import org.commonmark.ext.autolink.AutolinkExtension;
 import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension;
 import org.commonmark.ext.gfm.tables.TablesExtension;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/ImageLoader.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/ImageLoader.java
index 4fca76a..b7b2531 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/ImageLoader.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/ImageLoader.java
@@ -19,7 +19,8 @@
 import com.google.gitiles.GitilesView;
 import com.google.gitiles.MimeTypes;
 import com.google.template.soy.shared.restricted.EscapingConventions.FilterImageDataUri;
-
+import java.io.IOException;
+import javax.annotation.Nullable;
 import org.eclipse.jgit.errors.LargeObjectException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
@@ -30,10 +31,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
-import javax.annotation.Nullable;
-
 /** Reads an image from Git and converts to {@code data:image/*;base64,...} */
 class ImageLoader {
   private static final Logger log = LoggerFactory.getLogger(ImageLoader.class);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownConfig.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownConfig.java
index f229f8e..5737d85 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownConfig.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownConfig.java
@@ -16,7 +16,6 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Config.SectionParser;
 import org.eclipse.jgit.util.StringUtils;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java
index d5218e7..f734949 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java
@@ -24,7 +24,8 @@
 import com.google.template.soy.data.SanitizedContent;
 import com.google.template.soy.shared.restricted.EscapingConventions.FilterImageDataUri;
 import com.google.template.soy.shared.restricted.EscapingConventions.FilterNormalizeUri;
-
+import java.util.List;
+import javax.annotation.Nullable;
 import org.commonmark.ext.gfm.strikethrough.Strikethrough;
 import org.commonmark.ext.gfm.tables.TableBlock;
 import org.commonmark.ext.gfm.tables.TableBody;
@@ -59,18 +60,13 @@
 import org.commonmark.node.Visitor;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.revwalk.RevTree;
-
-import java.util.List;
-
-import javax.annotation.Nullable;
-
 import prettify.parser.Prettify;
 import syntaxhighlight.ParseResult;
 
 /**
  * Formats parsed Markdown AST into HTML.
- * <p>
- * Callers must create a new instance for each document.
+ *
+ * <p>Callers must create a new instance for each document.
  */
 public class MarkdownToHtml implements Visitor {
   public static Builder builder() {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownUtil.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownUtil.java
index 6392cd0..9a6bb82 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownUtil.java
@@ -16,7 +16,6 @@
 
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Strings;
-
 import org.commonmark.node.Heading;
 import org.commonmark.node.Node;
 import org.commonmark.node.Text;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnBlock.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnBlock.java
index 3651474..d26e32c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnBlock.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnBlock.java
@@ -19,9 +19,9 @@
 
 /**
  * Multi-column layout delineated by {@code |||---|||}.
- * <p>
- * Each {@link Heading} or {@link BlockNote} within the layout begins a new
- * {@link Column} in the HTML.
+ *
+ * <p>Each {@link Heading} or {@link BlockNote} within the layout begins a new {@link Column} in the
+ * HTML.
  */
 public class MultiColumnBlock extends CustomBlock {
   /** Grid is 12 columns wide. */
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnExtension.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnExtension.java
index aeb3d89..4f1ca53 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnExtension.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MultiColumnExtension.java
@@ -17,7 +17,8 @@
 import com.google.common.base.Splitter;
 import com.google.common.primitives.Ints;
 import com.google.gitiles.doc.MultiColumnBlock.Column;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.commonmark.Extension;
 import org.commonmark.node.Block;
 import org.commonmark.node.Heading;
@@ -31,9 +32,6 @@
 import org.commonmark.parser.block.MatchedBlockParser;
 import org.commonmark.parser.block.ParserState;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /** CommonMark extension for multicolumn layouts. */
 public class MultiColumnExtension implements ParserExtension {
   private static final String MARKER = "|||---|||";
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/NamedAnchorExtension.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/NamedAnchorExtension.java
index fd3f8f7..e6a3071 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/NamedAnchorExtension.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/NamedAnchorExtension.java
@@ -14,6 +14,8 @@
 
 package com.google.gitiles.doc;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import org.commonmark.Extension;
 import org.commonmark.node.Node;
 import org.commonmark.node.Text;
@@ -22,9 +24,6 @@
 import org.commonmark.parser.delimiter.DelimiterProcessor;
 import org.commonmark.parser.delimiter.DelimiterRun;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /** Parses <code>{#foo}</code> into {@link NamedAnchor}. */
 public class NamedAnchorExtension implements ParserExtension {
   public static Extension create() {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java
index 5affd6c..50e0b61 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java
@@ -15,17 +15,15 @@
 package com.google.gitiles.doc;
 
 import com.google.gitiles.doc.html.HtmlBuilder;
-import com.google.template.soy.shared.restricted.Sanitizers;
 import com.google.template.soy.shared.restricted.EscapingConventions.FilterImageDataUri;
-
-import org.commonmark.node.Heading;
-import org.commonmark.node.Node;
-import org.eclipse.jgit.util.RawParseUtils;
-
+import com.google.template.soy.shared.restricted.Sanitizers;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.commonmark.node.Heading;
+import org.commonmark.node.Node;
+import org.eclipse.jgit.util.RawParseUtils;
 
 class Navbar {
   private static final Pattern REF_LINK =
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/PathResolver.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/PathResolver.java
index 1cc8095..205cecd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/PathResolver.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/PathResolver.java
@@ -15,21 +15,19 @@
 package com.google.gitiles.doc;
 
 import com.google.common.base.CharMatcher;
-
 import javax.annotation.Nullable;
 
 class PathResolver {
   /**
    * Resolve a path within the repository.
    *
-   * @param file path of the Markdown file in the repository that is making the
-   *        reference. May be null.
-   * @param target destination within the repository. If {@code target} starts
-   *        with {@code '/'}, {@code file} may be null and {@code target} is
-   *        evaluated as from the root directory of the repository.
-   * @return resolved form of {@code target} within the repository. Null if
-   *         {@code target} is not valid from {@code file}. Does not begin with
-   *         {@code '/'}, even if {@code target} does.
+   * @param file path of the Markdown file in the repository that is making the reference. May be
+   *     null.
+   * @param target destination within the repository. If {@code target} starts with {@code '/'},
+   *     {@code file} may be null and {@code target} is evaluated as from the root directory of the
+   *     repository.
+   * @return resolved form of {@code target} within the repository. Null if {@code target} is not
+   *     valid from {@code file}. Does not begin with {@code '/'}, even if {@code target} does.
    */
   @Nullable
   static String resolve(@Nullable String file, String target) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/SmartQuotedExtension.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/SmartQuotedExtension.java
index 4f06f3d..7df0c13 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/SmartQuotedExtension.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/SmartQuotedExtension.java
@@ -18,7 +18,6 @@
 import static com.google.gitiles.doc.SmartQuoted.Type.SINGLE;
 
 import com.google.gitiles.doc.SmartQuoted.Type;
-
 import org.commonmark.Extension;
 import org.commonmark.node.Node;
 import org.commonmark.node.Text;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java
index 9c415a8..1cbc374 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java
@@ -19,17 +19,15 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.gitiles.doc.html.HtmlBuilder;
-
-import org.apache.commons.lang3.StringUtils;
-import org.commonmark.node.Heading;
-import org.commonmark.node.Node;
-
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Deque;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+import org.commonmark.node.Heading;
+import org.commonmark.node.Node;
 
 /** Outputs outline from HeaderNodes in the AST. */
 class TocFormatter {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java
index 3239fe1..9551e94 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java
@@ -25,20 +25,18 @@
 import com.google.template.soy.shared.restricted.EscapingConventions.EscapeHtml;
 import com.google.template.soy.shared.restricted.EscapingConventions.FilterImageDataUri;
 import com.google.template.soy.shared.restricted.EscapingConventions.FilterNormalizeUri;
-
 import java.io.IOException;
 import java.util.regex.Pattern;
 
 /**
  * Builds a document fragment using a restricted subset of HTML.
- * <p>
- * Most attributes are rejected ({@code style}, {@code onclick}, ...) by
- * throwing IllegalArgumentException if the caller attempts to add them to a
- * pending element.
- * <p>
- * Useful but critical attributes like {@code href} on anchors or {@code src} on
- * img permit only safe subset of URIs, primarily {@code http://},
- * {@code https://}, and for image src {@code data:image/*;base64,...}.
+ *
+ * <p>Most attributes are rejected ({@code style}, {@code onclick}, ...) by throwing
+ * IllegalArgumentException if the caller attempts to add them to a pending element.
+ *
+ * <p>Useful but critical attributes like {@code href} on anchors or {@code src} on img permit only
+ * safe subset of URIs, primarily {@code http://}, {@code https://}, and for image src {@code
+ * data:image/*;base64,...}.
  */
 public final class HtmlBuilder {
   private static final ImmutableSet<String> ALLOWED_TAGS =
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ConfigUtilTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ConfigUtilTest.java
index 255d7b8..0002ed1 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ConfigUtilTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ConfigUtilTest.java
@@ -14,7 +14,6 @@
 
 package com.google.gitiles;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.gitiles.ConfigUtil.getDuration;
 import static org.junit.Assert.fail;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
index f2adff3..760ccb9 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
@@ -20,17 +20,15 @@
 import static java.util.TimeZone.getTimeZone;
 
 import com.google.common.base.Optional;
-
+import java.text.ParseException;
+import java.util.Date;
+import java.util.TimeZone;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.util.GitDateParser;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.text.ParseException;
-import java.util.Date;
-import java.util.TimeZone;
-
 @RunWith(JUnit4.class)
 public class DateFormatterTest {
   @Test
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java
index 620d80a..7a2d201 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java
@@ -20,7 +20,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.BaseEncoding;
-
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.diff.DiffEntry.Side;
@@ -48,8 +47,7 @@
     String diffHeader =
         String.format(
             "diff --git <a href=\"/b/repo/+/%s/foo\">a/foo</a> <a href=\"/b/repo/+/%s/foo\">b/foo</a>",
-            c1.name(),
-            c2.name());
+            c1.name(), c2.name());
     assertThat(actual).contains(diffHeader);
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java
index b158432..f113d94 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java
@@ -25,10 +25,6 @@
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Maps;
-
-import org.eclipse.jgit.http.server.ServletUtils;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
-
 import java.io.BufferedReader;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
@@ -39,12 +35,13 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
+import org.eclipse.jgit.http.server.ServletUtils;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 
 /** Simple fake implementation of {@link HttpServletRequest}. */
 public class FakeHttpServletRequest implements HttpServletRequest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java
index 4f50568..544c075 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java
@@ -23,18 +23,15 @@
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.net.HttpHeaders;
-
-import org.eclipse.jgit.util.RawParseUtils;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.charset.Charset;
 import java.util.Locale;
-
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.util.RawParseUtils;
 
 /** Simple fake implementation of {@link HttpServletResponse}. */
 public class FakeHttpServletResponse implements HttpServletResponse {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesFilterTest.java
index 4b10ca7..f8d8640 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesFilterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesFilterTest.java
@@ -19,12 +19,11 @@
 import static com.google.gitiles.GitilesFilter.REPO_REGEX;
 import static com.google.gitiles.GitilesFilter.ROOT_REGEX;
 
+import java.util.regex.Matcher;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.regex.Matcher;
-
 /** Tests for the Gitiles filter. */
 @RunWith(JUnit4.class)
 public class GitilesFilterTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
index 59659a2..7cce3ef 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
@@ -20,7 +20,6 @@
 import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ImmutableMap;
 import com.google.gitiles.GitilesView.Type;
-
 import org.eclipse.jgit.lib.ObjectId;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java
index 0a502b0..779e816 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java
@@ -21,7 +21,7 @@
 import static javax.servlet.http.HttpServletResponse.SC_MOVED_PERMANENTLY;
 
 import com.google.common.net.HttpHeaders;
-
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -33,8 +33,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import javax.servlet.http.HttpServletRequest;
-
 /** Tests for gitweb redirector. */
 @RunWith(JUnit4.class)
 public class GitwebRedirectFilterTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
index 07b8585..1e1e01f 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
@@ -22,7 +22,8 @@
 import com.google.template.soy.data.SoyListData;
 import com.google.template.soy.data.SoyMapData;
 import com.google.template.soy.data.restricted.NullData;
-
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -32,10 +33,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Map;
-
-import javax.servlet.http.HttpServletResponse;
-
 /** Tests for {@link HostIndexServlet}. */
 @RunWith(JUnit4.class)
 public class HostIndexServletTest extends ServletTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/IdentRevFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/IdentRevFilterTest.java
index 43992d5..dacf85e 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/IdentRevFilterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/IdentRevFilterTest.java
@@ -26,10 +26,9 @@
 /**
  * Tests for {@link IdentRevFilter}.
  *
- * Unfortunately it's not easy to test the Filter using real {@link RevCommit}s
- * because {@link TestRepository} hard-codes its author as "J. Author". The next
- * best thing is to test a {@link PersonIdent}, those are easy to construct.
- * TODO(dborowitz): Fix TestRepository to allow this.
+ * <p>Unfortunately it's not easy to test the Filter using real {@link RevCommit}s because {@link
+ * TestRepository} hard-codes its author as "J. Author". The next best thing is to test a {@link
+ * PersonIdent}, those are easy to construct. TODO(dborowitz): Fix TestRepository to allow this.
  */
 @RunWith(JUnit4.class)
 public class IdentRevFilterTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
index f6b16d9..37ff436 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
@@ -17,14 +17,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableMap;
-
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.lib.Config;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import javax.servlet.http.HttpServletRequest;
-
 /** Tests for {@link Linkifier}. */
 @RunWith(JUnit4.class)
 public class LinkifierTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
index 5d1d1f6..06ddaf4 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
@@ -20,14 +20,12 @@
 import com.google.gitiles.CommitJsonData.Log;
 import com.google.gitiles.DateFormatter.Format;
 import com.google.gson.reflect.TypeToken;
-
+import java.util.ArrayList;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.ArrayList;
-
 /** Tests for {@link LogServlet}. */
 @RunWith(JUnit4.class)
 public class LogServletTest extends ServletTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
index 3328b4c..a174625 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
@@ -18,7 +18,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.Lists;
-
+import java.util.List;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -31,8 +31,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
 /** Unit tests for {@link LogServlet}. */
 @RunWith(JUnit4.class)
 public class PaginatorTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
index 696b446..b492ed3 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
@@ -21,7 +21,8 @@
 import com.google.gitiles.TreeJsonData.Tree;
 import com.google.template.soy.data.SoyListData;
 import com.google.template.soy.data.restricted.StringData;
-
+import java.util.List;
+import java.util.Map;
 import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
 import org.eclipse.jgit.dircache.DirCacheEntry;
 import org.eclipse.jgit.lib.FileMode;
@@ -33,9 +34,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-import java.util.Map;
-
 /** Tests for {@PathServlet}. */
 @SuppressWarnings("unchecked")
 @RunWith(JUnit4.class)
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
index 962b037..8dff6b3 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -21,7 +21,10 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.gitiles.RefServlet.RefJsonData;
 import com.google.gson.reflect.TypeToken;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -31,12 +34,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
 /** Tests for {@link RefServlet}. */
 @RunWith(JUnit4.class)
 public class RefServletTest extends ServletTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
index 85311a8..43047ed 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
@@ -21,7 +21,6 @@
 
 import com.google.common.cache.CacheBuilder;
 import com.google.gitiles.RevisionParser.Result;
-
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
index fdf2eec..24c551c 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
@@ -26,7 +26,8 @@
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.reflect.TypeToken;
-
+import java.util.Map;
+import java.util.TimeZone;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -38,9 +39,6 @@
 import org.junit.After;
 import org.junit.Before;
 
-import java.util.Map;
-import java.util.TimeZone;
-
 /** Base class for servlet tests. */
 public class ServletTest {
   protected TestRepository<DfsRepository> repo;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java
index 50c91a5..3571270 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java
@@ -18,15 +18,12 @@
 
 import com.google.common.base.CharMatcher;
 import com.google.common.collect.ImmutableMap;
-
-import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
-import org.eclipse.jgit.lib.Config;
-
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-
 import javax.servlet.http.HttpServletRequest;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
+import org.eclipse.jgit.lib.Config;
 
 /** Gitiles access for testing. */
 public class TestGitilesAccess implements GitilesAccess.Factory {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java
index 9b80a56..0a7beb1 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java
@@ -15,7 +15,13 @@
 package com.google.gitiles;
 
 import com.google.common.collect.ImmutableList;
-
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.junit.TestRepository;
@@ -23,15 +29,6 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
 
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-
 /** Static utility methods for creating {@link GitilesServlet}s for testing. */
 public class TestGitilesServlet {
   /** @see #create(TestRepository) */
@@ -42,12 +39,12 @@
 
   /**
    * Create a servlet backed by a single test repository.
-   * <p>
-   * The servlet uses the same filter lists as a real servlet, but only knows
-   * about a single repo, having the name returned by
-   * {@link org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription#getRepositoryName()}.
-   * Pass a {@link FakeHttpServletRequest} and {@link FakeHttpServletResponse}
-   * to the servlet's {@code service} method to test.
+   *
+   * <p>The servlet uses the same filter lists as a real servlet, but only knows about a single
+   * repo, having the name returned by {@link
+   * org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription#getRepositoryName()}. Pass a
+   * {@link FakeHttpServletRequest} and {@link FakeHttpServletResponse} to the servlet's {@code
+   * service} method to test.
    *
    * @param repo the test repo backing the servlet.
    * @param gitwebRedirect optional redirect filter for gitweb URLs.
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java
index 9a7f4cb..68acffb 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java
@@ -21,19 +21,16 @@
 import static com.google.gitiles.GitilesFilter.ROOT_REGEX;
 
 import com.google.common.collect.ImmutableList;
-
-import org.eclipse.jgit.http.server.glue.MetaFilter;
-import org.eclipse.jgit.http.server.glue.MetaServlet;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
-import org.eclipse.jgit.junit.TestRepository;
-
 import java.io.IOException;
 import java.util.regex.Pattern;
-
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.http.server.glue.MetaFilter;
+import org.eclipse.jgit.http.server.glue.MetaServlet;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
+import org.eclipse.jgit.junit.TestRepository;
 
 /** Run {@link ViewFilter} in a test environment. */
 public class TestViewFilter {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
index e34bc88..8d38eff 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.io.IOException;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -33,8 +34,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-
 /** Unit tests for {@link TimeCache}. */
 @RunWith(JUnit4.class)
 public class TimeCacheTest {
@@ -44,8 +43,8 @@
 
   /**
    * Start time of {@link #repo}.
-   * <p>
-   * Note that commits auto-increment the repo's ticker, but tags do not.
+   *
+   * <p>Note that commits auto-increment the repo's ticker, but tags do not.
    */
   private long start;
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java
index 001ef02..98d416a 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java
@@ -19,7 +19,6 @@
 import static com.google.gitiles.TreeSoyData.resolveTargetUrl;
 
 import com.google.common.base.Strings;
-
 import org.eclipse.jgit.lib.ObjectId;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
index 32cb7ca..9981a2d 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
@@ -19,7 +19,8 @@
 
 import com.google.common.net.HttpHeaders;
 import com.google.gitiles.GitilesView.Type;
-
+import java.io.IOException;
+import javax.servlet.ServletException;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -30,10 +31,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-
 /** Tests for the view filter. */
 @RunWith(JUnit4.class)
 public class ViewFilterTest {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
index 265866b..d05b082 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
@@ -20,15 +20,13 @@
 import com.google.gitiles.CommitJsonData.Ident;
 import com.google.gitiles.ServletTest;
 import com.google.gson.reflect.TypeToken;
-
+import java.util.List;
+import java.util.Map;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-import java.util.Map;
-
 @RunWith(JUnit4.class)
 public class BlameServletTest extends ServletTest {
   private static final String NAME = "J. Author";
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
index 25f3d7f..2404090 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
@@ -17,7 +17,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.gitiles.ServletTest;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -146,6 +145,6 @@
     repo.branch("master").commit().add("README.md", "[c](git://example.com/repo/..)").create();
 
     String html = buildHtml("/repo/+doc/master/README.md");
-    assertThat(html).contains("<a href=\"#zSoyz\">c</a>");
+    assertThat(html).contains("<a href=\"about:invalid#zSoyz\">c</a>");
   }
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
index ad9f941..a7e08a0 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
@@ -19,7 +19,6 @@
 import com.google.common.base.CharMatcher;
 import com.google.gitiles.GitilesView;
 import com.google.gitiles.RootedDocServlet;
-
 import org.eclipse.jgit.lib.Config;
 import org.junit.Before;
 import org.junit.Test;
@@ -33,12 +32,13 @@
 
   @Before
   public void setup() {
-    view = GitilesView.revision()
-        .setHostName("127.0.0.1")
-        .setServletPath("/g")
-        .setRepositoryName("repo")
-        .setRevision("HEAD")
-        .build();
+    view =
+        GitilesView.revision()
+            .setHostName("127.0.0.1")
+            .setServletPath("/g")
+            .setRepositoryName("repo")
+            .setRevision("HEAD")
+            .build();
     config = new Config();
   }
 
@@ -75,10 +75,10 @@
     url = "git://example.com/repo.git";
     assertThat(md.href(url)).isEqualTo(url);
 
-    assertThat(md.href("git:example.com/repo.git")).isEqualTo("#zSoyz");
-    assertThat(md.href("git://")).isEqualTo("#zSoyz");
-    assertThat(md.href("git://example.com/../root")).isEqualTo("#zSoyz");
-    assertThat(md.href("git://example.com/root/..")).isEqualTo("#zSoyz");
+    assertThat(md.href("git:example.com/repo.git")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("git://")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("git://example.com/../root")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("git://example.com/root/..")).isEqualTo("about:invalid#zSoyz");
   }
 
   @Test
@@ -126,24 +126,22 @@
 
   private static void testMarkdownInRoot(MarkdownToHtml md) {
     assertThat(md.href("#Help")).isEqualTo("#Help");
-    assertThat(md.href("setup.md#Help"))
-        .isEqualTo("/g/repo/+/HEAD/setup.md#Help");
+    assertThat(md.href("setup.md#Help")).isEqualTo("/g/repo/+/HEAD/setup.md#Help");
 
     assertThat(md.href("setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
     assertThat(md.href("./setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
     assertThat(md.href("./")).isEqualTo("/g/repo/+/HEAD/");
     assertThat(md.href(".")).isEqualTo("/g/repo/+/HEAD/");
 
-    assertThat(md.href("../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../..")).isEqualTo("#zSoyz");
-    assertThat(md.href("..")).isEqualTo("#zSoyz");
+    assertThat(md.href("../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("..")).isEqualTo("about:invalid#zSoyz");
   }
 
   private static void testMarkdownInTree(MarkdownToHtml md) {
     assertThat(md.href("#Help")).isEqualTo("#Help");
-    assertThat(md.href("setup.md#Help"))
-        .isEqualTo("/g/repo/+/HEAD/doc/setup.md#Help");
+    assertThat(md.href("setup.md#Help")).isEqualTo("/g/repo/+/HEAD/doc/setup.md#Help");
 
     assertThat(md.href("setup.md")).isEqualTo("/g/repo/+/HEAD/doc/setup.md");
     assertThat(md.href("./setup.md")).isEqualTo("/g/repo/+/HEAD/doc/setup.md");
@@ -155,10 +153,10 @@
     assertThat(md.href("../")).isEqualTo("/g/repo/+/HEAD/");
     assertThat(md.href("..")).isEqualTo("/g/repo/+/HEAD/");
 
-    assertThat(md.href("../../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../..")).isEqualTo("#zSoyz");
-    assertThat(md.href("../../../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../../..")).isEqualTo("#zSoyz");
+    assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../../../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../../..")).isEqualTo("about:invalid#zSoyz");
   }
 
   private MarkdownToHtml file(String path) {
@@ -203,10 +201,10 @@
     assertThat(md.href("./")).isEqualTo("/");
     assertThat(md.href(".")).isEqualTo("/");
 
-    assertThat(md.href("../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../..")).isEqualTo("#zSoyz");
-    assertThat(md.href("..")).isEqualTo("#zSoyz");
+    assertThat(md.href("../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("..")).isEqualTo("about:invalid#zSoyz");
   }
 
   @Test
@@ -227,10 +225,10 @@
     assertThat(md.href("../")).isEqualTo("/");
     assertThat(md.href("..")).isEqualTo("/");
 
-    assertThat(md.href("../../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../..")).isEqualTo("#zSoyz");
-    assertThat(md.href("../../../")).isEqualTo("#zSoyz");
-    assertThat(md.href("../../..")).isEqualTo("#zSoyz");
+    assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../../../")).isEqualTo("about:invalid#zSoyz");
+    assertThat(md.href("../../..")).isEqualTo("about:invalid#zSoyz");
   }
 
   private MarkdownToHtml rootedDoc(String path, String file) {
diff --git a/lib/BUCK b/lib/BUCK
index d585cc3..9e64d07 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -6,8 +6,8 @@
 
 maven_jar(
   name = 'gson',
-  id = 'com.google.code.gson:gson:2.1',
-  sha1 = '2e66da15851f9f5b5079228f856c2f090ba98c38',
+  id = 'com.google.code.gson:gson:2.7',
+  sha1 = '751f548c85fa49f330cecbb1875893f971b33c4e',
 )
 
 maven_jar(
diff --git a/lib/guice/BUCK b/lib/guice/BUCK
index 59470ce..35790d7 100644
--- a/lib/guice/BUCK
+++ b/lib/guice/BUCK
@@ -1,4 +1,4 @@
-VERSION = '4.0'
+VERSION = '4.1.0'
 EXCLUDE = [
   'META-INF/DEPENDENCIES',
   'META-INF/LICENSE',
@@ -20,7 +20,7 @@
 maven_jar(
   name = 'multibindings',
   id = 'com.google.inject.extensions:guice-multibindings:' + VERSION,
-  sha1 = 'f4509545b4470bbcc865aa500ad6fef2e97d28bf',
+  sha1 = '3b27257997ac51b0f8d19676f1ea170427e86d51',
   exclude_java_sources = True,
   exclude = EXCLUDE + [
     'META-INF/maven/com.google.guava/guava/pom.properties',
@@ -32,7 +32,7 @@
 maven_jar(
   name = 'guice_library',
   id = 'com.google.inject:guice:' + VERSION,
-  sha1 = '0f990a43d3725781b6db7cd0acf0a8b62dfd1649',
+  sha1 = 'eeb69005da379a10071aa4948c48d89250febb07',
   deps = [':aopalliance'],
   exclude_java_sources = True,
   exclude = EXCLUDE + [
@@ -45,7 +45,7 @@
 maven_jar(
   name = 'guice-assistedinject',
   id = 'com.google.inject.extensions:guice-assistedinject:' + VERSION,
-  sha1 = '8fa6431da1a2187817e3e52e967535899e2e46ca',
+  sha1 = 'af799dd7e23e6fe8c988da12314582072b07edcb',
   exclude = EXCLUDE,
 )
 
diff --git a/lib/soy/BUCK b/lib/soy/BUCK
index dbd5aac..a55edd0 100644
--- a/lib/soy/BUCK
+++ b/lib/soy/BUCK
@@ -1,7 +1,8 @@
+# Keep this version of Soy synchronized with the version used in Gerrit.
 maven_jar(
   name = 'soy',
-  id = 'com.google.template:soy:2015-04-10',
-  sha1 = 'f2a260c0eafbc5756ccec546efd2ffd5b0a583cb',
+  id = 'com.google.template:soy:2016-08-09',
+  sha1 = '43d33651e95480d515fe26c10a662faafe3ad1e4',
   deps = [
     ':icu4j',
     '//lib:jsr305',
@@ -10,6 +11,6 @@
 
 maven_jar(
   name = 'icu4j',
-  id = 'com.ibm.icu:icu4j:51.1',
-  sha1 = '8ce396c4aed83c0c3de9158dc72c834fd283d5a4',
+  id = 'com.ibm.icu:icu4j:57.1',
+  sha1 = '198ea005f41219f038f4291f0b0e9f3259730e92',
 )
diff --git a/tools/gitiles.importorder b/tools/gitiles.importorder
index e5f83dc..e372a41 100644
--- a/tools/gitiles.importorder
+++ b/tools/gitiles.importorder
@@ -1,9 +1,3 @@
 #Organize Import Order
-#Thu Dec 27 15:20:37 PST 2012
-6=javax
-5=java
-4=org
-3=net
-2=junit
-1=com
-0=com.google
+#Fri Aug 19 16:08:40 EDT 2016
+0=