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 152a50a..116bf29 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveFormat.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveFormat.java
@@ -35,6 +35,7 @@
   // valid JAR file, whose code would have access to cookies on the domain.
 
   private static final ImmutableMap<String, ArchiveFormat> BY_EXT;
+
   static {
     ImmutableMap.Builder<String, ArchiveFormat> byExt = ImmutableMap.builder();
     for (ArchiveFormat format : ArchiveFormat.values()) {
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 851723f..8a3b1e2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
@@ -57,8 +57,8 @@
       return;
     }
 
-    Optional<ArchiveFormat> format = ArchiveFormat.byExtension(
-        view.getExtension(), getAccess(req).getConfig());
+    Optional<ArchiveFormat> format =
+        ArchiveFormat.byExtension(view.getExtension(), getAccess(req).getConfig());
     if (!format.isPresent()) {
       res.setStatus(SC_NOT_FOUND);
       return;
@@ -95,15 +95,14 @@
   }
 
   private String getFilename(GitilesView view, Revision rev, String ext) {
-    StringBuilder sb = new StringBuilder()
-        .append(PathUtil.basename(view.getRepositoryName()))
-        .append('-')
-        .append(rev.getName());
+    StringBuilder sb =
+        new StringBuilder()
+            .append(PathUtil.basename(view.getRepositoryName()))
+            .append('-')
+            .append(rev.getName());
     if (view.getPathPart() != null) {
-      sb.append('-')
-          .append(view.getPathPart().replace('/', '-'));
+      sb.append('-').append(view.getPathPart().replace('/', '-'));
     }
-    return sb.append(ext)
-        .toString();
+    return sb.append(ext).toString();
   }
 }
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 476e8cc..49c62df 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
@@ -66,6 +66,7 @@
   public static BaseServlet notFoundServlet() {
     return new BaseServlet(null, null) {
       private static final long serialVersionUID = 1L;
+
       @Override
       public void service(HttpServletRequest req, HttpServletResponse res) {
         res.setStatus(SC_NOT_FOUND);
@@ -147,8 +148,7 @@
    * @param req in-progress request.
    * @param res in-progress response.
    */
-  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     res.sendError(SC_BAD_REQUEST);
   }
 
@@ -158,8 +158,7 @@
    * @param req in-progress request.
    * @param res in-progress response.
    */
-  protected void doGetText(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
     res.sendError(SC_BAD_REQUEST);
   }
 
@@ -169,8 +168,7 @@
    * @param req in-progress request.
    * @param res in-progress response.
    */
-  protected void doGetJson(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
     res.sendError(SC_BAD_REQUEST);
   }
 
@@ -202,10 +200,10 @@
    * @param soyData data for Soy.
    * @throws IOException an error occurred during rendering.
    */
-  protected void renderHtml(HttpServletRequest req, HttpServletResponse res, String templateName,
-      Map<String, ?> soyData) throws IOException {
-    renderer.render(req, res, templateName,
-        startHtmlResponse(req, res, soyData));
+  protected void renderHtml(
+      HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
+      throws IOException {
+    renderer.render(req, res, templateName, startHtmlResponse(req, res, soyData));
   }
 
   /**
@@ -226,22 +224,22 @@
    *     written only on calling {@code close()}.
    * @throws IOException an error occurred during rendering the header.
    */
-  protected OutputStream startRenderStreamingHtml(HttpServletRequest req,
-      HttpServletResponse res, String templateName, Map<String, ?> soyData) throws IOException {
+  protected OutputStream startRenderStreamingHtml(
+      HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
+      throws IOException {
     req.setAttribute(STREAMING_ATTRIBUTE, true);
     return renderer.renderStreaming(res, templateName, startHtmlResponse(req, res, soyData));
   }
 
-  private Map<String, ?> startHtmlResponse(HttpServletRequest req, HttpServletResponse res,
-      Map<String, ?> soyData) throws IOException {
+  private Map<String, ?> startHtmlResponse(
+      HttpServletRequest req, HttpServletResponse res, Map<String, ?> soyData) throws IOException {
     res.setContentType(FormatType.HTML.getMimeType());
     res.setCharacterEncoding(UTF_8.name());
     setCacheHeaders(res);
 
     Map<String, Object> allData = getData(req);
 
-    GitilesConfig.putVariant(
-        getAccess(req).getConfig(), "customHeader", "headerVariant", allData);
+    GitilesConfig.putVariant(getAccess(req).getConfig(), "customHeader", "headerVariant", allData);
     allData.putAll(soyData);
     GitilesView view = ViewFilter.getView(req);
     if (!allData.containsKey("repositoryName") && view.getRepositoryName() != null) {
@@ -263,8 +261,9 @@
    * @param src @see com.google.gson.Gson#toJson(Object, Type, Appendable)
    * @param typeOfSrc @see com.google.gson.Gson#toJson(Object, Type, Appendable)
    */
-  protected void renderJson(HttpServletRequest req, HttpServletResponse res, Object src,
-      Type typeOfSrc) throws IOException {
+  protected void renderJson(
+      HttpServletRequest req, HttpServletResponse res, Object src, Type typeOfSrc)
+      throws IOException {
     setApiHeaders(res, JSON);
     res.setStatus(SC_OK);
     try (Writer writer = newWriter(req, res)) {
@@ -276,9 +275,9 @@
   @SuppressWarnings("unused") // Used in subclasses.
   protected GsonBuilder newGsonBuilder(HttpServletRequest req) throws IOException {
     return new GsonBuilder()
-      .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
-      .setPrettyPrinting()
-      .generateNonExecutableJson();
+        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
+        .setPrettyPrinting()
+        .generateNonExecutableJson();
   }
 
   /**
@@ -288,8 +287,8 @@
    * @param contentType contentType to set.
    * @return the response's writer.
    */
-  protected Writer startRenderText(HttpServletRequest req, HttpServletResponse res,
-      String contentType) throws IOException {
+  protected Writer startRenderText(
+      HttpServletRequest req, HttpServletResponse res, String contentType) throws IOException {
     setApiHeaders(res, contentType);
     return newWriter(req, res);
   }
@@ -324,8 +323,9 @@
    *
    * @throws IOException
    */
-  protected void renderTextError(HttpServletRequest req, HttpServletResponse res, int statusCode,
-      String message) throws IOException {
+  protected void renderTextError(
+      HttpServletRequest req, HttpServletResponse res, int statusCode, String message)
+      throws IOException {
     res.setStatus(statusCode);
     setApiHeaders(res, TEXT);
     setCacheHeaders(res);
@@ -371,8 +371,7 @@
     return new OutputStreamWriter(os, res.getCharacterEncoding());
   }
 
-  private Writer newWriter(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  private Writer newWriter(HttpServletRequest req, HttpServletResponse res) throws IOException {
     OutputStream out;
     if (acceptsGzipEncoding(req)) {
       res.setHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
@@ -388,7 +387,7 @@
     if (accepts == null) {
       return false;
     }
-    for (int b = 0; b < accepts.length();) {
+    for (int b = 0; b < accepts.length(); ) {
       int comma = accepts.indexOf(',', b);
       int e = 0 <= comma ? comma : accepts.length();
       String term = accepts.substring(b, e).trim();
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 87fc5c9..09dd548 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
@@ -61,8 +61,7 @@
     this.view = view;
   }
 
-  public Map<String, Object> toSoyData(ObjectId blobId)
-      throws MissingObjectException, IOException {
+  public Map<String, Object> toSoyData(ObjectId blobId) throws MissingObjectException, IOException {
     return toSoyData(null, blobId);
   }
 
@@ -107,8 +106,11 @@
 
     int last = 0;
     for (ParseResult r : results) {
-      checkState(r.getOffset() >= last,
-          "out-of-order ParseResult, expected %s >= %s", r.getOffset(), last);
+      checkState(
+          r.getOffset() >= last,
+          "out-of-order ParseResult, expected %s >= %s",
+          r.getOffset(),
+          last);
       line = writeResult(lines, null, content, last, r.getOffset());
       last = r.getOffset() + r.getLength();
       line = writeResult(lines, r.getStyleKeysString(), content, r.getOffset(), last);
@@ -132,8 +134,8 @@
     }
   }
 
-  private static SoyListData writeResult(SoyListData lines, String classes,
-      String s, int start, int end) {
+  private static SoyListData writeResult(
+      SoyListData lines, String classes, String s, int start, int end) {
     SoyListData line = lines.getListData(lines.length() - 1);
     while (true) {
       int nl = nextLineBreak(s, start, end);
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 f457088..4027d91 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitData.java
@@ -100,8 +100,7 @@
       return this;
     }
 
-    CommitData build(HttpServletRequest req, RevCommit c, Set<Field> fs)
-        throws IOException {
+    CommitData build(HttpServletRequest req, RevCommit c, Set<Field> fs) throws IOException {
       checkFields(fs);
       checkNotNull(req, "request");
       Repository repo = ServletUtils.getRepository(req);
@@ -124,17 +123,15 @@
         }
       }
       if (fs.contains(Field.URL)) {
-        result.url = GitilesView.revision()
-            .copyFrom(view)
-            .setRevision(c)
-            .toUrl();
+        result.url = GitilesView.revision().copyFrom(view).setRevision(c).toUrl();
       }
       if (fs.contains(Field.LOG_URL)) {
         result.logUrl = urlFromView(view, c, GitilesView.log());
       }
       if (fs.contains(Field.ARCHIVE_URL)) {
-        result.archiveUrl = urlFromView(view, c,
-            GitilesView.archive().setExtension(archiveFormat.getDefaultSuffix()));
+        result.archiveUrl =
+            urlFromView(
+                view, c, GitilesView.archive().setExtension(archiveFormat.getDefaultSuffix()));
       }
       if (fs.contains(Field.ARCHIVE_TYPE)) {
         result.archiveType = archiveFormat;
@@ -186,10 +183,11 @@
       }
     }
 
-    private static String urlFromView(GitilesView view, RevCommit commit,
-        GitilesView.Builder builder) {
+    private static String urlFromView(
+        GitilesView view, RevCommit commit, GitilesView.Builder builder) {
       Revision rev = view.getRevision();
-      return builder.copyFrom(view)
+      return builder
+          .copyFrom(view)
           .setOldRevision(Revision.NULL)
           .setRevision(rev.getId().equals(commit) ? rev.getName() : commit.name(), commit)
           .setPathPart(view.getPathPart())
@@ -200,18 +198,23 @@
       if (refsById == null) {
         refsById = repo.getAllRefsByPeeledObjectId();
       }
-      return FluentIterable.from(firstNonNull(refsById.get(id), ImmutableSet.<Ref> of()))
-        .filter(new Predicate<Ref>() {
-          @Override
-          public boolean apply(Ref ref) {
-            return ref.getName().startsWith(prefix);
-          }
-        }).toSortedList(Ordering.natural().onResultOf(new Function<Ref, String>() {
-          @Override
-          public String apply(Ref ref) {
-            return ref.getName();
-          }
-        }));
+      return FluentIterable.from(firstNonNull(refsById.get(id), ImmutableSet.<Ref>of()))
+          .filter(
+              new Predicate<Ref>() {
+                @Override
+                public boolean apply(Ref ref) {
+                  return ref.getName().startsWith(prefix);
+                }
+              })
+          .toSortedList(
+              Ordering.natural()
+                  .onResultOf(
+                      new Function<Ref, String>() {
+                        @Override
+                        public String apply(Ref ref) {
+                          return ref.getName();
+                        }
+                      }));
     }
 
     private AbstractTreeIterator getTreeIterator(RevCommit commit) throws IOException {
@@ -223,9 +226,10 @@
     private DiffList computeDiffEntries(Repository repo, GitilesView view, RevCommit commit)
         throws IOException {
       DiffList result = new DiffList();
-      result.revision = view.getRevision().matches(commit)
-          ? view.getRevision()
-          : Revision.peeled(commit.name(), commit);
+      result.revision =
+          view.getRevision().matches(commit)
+              ? view.getRevision()
+              : Revision.peeled(commit.name(), commit);
 
       AbstractTreeIterator oldTree;
       switch (commit.getParentCount()) {
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 b1d8d8f..1db047b 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -34,8 +34,9 @@
 import javax.servlet.http.HttpServletRequest;
 
 public class CommitJsonData {
-  static final ImmutableSet<Field> DEFAULT_FIELDS = Sets.immutableEnumSet(
-      Field.SHA, Field.TREE, Field.PARENTS, Field.AUTHOR, Field.COMMITTER, Field.MESSAGE);
+  static final ImmutableSet<Field> DEFAULT_FIELDS =
+      Sets.immutableEnumSet(
+          Field.SHA, Field.TREE, Field.PARENTS, Field.AUTHOR, Field.COMMITTER, Field.MESSAGE);
 
   public static class Log {
     public List<Commit> log;
@@ -85,9 +86,7 @@
 
   Commit toJsonData(HttpServletRequest req, RevCommit c, Set<Field> fs, DateFormatter df)
       throws IOException {
-    CommitData cd = new CommitData.Builder()
-        .setRevWalk(walk)
-        .build(req, c, fs);
+    CommitData cd = new CommitData.Builder().setRevWalk(walk).build(req, c, fs);
 
     Commit result = new Commit();
     if (cd.sha != null) {
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 9e5a9fe..d5bd8fd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -47,12 +47,21 @@
 
 /** Soy data converter for git commits. */
 public class CommitSoyData {
-  static final ImmutableSet<Field> DEFAULT_FIELDS = Sets.immutableEnumSet(Field.AUTHOR,
-      Field.COMMITTER, Field.SHA, Field.TREE, Field.TREE_URL, Field.PARENTS, Field.MESSAGE,
-      Field.LOG_URL, Field.ARCHIVE_URL, Field.ARCHIVE_TYPE);
+  static final ImmutableSet<Field> DEFAULT_FIELDS =
+      Sets.immutableEnumSet(
+          Field.AUTHOR,
+          Field.COMMITTER,
+          Field.SHA,
+          Field.TREE,
+          Field.TREE_URL,
+          Field.PARENTS,
+          Field.MESSAGE,
+          Field.LOG_URL,
+          Field.ARCHIVE_URL,
+          Field.ARCHIVE_TYPE);
 
-  private static final ImmutableSet<Field> NESTED_FIELDS = Sets.immutableEnumSet(
-      Field.PARENT_BLAME_URL);
+  private static final ImmutableSet<Field> NESTED_FIELDS =
+      Sets.immutableEnumSet(Field.PARENT_BLAME_URL);
 
   private Linkifier linkifier;
   private RevWalk walk;
@@ -74,17 +83,14 @@
     return this;
   }
 
-  Map<String, Object> toSoyData(HttpServletRequest req, RevCommit c, Set<Field> fs,
-      DateFormatter df) throws IOException {
+  Map<String, Object> toSoyData(
+      HttpServletRequest req, RevCommit c, Set<Field> fs, DateFormatter df) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     if (cdb == null) {
       cdb = new CommitData.Builder();
     }
 
-    CommitData cd = cdb
-        .setRevWalk(walk)
-        .setArchiveFormat(archiveFormat)
-        .build(req, c, fs);
+    CommitData cd = cdb.setRevWalk(walk).setArchiveFormat(archiveFormat).build(req, c, fs);
 
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(fs.size());
     if (cd.author != null) {
@@ -139,13 +145,16 @@
     if (cd.diffEntries != null) {
       data.put("diffTree", toSoyData(view, cd.diffEntries));
     }
-    checkState(Sets.difference(fs, NESTED_FIELDS).size() == data.size(),
-        "bad commit data fields: %s != %s", fs, data.keySet());
+    checkState(
+        Sets.difference(fs, NESTED_FIELDS).size() == data.size(),
+        "bad commit data fields: %s != %s",
+        fs,
+        data.keySet());
     return data;
   }
 
-  Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit,
-      DateFormatter df) throws IOException {
+  Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit, DateFormatter df)
+      throws IOException {
     return toSoyData(req, commit, DEFAULT_FIELDS, df);
   }
 
@@ -159,8 +168,8 @@
         "relativeTime", RelativeDateFormatter.format(ident.getWhen()));
   }
 
-  private List<Map<String, String>> toSoyData(GitilesView view, Set<Field> fs,
-      List<RevCommit> parents) {
+  private List<Map<String, String>> toSoyData(
+      GitilesView view, Set<Field> fs, List<RevCommit> parents) {
     List<Map<String, String>> result = Lists.newArrayListWithCapacity(parents.size());
     int i = 1;
     // TODO(dborowitz): Render something slightly different when we're actively
@@ -180,17 +189,16 @@
 
       Map<String, String> e = Maps.newHashMapWithExpectedSize(4);
       e.put("sha", name);
-      e.put("url", GitilesView.revision()
-          .copyFrom(view)
-          .setRevision(parentName, parent)
-          .toUrl());
+      e.put("url", GitilesView.revision().copyFrom(view).setRevision(parentName, parent).toUrl());
       e.put("diffUrl", diff.toUrl());
       if (fs.contains(Field.PARENT_BLAME_URL)) {
         // Assumes caller has ensured path is a file.
-        e.put("blameUrl", GitilesView.blame()
-            .copyFrom(view)
-            .setRevision(Revision.peeled(parentName, parent))
-            .toUrl());
+        e.put(
+            "blameUrl",
+            GitilesView.blame()
+                .copyFrom(view)
+                .setRevision(Revision.peeled(parentName, parent))
+                .toUrl());
       }
       result.add(e);
     }
@@ -201,11 +209,12 @@
     if (dl.oldRevision == null) {
       return NullData.INSTANCE;
     }
-    GitilesView.Builder diffUrl = GitilesView.diff()
-        .copyFrom(view)
-        .setOldRevision(dl.oldRevision)
-        .setRevision(dl.revision)
-        .setPathPart("");
+    GitilesView.Builder diffUrl =
+        GitilesView.diff()
+            .copyFrom(view)
+            .setOldRevision(dl.oldRevision)
+            .setRevision(dl.revision)
+            .setPathPart("");
 
     List<Object> result = Lists.newArrayListWithCapacity(dl.entries.size());
     for (DiffEntry e : dl.entries) {
@@ -213,18 +222,22 @@
       ChangeType type = e.getChangeType();
       if (type != DELETE) {
         entry.put("path", e.getNewPath());
-        entry.put("url", GitilesView.path()
-            .copyFrom(view)
-            .setRevision(dl.revision)
-            .setPathPart(e.getNewPath())
-            .toUrl());
+        entry.put(
+            "url",
+            GitilesView.path()
+                .copyFrom(view)
+                .setRevision(dl.revision)
+                .setPathPart(e.getNewPath())
+                .toUrl());
       } else {
         entry.put("path", e.getOldPath());
-        entry.put("url", GitilesView.path()
-            .copyFrom(view)
-            .setRevision(dl.oldRevision)
-            .setPathPart(e.getOldPath())
-            .toUrl());
+        entry.put(
+            "url",
+            GitilesView.path()
+                .copyFrom(view)
+                .setRevision(dl.oldRevision)
+                .setPathPart(e.getOldPath())
+                .toUrl());
       }
       entry.put("diffUrl", diffUrl.setAnchor("F" + result.size()).toUrl());
       entry.put("changeType", e.getChangeType().toString());
@@ -236,17 +249,19 @@
     return result;
   }
 
-  private static List<Map<String, String>> toSoyData(GitilesView view, List<Ref> refs,
-      String prefix) {
+  private static List<Map<String, String>> toSoyData(
+      GitilesView view, List<Ref> refs, String prefix) {
     List<Map<String, String>> result = Lists.newArrayListWithCapacity(refs.size());
     for (Ref ref : refs) {
       if (ref.getName().startsWith(prefix)) {
-        result.add(ImmutableMap.of(
-          "name", ref.getName().substring(prefix.length()),
-          "url", GitilesView.revision()
-              .copyFrom(view)
-              .setRevision(Revision.unpeeled(ref.getName(), ref.getObjectId()))
-              .toUrl()));
+        result.add(
+            ImmutableMap.of(
+                "name", ref.getName().substring(prefix.length()),
+                "url",
+                    GitilesView.revision()
+                        .copyFrom(view)
+                        .setRevision(Revision.unpeeled(ref.getName(), ref.getObjectId()))
+                        .toUrl()));
       }
     }
     return result;
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 e167f94..0fedbf4 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
@@ -43,15 +43,15 @@
    * @param defaultValue value to use when the value is not assigned.
    * @return a standard duration representing the time read, or defaultValue.
    */
-  public static Duration getDuration(Config config, String section, String subsection, String name,
-      Duration defaultValue) {
+  public static Duration getDuration(
+      Config config, String section, String subsection, String name, Duration defaultValue) {
     String valStr = config.getString(section, subsection, name);
     if (valStr == null) {
-        return defaultValue;
+      return defaultValue;
     }
     valStr = valStr.trim();
     if (valStr.isEmpty()) {
-        return defaultValue;
+      return defaultValue;
     }
     Duration val = parseDuration(valStr);
     if (val == null) {
@@ -162,21 +162,19 @@
    *     {@link TimeZone#getTimeZone(String)}, unknown time zones are treated as
    *     GMT.
    */
-  public static Optional<TimeZone> getTimeZone(Config config, String section, String subsection,
-      String name) {
+  public static Optional<TimeZone> getTimeZone(
+      Config config, String section, String subsection, String name) {
     String id = config.getString(section, subsection, name);
-    return id != null ? Optional.of(TimeZone.getTimeZone(id)) : Optional.<TimeZone> absent();
+    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);
+    return Pattern.compile(pattern).matcher(valStr);
   }
 
   private static boolean anyOf(String a, String... cases) {
-    return Iterables.any(ImmutableList.copyOf(cases),
-        Predicates.equalTo(a.toLowerCase()));
+    return Iterables.any(ImmutableList.copyOf(cases), Predicates.equalTo(a.toLowerCase()));
   }
 
-  private ConfigUtil() {
-  }
+  private ConfigUtil() {}
 }
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 0a57b6b..dd6830d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DebugRenderer.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DebugRenderer.java
@@ -28,11 +28,15 @@
 
 /** Renderer that reloads Soy templates from the filesystem on every request. */
 public class DebugRenderer extends Renderer {
-  public DebugRenderer(String staticPrefix, Iterable<String> customTemplatesFilenames,
-      final String soyTemplatesRoot, String siteTitle) {
+  public DebugRenderer(
+      String staticPrefix,
+      Iterable<String> customTemplatesFilenames,
+      final String soyTemplatesRoot,
+      String siteTitle) {
     super(
         new FileUrlMapper(soyTemplatesRoot + File.separator),
-        ImmutableMap.<String, String> of(), staticPrefix,
+        ImmutableMap.<String, String>of(),
+        staticPrefix,
         FluentIterable.from(customTemplatesFilenames).transform(new FileUrlMapper()),
         siteTitle);
   }
@@ -44,8 +48,7 @@
 
   @Override
   protected SoyTofu getTofu() {
-    SoyFileSet.Builder builder = SoyFileSet.builder()
-        .setCompileTimeGlobals(globals);
+    SoyFileSet.Builder builder = SoyFileSet.builder().setCompileTimeGlobals(globals);
     for (URL template : templates.values()) {
       try {
         checkState(new File(template.toURI()).exists(), "Missing Soy template %s", template);
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 0e435c6..a31be1c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
@@ -57,7 +57,7 @@
   private static final String ANONYMOUS_USER_KEY = "anonymous user";
 
   private static final String DEFAULT_DESCRIPTION =
-    "Unnamed repository; edit this file 'description' to name the repository.";
+      "Unnamed repository; edit this file 'description' to name the repository.";
 
   private static final Collator US_COLLATOR = Collator.getInstance(Locale.US);
 
@@ -68,8 +68,12 @@
     private final Config baseConfig;
     private final FileResolver<HttpServletRequest> resolver;
 
-    Factory(File basePath, String baseGitUrl, Config baseConfig,
-        FileResolver<HttpServletRequest> resolver) throws IOException {
+    Factory(
+        File basePath,
+        String baseGitUrl,
+        Config baseConfig,
+        FileResolver<HttpServletRequest> resolver)
+        throws IOException {
       this.basePath = checkNotNull(basePath, "basePath");
       this.baseGitUrl = checkNotNull(baseGitUrl, "baseGitUrl");
       this.baseConfig = checkNotNull(baseConfig, "baseConfig");
@@ -82,8 +86,12 @@
       return newAccess(basePath, canonicalBasePath, baseGitUrl, resolver, req);
     }
 
-    protected DefaultAccess newAccess(File basePath, String canonicalBasePath, String baseGitUrl,
-        FileResolver<HttpServletRequest> resolver, HttpServletRequest req) {
+    protected DefaultAccess newAccess(
+        File basePath,
+        String canonicalBasePath,
+        String baseGitUrl,
+        FileResolver<HttpServletRequest> resolver,
+        HttpServletRequest req) {
       return new DefaultAccess(basePath, canonicalBasePath, baseGitUrl, baseConfig, resolver, req);
     }
   }
@@ -95,8 +103,13 @@
   protected final FileResolver<HttpServletRequest> resolver;
   protected final HttpServletRequest req;
 
-  protected DefaultAccess(File basePath, String canonicalBasePath, String baseGitUrl,
-      Config baseConfig, FileResolver<HttpServletRequest> resolver, HttpServletRequest req) {
+  protected DefaultAccess(
+      File basePath,
+      String canonicalBasePath,
+      String baseGitUrl,
+      Config baseConfig,
+      FileResolver<HttpServletRequest> resolver,
+      HttpServletRequest req) {
     this.basePath = checkNotNull(basePath, "basePath");
     this.canonicalBasePath = checkNotNull(canonicalBasePath, "canonicalBasePath");
     this.baseGitUrl = checkNotNull(baseGitUrl, "baseGitUrl");
@@ -106,8 +119,8 @@
   }
 
   @Override
-  public Map<String, RepositoryDescription> listRepositories(String prefix,
-      Set<String> branches) throws IOException {
+  public Map<String, RepositoryDescription> listRepositories(String prefix, Set<String> branches)
+      throws IOException {
     Map<String, RepositoryDescription> repos = Maps.newTreeMap(US_COLLATOR);
     for (Repository repo : scanRepositories(basePath, prefix, req)) {
       repos.put(getRepositoryName(repo), buildDescription(repo, branches));
@@ -130,7 +143,7 @@
 
   @Override
   public RepositoryDescription getRepositoryDescription() throws IOException {
-    return buildDescription(ServletUtils.getRepository(req), Collections.<String> emptySet());
+    return buildDescription(ServletUtils.getRepository(req), Collections.<String>emptySet());
   }
 
   @Override
@@ -170,8 +183,8 @@
     if (path.startsWith(canonicalBasePath)) {
       return path.substring(canonicalBasePath.length() + 1);
     }
-    throw new IllegalStateException(String.format(
-          "Repository path %s is outside base path %s", path, base));
+    throw new IllegalStateException(
+        String.format("Repository path %s is outside base path %s", path, base));
   }
 
   private String loadDescriptionText(Repository repo) throws IOException {
@@ -223,8 +236,8 @@
     return "refs/heads/" + name;
   }
 
-  private Collection<Repository> scanRepositories(File basePath, String prefix,
-      HttpServletRequest req) throws IOException {
+  private Collection<Repository> scanRepositories(
+      File basePath, String prefix, HttpServletRequest req) throws IOException {
     List<Repository> repos = Lists.newArrayList();
     Queue<File> todo = initScan(basePath, prefix);
     while (!todo.isEmpty()) {
@@ -243,8 +256,7 @@
     return repos;
   }
 
-  private Queue<File> initScan(File basePath, String prefix)
-      throws IOException {
+  private Queue<File> initScan(File basePath, String prefix) throws IOException {
     Queue<File> todo = Queues.newArrayDeque();
     File[] entries;
     if (isValidPrefix(prefix)) {
@@ -262,7 +274,8 @@
 
   private static boolean isValidPrefix(String prefix) {
     return !Strings.isNullOrEmpty(prefix)
-        && !prefix.equals(".") && !prefix.equals("..")
+        && !prefix.equals(".")
+        && !prefix.equals("..")
         && !prefix.contains("../")
         && !prefix.endsWith("/..");
   }
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 f3f244b..238aa74 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultRenderer.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultRenderer.java
@@ -29,15 +29,18 @@
   private final SoyTofu tofu;
 
   DefaultRenderer() {
-    this("", ImmutableList.<URL> of(), "");
+    this("", ImmutableList.<URL>of(), "");
   }
 
   public DefaultRenderer(String staticPrefix, Iterable<URL> customTemplates, String siteTitle) {
-    this(ImmutableMap.<String, String> of(), staticPrefix, customTemplates, siteTitle);
+    this(ImmutableMap.<String, String>of(), staticPrefix, customTemplates, siteTitle);
   }
 
-  public DefaultRenderer(Map<String, String> globals, String staticPrefix,
-      Iterable<URL> customTemplates, String siteTitle) {
+  public DefaultRenderer(
+      Map<String, String> globals,
+      String staticPrefix,
+      Iterable<URL> customTemplates,
+      String siteTitle) {
     super(
         new Function<String, URL>() {
           @Override
@@ -45,9 +48,11 @@
             return Resources.getResource(Renderer.class, "templates/" + name);
           }
         },
-        globals, staticPrefix, customTemplates, siteTitle);
-    SoyFileSet.Builder builder = SoyFileSet.builder()
-        .setCompileTimeGlobals(this.globals);
+        globals,
+        staticPrefix,
+        customTemplates,
+        siteTitle);
+    SoyFileSet.Builder builder = SoyFileSet.builder().setCompileTimeGlobals(this.globals);
     for (URL template : templates.values()) {
       builder.add(template);
     }
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 949fbab..adc280a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
@@ -49,8 +49,7 @@
 
   private static boolean getBooleanParam(GitilesView view, String name) {
     List<String> values = view.getParameters().get(name);
-    return !values.isEmpty()
-        && (values.get(0).isEmpty() || values.get(0).equals("1"));
+    return !values.isEmpty() && (values.get(0).isEmpty() || values.get(0).equals("1"));
   }
 
   protected DescribeServlet(GitilesAccess.Factory accessFactory) {
@@ -58,8 +57,7 @@
   }
 
   @Override
-  protected void doGetText(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
     String name = describe(ServletUtils.getRepository(req), ViewFilter.getView(req), req, res);
     if (name == null) {
       return;
@@ -70,36 +68,47 @@
   }
 
   @Override
-  protected void doGetJson(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
     String name = describe(ServletUtils.getRepository(req), ViewFilter.getView(req), req, res);
     if (name == null) {
       return;
     }
-    renderJson(req, res,
+    renderJson(
+        req,
+        res,
         ImmutableMap.of(ViewFilter.getView(req).getPathPart(), name),
         new TypeToken<Map<String, String>>() {}.getType());
   }
 
-  private ObjectId resolve(Repository repo, GitilesView view, HttpServletRequest req,
-      HttpServletResponse res) throws IOException {
+  private ObjectId resolve(
+      Repository repo, GitilesView view, HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
     String rev = view.getPathPart();
     try {
       return repo.resolve(rev);
     } catch (RevisionSyntaxException e) {
-      renderTextError(req, res, SC_BAD_REQUEST,
+      renderTextError(
+          req,
+          res,
+          SC_BAD_REQUEST,
           "Invalid revision syntax: " + RefServlet.sanitizeRefForText(rev));
       return null;
     } catch (AmbiguousObjectException e) {
-      renderTextError(req, res, SC_BAD_REQUEST, String.format(
-            "Ambiguous short SHA-1 %s (%s)",
-            e.getAbbreviatedObjectId(), Joiner.on(", ").join(e.getCandidates())));
+      renderTextError(
+          req,
+          res,
+          SC_BAD_REQUEST,
+          String.format(
+              "Ambiguous short SHA-1 %s (%s)",
+              e.getAbbreviatedObjectId(),
+              Joiner.on(", ").join(e.getCandidates())));
       return null;
     }
   }
 
-  private String describe(Repository repo, GitilesView view, HttpServletRequest req,
-      HttpServletResponse res) throws IOException {
+  private String describe(
+      Repository repo, GitilesView view, HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
     if (!getBooleanParam(view, CONTAINS_PARAM)) {
       res.setStatus(SC_BAD_REQUEST);
       return null;
@@ -125,8 +134,8 @@
     return name;
   }
 
-  private NameRevCommand nameRevCommand(Git git, ObjectId id,
-      HttpServletRequest req, HttpServletResponse res) throws IOException {
+  private NameRevCommand nameRevCommand(
+      Git git, ObjectId id, HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     NameRevCommand cmd = git.nameRev();
     boolean all = getBooleanParam(view, ALL_PARAM);
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 788eb07..90d5170 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -93,10 +93,12 @@
         }
         GitilesAccess access = getAccess(req);
         DateFormatter df = new DateFormatter(access, Format.DEFAULT);
-        data.put("commit", new CommitSoyData()
-            .setLinkifier(linkifier)
-            .setArchiveFormat(getArchiveFormat(access))
-            .toSoyData(req, walk.parseCommit(view.getRevision().getId()), fs, df));
+        data.put(
+            "commit",
+            new CommitSoyData()
+                .setLinkifier(linkifier)
+                .setArchiveFormat(getArchiveFormat(access))
+                .toSoyData(req, walk.parseCommit(view.getRevision().getId()), fs, df));
       }
       if (!data.containsKey("repositoryName") && (view.getRepositoryName() != null)) {
         data.put("repositoryName", view.getRepositoryName());
@@ -107,15 +109,14 @@
 
       setCacheHeaders(res);
       try (OutputStream out = startRenderStreamingHtml(req, res, "gitiles.diffDetail", data);
-        DiffFormatter diff = new HtmlDiffFormatter(renderer, view, out)) {
+          DiffFormatter diff = new HtmlDiffFormatter(renderer, view, out)) {
         formatDiff(repo, oldTree, newTree, view.getPathPart(), diff);
       }
     }
   }
 
   @Override
-  protected void doGetText(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
@@ -143,9 +144,7 @@
       return null;
     }
     return TreeWalk.forPath(
-        walk.getObjectReader(),
-        view.getPathPart(),
-        walk.parseTree(view.getRevision().getId()));
+        walk.getObjectReader(), view.getPathPart(), walk.parseTree(view.getRevision().getId()));
   }
 
   private static boolean isParentOf(RevWalk walk, Revision oldRevision, Revision newRevision)
@@ -162,8 +161,13 @@
     return (tw.getRawMode(0) & FileMode.TYPE_FILE) > 0;
   }
 
-  private static void formatDiff(Repository repo, AbstractTreeIterator oldTree,
-      AbstractTreeIterator newTree, String path, DiffFormatter diff) throws IOException {
+  private static void formatDiff(
+      Repository repo,
+      AbstractTreeIterator oldTree,
+      AbstractTreeIterator newTree,
+      String path,
+      DiffFormatter diff)
+      throws IOException {
     if (!path.isEmpty()) {
       diff.setPathFilter(PathFilter.create(path));
     }
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 1d2f61c..c78ea25 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/FormatType.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/FormatType.java
@@ -32,8 +32,7 @@
 
   public static Optional<FormatType> getFormatType(HttpServletRequest req) {
     @SuppressWarnings("unchecked")
-    Optional<FormatType> result =
-        (Optional<FormatType>) req.getAttribute(FORMAT_TYPE_ATTRIBUTE);
+    Optional<FormatType> result = (Optional<FormatType>) req.getAttribute(FORMAT_TYPE_ATTRIBUTE);
     if (result != null) {
       return result;
     }
@@ -58,8 +57,7 @@
     return set(req, Optional.of(DEFAULT));
   }
 
-  private static Optional<FormatType> set(HttpServletRequest req,
-      Optional<FormatType> format) {
+  private static Optional<FormatType> set(HttpServletRequest req, Optional<FormatType> format) {
     req.setAttribute(FORMAT_TYPE_ATTRIBUTE, format);
     return format;
   }
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 6434e55..2977507 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
@@ -54,8 +54,7 @@
    */
   public Map<String, RepositoryDescription> listRepositories(
       @Nullable String prefix, Set<String> branches)
-          throws ServiceNotEnabledException, ServiceNotAuthorizedException,
-          IOException;
+      throws ServiceNotEnabledException, ServiceNotAuthorizedException, IOException;
 
   /**
    * @return an opaque object that uniquely identifies the end-user making the
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 a196c07..4f7b40f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesConfig.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesConfig.java
@@ -53,8 +53,8 @@
     return config;
   }
 
-  public static void putVariant(Config config, String templateName, String keyName,
-      Map<String, ? super String> out) {
+  public static void putVariant(
+      Config config, String templateName, String keyName, Map<String, ? super String> out) {
     String variant = config.getString("template", null, templateName);
     if (variant != null) {
       out.put(keyName, variant);
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 d1960b8..4e5da10 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
@@ -77,52 +77,65 @@
   private static final String CMD = "\\+[a-z0-9-]*";
 
   @VisibleForTesting
-  static final Pattern ROOT_REGEX = Pattern.compile(""
-      + "^(      " // 1. Everything
-      + "  /*    " // Excess slashes
-      + "  (/)   " // 2. Repo name (just slash)
-      + "  ()    " // 3. Command
-      + "  ()    " // 4. Path
-      + ")$      ",
-      Pattern.COMMENTS);
+  static final Pattern ROOT_REGEX =
+      Pattern.compile(
+          ""
+              + "^(      " // 1. Everything
+              + "  /*    " // Excess slashes
+              + "  (/)   " // 2. Repo name (just slash)
+              + "  ()    " // 3. Command
+              + "  ()    " // 4. Path
+              + ")$      ",
+          Pattern.COMMENTS);
 
   @VisibleForTesting
-  static final Pattern REPO_REGEX = Pattern.compile(""
-      + "^(                     " // 1. Everything
-      + "  /*                   " // Excess slashes
-      + "  (                    " // 2. Repo name
-      + "   /                   " // Leading slash
-      + "   (?:.(?!             " // Anything, as long as it's not followed by...
-      + "        /" + CMD + "/  " // the special "/<CMD>/" separator,
-      + "        |/" + CMD + "$ " // or "/<CMD>" at the end of the string
-      + "        ))*?           "
-      + "  )                    "
-      + "  /*                   " // Trailing slashes
-      + "  ()                   " // 3. Command
-      + "  ()                   " // 4. Path
-      + ")$                     ",
-      Pattern.COMMENTS);
+  static final Pattern REPO_REGEX =
+      Pattern.compile(
+          ""
+              + "^(                     " // 1. Everything
+              + "  /*                   " // Excess slashes
+              + "  (                    " // 2. Repo name
+              + "   /                   " // Leading slash
+              + "   (?:.(?!             " // Anything, as long as it's not followed by...
+              + "        /"
+              + CMD
+              + "/  " // the special "/<CMD>/" separator,
+              + "        |/"
+              + CMD
+              + "$ " // or "/<CMD>" at the end of the string
+              + "        ))*?           "
+              + "  )                    "
+              + "  /*                   " // Trailing slashes
+              + "  ()                   " // 3. Command
+              + "  ()                   " // 4. Path
+              + ")$                     ",
+          Pattern.COMMENTS);
 
   @VisibleForTesting
-  static final Pattern REPO_PATH_REGEX = Pattern.compile(""
-      + "^(              " // 1. Everything
-      + "  /*            " // Excess slashes
-      + "  (             " // 2. Repo name
-      + "   /            " // Leading slash
-      + "   .*?          " // Anything, non-greedy
-      + "  )             "
-      + "  /(" + CMD + ")" // 3. Command
-      + "  (             " // 4. Path
-      + "   (?:/.*)?     " // Slash path, or nothing.
-      + "  )             "
-      + ")$              ",
-      Pattern.COMMENTS);
+  static final Pattern REPO_PATH_REGEX =
+      Pattern.compile(
+          ""
+              + "^(              " // 1. Everything
+              + "  /*            " // Excess slashes
+              + "  (             " // 2. Repo name
+              + "   /            " // Leading slash
+              + "   .*?          " // Anything, non-greedy
+              + "  )             "
+              + "  /("
+              + CMD
+              + ")" // 3. Command
+              + "  (             " // 4. Path
+              + "   (?:/.*)?     " // Slash path, or nothing.
+              + "  )             "
+              + ")$              ",
+          Pattern.COMMENTS);
 
   private static class DispatchFilter extends AbstractHttpFilter {
     private final ListMultimap<GitilesView.Type, Filter> filters;
     private final Map<GitilesView.Type, HttpServlet> servlets;
 
-    private DispatchFilter(ListMultimap<GitilesView.Type, Filter> filters,
+    private DispatchFilter(
+        ListMultimap<GitilesView.Type, Filter> filters,
         Map<GitilesView.Type, HttpServlet> servlets) {
       this.filters = LinkedListMultimap.create(filters);
       this.servlets = ImmutableMap.copyOf(servlets);
@@ -166,8 +179,7 @@
   private GitwebRedirectFilter gitwebRedirect;
   private boolean initialized;
 
-  GitilesFilter() {
-  }
+  GitilesFilter() {}
 
   GitilesFilter(
       Config config,
@@ -213,10 +225,7 @@
     }
     root.through(dispatchFilter);
 
-    serveRegex(REPO_REGEX)
-        .through(repositoryFilter)
-        .through(viewFilter)
-        .through(dispatchFilter);
+    serveRegex(REPO_REGEX).through(repositoryFilter).through(viewFilter).through(dispatchFilter);
 
     serveRegex(REPO_PATH_REGEX)
         .through(repositoryFilter)
@@ -270,8 +279,7 @@
 
   synchronized void setHandler(GitilesView.Type view, HttpServlet handler) {
     checkNotInitialized();
-    servlets.put(checkNotNull(view, "view"),
-        checkNotNull(handler, "handler for %s", view));
+    servlets.put(checkNotNull(view, "view"), checkNotNull(handler, "handler for %s", view));
   }
 
   private synchronized void checkNotInitialized() {
@@ -309,22 +317,24 @@
 
   private void setDefaultRenderer(FilterConfig filterConfig) {
     if (renderer == null) {
-      renderer = new DefaultRenderer(
-          filterConfig.getServletContext().getContextPath() + STATIC_PREFIX,
-          FluentIterable.from(Arrays.asList(
-                config.getStringList("gitiles", null, "customTemplates")))
-              .transform(new FileUrlMapper()),
-          firstNonNull(config.getString("gitiles", null, "siteTitle"), "Gitiles"));
+      renderer =
+          new DefaultRenderer(
+              filterConfig.getServletContext().getContextPath() + STATIC_PREFIX,
+              FluentIterable.from(
+                      Arrays.asList(config.getStringList("gitiles", null, "customTemplates")))
+                  .transform(new FileUrlMapper()),
+              firstNonNull(config.getString("gitiles", null, "siteTitle"), "Gitiles"));
     }
   }
 
   private void setDefaultUrls() throws ServletException {
     if (urls == null) {
       try {
-        urls = new DefaultUrls(
-            config.getString("gitiles", null, "canonicalHostName"),
-            getBaseGitUrl(config),
-            config.getString("gitiles", null, "gerritUrl"));
+        urls =
+            new DefaultUrls(
+                config.getString("gitiles", null, "canonicalHostName"),
+                getBaseGitUrl(config),
+                config.getString("gitiles", null, "gerritUrl"));
       } catch (UnknownHostException e) {
         throw new ServletException(e);
       }
@@ -351,11 +361,9 @@
       if (accessFactory == null) {
         checkState(fileResolver != null, "need a FileResolver when GitilesAccess.Factory not set");
         try {
-        accessFactory = new DefaultAccess.Factory(
-            new File(basePath),
-            getBaseGitUrl(config),
-            config,
-            fileResolver);
+          accessFactory =
+              new DefaultAccess.Factory(
+                  new File(basePath), getBaseGitUrl(config), config, fileResolver);
         } catch (IOException e) {
           throw new ServletException(e);
         }
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 a3c15b3..7a14ba2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesServlet.java
@@ -56,9 +56,17 @@
       @Nullable TimeCache timeCache,
       @Nullable BlameCache blameCache,
       @Nullable GitwebRedirectFilter gitwebRedirect) {
-    super(new GitilesFilter(
-        config, renderer, urls, accessFactory, resolver, visibilityCache, timeCache, blameCache,
-        gitwebRedirect));
+    super(
+        new GitilesFilter(
+            config,
+            renderer,
+            urls,
+            accessFactory,
+            resolver,
+            visibilityCache,
+            timeCache,
+            blameCache,
+            gitwebRedirect));
   }
 
   public GitilesServlet() {
@@ -72,28 +80,30 @@
 
   @Override
   public void init(final ServletConfig config) throws ServletException {
-    getDelegateFilter().init(new FilterConfig() {
-      @Override
-      public String getFilterName() {
-        return getDelegateFilter().getClass().getName();
-      }
+    getDelegateFilter()
+        .init(
+            new FilterConfig() {
+              @Override
+              public String getFilterName() {
+                return getDelegateFilter().getClass().getName();
+              }
 
-      @Override
-      public String getInitParameter(String name) {
-        return config.getInitParameter(name);
-      }
+              @Override
+              public String getInitParameter(String name) {
+                return config.getInitParameter(name);
+              }
 
-      @SuppressWarnings("rawtypes")
-      @Override
-      public Enumeration getInitParameterNames() {
-        return config.getInitParameterNames();
-      }
+              @SuppressWarnings("rawtypes")
+              @Override
+              public Enumeration getInitParameterNames() {
+                return config.getInitParameterNames();
+              }
 
-      @Override
-      public ServletContext getServletContext() {
-        return config.getServletContext();
-      }
-    });
+              @Override
+              public ServletContext getServletContext() {
+                return config.getServletContext();
+              }
+            });
   }
 
   /**
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 fdf577d..6308a76 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesUrls.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesUrls.java
@@ -35,21 +35,22 @@
    * should not be encoded, while almost any other non-alpha, non-numeric
    * character will be encoded using URL style encoding.
    */
-  public static final Function<String, String> NAME_ESCAPER = new Function<String, String>() {
-    @Override
-    public String apply(String s) {
-      try {
-        return URLEncoder.encode(s, UTF_8.name())
-            .replace("%2F", "/")
-            .replace("%2f", "/")
-            .replace("+", "%20")
-            .replace("%2B", "+")
-            .replace("%2b", "+");
-      } catch (UnsupportedEncodingException e) {
-        throw new IllegalStateException(e);
-      }
-    }
-  };
+  public static final Function<String, String> NAME_ESCAPER =
+      new Function<String, String>() {
+        @Override
+        public String apply(String s) {
+          try {
+            return URLEncoder.encode(s, UTF_8.name())
+                .replace("%2F", "/")
+                .replace("%2f", "/")
+                .replace("+", "%20")
+                .replace("%2B", "+")
+                .replace("%2b", "+");
+          } catch (UnsupportedEncodingException e) {
+            throw new IllegalStateException(e);
+          }
+        }
+      };
 
   /**
    * Return the name of the host from the request.
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 0e7dc59..0a76b7d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -171,9 +171,8 @@
     public Builder setRepositoryPrefix(String prefix) {
       switch (type) {
         case HOST_INDEX:
-          this.repositoryPrefix = prefix != null
-              ? Strings.emptyToNull(maybeTrimLeadingAndTrailingSlash(prefix))
-              : null;
+          this.repositoryPrefix =
+              prefix != null ? Strings.emptyToNull(maybeTrimLeadingAndTrailingSlash(prefix)) : null;
           return this;
         default:
           throw new IllegalStateException(
@@ -184,8 +183,8 @@
     public Builder setRepositoryName(String repositoryName) {
       switch (type) {
         case HOST_INDEX:
-          throw new IllegalStateException(String.format(
-              "cannot set repository name on %s view", type));
+          throw new IllegalStateException(
+              String.format("cannot set repository name on %s view", type));
         default:
           this.repositoryName = checkNotNull(repositoryName);
           return this;
@@ -362,8 +361,17 @@
           checkRootedDoc();
           break;
       }
-      return new GitilesView(type, hostName, servletPath, repositoryPrefix,
-          repositoryName, revision, oldRevision, path, extension, params,
+      return new GitilesView(
+          type,
+          hostName,
+          servletPath,
+          repositoryPrefix,
+          repositoryName,
+          revision,
+          oldRevision,
+          path,
+          extension,
+          params,
           anchor);
     }
 
@@ -500,7 +508,8 @@
   private final ListMultimap<String, String> params;
   private final String anchor;
 
-  private GitilesView(Type type,
+  private GitilesView(
+      Type type,
       String hostName,
       String servletPath,
       String repositoryPrefix,
@@ -598,16 +607,17 @@
 
   @Override
   public String toString() {
-    ToStringHelper b = toStringHelper(type.toString())
-        .omitNullValues()
-        .add("host", hostName)
-        .add("servlet", servletPath)
-        .add("prefix", repositoryPrefix)
-        .add("repo", repositoryName)
-        .add("rev", revision)
-        .add("old", oldRevision)
-        .add("path", path)
-        .add("extension", extension);
+    ToStringHelper b =
+        toStringHelper(type.toString())
+            .omitNullValues()
+            .add("host", hostName)
+            .add("servlet", servletPath)
+            .add("prefix", repositoryPrefix)
+            .add("repo", repositoryName)
+            .add("rev", revision)
+            .add("old", oldRevision)
+            .add("path", path)
+            .add("extension", extension);
     if (!params.isEmpty()) {
       b.add("params", params);
     }
@@ -650,12 +660,18 @@
         url.append(firstNonNull(extension, DEFAULT_ARCHIVE_EXTENSION));
         break;
       case PATH:
-        url.append(repositoryName).append("/+/").append(revision.getName()).append('/')
+        url.append(repositoryName)
+            .append("/+/")
+            .append(revision.getName())
+            .append('/')
             .append(path);
         break;
       case SHOW:
-        url.append(repositoryName).append("/+show/").append(revision.getName())
-            .append('/').append(path);
+        url.append(repositoryName)
+            .append("/+show/")
+            .append(revision.getName())
+            .append('/')
+            .append(path);
         break;
       case DIFF:
         url.append(repositoryName).append("/+/");
@@ -680,7 +696,10 @@
         }
         break;
       case BLAME:
-        url.append(repositoryName).append("/+blame/").append(revision.getName()).append('/')
+        url.append(repositoryName)
+            .append("/+blame/")
+            .append(revision.getName())
+            .append('/')
             .append(path);
         break;
       case DOC:
@@ -736,12 +755,12 @@
    *     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);
-    checkArgument(type != Type.REFS || Strings.isNullOrEmpty(path),
+    checkArgument(!NON_HTML_TYPES.contains(type), "breadcrumbs for %s view not supported", type);
+    checkArgument(
+        type != Type.REFS || Strings.isNullOrEmpty(path),
         "breadcrumbs for REFS view with path not supported");
-    checkArgument(hasSingleTree == null || type == Type.PATH,
-        "hasSingleTree must be null for %s view", type);
+    checkArgument(
+        hasSingleTree == null || type == Type.PATH, "hasSingleTree must be null for %s view", type);
     String path = this.path;
     ImmutableList.Builder<Map<String, String>> breadcrumbs = ImmutableList.builder();
     breadcrumbs.add(breadcrumb(hostName, hostIndex().copyFrom(this).setRepositoryPrefix(null)));
@@ -777,9 +796,10 @@
       }
       StringBuilder cur = new StringBuilder();
       List<String> parts = PathUtil.SPLITTER.omitEmptyStrings().splitToList(path);
-      checkArgument(hasSingleTree == null
-          || (parts.isEmpty() && hasSingleTree.isEmpty())
-          || hasSingleTree.size() == parts.size() - 1,
+      checkArgument(
+          hasSingleTree == null
+              || (parts.isEmpty() && hasSingleTree.isEmpty())
+              || hasSingleTree.size() == parts.size() - 1,
           "hasSingleTree has wrong number of entries");
       for (int i = 0; i < parts.size(); i++) {
         String part = parts.get(i);
@@ -801,9 +821,7 @@
     List<Map<String, String>> r = new ArrayList<>(parts.size());
     for (int i = 0; i < parts.size(); i++) {
       String prefix = Joiner.on('/').join(parts.subList(0, i + 1));
-      r.add(breadcrumb(
-          parts.get(i),
-          hostIndex().copyFrom(this).setRepositoryPrefix(prefix)));
+      r.add(breadcrumb(parts.get(i), hostIndex().copyFrom(this).setRepositoryPrefix(prefix)));
     }
     return r;
   }
@@ -840,21 +858,20 @@
   @VisibleForTesting
   static String paramsToString(ListMultimap<String, String> params) {
     try {
-    StringBuilder sb = new StringBuilder();
-    boolean first = true;
-    for (Map.Entry<String, String> e : params.entries()) {
-      if (!first) {
-        sb.append('&');
-      } else {
-        first = false;
+      StringBuilder sb = new StringBuilder();
+      boolean first = true;
+      for (Map.Entry<String, String> e : params.entries()) {
+        if (!first) {
+          sb.append('&');
+        } else {
+          first = false;
+        }
+        sb.append(URLEncoder.encode(e.getKey(), UTF_8.name()));
+        if (!"".equals(e.getValue())) {
+          sb.append('=').append(URLEncoder.encode(e.getValue(), UTF_8.name()));
+        }
       }
-      sb.append(URLEncoder.encode(e.getKey(), UTF_8.name()));
-      if (!"".equals(e.getValue())) {
-        sb.append('=')
-            .append(URLEncoder.encode(e.getValue(), UTF_8.name()));
-      }
-    }
-    return sb.toString();
+      return sb.toString();
     } catch (UnsupportedEncodingException e) {
       throw new IllegalStateException(e);
     }
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 ddf65b4..6578891 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitwebRedirectFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitwebRedirectFilter.java
@@ -97,29 +97,26 @@
     } else if ("log".equals(action) || "shortlog".equals(action)) {
       view = GitilesView.log().setRevision(firstNonNull(hash, Revision.HEAD));
     } else if ("tree".equals(action)) {
-      view = GitilesView.path()
-          .setRevision(firstNonNull(hashBase, Revision.HEAD))
-          .setPathPart(path);
+      view =
+          GitilesView.path().setRevision(firstNonNull(hashBase, Revision.HEAD)).setPathPart(path);
     } else if (("blob".equals(action) || "blob_plain".equals(action))
-        && hashBase != null && !path.isEmpty()) {
-      view = GitilesView.path()
-          .setRevision(hashBase)
-          .setPathPart(path);
+        && hashBase != null
+        && !path.isEmpty()) {
+      view = GitilesView.path().setRevision(hashBase).setPathPart(path);
     } else if ("commitdiff".equals(action) && hash != null) {
-      view = GitilesView.diff()
-          .setOldRevision(firstNonNull(hashParent, Revision.NULL))
-          .setRevision(hash)
-          .setPathPart("");
-    } else if ("blobdiff".equals(action) && !path.isEmpty()
-        && hashParentBase != null && hashBase != null) {
-      view = GitilesView.diff()
-          .setOldRevision(hashParentBase)
-          .setRevision(hashBase)
-          .setPathPart(path);
+      view =
+          GitilesView.diff()
+              .setOldRevision(firstNonNull(hashParent, Revision.NULL))
+              .setRevision(hash)
+              .setPathPart("");
+    } else if ("blobdiff".equals(action)
+        && !path.isEmpty()
+        && hashParentBase != null
+        && hashBase != null) {
+      view =
+          GitilesView.diff().setOldRevision(hashParentBase).setRevision(hashBase).setPathPart(path);
     } else if ("history".equals(action) && !path.isEmpty()) {
-      view = GitilesView.log()
-          .setRevision(firstNonNull(hashBase, Revision.HEAD))
-          .setPathPart(path);
+      view = GitilesView.log().setRevision(firstNonNull(hashBase, Revision.HEAD)).setPathPart(path);
     } else {
       // Gitiles does not provide an RSS feed (a=rss,atom,opml)
       // Any other URL is out of date and not valid anymore.
@@ -133,9 +130,10 @@
 
     String url;
     try {
-      url = view.setHostName(gitwebView.getHostName())
-          .setServletPath(gitwebView.getServletPath())
-          .toUrl();
+      url =
+          view.setHostName(gitwebView.getHostName())
+              .setServletPath(gitwebView.getServletPath())
+              .toUrl();
     } catch (InvalidViewException e) {
       res.setStatus(SC_GONE);
       return;
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 2cc1351..c1f10e6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
@@ -56,15 +56,15 @@
 
   protected final GitilesUrls urls;
 
-  public HostIndexServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      GitilesUrls urls) {
+  public HostIndexServlet(
+      GitilesAccess.Factory accessFactory, Renderer renderer, GitilesUrls urls) {
     super(renderer, accessFactory);
     this.urls = checkNotNull(urls, "urls");
   }
 
   private Map<String, RepositoryDescription> list(
-      HttpServletRequest req, HttpServletResponse res, String prefix,
-      Set<String> branches) throws IOException {
+      HttpServletRequest req, HttpServletResponse res, String prefix, Set<String> branches)
+      throws IOException {
     Map<String, RepositoryDescription> descs;
     try {
       descs = getAccess(req).listRepositories(prefix, branches);
@@ -94,20 +94,16 @@
     return descs;
   }
 
-  private SoyMapData toSoyMapData(RepositoryDescription desc,
-      @Nullable String prefix, GitilesView view) {
+  private SoyMapData toSoyMapData(
+      RepositoryDescription desc, @Nullable String prefix, GitilesView view) {
     return new SoyMapData(
         "name", stripPrefix(prefix, desc.name),
         "description", Strings.nullToEmpty(desc.description),
-        "url", GitilesView.repositoryIndex()
-            .copyFrom(view)
-            .setRepositoryName(desc.name)
-            .toUrl());
+        "url", GitilesView.repositoryIndex().copyFrom(view).setRepositoryName(desc.name).toUrl());
   }
 
   @Override
-  protected void doHead(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doHead(HttpServletRequest req, HttpServletResponse res) throws IOException {
     Optional<FormatType> format = getFormat(req);
     if (!format.isPresent()) {
       res.sendError(SC_BAD_REQUEST);
@@ -118,7 +114,7 @@
     String prefix = view.getRepositoryPrefix();
     if (prefix != null) {
       Map<String, RepositoryDescription> descs =
-          list(req, res, prefix, Collections.<String> emptySet());
+          list(req, res, prefix, Collections.<String>emptySet());
       if (descs == null) {
         return;
       }
@@ -158,11 +154,19 @@
       hostName = hostName + '/' + prefix;
       breadcrumbs = view.getBreadcrumbs();
     }
-    renderHtml(req, res, "gitiles.hostIndex", ImmutableMap.of(
-        "hostName", hostName,
-        "breadcrumbs", SoyData.createFromExistingData(breadcrumbs),
-        "prefix", prefix != null ? prefix + '/' : "",
-        "repositories", repos));
+    renderHtml(
+        req,
+        res,
+        "gitiles.hostIndex",
+        ImmutableMap.of(
+            "hostName",
+            hostName,
+            "breadcrumbs",
+            SoyData.createFromExistingData(breadcrumbs),
+            "prefix",
+            prefix != null ? prefix + '/' : "",
+            "repositories",
+            repos));
   }
 
   @Override
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 efccc4a..4998f94 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/HtmlDiffFormatter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/HtmlDiffFormatter.java
@@ -68,8 +68,7 @@
   }
 
   @Override
-  public void format(FileHeader hdr, RawText a, RawText b)
-      throws IOException {
+  public void format(FileHeader hdr, RawText a, RawText b) throws IOException {
     int start = hdr.getStartOffset();
     int end = hdr.getEndOffset();
     if (!hdr.getHunks().isEmpty()) {
@@ -84,35 +83,37 @@
     }
   }
 
-  private void renderHeader(String header)
-      throws IOException {
+  private void renderHeader(String header) throws IOException {
     int lf = header.indexOf('\n');
-    String rest = 0 <= lf ?  header.substring(lf + 1) : "";
+    String rest = 0 <= lf ? header.substring(lf + 1) : "";
 
     // Based on DiffFormatter.formatGitDiffFirstHeaderLine.
     List<Map<String, String>> parts = Lists.newArrayListWithCapacity(3);
     parts.add(ImmutableMap.of("text", "diff --git"));
     if (entry.getChangeType() != ChangeType.ADD) {
-      parts.add(ImmutableMap.of(
-          "text", GIT_PATH.quote(getOldPrefix() + entry.getOldPath()),
-          "url", revisionUrl(view.getOldRevision(), entry.getOldPath())));
+      parts.add(
+          ImmutableMap.of(
+              "text", GIT_PATH.quote(getOldPrefix() + entry.getOldPath()),
+              "url", revisionUrl(view.getOldRevision(), entry.getOldPath())));
     } else {
-      parts.add(ImmutableMap.of(
-          "text", GIT_PATH.quote(getOldPrefix() + entry.getNewPath())));
+      parts.add(ImmutableMap.of("text", GIT_PATH.quote(getOldPrefix() + entry.getNewPath())));
     }
     if (entry.getChangeType() != ChangeType.DELETE) {
-      parts.add(ImmutableMap.of(
-          "text", GIT_PATH.quote(getNewPrefix() + entry.getNewPath()),
-          "url", revisionUrl(view.getRevision(), entry.getNewPath())));
+      parts.add(
+          ImmutableMap.of(
+              "text", GIT_PATH.quote(getNewPrefix() + entry.getNewPath()),
+              "url", revisionUrl(view.getRevision(), entry.getNewPath())));
     } else {
-      parts.add(ImmutableMap.of(
-          "text", GIT_PATH.quote(getNewPrefix() + entry.getOldPath())));
+      parts.add(ImmutableMap.of("text", GIT_PATH.quote(getNewPrefix() + entry.getOldPath())));
     }
 
-    getOutputStream().write(renderer.newRenderer("gitiles.diffHeader")
-        .setData(ImmutableMap.of("firstParts", parts, "rest", rest, "fileIndex", fileIndex))
-        .render()
-        .getBytes(UTF_8));
+    getOutputStream()
+        .write(
+            renderer
+                .newRenderer("gitiles.diffHeader")
+                .setData(ImmutableMap.of("firstParts", parts, "rest", rest, "fileIndex", fileIndex))
+                .render()
+                .getBytes(UTF_8));
   }
 
   private String revisionUrl(Revision rev, String path) {
@@ -125,8 +126,8 @@
   }
 
   @Override
-  protected void writeHunkHeader(int aStartLine, int aEndLine,
-      int bStartLine, int bEndLine) throws IOException {
+  protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine)
+      throws IOException {
     getOutputStream().write(HUNK_BEGIN);
     // TODO(sop): If hunk header starts including method names, escape it.
     super.writeHunkHeader(aStartLine, aEndLine, bStartLine, bEndLine);
@@ -134,8 +135,7 @@
   }
 
   @Override
-  protected void writeLine(char prefix, RawText text, int cur)
-      throws IOException {
+  protected void writeLine(char prefix, RawText text, int cur) throws IOException {
     // Manually render each line, rather than invoke a Soy template. This method
     // can be called thousands of times in a single request. Avoid unnecessary
     // overheads by formatting as-is.
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 eb0905b..5493452 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/IdentRevFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/IdentRevFilter.java
@@ -43,8 +43,8 @@
   }
 
   @Override
-  public boolean include(RevWalk walker, RevCommit commit) throws StopWalkException,
-      MissingObjectException, IncorrectObjectTypeException, IOException {
+  public boolean include(RevWalk walker, RevCommit commit)
+      throws StopWalkException, MissingObjectException, IncorrectObjectTypeException, IOException {
     return matchesPerson(getIdent(commit));
   }
 
@@ -59,8 +59,7 @@
     // Equivalent to --fixed-strings, to avoid pathological performance of Java
     // regex matching.
     // TODO(kalman): Find/use a port of re2.
-    return person.getName().contains(pattern)
-        || person.getEmailAddress().contains(pattern);
+    return person.getName().contains(pattern) || person.getEmailAddress().contains(pattern);
   }
 
   protected abstract PersonIdent getIdent(RevCommit commit);
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 8225278..e513ec4 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
@@ -45,14 +45,8 @@
 
   static {
     // HTTP URL regex adapted from com.google.gwtexpui.safehtml.client.SafeHtml.
-    String part = "(?:" +
-        "[a-zA-Z0-9$_.+!*',%;:@=?#/~<>-]" +
-        "|&(?!lt;|gt;)" +
-        ")";
-    String httpUrl = "https?://" +
-        part + "{2,}" +
-        "(?:[(]" + part + "*" + "[)])*" +
-        part + "*";
+    String part = "(?:" + "[a-zA-Z0-9$_.+!*',%;:@=?#/~<>-]" + "|&(?!lt;|gt;)" + ")";
+    String httpUrl = "https?://" + part + "{2,}" + "(?:[(]" + part + "*" + "[)])*" + part + "*";
     HTTP_URL_PATTERN = Pattern.compile(httpUrl);
     CHANGE_ID_PATTERN = Pattern.compile("(\\bI[0-9a-f]{8,40}\\b)");
   }
@@ -76,8 +70,9 @@
       String link = config.getString("commentlink", subsection, "link");
       String html = config.getString("commentlink", subsection, "html");
       if (html != null) {
-        log.warn("Beware: html in commentlinks is unsupported in gitiles; "
-               + "Did you copy it from a gerrit config?");
+        log.warn(
+            "Beware: html in commentlinks is unsupported in gitiles; "
+                + "Did you copy it from a gerrit config?");
       }
       if (Strings.isNullOrEmpty(match)) {
         log.warn("invalid commentlink.%s.match", subsection);
@@ -86,7 +81,7 @@
       Pattern pattern;
       try {
         pattern = Pattern.compile(match);
-      } catch(PatternSyntaxException ex) {
+      } catch (PatternSyntaxException ex) {
         log.warn("invalid commentlink." + subsection + ".match", ex);
         continue;
       }
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 ae6219f..4408c1e 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -131,8 +131,7 @@
 
       try (OutputStream out = startRenderStreamingHtml(req, res, "gitiles.logDetail", data)) {
         Writer w = newWriter(out, res);
-        new LogSoyData(req, access, pretty)
-            .renderStreaming(paginator, null, renderer, w, df);
+        new LogSoyData(req, access, pretty).renderStreaming(paginator, null, renderer, w, df);
         w.flush();
       }
     } catch (RevWalkException e) {
@@ -169,8 +168,8 @@
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
         paginator.getWalk().parseBody(c);
-        entries.add(new CommitJsonData().setRevWalk(paginator.getWalk())
-            .toJsonData(req, c, fs, df));
+        entries.add(
+            new CommitJsonData().setRevWalk(paginator.getWalk()).toJsonData(req, c, fs, df));
       }
       result.log = entries;
       if (paginator.getPreviousStart() != null) {
@@ -198,14 +197,14 @@
     }
     try (RevWalk walk = new RevWalk(repo)) {
       return GitilesView.log()
-        .copyFrom(view)
-        .setRevision(Revision.peel(Constants.HEAD, walk.parseAny(headRef.getObjectId()), walk))
-        .build();
+          .copyFrom(view)
+          .setRevision(Revision.peel(Constants.HEAD, walk.parseAny(headRef.getObjectId()), walk))
+          .build();
     }
   }
 
-  private static Optional<ObjectId> getStart(ListMultimap<String, String> params,
-      ObjectReader reader) throws IOException {
+  private static Optional<ObjectId> getStart(
+      ListMultimap<String, String> params, ObjectReader reader) throws IOException {
     List<String> values = params.get(START_PARAM);
     switch (values.size()) {
       case 0:
@@ -258,15 +257,15 @@
     String path = view.getPathPart();
 
     List<String> followParams = view.getParameters().get(FOLLOW_PARAM);
-    boolean follow = !followParams.isEmpty()
-        ? isTrue(followParams.get(0))
-        : access.getConfig().getBoolean("log", null, "follow", true);
+    boolean follow =
+        !followParams.isEmpty()
+            ? isTrue(followParams.get(0))
+            : access.getConfig().getBoolean("log", null, "follow", true);
     if (follow) {
       walk.setTreeFilter(FollowFilter.create(path, access.getConfig().get(DiffConfig.KEY)));
     } else {
-      walk.setTreeFilter(AndTreeFilter.create(
-          PathFilterGroup.createFromStrings(path),
-          TreeFilter.ANY_DIFF));
+      walk.setTreeFilter(
+          AndTreeFilter.create(PathFilterGroup.createFromStrings(path), TreeFilter.ANY_DIFF));
     }
   }
 
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 97fe1ce..6d1a1c8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -39,9 +39,17 @@
 import javax.servlet.http.HttpServletRequest;
 
 public class LogSoyData {
-  private static final ImmutableSet<Field> FIELDS = Sets.immutableEnumSet(Field.ABBREV_SHA,
-      Field.SHA, Field.URL, Field.SHORT_MESSAGE, Field.MESSAGE, Field.AUTHOR, Field.COMMITTER,
-      Field.BRANCHES, Field.TAGS);
+  private static final ImmutableSet<Field> FIELDS =
+      Sets.immutableEnumSet(
+          Field.ABBREV_SHA,
+          Field.SHA,
+          Field.URL,
+          Field.SHORT_MESSAGE,
+          Field.MESSAGE,
+          Field.AUTHOR,
+          Field.COMMITTER,
+          Field.BRANCHES,
+          Field.TAGS);
   private static final ImmutableSet<Field> VERBOSE_FIELDS = Field.setOf(FIELDS, Field.DIFF_TREE);
 
   private final HttpServletRequest req;
@@ -60,9 +68,15 @@
     variant = firstNonNull(config.getString("logFormat", pretty, "variant"), pretty);
   }
 
-  public void renderStreaming(Paginator paginator, @Nullable String revision, Renderer renderer,
-      Writer out, DateFormatter df) throws IOException {
-    renderer.newRenderer("gitiles.logEntriesHeader")
+  public void renderStreaming(
+      Paginator paginator,
+      @Nullable String revision,
+      Renderer renderer,
+      Writer out,
+      DateFormatter df)
+      throws IOException {
+    renderer
+        .newRenderer("gitiles.logEntriesHeader")
         .setData(toHeaderSoyData(paginator, revision))
         .render(out);
     out.flush();
@@ -78,7 +92,8 @@
       renderer.newRenderer("gitiles.emptyLog").render(out);
     }
 
-    renderer.newRenderer("gitiles.logEntriesFooter")
+    renderer
+        .newRenderer("gitiles.logEntriesFooter")
         .setData(toFooterSoyData(paginator, revision))
         .render(out);
   }
@@ -120,7 +135,7 @@
     if (type != ChangeType.RENAME && type != ChangeType.COPY) {
       return null;
     }
-    return ImmutableMap.<String, Object> of(
+    return ImmutableMap.<String, Object>of(
         "changeType", type.toString(),
         "oldPath", entry.getOldPath(),
         "newPath", entry.getNewPath(),
@@ -131,9 +146,11 @@
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(1);
     ObjectId next = paginator.getNextStart();
     if (next != null) {
-      data.put("nextUrl", copyAndCanonicalizeView(revision)
-          .replaceParam(LogServlet.START_PARAM, next.name())
-          .toUrl());
+      data.put(
+          "nextUrl",
+          copyAndCanonicalizeView(revision)
+              .replaceParam(LogServlet.START_PARAM, next.name())
+              .toUrl());
     }
     return data;
   }
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 1a1a053..019d33c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
@@ -85,8 +85,8 @@
    * @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 {
+  Paginator(RevWalk walk, int limit, @Nullable ObjectId start)
+      throws MissingObjectException, IncorrectObjectTypeException, IOException {
     this.walk = checkNotNull(walk, "walk");
     checkArgument(limit > 0, "limit must be positive: %s", limit);
     this.limit = limit;
@@ -127,8 +127,7 @@
    * @throws IncorrectObjectTypeException See {@link RevWalk#next()}.
    * @throws IOException See {@link RevWalk#next()}.
    */
-  public RevCommit next() throws MissingObjectException, IncorrectObjectTypeException,
-      IOException {
+  public RevCommit next() throws MissingObjectException, IncorrectObjectTypeException, IOException {
     if (done) {
       return null;
     }
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 d08062f..4837671 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
@@ -80,11 +80,16 @@
    * repository URL verbatim in a web browser.
    */
   private static final Pattern VERBATIM_SUBMODULE_URL_PATTERN =
-      Pattern.compile("^(" + Joiner.on('|').join(
-          "https?://[^.]+.googlesource.com/.*",
-          "https?://[^.]+.googlecode.com/.*",
-          "https?://code.google.com/p/.*",
-          "https?://github.com/.*") + ")$", Pattern.CASE_INSENSITIVE);
+      Pattern.compile(
+          "^("
+              + Joiner.on('|')
+                  .join(
+                      "https?://[^.]+.googlesource.com/.*",
+                      "https?://[^.]+.googlecode.com/.*",
+                      "https?://code.google.com/p/.*",
+                      "https?://github.com/.*")
+              + ")$",
+          Pattern.CASE_INSENSITIVE);
 
   static final String AUTODIVE_PARAM = "autodive";
   static final String NO_AUTODIVE_VALUE = "0";
@@ -279,8 +284,8 @@
     }
 
     @Override
-    public boolean include(TreeWalk tw) throws MissingObjectException,
-        IncorrectObjectTypeException, IOException {
+    public boolean include(TreeWalk tw)
+        throws MissingObjectException, IncorrectObjectTypeException, IOException {
       count++;
       int cmp = tw.isPathPrefix(pathRaw, pathRaw.length);
       if (cmp > 0) {
@@ -313,7 +318,7 @@
 
     @Override
     public boolean shouldBeRecursive() {
-      return Bytes.indexOf(pathRaw, (byte)'/') >= 0;
+      return Bytes.indexOf(pathRaw, (byte) '/') >= 0;
     }
 
     @Override
@@ -344,7 +349,7 @@
         tw.addTree(root);
         tw.setRecursive(false);
         if (path.isEmpty()) {
-          return new WalkResult(tw, path, root, root, FileType.TREE, ImmutableList.<Boolean> of());
+          return new WalkResult(tw, path, root, root, FileType.TREE, ImmutableList.<Boolean>of());
         }
         AutoDiveFilter f = new AutoDiveFilter(path);
         tw.setFilter(f);
@@ -375,7 +380,12 @@
     private final FileType type;
     private final List<Boolean> hasSingleTree;
 
-    private WalkResult(TreeWalk tw, String path, RevTree root, ObjectId objectId, FileType type,
+    private WalkResult(
+        TreeWalk tw,
+        String path,
+        RevTree root,
+        ObjectId objectId,
+        FileType type,
         List<Boolean> hasSingleTree) {
       this.tw = tw;
       this.path = path;
@@ -414,21 +424,28 @@
           }
           child = next;
         }
-        res.sendRedirect(GitilesView.path().copyFrom(view)
-            .setPathPart(
-                RawParseUtils.decode(child.getEntryPathBuffer(), 0, child.getEntryPathLength()))
-            .toUrl());
+        res.sendRedirect(
+            GitilesView.path()
+                .copyFrom(view)
+                .setPathPart(
+                    RawParseUtils.decode(child.getEntryPathBuffer(), 0, child.getEntryPathLength()))
+                .toUrl());
         return;
       }
     }
     // TODO(sop): Allow caching trees by SHA-1 when no S cookie is sent.
-    renderHtml(req, res, "gitiles.pathDetail", ImmutableMap.of(
-        "title", !view.getPathPart().isEmpty() ? view.getPathPart() : "/",
-        "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
-        "type", FileType.TREE.toString(),
-        "data", new TreeSoyData(wr.getObjectReader(), view, cfg, wr.root)
-            .setArchiveFormat(getArchiveFormat(getAccess(req)))
-            .toSoyData(wr.id, wr.tw)));
+    renderHtml(
+        req,
+        res,
+        "gitiles.pathDetail",
+        ImmutableMap.of(
+            "title", !view.getPathPart().isEmpty() ? view.getPathPart() : "/",
+            "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
+            "type", FileType.TREE.toString(),
+            "data",
+                new TreeSoyData(wr.getObjectReader(), view, cfg, wr.root)
+                    .setArchiveFormat(getArchiveFormat(getAccess(req)))
+                    .toSoyData(wr.id, wr.tw)));
   }
 
   private CanonicalTreeParser getOnlyChildSubtree(ObjectReader reader, ObjectId id, byte[] prefix)
@@ -444,14 +461,17 @@
   private void showFile(HttpServletRequest req, HttpServletResponse res, WalkResult wr)
       throws IOException {
     GitilesView view = ViewFilter.getView(req);
-    Map<String, ?> data = new BlobSoyData(wr.getObjectReader(), view)
-        .toSoyData(wr.path, wr.id);
+    Map<String, ?> data = new BlobSoyData(wr.getObjectReader(), view).toSoyData(wr.path, wr.id);
     // TODO(sop): Allow caching files by SHA-1 when no S cookie is sent.
-    renderHtml(req, res, "gitiles.pathDetail", ImmutableMap.of(
-        "title", ViewFilter.getView(req).getPathPart(),
-        "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
-        "type", wr.type.toString(),
-        "data", data));
+    renderHtml(
+        req,
+        res,
+        "gitiles.pathDetail",
+        ImmutableMap.of(
+            "title", ViewFilter.getView(req).getPathPart(),
+            "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
+            "type", wr.type.toString(),
+            "data", data));
   }
 
   private void showSymlink(HttpServletRequest req, HttpServletResponse res, WalkResult wr)
@@ -469,20 +489,22 @@
       data.put("sha", ObjectId.toString(wr.id));
       data.put("data", null);
       data.put("size", Long.toString(loader.getSize()));
-      renderHtml(req, res, "gitiles.pathDetail", ImmutableMap.of(
-          "title", ViewFilter.getView(req).getPathPart(),
-          "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
-          "type", FileType.REGULAR_FILE.toString(),
-          "data", data));
+      renderHtml(
+          req,
+          res,
+          "gitiles.pathDetail",
+          ImmutableMap.of(
+              "title", ViewFilter.getView(req).getPathPart(),
+              "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
+              "type", FileType.REGULAR_FILE.toString(),
+              "data", data));
       return;
     }
 
-    String url = resolveTargetUrl(
-        GitilesView.path()
-            .copyFrom(view)
-            .setPathPart(dirname(view.getPathPart()))
-            .build(),
-        target);
+    String url =
+        resolveTargetUrl(
+            GitilesView.path().copyFrom(view).setPathPart(dirname(view.getPathPart())).build(),
+            target);
     data.put("title", view.getPathPart());
     data.put("target", target);
     if (url != null) {
@@ -490,11 +512,15 @@
     }
 
     // TODO(sop): Allow caching files by SHA-1 when no S cookie is sent.
-    renderHtml(req, res, "gitiles.pathDetail", ImmutableMap.of(
-        "title", ViewFilter.getView(req).getPathPart(),
-        "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
-        "type", FileType.SYMLINK.toString(),
-        "data", data));
+    renderHtml(
+        req,
+        res,
+        "gitiles.pathDetail",
+        ImmutableMap.of(
+            "title", ViewFilter.getView(req).getPathPart(),
+            "breadcrumbs", view.getBreadcrumbs(wr.hasSingleTree),
+            "type", FileType.SYMLINK.toString(),
+            "data", data));
   }
 
   private static String dirname(String path) {
@@ -517,10 +543,8 @@
     String modulesUrl;
     String remoteUrl = null;
 
-    try (SubmoduleWalk sw = SubmoduleWalk.forPath(
-          ServletUtils.getRepository(req),
-          wr.root,
-          view.getPathPart())) {
+    try (SubmoduleWalk sw =
+        SubmoduleWalk.forPath(ServletUtils.getRepository(req), wr.root, view.getPathPart())) {
       modulesUrl = sw.getModulesUrl();
       if (modulesUrl != null && (modulesUrl.startsWith("./") || modulesUrl.startsWith("../"))) {
         String moduleRepo = PathUtil.simplifyPathUpToRoot(modulesUrl, view.getRepositoryName());
@@ -545,10 +569,14 @@
     }
 
     // TODO(sop): Allow caching links by SHA-1 when no S cookie is sent.
-    renderHtml(req, res, "gitiles.pathDetail", ImmutableMap.of(
-        "title", view.getPathPart(),
-        "type", FileType.GITLINK.toString(),
-        "data", data));
+    renderHtml(
+        req,
+        res,
+        "gitiles.pathDetail",
+        ImmutableMap.of(
+            "title", view.getPathPart(),
+            "type", FileType.GITLINK.toString(),
+            "data", data));
   }
 
   private static String resolveHttpUrl(String remoteUrl) {
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 e55b77d..e67223f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathUtil.java
@@ -59,6 +59,5 @@
     return path.substring(slash + 1);
   }
 
-  private PathUtil() {
-  }
+  private PathUtil() {}
 }
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 91795bb..6bf0feb 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
@@ -50,8 +50,7 @@
   private String readmePath;
   private ObjectId readmeId;
 
-  ReadmeHelper(ObjectReader reader, GitilesView view, Config cfg,
-      RevTree rootTree) {
+  ReadmeHelper(ObjectReader reader, GitilesView view, Config cfg, RevTree rootTree) {
     this.reader = reader;
     this.view = view;
     this.cfg = cfg;
@@ -59,8 +58,9 @@
     render = cfg.getBoolean("markdown", "render", true);
   }
 
-  void scanTree(RevTree tree) throws MissingObjectException,
-      IncorrectObjectTypeException, CorruptObjectException, IOException {
+  void scanTree(RevTree tree)
+      throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
+          IOException {
     if (render) {
       TreeWalk tw = new TreeWalk(reader);
       tw.setRecursive(false);
@@ -90,13 +90,13 @@
 
   SanitizedContent render() {
     try {
-      Duration parseTimeout = ConfigUtil.getDuration(cfg, "markdown", null,
-          "parseTimeout", Duration.standardSeconds(2));
+      Duration parseTimeout =
+          ConfigUtil.getDuration(
+              cfg, "markdown", null, "parseTimeout", Duration.standardSeconds(2));
       int inputLimit = cfg.getInt("markdown", "inputLimit", 5 << 20);
       byte[] raw = reader.open(readmeId, Constants.OBJ_BLOB).getCachedBytes(inputLimit);
       String md = RawParseUtils.decode(raw);
-      RootNode root =
-          GitilesMarkdown.parseFile(parseTimeout, view, readmePath, md);
+      RootNode root = GitilesMarkdown.parseFile(parseTimeout, view, readmePath, md);
       if (root == null) {
         return null;
       }
@@ -107,13 +107,9 @@
         img = new ImageLoader(reader, view, rootTree, readmePath, imageLimit);
       }
 
-      return new MarkdownToHtml(view, cfg)
-        .setImageLoader(img)
-        .setReadme(true)
-        .toSoyHtml(root);
+      return new MarkdownToHtml(view, cfg).setImageLoader(img).setReadme(true).toSoyHtml(root);
     } catch (LargeObjectException | IOException e) {
-      log.error(String.format("error rendering %s/%s",
-          view.getRepositoryName(), readmePath), e);
+      log.error(String.format("error rendering %s/%s", view.getRepositoryName(), readmePath), e);
       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 ff48d4d..0d74b46 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -52,15 +52,14 @@
 
   private final TimeCache timeCache;
 
-  protected RefServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      TimeCache timeCache) {
+  protected RefServlet(
+      GitilesAccess.Factory accessFactory, Renderer renderer, TimeCache timeCache) {
     super(renderer, accessFactory);
     this.timeCache = checkNotNull(timeCache, "timeCache");
   }
 
   @Override
-  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     if (!ViewFilter.getView(req).getPathPart().isEmpty()) {
       res.setStatus(SC_NOT_FOUND);
       return;
@@ -69,16 +68,18 @@
     try (RevWalk walk = new RevWalk(ServletUtils.getRepository(req))) {
       tags = getTagsSoyData(req, timeCache, walk, 0);
     }
-    renderHtml(req, res, "gitiles.refsDetail",
+    renderHtml(
+        req,
+        res,
+        "gitiles.refsDetail",
         ImmutableMap.of("branches", getBranchesSoyData(req, 0), "tags", tags));
   }
 
   @Override
-  protected void doGetText(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
-    Map<String, Ref> refs = getRefs(ServletUtils.getRepository(req).getRefDatabase(),
-        view.getPathPart());
+    Map<String, Ref> refs =
+        getRefs(ServletUtils.getRepository(req).getRefDatabase(), view.getPathPart());
     TextRefAdvertiser adv = new TextRefAdvertiser(startRenderText(req, res));
     adv.setDerefTags(true);
     adv.send(refs);
@@ -86,11 +87,10 @@
   }
 
   @Override
-  protected void doGetJson(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
-    Map<String, Ref> refs = getRefs(ServletUtils.getRepository(req).getRefDatabase(),
-        view.getPathPart());
+    Map<String, Ref> refs =
+        getRefs(ServletUtils.getRepository(req).getRefDatabase(), view.getPathPart());
     Map<String, RefJsonData> jsonRefs = new LinkedHashMap<>();
     for (Map.Entry<String, Ref> ref : refs.entrySet()) {
       jsonRefs.put(ref.getKey(), new RefJsonData(ref.getValue()));
@@ -131,8 +131,8 @@
     }.compound(RefComparator.INSTANCE);
   }
 
-  static List<Map<String, Object>> getTagsSoyData(HttpServletRequest req,
-      TimeCache timeCache, RevWalk walk, int limit) throws IOException {
+  static List<Map<String, Object>> getTagsSoyData(
+      HttpServletRequest req, TimeCache timeCache, RevWalk walk, int limit) throws IOException {
     return getRefsSoyData(
         ServletUtils.getRepository(req).getRefDatabase(),
         ViewFilter.getView(req),
@@ -143,16 +143,20 @@
   }
 
   private static Ordering<Ref> tagComparator(final TimeCache timeCache, final RevWalk walk) {
-    return Ordering.natural().onResultOf(new Function<Ref, Long>() {
-      @Override
-      public Long apply(Ref ref) {
-        try {
-          return timeCache.getTime(walk, ref.getObjectId());
-        } catch (IOException e) {
-          throw new UncheckedExecutionException(e);
-        }
-      }
-    }).reverse().compound(RefComparator.INSTANCE);
+    return Ordering.natural()
+        .onResultOf(
+            new Function<Ref, Long>() {
+              @Override
+              public Long apply(Ref ref) {
+                try {
+                  return timeCache.getTime(walk, ref.getObjectId());
+                } catch (IOException e) {
+                  throw new UncheckedExecutionException(e);
+                }
+              }
+            })
+        .reverse()
+        .compound(RefComparator.INSTANCE);
   }
 
   private static List<Map<String, Object>> getRefsSoyData(
@@ -161,7 +165,8 @@
       String prefix,
       Ordering<Ref> ordering,
       @Nullable Ref headLeaf,
-      int limit) throws IOException {
+      int limit)
+      throws IOException {
     Collection<Ref> refs = refdb.getRefs(prefix).values();
     refs = ordering.leastOf(refs, limit > 0 ? Ints.saturatedCast(limit + 1L) : refs.size());
     List<Map<String, Object>> result = Lists.newArrayListWithCapacity(refs.size());
@@ -172,8 +177,13 @@
       if (refForName != null) {
         boolean needPrefix = !ref.getName().equals(refForName.getName());
         Map<String, Object> value = Maps.newHashMapWithExpectedSize(3);
-        value.put("url", GitilesView.revision().copyFrom(view).setRevision(
-          Revision.unpeeled(needPrefix ? ref.getName() : name, ref.getObjectId())).toUrl());
+        value.put(
+            "url",
+            GitilesView.revision()
+                .copyFrom(view)
+                .setRevision(
+                    Revision.unpeeled(needPrefix ? ref.getName() : name, ref.getObjectId()))
+                .toUrl());
         value.put("name", name);
         if (headLeaf != null) {
           value.put("isHead", headLeaf.equals(ref));
@@ -185,9 +195,7 @@
   }
 
   static String sanitizeRefForText(String refName) {
-    return refName.replace("&", "&amp;")
-        .replace("<", "&lt;")
-        .replace(">", "&gt;");
+    return refName.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
   }
 
   private static Map<String, Ref> getRefs(RefDatabase refdb, String path) throws IOException {
@@ -229,7 +237,7 @@
   static class RefJsonData {
     RefJsonData(Ref ref) {
       value = ref.getObjectId().getName();
-      if(ref.getPeeledObjectId() != null) {
+      if (ref.getPeeledObjectId() != null) {
         peeled = ref.getPeeledObjectId().getName();
       }
       if (ref.isSymbolic()) {
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 9defb71..8d04578 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Renderer.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Renderer.java
@@ -55,23 +55,25 @@
   // Must match .streamingPlaceholder.
   private static final String PLACEHOLDER = "id=\"STREAMED_OUTPUT_BLOCK\"";
 
-  private static final List<String> SOY_FILENAMES = ImmutableList.of(
-      "BlameDetail.soy",
-      "Common.soy",
-      "DiffDetail.soy",
-      "Doc.soy",
-      "HostIndex.soy",
-      "LogDetail.soy",
-      "ObjectDetail.soy",
-      "PathDetail.soy",
-      "RefList.soy",
-      "RevisionDetail.soy",
-      "RepositoryIndex.soy");
+  private static final List<String> SOY_FILENAMES =
+      ImmutableList.of(
+          "BlameDetail.soy",
+          "Common.soy",
+          "DiffDetail.soy",
+          "Doc.soy",
+          "HostIndex.soy",
+          "LogDetail.soy",
+          "ObjectDetail.soy",
+          "PathDetail.soy",
+          "RefList.soy",
+          "RevisionDetail.soy",
+          "RepositoryIndex.soy");
 
-  public static final Map<String, String> STATIC_URL_GLOBALS = ImmutableMap.of(
-      "gitiles.BASE_CSS_URL", "base.css",
-      "gitiles.DOC_CSS_URL", "doc.css",
-      "gitiles.PRETTIFY_CSS_URL", "prettify/prettify.css");
+  public static final Map<String, String> STATIC_URL_GLOBALS =
+      ImmutableMap.of(
+          "gitiles.BASE_CSS_URL", "base.css",
+          "gitiles.DOC_CSS_URL", "doc.css",
+          "gitiles.PRETTIFY_CSS_URL", "prettify/prettify.css");
 
   protected static class FileUrlMapper implements Function<String, URL> {
     private final String prefix;
@@ -99,13 +101,15 @@
 
   protected ImmutableMap<String, URL> templates;
   protected ImmutableMap<String, String> globals;
-  private final ConcurrentMap<String, HashCode> hashes = new MapMaker()
-      .initialCapacity(SOY_FILENAMES.size())
-      .concurrencyLevel(1)
-      .makeMap();
+  private final ConcurrentMap<String, HashCode> hashes =
+      new MapMaker().initialCapacity(SOY_FILENAMES.size()).concurrencyLevel(1).makeMap();
 
-  protected Renderer(Function<String, URL> resourceMapper, Map<String, String> globals,
-      String staticPrefix, Iterable<URL> customTemplates, String siteTitle) {
+  protected Renderer(
+      Function<String, URL> resourceMapper,
+      Map<String, String> globals,
+      String staticPrefix,
+      Iterable<URL> customTemplates,
+      String siteTitle) {
     checkNotNull(staticPrefix, "staticPrefix");
 
     ImmutableMap.Builder<String, URL> b = ImmutableMap.builder();
@@ -153,8 +157,9 @@
     return newRenderer(templateName).setData(soyData).render();
   }
 
-  void render(HttpServletRequest req, HttpServletResponse res,
-      String templateName, Map<String, ?> soyData) throws IOException {
+  void render(
+      HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
+      throws IOException {
     res.setContentType("text/html");
     res.setCharacterEncoding("UTF-8");
     byte[] data = newRenderer(templateName).setData(soyData).render().getBytes(UTF_8);
@@ -168,9 +173,7 @@
 
   OutputStream renderStreaming(HttpServletResponse res, String templateName, Map<String, ?> soyData)
       throws IOException {
-    final String html = newRenderer(templateName)
-        .setData(soyData)
-        .render();
+    final String html = newRenderer(templateName).setData(soyData).render();
     int id = html.indexOf(PLACEHOLDER);
     checkArgument(id >= 0, "Template must contain %s", PLACEHOLDER);
 
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 6eb5033..bbaabc5 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
@@ -43,8 +43,8 @@
   }
 
   @Override
-  public void doFilter(HttpServletRequest req, HttpServletResponse res,
-      FilterChain chain) throws IOException, ServletException {
+  public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain)
+      throws IOException, ServletException {
     try {
       String repo = ViewFilter.trimLeadingSlash(getRegexGroup(req, 1));
       try (Repository git = resolver.open(req, repo)) {
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 d1dfbd8..c45e0e6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -55,15 +55,14 @@
 
   private final TimeCache timeCache;
 
-  public RepositoryIndexServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      TimeCache timeCache) {
+  public RepositoryIndexServlet(
+      GitilesAccess.Factory accessFactory, Renderer renderer, TimeCache timeCache) {
     super(renderer, accessFactory);
     this.timeCache = checkNotNull(timeCache, "timeCache");
   }
 
   @Override
-  protected void doHead(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doHead(HttpServletRequest req, HttpServletResponse res) throws IOException {
     // If the repository didn't exist a prior filter would have 404 replied.
     Optional<FormatType> format = getFormat(req);
     if (!format.isPresent()) {
@@ -77,7 +76,7 @@
         res.setContentType(format.get().getMimeType());
         break;
       case TEXT:
-        default:
+      default:
         res.sendError(SC_BAD_REQUEST);
         break;
     }
@@ -155,8 +154,8 @@
     return list.size() > REF_LIMIT ? list.subList(0, REF_LIMIT) : list;
   }
 
-  private static Map<String, Object> renderReadme(RevWalk walk,
-      GitilesView view, Config cfg, RevObject head) throws IOException {
+  private static Map<String, Object> renderReadme(
+      RevWalk walk, GitilesView view, Config cfg, RevObject head) throws IOException {
     RevTree rootTree;
     try {
       rootTree = walk.parseTree(head);
@@ -164,13 +163,15 @@
       return null;
     }
 
-    ReadmeHelper readme = new ReadmeHelper(
-        walk.getObjectReader(),
-        GitilesView.path().copyFrom(view).setRevision(Revision.HEAD).setPathPart("/").build(),
-        cfg, rootTree);
+    ReadmeHelper readme =
+        new ReadmeHelper(
+            walk.getObjectReader(),
+            GitilesView.path().copyFrom(view).setRevision(Revision.HEAD).setPathPart("/").build(),
+            cfg,
+            rootTree);
     readme.scanTree(rootTree);
     if (readme.isPresent()) {
-      return ImmutableMap.<String, Object> of("readmeHtml", readme.render());
+      return ImmutableMap.<String, Object>of("readmeHtml", readme.render());
     }
     return null;
   }
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 00d5763..356fbc7 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Revision.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Revision.java
@@ -46,8 +46,7 @@
   public static final Revision HEAD = named("HEAD");
 
   public static Revision normalizeParentExpressions(Revision rev) {
-    if (rev == null
-        || (rev.name.indexOf('~') < 0 && rev.name.indexOf('^') < 0)) {
+    if (rev == null || (rev.name.indexOf('~') < 0 && rev.name.indexOf('^') < 0)) {
       return rev;
     }
     return new Revision(rev.id.name(), rev.id, rev.type, rev.peeledId, rev.peeledType);
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 9f234d1..59112d0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
@@ -167,8 +167,9 @@
             } else {
               oldRevision = Revision.NULL;
             }
-            Result result = new Result(Revision.peeled(name, c), oldRevision,
-                path.substring(name.length() + 2));
+            Result result =
+                new Result(
+                    Revision.peeled(name, c), oldRevision, path.substring(name.length() + 2));
             return isVisible(walk, result) ? result : null;
           }
         }
@@ -212,9 +213,7 @@
   private static boolean isValidRevision(String revision) {
     // Disallow some uncommon but valid revision expressions that either we
     // don't support or we represent differently in our URLs.
-    return !revision.contains(":")
-        && !revision.contains("^{")
-        && !revision.contains("@");
+    return !revision.contains(":") && !revision.contains("^{") && !revision.contains("@");
   }
 
   private boolean isVisible(RevWalk walk, Result result) throws IOException {
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 9887195..9c7fdb0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -67,8 +67,8 @@
 
   private final Linkifier linkifier;
 
-  public RevisionServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      Linkifier linkifier) {
+  public RevisionServlet(
+      GitilesAccess.Factory accessFactory, Renderer renderer, Linkifier linkifier) {
     super(renderer, accessFactory);
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
@@ -92,33 +92,39 @@
         try {
           switch (obj.getType()) {
             case OBJ_COMMIT:
-              soyObjects.add(ImmutableMap.of(
-                  "type", Constants.TYPE_COMMIT,
-                  "data", new CommitSoyData()
-                      .setLinkifier(linkifier)
-                      .setRevWalk(walk)
-                      .setArchiveFormat(getArchiveFormat(access))
-                      .toSoyData(req, (RevCommit) obj, COMMIT_SOY_FIELDS, df)));
+              soyObjects.add(
+                  ImmutableMap.of(
+                      "type",
+                      Constants.TYPE_COMMIT,
+                      "data",
+                      new CommitSoyData()
+                          .setLinkifier(linkifier)
+                          .setRevWalk(walk)
+                          .setArchiveFormat(getArchiveFormat(access))
+                          .toSoyData(req, (RevCommit) obj, COMMIT_SOY_FIELDS, df)));
               break;
             case OBJ_TREE:
               Map<String, Object> tree =
-                  new TreeSoyData(walk.getObjectReader(), view, cfg, (RevTree) obj)
-                      .toSoyData(obj);
-              soyObjects.add(ImmutableMap.of(
-                  "type", Constants.TYPE_TREE,
-                  "data", tree));
+                  new TreeSoyData(walk.getObjectReader(), view, cfg, (RevTree) obj).toSoyData(obj);
+              soyObjects.add(ImmutableMap.of("type", Constants.TYPE_TREE, "data", tree));
               hasReadme = tree.containsKey("readmeHtml");
               break;
             case OBJ_BLOB:
-              soyObjects.add(ImmutableMap.of(
-                  "type", Constants.TYPE_BLOB,
-                  "data", new BlobSoyData(walk.getObjectReader(), view).toSoyData(obj)));
+              soyObjects.add(
+                  ImmutableMap.of(
+                      "type",
+                      Constants.TYPE_BLOB,
+                      "data",
+                      new BlobSoyData(walk.getObjectReader(), view).toSoyData(obj)));
               hasBlob = true;
               break;
             case OBJ_TAG:
-              soyObjects.add(ImmutableMap.of(
-                  "type", Constants.TYPE_TAG,
-                  "data", new TagSoyData(linkifier, req).toSoyData((RevTag) obj, df)));
+              soyObjects.add(
+                  ImmutableMap.of(
+                      "type",
+                      Constants.TYPE_TAG,
+                      "data",
+                      new TagSoyData(linkifier, req).toSoyData((RevTag) obj, df)));
               break;
             default:
               log.warn("Bad object type for {}: {}", ObjectId.toString(obj.getId()), obj.getType());
@@ -136,11 +142,15 @@
         }
       }
 
-      renderHtml(req, res, "gitiles.revisionDetail", ImmutableMap.of(
-          "title", view.getRevision().getName(),
-          "objects", soyObjects,
-          "hasBlob", hasBlob,
-          "hasReadme", hasReadme));
+      renderHtml(
+          req,
+          res,
+          "gitiles.revisionDetail",
+          ImmutableMap.of(
+              "title", view.getRevision().getName(),
+              "objects", soyObjects,
+              "hasBlob", hasBlob,
+              "hasReadme", hasReadme));
     }
   }
 
@@ -149,16 +159,16 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
     try (ObjectReader reader = repo.newObjectReader()) {
-        ObjectLoader loader = reader.open(view.getRevision().getId());
-        if (loader.getType() != OBJ_COMMIT) {
-          res.setStatus(SC_NOT_FOUND);
-        } else {
-          PathServlet.setTypeHeader(res, loader.getType());
-          try (Writer writer = startRenderText(req, res);
-              OutputStream out = BaseEncoding.base64().encodingStream(writer)) {
-            loader.copyTo(out);
-          }
+      ObjectLoader loader = reader.open(view.getRevision().getId());
+      if (loader.getType() != OBJ_COMMIT) {
+        res.setStatus(SC_NOT_FOUND);
+      } else {
+        PathServlet.setTypeHeader(res, loader.getType());
+        try (Writer writer = startRenderText(req, res);
+            OutputStream out = BaseEncoding.base64().encodingStream(writer)) {
+          loader.copyTo(out);
         }
+      }
     }
   }
 
@@ -172,9 +182,12 @@
       RevObject obj = walk.parseAny(view.getRevision().getId());
       switch (obj.getType()) {
         case OBJ_COMMIT:
-          renderJson(req, res, new CommitJsonData()
-                .setRevWalk(walk)
-                .toJsonData(req, (RevCommit) obj, COMMIT_JSON_FIELDS, df),
+          renderJson(
+              req,
+              res,
+              new CommitJsonData()
+                  .setRevWalk(walk)
+                  .toJsonData(req, (RevCommit) obj, COMMIT_JSON_FIELDS, df),
               Commit.class);
           break;
         default:
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 bdf4aa9..057aba8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RootedDocServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RootedDocServlet.java
@@ -47,8 +47,10 @@
   private final RepositoryResolver<HttpServletRequest> resolver;
   private final DocServlet docServlet;
 
-  public RootedDocServlet(RepositoryResolver<HttpServletRequest> resolver,
-      GitilesAccess.Factory accessFactory, Renderer renderer) {
+  public RootedDocServlet(
+      RepositoryResolver<HttpServletRequest> resolver,
+      GitilesAccess.Factory accessFactory,
+      Renderer renderer) {
     this.resolver = resolver;
     docServlet = new DocServlet(accessFactory, renderer);
   }
@@ -77,15 +79,18 @@
       }
 
       req.setAttribute(ATTRIBUTE_REPOSITORY, repo);
-      ViewFilter.setView(req, GitilesView.rootedDoc()
-          .setHostName(req.getServerName())
-          .setServletPath(req.getContextPath() + req.getServletPath())
-          .setRevision(BRANCH, obj)
-          .setPathPart(req.getPathInfo())
-          .build());
+      ViewFilter.setView(
+          req,
+          GitilesView.rootedDoc()
+              .setHostName(req.getServerName())
+              .setServletPath(req.getContextPath() + req.getServletPath())
+              .setRevision(BRANCH, obj)
+              .setPathPart(req.getPathInfo())
+              .build());
 
       docServlet.service(req, res);
-    } catch (RepositoryNotFoundException | ServiceNotAuthorizedException
+    } catch (RepositoryNotFoundException
+        | ServiceNotAuthorizedException
         | ServiceNotEnabledException e) {
       log.error(String.format("cannot open repository for %s", req.getServerName()), e);
       res.sendError(HttpServletResponse.SC_NOT_FOUND);
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 f5881d4..36646aa 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ThreadSafePrettifyParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ThreadSafePrettifyParser.java
@@ -20,15 +20,15 @@
 import prettify.parser.Prettify;
 
 public class ThreadSafePrettifyParser extends PrettifyParser {
-  public static final ThreadSafePrettifyParser INSTANCE =
-      new ThreadSafePrettifyParser();
+  public static final ThreadSafePrettifyParser INSTANCE = new ThreadSafePrettifyParser();
 
   private ThreadSafePrettifyParser() {
     // Prettify is not thread safe ... unless we do this.
-    prettify = new Prettify() {
-      {
-        langHandlerRegistry = Collections.synchronizedMap(langHandlerRegistry);
-      }
-    };
+    prettify =
+        new Prettify() {
+          {
+            langHandlerRegistry = Collections.synchronizedMap(langHandlerRegistry);
+          }
+        };
   }
 }
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 efdff6e..7021733 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TimeCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TimeCache.java
@@ -58,25 +58,27 @@
 
   Long getTime(final RevWalk walk, final ObjectId id) throws IOException {
     try {
-      return cache.get(id, new Callable<Long>() {
-        @Override
-        public Long call() throws IOException {
-          RevObject o = walk.parseAny(id);
-          while (o instanceof RevTag) {
-            RevTag tag = (RevTag) o;
-            PersonIdent ident = tag.getTaggerIdent();
-            if (ident != null) {
-              return ident.getWhen().getTime() / 1000;
+      return cache.get(
+          id,
+          new Callable<Long>() {
+            @Override
+            public Long call() throws IOException {
+              RevObject o = walk.parseAny(id);
+              while (o instanceof RevTag) {
+                RevTag tag = (RevTag) o;
+                PersonIdent ident = tag.getTaggerIdent();
+                if (ident != null) {
+                  return ident.getWhen().getTime() / 1000;
+                }
+                o = tag.getObject();
+                walk.parseHeaders(o);
+              }
+              if (o.getType() == Constants.OBJ_COMMIT) {
+                return Long.valueOf(((RevCommit) o).getCommitTime());
+              }
+              return Long.MIN_VALUE;
             }
-            o = tag.getObject();
-            walk.parseHeaders(o);
-          }
-          if (o.getType() == Constants.OBJ_COMMIT) {
-            return Long.valueOf(((RevCommit) o).getCommitTime());
-          }
-          return Long.MIN_VALUE;
-        }
-      });
+          });
     } catch (ExecutionException e) {
       Throwables.propagateIfInstanceOf(e.getCause(), IOException.class);
       throw new IOException(e);
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 4ad6562..b525453 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
@@ -53,6 +53,5 @@
     return tree;
   }
 
-  private TreeJsonData() {
-  }
+  private TreeJsonData() {}
 }
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 6967c65..f1366ad 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
@@ -54,10 +54,7 @@
     if (resolved == null) {
       return null;
     }
-    return GitilesView.path()
-        .copyFrom(view)
-        .setPathPart(resolved)
-        .toUrl();
+    return GitilesView.path().copyFrom(view).setPathPart(resolved).toUrl();
   }
 
   @VisibleForTesting
@@ -77,8 +74,7 @@
   private final RevTree rootTree;
   private ArchiveFormat archiveFormat;
 
-  public TreeSoyData(ObjectReader reader, GitilesView view, Config cfg,
-      RevTree rootTree) {
+  public TreeSoyData(ObjectReader reader, GitilesView view, Config cfg, RevTree rootTree) {
     this.reader = reader;
     this.view = view;
     this.cfg = cfg;
@@ -90,8 +86,8 @@
     return this;
   }
 
-  public Map<String, Object> toSoyData(ObjectId treeId, TreeWalk tw) throws MissingObjectException,
-         IOException {
+  public Map<String, Object> toSoyData(ObjectId treeId, TreeWalk tw)
+      throws MissingObjectException, IOException {
     ReadmeHelper readme = new ReadmeHelper(reader, view, cfg, rootTree);
     List<Object> entries = Lists.newArrayList();
     GitilesView.Builder urlBuilder = GitilesView.path().copyFrom(view);
@@ -108,8 +104,8 @@
           urlBuilder.setPathPart(name);
           break;
         default:
-          throw new IllegalStateException(String.format(
-              "Cannot render TreeSoyData from %s view", view.getType()));
+          throw new IllegalStateException(
+              String.format("Cannot render TreeSoyData from %s view", view.getType()));
       }
 
       String url = urlBuilder.toUrl();
@@ -122,9 +118,7 @@
       entry.put("name", name);
       entry.put("url", url);
       if (type == FileType.SYMLINK) {
-        String target = new String(
-            reader.open(tw.getObjectId(0)).getCachedBytes(),
-            UTF_8);
+        String target = new String(reader.open(tw.getObjectId(0)).getCachedBytes(), UTF_8);
         entry.put("targetName", getTargetDisplayName(target));
         String targetUrl = resolveTargetUrl(view, target);
         if (targetUrl != null) {
@@ -143,11 +137,13 @@
     if (view.getType() == GitilesView.Type.PATH
         && view.getRevision().getPeeledType() == OBJ_COMMIT) {
       data.put("logUrl", GitilesView.log().copyFrom(view).toUrl());
-      data.put("archiveUrl", GitilesView.archive()
-          .copyFrom(view)
-          .setPathPart(Strings.emptyToNull(view.getPathPart()))
-          .setExtension(archiveFormat.getDefaultSuffix())
-          .toUrl());
+      data.put(
+          "archiveUrl",
+          GitilesView.archive()
+              .copyFrom(view)
+              .setPathPart(Strings.emptyToNull(view.getPathPart()))
+              .setExtension(archiveFormat.getDefaultSuffix())
+              .toUrl());
       data.put("archiveType", archiveFormat.getShortName());
     }
 
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 3bd5e09..131a353 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -93,8 +93,8 @@
   private final GitilesAccess.Factory accessFactory;
   private final VisibilityCache visibilityCache;
 
-  public ViewFilter(GitilesAccess.Factory accessFactory, GitilesUrls urls,
-      VisibilityCache visibilityCache) {
+  public ViewFilter(
+      GitilesAccess.Factory accessFactory, GitilesUrls urls, VisibilityCache visibilityCache) {
     this.urls = checkNotNull(urls, "urls");
     this.accessFactory = checkNotNull(accessFactory, "accessFactory");
     this.visibilityCache = checkNotNull(visibilityCache, "visibilityCache");
@@ -134,8 +134,7 @@
     }
   }
 
-  private boolean normalize(GitilesView.Builder view, HttpServletResponse res)
-      throws IOException {
+  private boolean normalize(GitilesView.Builder view, HttpServletResponse res) throws IOException {
     if (view.getOldRevision() != Revision.NULL) {
       return false;
     }
@@ -185,8 +184,7 @@
     }
   }
 
-  private GitilesView.Builder parseNoCommand(HttpServletRequest req,
-      String repoName) {
+  private GitilesView.Builder parseNoCommand(HttpServletRequest req, String repoName) {
     if (!hasRepository(req)) {
       return GitilesView.hostIndex().setRepositoryPrefix(repoName);
     }
@@ -217,8 +215,8 @@
         .setExtension(ext);
   }
 
-  private GitilesView.Builder parseAutoCommand(
-      HttpServletRequest req, String repoName, String path) throws IOException {
+  private GitilesView.Builder parseAutoCommand(HttpServletRequest req, String repoName, String path)
+      throws IOException {
     // Note: if you change the mapping for +, make sure to change
     // GitilesView.toUrl() correspondingly.
     if (path.isEmpty()) {
@@ -234,9 +232,9 @@
     GitilesView.Builder b = parseShowCommand(repoName, result);
     if (b != null && b.getPathPart() != null && b.getPathPart().endsWith(".md")) {
       return GitilesView.doc()
-        .setRepositoryName(repoName)
-        .setRevision(result.getRevision())
-        .setPathPart(result.getPath());
+          .setRepositoryName(repoName)
+          .setRevision(result.getRevision())
+          .setPathPart(result.getPath());
     }
     return b;
   }
@@ -260,18 +258,15 @@
     if (isEmptyOrSlash(path)) {
       return null;
     }
-    return GitilesView.describe()
-        .setRepositoryName(repoName)
-        .setPathPart(path);
+    return GitilesView.describe().setRepositoryName(repoName).setPathPart(path);
   }
 
-  private GitilesView.Builder parseDiffCommand(
-      HttpServletRequest req, String repoName, String path) throws IOException {
+  private GitilesView.Builder parseDiffCommand(HttpServletRequest req, String repoName, String path)
+      throws IOException {
     return parseDiffCommand(repoName, parseRevision(req, path));
   }
 
-  private GitilesView.Builder parseDiffCommand(
-      String repoName, RevisionParser.Result result) {
+  private GitilesView.Builder parseDiffCommand(String repoName, RevisionParser.Result result) {
     if (result == null) {
       return null;
     }
@@ -282,8 +277,8 @@
         .setPathPart(result.getPath());
   }
 
-  private GitilesView.Builder parseLogCommand(
-      HttpServletRequest req, String repoName, String path) throws IOException {
+  private GitilesView.Builder parseLogCommand(HttpServletRequest req, String repoName, String path)
+      throws IOException {
     if (isEmptyOrSlash(path)) {
       return GitilesView.log().setRepositoryName(repoName);
     }
@@ -299,46 +294,39 @@
   }
 
   private GitilesView.Builder parseRefsCommand(String repoName, String path) {
-    return GitilesView.refs()
-        .setRepositoryName(repoName)
-        .setPathPart(path);
+    return GitilesView.refs().setRepositoryName(repoName).setPathPart(path);
   }
 
-  private GitilesView.Builder parseShowCommand(
-      HttpServletRequest req, String repoName, String path) throws IOException {
+  private GitilesView.Builder parseShowCommand(HttpServletRequest req, String repoName, String path)
+      throws IOException {
     return parseShowCommand(repoName, parseRevision(req, path));
   }
 
-  private GitilesView.Builder parseShowCommand(
-      String repoName, RevisionParser.Result result) {
+  private GitilesView.Builder parseShowCommand(String repoName, RevisionParser.Result result) {
     if (result == null || result.getOldRevision() != null) {
       return null;
     }
     if (result.getPath().isEmpty()) {
-      return GitilesView.revision()
-        .setRepositoryName(repoName)
-        .setRevision(result.getRevision());
+      return GitilesView.revision().setRepositoryName(repoName).setRevision(result.getRevision());
     } else {
       return GitilesView.path()
-        .setRepositoryName(repoName)
-        .setRevision(result.getRevision())
-        .setPathPart(result.getPath());
+          .setRepositoryName(repoName)
+          .setRevision(result.getRevision())
+          .setPathPart(result.getPath());
     }
   }
 
-  private GitilesView.Builder parseDocCommand(
-      HttpServletRequest req, String repoName, String path) throws IOException {
+  private GitilesView.Builder parseDocCommand(HttpServletRequest req, String repoName, String path)
+      throws IOException {
     return parseDocCommand(repoName, parseRevision(req, path));
   }
 
-  private GitilesView.Builder parseDocCommand(
-      String repoName, RevisionParser.Result result) {
+  private GitilesView.Builder parseDocCommand(String repoName, RevisionParser.Result result) {
     if (result == null || result.getOldRevision() != null) {
       return null;
     }
-    GitilesView.Builder b = GitilesView.doc()
-        .setRepositoryName(repoName)
-        .setRevision(result.getRevision());
+    GitilesView.Builder b =
+        GitilesView.doc().setRepositoryName(repoName).setRevision(result.getRevision());
     if (!result.getPath().isEmpty()) {
       b.setPathPart(result.getPath());
     }
@@ -347,8 +335,9 @@
 
   private RevisionParser.Result parseRevision(HttpServletRequest req, String path)
       throws IOException {
-    RevisionParser revParser = new RevisionParser(
-        ServletUtils.getRepository(req), accessFactory.forRequest(req), visibilityCache);
+    RevisionParser revParser =
+        new RevisionParser(
+            ServletUtils.getRepository(req), accessFactory.forRequest(req), visibilityCache);
     return revParser.parse(checkLeadingSlash(path));
   }
 }
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 cc36da8..2c0385d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
@@ -81,10 +81,10 @@
     @Override
     public String toString() {
       return toStringHelper(this)
-        .add("user", user)
-        .add("repositoryName", repositoryName)
-        .add("objectId", objectId)
-        .toString();
+          .add("user", user)
+          .add("repositoryName", repositoryName)
+          .add("objectId", objectId)
+          .toString();
     }
   }
 
@@ -92,9 +92,7 @@
   private final boolean topoSort;
 
   public static CacheBuilder<Object, Object> defaultBuilder() {
-    return CacheBuilder.newBuilder()
-        .maximumSize(1 << 10)
-        .expireAfterWrite(30, TimeUnit.MINUTES);
+    return CacheBuilder.newBuilder().maximumSize(1 << 10).expireAfterWrite(30, TimeUnit.MINUTES);
   }
 
   public VisibilityCache(boolean topoSort) {
@@ -110,8 +108,13 @@
     return cache;
   }
 
-  boolean isVisible(final Repository repo, final RevWalk walk, GitilesAccess access,
-      final ObjectId id, final ObjectId... knownReachable) throws IOException {
+  boolean isVisible(
+      final Repository repo,
+      final RevWalk walk,
+      GitilesAccess access,
+      final ObjectId id,
+      final ObjectId... knownReachable)
+      throws IOException {
     try {
       return cache.get(
           new Key(access.getUserKey(), access.getRepositoryName(), id),
@@ -135,8 +138,9 @@
     }
   }
 
-  private boolean isVisible(Repository repo, RevWalk walk, ObjectId id,
-      Collection<ObjectId> knownReachable) throws IOException {
+  private boolean isVisible(
+      Repository repo, RevWalk walk, ObjectId id, Collection<ObjectId> knownReachable)
+      throws IOException {
     RevCommit commit;
     try {
       commit = walk.parseCommit(id);
@@ -175,23 +179,28 @@
 
   @SuppressWarnings("unchecked")
   private static Predicate<Ref> otherRefs() {
-    return not(Predicates.<Ref> or(
-        refStartsWith(R_HEADS), refStartsWith(R_TAGS), refStartsWith("refs/changes/")));
+    return not(
+        Predicates.<Ref>or(
+            refStartsWith(R_HEADS), refStartsWith(R_TAGS), refStartsWith("refs/changes/")));
   }
 
-  private boolean isReachableFromRefs(RevWalk walk, RevCommit commit,
-      Collection<Ref> refs) throws IOException {
-    return isReachableFrom(walk, commit,
-        Collections2.transform(refs, new Function<Ref, ObjectId>() {
-          @Override
-          public ObjectId apply(Ref ref) {
-            if (ref.getPeeledObjectId() != null) {
-              return ref.getPeeledObjectId();
-            } else {
-              return ref.getObjectId();
-            }
-          }
-        }));
+  private boolean isReachableFromRefs(RevWalk walk, RevCommit commit, Collection<Ref> refs)
+      throws IOException {
+    return isReachableFrom(
+        walk,
+        commit,
+        Collections2.transform(
+            refs,
+            new Function<Ref, ObjectId>() {
+              @Override
+              public ObjectId apply(Ref ref) {
+                if (ref.getPeeledObjectId() != null) {
+                  return ref.getPeeledObjectId();
+                } else {
+                  return ref.getObjectId();
+                }
+              }
+            }));
   }
 
   private boolean isReachableFrom(RevWalk walk, RevCommit commit, Collection<ObjectId> ids)
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 9c5edbd..daae821 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
@@ -69,8 +69,7 @@
   }
 
   @Override
-  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
@@ -82,20 +81,32 @@
       }
 
       String title = "Blame - " + view.getPathPart();
-      Map<String, ?> blobData = new BlobSoyData(rw.getObjectReader(), view)
-          .toSoyData(view.getPathPart(), result.blobId);
+      Map<String, ?> blobData =
+          new BlobSoyData(rw.getObjectReader(), view).toSoyData(view.getPathPart(), result.blobId);
       if (blobData.get("lines") != null) {
         DateFormatter df = new DateFormatter(access, Format.ISO);
-        renderHtml(req, res, "gitiles.blameDetail", ImmutableMap.of(
-            "title", title,
-            "breadcrumbs", view.getBreadcrumbs(),
-            "data", blobData,
-            "regions", toSoyData(view, rw.getObjectReader(), result.regions, df)));
+        renderHtml(
+            req,
+            res,
+            "gitiles.blameDetail",
+            ImmutableMap.of(
+                "title",
+                title,
+                "breadcrumbs",
+                view.getBreadcrumbs(),
+                "data",
+                blobData,
+                "regions",
+                toSoyData(view, rw.getObjectReader(), result.regions, df)));
       } else {
-        renderHtml(req, res, "gitiles.blameDetail", ImmutableMap.of(
-            "title", title,
-            "breadcrumbs", view.getBreadcrumbs(),
-            "data", blobData));
+        renderHtml(
+            req,
+            res,
+            "gitiles.blameDetail",
+            ImmutableMap.of(
+                "title", title,
+                "breadcrumbs", view.getBreadcrumbs(),
+                "data", blobData));
       }
     }
   }
@@ -118,15 +129,19 @@
         r.setStart(start);
         start += r.getCount();
       }
-      renderJson(req, res, ImmutableMap.of("regions", result.regions),
+      renderJson(
+          req,
+          res,
+          ImmutableMap.of("regions", result.regions),
           new TypeToken<Map<String, List<Region>>>() {}.getType());
     }
   }
 
   @Override
   protected GsonBuilder newGsonBuilder(HttpServletRequest req) throws IOException {
-    return super.newGsonBuilder(req).registerTypeAdapter(Region.class,
-        new RegionAdapter(new DateFormatter(getAccess(req), Format.ISO)));
+    return super.newGsonBuilder(req)
+        .registerTypeAdapter(
+            Region.class, new RegionAdapter(new DateFormatter(getAccess(req), Format.ISO)));
   }
 
   private static class RegionResult {
@@ -139,8 +154,9 @@
     }
   }
 
-  private RegionResult getRegions(GitilesView view, GitilesAccess access, Repository repo,
-      RevWalk rw, HttpServletResponse res) throws IOException {
+  private RegionResult getRegions(
+      GitilesView view, GitilesAccess access, Repository repo, RevWalk rw, HttpServletResponse res)
+      throws IOException {
     RevCommit currCommit = rw.parseCommit(view.getRevision().getId());
     ObjectId currCommitBlobId = resolveBlob(view, rw, currCommit);
     if (currCommitBlobId == null) {
@@ -152,13 +168,15 @@
     ObjectId lastCommitBlobId = resolveBlob(view, rw, lastCommit);
 
     if (!Objects.equals(currCommitBlobId, lastCommitBlobId)) {
-      log.warn(String.format("Blob %s in last modified commit %s for repo %s starting from %s"
-          + " does not match original blob %s",
-          ObjectId.toString(lastCommitBlobId),
-          ObjectId.toString(lastCommit),
-          access.getRepositoryName(),
-          ObjectId.toString(currCommit),
-          ObjectId.toString(currCommitBlobId)));
+      log.warn(
+          String.format(
+              "Blob %s in last modified commit %s for repo %s starting from %s"
+                  + " does not match original blob %s",
+              ObjectId.toString(lastCommitBlobId),
+              ObjectId.toString(lastCommit),
+              access.getRepositoryName(),
+              ObjectId.toString(currCommit),
+              ObjectId.toString(currCommitBlobId)));
       lastCommitBlobId = currCommitBlobId;
       lastCommit = currCommit;
     }
@@ -191,6 +209,7 @@
   private static final ImmutableList<String> CLASSES =
       ImmutableList.of("Blame-region--bg1", "Blame-region--bg2");
   private static final ImmutableList<SoyMapData> NULLS;
+
   static {
     ImmutableList.Builder<SoyMapData> nulls = ImmutableList.builder();
     for (String clazz : CLASSES) {
@@ -199,8 +218,9 @@
     NULLS = nulls.build();
   }
 
-  private static SoyListData toSoyData(GitilesView view, ObjectReader reader,
-      List<Region> regions, DateFormatter df) throws IOException {
+  private static SoyListData toSoyData(
+      GitilesView view, ObjectReader reader, List<Region> regions, DateFormatter df)
+      throws IOException {
     Map<ObjectId, String> abbrevShas = Maps.newHashMap();
     SoyListData result = new SoyListData();
 
@@ -225,18 +245,24 @@
           blameParent = "^";
           blameText = "blame^";
         }
-        e.put("blameUrl", GitilesView.blame().copyFrom(view)
-            .setRevision(r.getSourceCommit().name() + blameParent)
-            .setPathPart(r.getSourcePath())
-            .toUrl());
+        e.put(
+            "blameUrl",
+            GitilesView.blame()
+                .copyFrom(view)
+                .setRevision(r.getSourceCommit().name() + blameParent)
+                .setPathPart(r.getSourcePath())
+                .toUrl());
         e.put("blameText", blameText);
-        e.put("commitUrl", GitilesView.revision().copyFrom(view)
-            .setRevision(r.getSourceCommit().name())
-            .toUrl());
-        e.put("diffUrl", GitilesView.diff().copyFrom(view)
-            .setRevision(r.getSourceCommit().name())
-            .setPathPart(r.getSourcePath())
-            .toUrl());
+        e.put(
+            "commitUrl",
+            GitilesView.revision().copyFrom(view).setRevision(r.getSourceCommit().name()).toUrl());
+        e.put(
+            "diffUrl",
+            GitilesView.diff()
+                .copyFrom(view)
+                .setRevision(r.getSourceCommit().name())
+                .setPathPart(r.getSourcePath())
+                .toUrl());
         e.put("author", CommitSoyData.toSoyData(r.getSourceAuthor(), df));
         e.put("class", CLASSES.get(c));
         result.add(e);
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 a9710ae..eed270f 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
@@ -35,15 +35,23 @@
   @Override
   public void write(JsonWriter out, Region value) throws IOException {
     out.beginObject()
-        .name("start").value(value.getStart() + 1)
-        .name("count").value(value.getCount())
-        .name("path").value(value.getSourcePath())
-        .name("commit").value(ObjectId.toString(value.getSourceCommit()))
-        .name("author").beginObject()
+        .name("start")
+        .value(value.getStart() + 1)
+        .name("count")
+        .value(value.getCount())
+        .name("path")
+        .value(value.getSourcePath())
+        .name("commit")
+        .value(ObjectId.toString(value.getSourceCommit()))
+        .name("author")
+        .beginObject()
         // TODO(dborowitz): Use an adapter from CommitJsonData instead.
-        .name("name").value(value.getSourceAuthor().getName())
-        .name("email").value(value.getSourceAuthor().getEmailAddress())
-        .name("time").value(df.format(value.getSourceAuthor()))
+        .name("name")
+        .value(value.getSourceAuthor().getName())
+        .name("email")
+        .value(value.getSourceAuthor().getEmailAddress())
+        .name("time")
+        .value(df.format(value.getSourceAuthor()))
         .endObject()
         .endObject();
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/ColsNode.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/ColsNode.java
index 7c31b0f..502c39f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/ColsNode.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/ColsNode.java
@@ -57,10 +57,8 @@
     int idx = 0;
     Column col = null;
     for (Node n : children) {
-      if (col == null
-          || n instanceof HeaderNode
-          || n instanceof DivNode) {
-        for (;;) {
+      if (col == null || n instanceof HeaderNode || n instanceof DivNode) {
+        for (; ; ) {
           if (idx < columns.size()) {
             col = columns.get(idx);
           } else {
@@ -78,9 +76,7 @@
   }
 
   private static <T> ArrayList<T> copyOf(List<T> in) {
-    return in != null && !in.isEmpty()
-        ? new ArrayList<>(in)
-        : new ArrayList<T>();
+    return in != null && !in.isEmpty() ? new ArrayList<>(in) : new ArrayList<T>();
   }
 
   @SuppressWarnings("unchecked")
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DivNode.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DivNode.java
index f3389de..9bdb926 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DivNode.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DivNode.java
@@ -25,9 +25,10 @@
   private final String style;
 
   DivNode(String style, List<Node> list) {
-    super(list.size() == 1 && list.get(0) instanceof ParaNode
-        ? ((ParaNode) list.get(0)).getChildren()
-        : list);
+    super(
+        list.size() == 1 && list.get(0) instanceof ParaNode
+            ? ((ParaNode) list.get(0)).getChildren()
+            : list);
     this.style = style;
   }
 
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 59b8b5c..4b774a5 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
@@ -76,8 +76,7 @@
   }
 
   @Override
-  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     Config cfg = getAccess(req).getConfig();
     if (!cfg.getBoolean("markdown", "render", true)) {
       res.setStatus(SC_NOT_FOUND);
@@ -110,13 +109,14 @@
         return;
       }
 
-      Duration parseTimeout = ConfigUtil.getDuration(cfg, "markdown", null,
-          "parseTimeout", Duration.standardSeconds(2));
+      Duration parseTimeout =
+          ConfigUtil.getDuration(
+              cfg, "markdown", null, "parseTimeout", Duration.standardSeconds(2));
       view = view.toBuilder().setPathPart(srcmd.path).build();
       int inputLimit = cfg.getInt("markdown", "inputLimit", 5 << 20);
-      RootNode doc = GitilesMarkdown.parseFile(
-          parseTimeout, view, srcmd.path,
-          srcmd.read(rw.getObjectReader(), inputLimit));
+      RootNode doc =
+          GitilesMarkdown.parseFile(
+              parseTimeout, view, srcmd.path, srcmd.read(rw.getObjectReader(), inputLimit));
       if (doc == null) {
         res.sendRedirect(GitilesView.show().copyFrom(view).toUrl());
         return;
@@ -124,9 +124,9 @@
 
       RootNode nav = null;
       if (navmd != null) {
-        nav = GitilesMarkdown.parseFile(
-            parseTimeout, view, navmd.path,
-            navmd.read(rw.getObjectReader(), inputLimit));
+        nav =
+            GitilesMarkdown.parseFile(
+                parseTimeout, view, navmd.path, navmd.read(rw.getObjectReader(), inputLimit));
         if (nav == null) {
           res.setStatus(SC_INTERNAL_SERVER_ERROR);
           return;
@@ -136,8 +136,7 @@
       int imageLimit = cfg.getInt("markdown", "imageLimit", 256 << 10);
       ImageLoader img = null;
       if (imageLimit > 0) {
-        img = new ImageLoader(rw.getObjectReader(), view,
-            root, srcmd.path, imageLimit);
+        img = new ImageLoader(rw.getObjectReader(), view, root, srcmd.path, imageLimit);
       }
 
       res.setHeader(HttpHeaders.ETAG, curEtag);
@@ -171,23 +170,25 @@
     res.setHeader(HttpHeaders.CACHE_CONTROL, "private, max-age=0, must-revalidate");
   }
 
-  private void showDoc(HttpServletRequest req, HttpServletResponse res,
-      GitilesView view, Config cfg, ImageLoader img,
-      RootNode nav, RootNode doc) throws IOException {
+  private void showDoc(
+      HttpServletRequest req,
+      HttpServletResponse res,
+      GitilesView view,
+      Config cfg,
+      ImageLoader img,
+      RootNode nav,
+      RootNode doc)
+      throws IOException {
     Map<String, Object> data = new HashMap<>();
     data.putAll(Navbar.bannerSoyData(view, img, nav));
-    data.put("pageTitle", MoreObjects.firstNonNull(
-        MarkdownUtil.getTitle(doc),
-        view.getPathPart()));
+    data.put("pageTitle", MoreObjects.firstNonNull(MarkdownUtil.getTitle(doc), view.getPathPart()));
     if (view.getType() != GitilesView.Type.ROOTED_DOC) {
       data.put("sourceUrl", GitilesView.show().copyFrom(view).toUrl());
       data.put("logUrl", GitilesView.log().copyFrom(view).toUrl());
       data.put("blameUrl", GitilesView.blame().copyFrom(view).toUrl());
     }
     data.put("navbarHtml", new MarkdownToHtml(view, cfg).toSoyHtml(nav));
-    data.put("bodyHtml", new MarkdownToHtml(view, cfg)
-        .setImageLoader(img)
-        .toSoyHtml(doc));
+    data.put("bodyHtml", new MarkdownToHtml(view, cfg).setImageLoader(img).toSoyHtml(doc));
 
     String analyticsId = cfg.getString("google", null, "analyticsId");
     if (!Strings.isNullOrEmpty(analyticsId)) {
@@ -237,8 +238,7 @@
   private static boolean findIndexFile(TreeWalk tw) throws IOException {
     tw.enterSubtree();
     while (tw.next()) {
-      if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_FILE
-          && INDEX_MD.equals(tw.getNameString())) {
+      if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_FILE && INDEX_MD.equals(tw.getNameString())) {
         return true;
       }
     }
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 91168b8..c417932 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
@@ -39,8 +39,7 @@
 import java.util.List;
 
 /** Parses Gitiles extensions to markdown. */
-public class GitilesMarkdown extends Parser
-    implements BlockPluginParser, InlinePluginParser {
+public class GitilesMarkdown extends Parser implements BlockPluginParser, InlinePluginParser {
   private static final Logger log = LoggerFactory.getLogger(MarkdownUtil.class);
 
   // SUPPRESS_ALL_HTML is enabled to permit hosting arbitrary user content
@@ -51,8 +50,8 @@
   // this impacting the rendered formatting.
   private static final int MD_OPTIONS = (ALL | SUPPRESS_ALL_HTML) & ~(HARDWRAPS);
 
-  public static RootNode parseFile(Duration parseTimeout, GitilesView view,
-      String path, String md) {
+  public static RootNode parseFile(
+      Duration parseTimeout, GitilesView view, String path, String md) {
     if (md == null) {
       return null;
     }
@@ -65,7 +64,8 @@
         throw e;
       }
     } catch (ParsingTimeoutException e) {
-      log.error("timeout {} ms rendering {}/{} at {}",
+      log.error(
+          "timeout {} ms rendering {}/{} at {}",
           parseTimeout.getMillis(),
           view.getRepositoryName(),
           path,
@@ -75,9 +75,8 @@
   }
 
   private static PegDownProcessor newParser(Duration parseDeadline) {
-    PegDownPlugins plugins = new PegDownPlugins.Builder()
-        .withPlugin(GitilesMarkdown.class, parseDeadline)
-        .build();
+    PegDownPlugins plugins =
+        new PegDownPlugins.Builder().withPlugin(GitilesMarkdown.class, parseDeadline).build();
     return new PegDownProcessor(MD_OPTIONS, parseDeadline.getMillis(), plugins);
   }
 
@@ -92,32 +91,28 @@
   @Override
   public Rule[] blockPluginRules() {
     return new Rule[] {
-        cols(),
-        hr(),
-        iframe(),
-        note(),
-        toc(),
+      cols(), hr(), iframe(), note(), toc(),
     };
   }
 
   @Override
   public Rule[] inlinePluginRules() {
-    return new Rule[]{
-        namedAnchorHtmlStyle(),
-        namedAnchorMarkdownExtensionStyle(),
+    return new Rule[] {
+      namedAnchorHtmlStyle(), namedAnchorMarkdownExtensionStyle(),
     };
   }
 
   public Rule toc() {
-    return NodeSequence(
-        string("[TOC]"),
-        push(new TocNode()));
+    return NodeSequence(string("[TOC]"), push(new TocNode()));
   }
 
   public Rule hr() {
     // GitHub flavor markdown recognizes "--" as a rule.
     return NodeSequence(
-        NonindentSpace(), string("--"), zeroOrMore('-'), Newline(),
+        NonindentSpace(),
+        string("--"),
+        zeroOrMore('-'),
+        Newline(),
         oneOrMore(BlankLine()),
         push(new SimpleNode(SimpleNode.Type.HRule)));
   }
@@ -125,19 +120,21 @@
   public Rule namedAnchorHtmlStyle() {
     StringBuilderVar name = new StringBuilderVar();
     return NodeSequence(
-        Sp(), string("<a"),
+        Sp(),
+        string("<a"),
         Spn1(),
         sequence(string("name="), attribute(name)),
-        Spn1(), '>',
-        Spn1(), string("</a>"),
+        Spn1(),
+        '>',
+        Spn1(),
+        string("</a>"),
         push(new NamedAnchorNode(name.getString())));
   }
 
   public Rule namedAnchorMarkdownExtensionStyle() {
     StringBuilderVar name = new StringBuilderVar();
     return NodeSequence(
-        Sp(), string("{#"), anchorId(name), '}',
-        push(new NamedAnchorNode(name.getString())));
+        Sp(), string("{#"), anchorId(name), '}', push(new NamedAnchorNode(name.getString())));
   }
 
   public Rule anchorId(StringBuilderVar name) {
@@ -152,35 +149,36 @@
     return NodeSequence(
         string("<iframe"),
         oneOrMore(
-          sequence(
-            Spn1(),
-            firstOf(
-              sequence(string("src="), attribute(src)),
-              sequence(string("height="), attribute(h)),
-              sequence(string("width="), attribute(w)),
-              sequence(string("frameborder="), attribute(b))
-            ))),
-        Spn1(), '>',
-        Spn1(), string("</iframe>"),
-        push(new IframeNode(src.getString(),
-            h.getString(), w.getString(),
-            b.getString())));
+            sequence(
+                Spn1(),
+                firstOf(
+                    sequence(string("src="), attribute(src)),
+                    sequence(string("height="), attribute(h)),
+                    sequence(string("width="), attribute(w)),
+                    sequence(string("frameborder="), attribute(b))))),
+        Spn1(),
+        '>',
+        Spn1(),
+        string("</iframe>"),
+        push(new IframeNode(src.getString(), h.getString(), w.getString(), b.getString())));
   }
 
   public Rule attribute(StringBuilderVar var) {
     return firstOf(
-      sequence('"', zeroOrMore(testNot('"'), ANY), var.append(match()), '"'),
-      sequence('\'', zeroOrMore(testNot('\''), ANY), var.append(match()), '\''));
+        sequence('"', zeroOrMore(testNot('"'), ANY), var.append(match()), '"'),
+        sequence('\'', zeroOrMore(testNot('\''), ANY), var.append(match()), '\''));
   }
 
   public Rule note() {
     StringBuilderVar body = new StringBuilderVar();
     return NodeSequence(
-        string("***"), Sp(), typeOfNote(), Newline(),
-        oneOrMore(
-          testNot(string("***"), Newline()),
-          Line(body)),
-        string("***"), Newline(),
+        string("***"),
+        Sp(),
+        typeOfNote(),
+        Newline(),
+        oneOrMore(testNot(string("***"), Newline()), Line(body)),
+        string("***"),
+        Newline(),
         push(new DivNode(popAsString(), parse(body))));
   }
 
@@ -195,11 +193,12 @@
   public Rule cols() {
     StringBuilderVar body = new StringBuilderVar();
     return NodeSequence(
-        colsTag(), columnWidths(), Newline(),
-        oneOrMore(
-            testNot(colsTag(), Newline()),
-            Line(body)),
-        colsTag(), Newline(),
+        colsTag(),
+        columnWidths(),
+        Newline(),
+        oneOrMore(testNot(colsTag(), Newline()), Line(body)),
+        colsTag(),
+        Newline(),
         push(new ColsNode((List<ColsNode.Column>) pop(), parse(body))));
   }
 
@@ -210,19 +209,17 @@
   public Rule columnWidths() {
     ListVar widths = new ListVar();
     return sequence(
-      zeroOrMore(
-        sequence(
-          Sp(), optional(ch(',')), Sp(),
-          columnWidth(widths))),
-      push(widths.get()));
+        zeroOrMore(sequence(Sp(), optional(ch(',')), Sp(), columnWidth(widths))),
+        push(widths.get()));
   }
 
   public Rule columnWidth(ListVar widths) {
     StringBuilderVar s = new StringBuilderVar();
     return sequence(
-      optional(sequence(ch(':'), s.append(':'))),
-      oneOrMore(digit()), s.append(match()),
-      widths.get().add(parse(s.get().toString())));
+        optional(sequence(ch(':'), s.append(':'))),
+        oneOrMore(digit()),
+        s.append(match()),
+        widths.get().add(parse(s.get().toString())));
   }
 
   static ColsNode.Column parse(String spec) {
@@ -248,12 +245,13 @@
   public static class ListVar extends Var<List<Object>> {
     @SuppressWarnings({"rawtypes", "unchecked"})
     public ListVar() {
-      super(new Factory() {
-        @Override
-        public Object create() {
-          return new ArrayList<>();
-        }
-      });
+      super(
+          new Factory() {
+            @Override
+            public Object create() {
+              return new ArrayList<>();
+            }
+          });
     }
   }
 }
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 11c5e2f..b381616 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
@@ -41,8 +41,8 @@
   private final String path;
   private final int imageLimit;
 
-  public ImageLoader(ObjectReader reader, GitilesView view,
-      RevTree root, String path, int maxImageSize) {
+  public ImageLoader(
+      ObjectReader reader, GitilesView view, RevTree root, String path, int maxImageSize) {
     this.reader = reader;
     this.view = view;
     this.root = root;
@@ -97,17 +97,20 @@
     } catch (LargeObjectException.ExceedsLimit e) {
       return FilterImageDataUri.INSTANCE.getInnocuousOutput();
     } catch (IOException e) {
-      log.error(String.format("cannot read repo %s image %s from %s",
-          view.getRepositoryName(), path, root.name()), e);
+      log.error(
+          String.format(
+              "cannot read repo %s image %s from %s", view.getRepositoryName(), path, root.name()),
+          e);
       return FilterImageDataUri.INSTANCE.getInnocuousOutput();
     }
   }
 
-  private static final ImmutableMap<String, String> TYPES = ImmutableMap.of(
-      "png", "image/png",
-      "gif", "image/gif",
-      "jpg", "image/jpeg",
-      "jpeg", "image/jpeg");
+  private static final ImmutableMap<String, String> TYPES =
+      ImmutableMap.of(
+          "png", "image/png",
+          "gif", "image/gif",
+          "jpg", "image/jpeg",
+          "jpeg", "image/jpeg");
 
   private static String getMimeType(String path) {
     int d = path.lastIndexOf('.');
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 eb602ea..7d0d4e1 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
@@ -188,7 +188,8 @@
           .attribute("class", "h")
           .attribute("name", id)
           .attribute("href", "#" + id)
-          .open("span").close("span")
+          .open("span")
+          .close("span")
           .close("a");
     }
     visitChildren(node);
@@ -322,33 +323,25 @@
   @Override
   public void visit(AutoLinkNode node) {
     String url = node.getText();
-    html.open("a").attribute("href", href(url))
-        .appendAndEscape(url)
-        .close("a");
+    html.open("a").attribute("href", href(url)).appendAndEscape(url).close("a");
   }
 
   @Override
   public void visit(MailLinkNode node) {
     String addr = node.getText();
-    html.open("a").attribute("href", "mailto:" + addr)
-        .appendAndEscape(addr)
-        .close("a");
+    html.open("a").attribute("href", "mailto:" + addr).appendAndEscape(addr).close("a");
   }
 
   @Override
   public void visit(WikiLinkNode node) {
     String text = node.getText();
     String path = text.replace(' ', '-') + ".md";
-    html.open("a").attribute("href", href(path))
-        .appendAndEscape(text)
-        .close("a");
+    html.open("a").attribute("href", href(path)).appendAndEscape(text).close("a");
   }
 
   @Override
   public void visit(ExpLinkNode node) {
-    html.open("a")
-        .attribute("href", href(node.url))
-        .attribute("title", node.title);
+    html.open("a").attribute("href", href(node.url)).attribute("title", node.title);
     visitChildren(node);
     html.close("a");
   }
@@ -357,9 +350,7 @@
   public void visit(RefLinkNode node) {
     ReferenceNode ref = references.get(node.referenceKey, getInnerText(node));
     if (ref != null) {
-      html.open("a")
-          .attribute("href", href(ref.getUrl()))
-          .attribute("title", ref.getTitle());
+      html.open("a").attribute("href", href(ref.getUrl())).attribute("title", ref.getTitle());
       visitChildren(node);
       html.close("a");
     } else {
@@ -411,9 +402,7 @@
       return FilterNormalizeUri.INSTANCE.getInnocuousOutput();
     }
 
-    GitilesView.Builder dest = url.endsWith(".md")
-        ? GitilesView.doc()
-        : GitilesView.show();
+    GitilesView.Builder dest = url.endsWith(".md") ? GitilesView.doc() : GitilesView.show();
     return dest.copyFrom(view).setPathPart(dir + url).build().toUrl();
   }
 
@@ -437,15 +426,13 @@
       // If reference is missing, insert a broken image.
       url = FilterImageDataUri.INSTANCE.getInnocuousOutput();
     }
-    html.open("img")
-        .attribute("src", url)
-        .attribute("title", title)
-        .attribute("alt", alt);
+    html.open("img").attribute("src", url).attribute("title", title).attribute("alt", alt);
   }
 
   private String resolveImageUrl(String url) {
     if (imageLoader == null
-        || url.startsWith("https://") || url.startsWith("http://")
+        || url.startsWith("https://")
+        || url.startsWith("http://")
         || url.startsWith("data:")) {
       return url;
     }
@@ -492,8 +479,7 @@
   public void visit(TableCellNode node) {
     mustBeInsideTable(node);
     String tag = table.inHeader ? "th" : "td";
-    html.open(tag)
-        .attribute("align", table.getAlign());
+    html.open(tag).attribute("align", table.getAlign());
     if (node.getColSpan() > 1) {
       html.attribute("colspan", Integer.toString(node.getColSpan()));
     }
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 e6a0f00..5130216 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
@@ -23,9 +23,7 @@
 class MarkdownUtil {
   /** Check if anchor URL is like {@code /top.md}. */
   static boolean isAbsolutePathToMarkdown(String url) {
-    return url.length() >= 5
-        && url.charAt(0) == '/' && url.charAt(1) != '/'
-        && url.endsWith(".md");
+    return url.length() >= 5 && url.charAt(0) == '/' && url.charAt(1) != '/' && url.endsWith(".md");
   }
 
   /** Combine child nodes as string; this must be escaped for HTML. */
@@ -66,6 +64,5 @@
     return null;
   }
 
-  private MarkdownUtil() {
-  }
+  private MarkdownUtil() {}
 }
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 548a252..aa8e0eb 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
@@ -29,9 +29,7 @@
 import java.util.Map;
 
 class Navbar {
-  static Map<String, Object> bannerSoyData(
-      GitilesView view, ImageLoader img,
-      RootNode nav) {
+  static Map<String, Object> bannerSoyData(GitilesView view, ImageLoader img, RootNode nav) {
     Map<String, Object> data = new HashMap<>();
     data.put("siteTitle", null);
     data.put("logoUrl", null);
@@ -41,7 +39,7 @@
       return data;
     }
 
-    for (Iterator<Node> i = nav.getChildren().iterator(); i.hasNext();) {
+    for (Iterator<Node> i = nav.getChildren().iterator(); i.hasNext(); ) {
       Node n = i.next();
       if (n instanceof HeaderNode) {
         HeaderNode h = (HeaderNode) n;
@@ -78,6 +76,5 @@
     return data;
   }
 
-  private Navbar() {
-  }
+  private Navbar() {}
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/TableState.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/TableState.java
index 80276d2..396a86b 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/TableState.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/TableState.java
@@ -47,13 +47,12 @@
       case Center:
         return "center";
       default:
-        throw new IllegalStateException(String.format(
-            "unsupported alignment %s on column %d",
-            c.getAlignment(), pos));
+        throw new IllegalStateException(
+            String.format("unsupported alignment %s on column %d", c.getAlignment(), pos));
     }
   }
 
   void done(TableCellNode cell) {
     column += cell.getColSpan();
   }
-}
\ No newline at end of file
+}
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 ed5315c..cb82f54 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
@@ -73,9 +73,12 @@
     html.open("div")
         .attribute("class", "toc")
         .attribute("role", "navigation")
-      .open("h2").appendAndEscape("Contents").close("h2")
-      .open("div").attribute("class", "toc-aux")
-      .open("ul");
+        .open("h2")
+        .appendAndEscape("Contents")
+        .close("h2")
+        .open("div")
+        .attribute("class", "toc-aux")
+        .open("ul");
     for (HeaderNode header : outline) {
       outline(header);
     }
@@ -106,15 +109,14 @@
     }
 
     html.open("li")
-      .open("a").attribute("href", "#" + id)
-      .appendAndEscape(MarkdownUtil.getInnerText(h))
-      .close("a")
-      .close("li");
+        .open("a")
+        .attribute("href", "#" + id)
+        .appendAndEscape(MarkdownUtil.getInnerText(h))
+        .close("a")
+        .close("li");
   }
 
-  private void scan(Node node,
-      Multimap<String, TocEntry> entries,
-      Deque<HeaderNode> stack) {
+  private void scan(Node node, Multimap<String, TocEntry> entries, Deque<HeaderNode> stack) {
     if (node instanceof HeaderNode) {
       scan((HeaderNode) node, entries, stack);
     } else {
@@ -124,9 +126,8 @@
     }
   }
 
-  private void scan(HeaderNode header,
-      Multimap<String, TocEntry> entries,
-      Deque<HeaderNode> stack) {
+  private void scan(
+      HeaderNode header, Multimap<String, TocEntry> entries, Deque<HeaderNode> stack) {
     if (header.getLevel() == 1) {
       countH1++;
     }
@@ -227,14 +228,10 @@
   private static String idFromTitle(String title) {
     StringBuilder b = new StringBuilder(title.length());
     for (char c : StringUtils.stripAccents(title).toCharArray()) {
-      if (('a' <= c && c <= 'z')
-          || ('A' <= c && c <= 'Z')
-          || ('0' <= c && c <= '9')) {
+      if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9')) {
         b.append(c);
       } else if (c == ' ') {
-        if (b.length() > 0
-            && b.charAt(b.length() - 1) != '-'
-            && b.charAt(b.length() - 1) != '_') {
+        if (b.length() > 0 && b.charAt(b.length() - 1) != '-' && b.charAt(b.length() - 1) != '_') {
           b.append('-');
         }
       } else if (b.length() > 0
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/Visitor.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/Visitor.java
index 5562be2..6c9f2f6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/Visitor.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/Visitor.java
@@ -16,9 +16,14 @@
 
 public interface Visitor extends org.pegdown.ast.Visitor {
   void visit(ColsNode node);
+
   void visit(ColsNode.Column node);
+
   void visit(DivNode node);
+
   void visit(IframeNode node);
+
   void visit(TocNode node);
+
   void visit(NamedAnchorNode node);
 }
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 5b74c35..89611da 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
@@ -41,20 +41,46 @@
  * {@code https://}, and for image src {@code data:image/*;base64,...}.
  */
 public final class HtmlBuilder {
-  private static final ImmutableSet<String> ALLOWED_TAGS = ImmutableSet.of(
-      "h1", "h2", "h3", "h4", "h5", "h6",
-      "a", "div", "img", "p", "blockquote", "pre",
-      "ol", "ul", "li", "dl", "dd", "dt",
-      "del", "em", "strong", "code", "br", "hr",
-      "table", "thead", "tbody", "caption", "tr", "th", "td",
-      "iframe", "span"
-  );
+  private static final ImmutableSet<String> ALLOWED_TAGS =
+      ImmutableSet.of(
+          "h1",
+          "h2",
+          "h3",
+          "h4",
+          "h5",
+          "h6",
+          "a",
+          "div",
+          "img",
+          "p",
+          "blockquote",
+          "pre",
+          "ol",
+          "ul",
+          "li",
+          "dl",
+          "dd",
+          "dt",
+          "del",
+          "em",
+          "strong",
+          "code",
+          "br",
+          "hr",
+          "table",
+          "thead",
+          "tbody",
+          "caption",
+          "tr",
+          "th",
+          "td",
+          "iframe",
+          "span");
 
-  private static final ImmutableSet<String> ALLOWED_ATTRIBUTES = ImmutableSet.of(
-      "id", "class", "role");
+  private static final ImmutableSet<String> ALLOWED_ATTRIBUTES =
+      ImmutableSet.of("id", "class", "role");
 
-  private static final ImmutableSet<String> SELF_CLOSING_TAGS = ImmutableSet.of(
-      "img", "br", "hr");
+  private static final ImmutableSet<String> SELF_CLOSING_TAGS = ImmutableSet.of("img", "br", "hr");
 
   private static final FilterNormalizeUri URI = FilterNormalizeUri.INSTANCE;
   private static final FilterImageDataUri IMAGE_DATA = FilterImageDataUri.INSTANCE;
@@ -64,9 +90,7 @@
   }
 
   public static boolean isValidHttpUri(String val) {
-    return (val.startsWith("https://")
-        || val.startsWith("http://")
-        || val.startsWith("//"))
+    return (val.startsWith("https://") || val.startsWith("http://") || val.startsWith("//"))
         && URI.getValueFilter().matcher(val).find();
   }
 
@@ -163,8 +187,7 @@
   /** Close an open tag with {@code </tag>} */
   public HtmlBuilder close(String tag) {
     checkArgument(
-        ALLOWED_TAGS.contains(tag) && !SELF_CLOSING_TAGS.contains(tag),
-        "invalid HTML tag %s", tag);
+        ALLOWED_TAGS.contains(tag) && !SELF_CLOSING_TAGS.contains(tag), "invalid HTML tag %s", tag);
 
     finishActiveTag();
     htmlBuf.append("</").append(tag).append('>');
@@ -194,8 +217,6 @@
   /** Bless the current content as HTML. */
   public SanitizedContent toSoy() {
     finishActiveTag();
-    return UnsafeSanitizedContentOrdainer.ordainAsSafe(
-        htmlBuf.toString(),
-        ContentKind.HTML);
+    return UnsafeSanitizedContentOrdainer.ordainAsSafe(htmlBuf.toString(), ContentKind.HTML);
   }
 }
