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 a7bf02a..1e7c1da 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
@@ -77,9 +77,8 @@
   public static Map<String, String> menuEntry(String text, String url) {
     if (url != null) {
       return ImmutableMap.of("text", text, "url", url);
-    } else {
-      return ImmutableMap.of("text", text);
     }
+    return ImmutableMap.of("text", text);
   }
 
   public static boolean isStreamingResponse(HttpServletRequest req) {
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 0fedbf4..597a8e0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
@@ -108,10 +108,9 @@
       if (digits.indexOf('.') == -1) {
         long val = Long.parseLong(digits);
         return new Duration(val * TimeUnit.MILLISECONDS.convert(1, unit));
-      } else {
-        double val = Double.parseDouble(digits);
-        return new Duration((long) (val * TimeUnit.MILLISECONDS.convert(1, unit)));
       }
+      double val = Double.parseDouble(digits);
+      return new Duration((long) (val * TimeUnit.MILLISECONDS.convert(1, unit)));
     } catch (NumberFormatException nfe) {
       return null;
     }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index 90d5170..8b06e56 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -152,9 +152,8 @@
     RevCommit newCommit = walk.parseCommit(newRevision.getId());
     if (newCommit.getParentCount() > 0) {
       return Arrays.asList(newCommit.getParents()).contains(oldRevision.getId());
-    } else {
-      return oldRevision == Revision.NULL;
     }
+    return oldRevision == Revision.NULL;
   }
 
   private static boolean isFile(TreeWalk tw) {
@@ -182,8 +181,7 @@
       CanonicalTreeParser p = new CanonicalTreeParser();
       p.reset(walk.getObjectReader(), walk.parseTree(id));
       return p;
-    } else {
-      return new EmptyTreeIterator();
     }
+    return new EmptyTreeIterator();
   }
 }
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 de2a06f..f837bca 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
@@ -132,13 +132,12 @@
             String oldName = b.toString();
             if (!isValidRevision(oldName)) {
               return null;
-            } else {
-              RevObject old = resolve(oldName, walk);
-              if (old == null) {
-                return null;
-              }
-              oldRevision = Revision.peel(oldName, old, walk);
             }
+            RevObject old = resolve(oldName, walk);
+            if (old == null) {
+              return null;
+            }
+            oldRevision = Revision.peel(oldName, old, walk);
             part = part.substring(dots + 2);
             b = new StringBuilder();
           } else if (firstParent > 0) {
@@ -228,8 +227,7 @@
     }
     if (result.getOldRevision() != null && result.getOldRevision() != Revision.NULL) {
       return cache.isVisible(repo, walk, access, result.getOldRevision().getId(), id);
-    } else {
-      return true;
     }
+    return true;
   }
 }
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 43fddfb..ef3289a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
@@ -62,11 +62,10 @@
   static String getTargetDisplayName(String target) {
     if (target.length() <= MAX_SYMLINK_TARGET_LENGTH) {
       return target;
-    } else {
-      int lastSlash = target.lastIndexOf('/');
-      // TODO(dborowitz): Doesn't abbreviate a long last path component.
-      return lastSlash >= 0 ? "..." + target.substring(lastSlash) : target;
     }
+    int lastSlash = target.lastIndexOf('/');
+    // TODO(dborowitz): Doesn't abbreviate a long last path component.
+    return lastSlash >= 0 ? "..." + target.substring(lastSlash) : target;
   }
 
   private final ObjectReader reader;
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 131a353..dbc9436 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -308,12 +308,11 @@
     }
     if (result.getPath().isEmpty()) {
       return GitilesView.revision().setRepositoryName(repoName).setRevision(result.getRevision());
-    } else {
-      return GitilesView.path()
-          .setRepositoryName(repoName)
-          .setRevision(result.getRevision())
-          .setPathPart(result.getPath());
     }
+    return GitilesView.path()
+        .setRepositoryName(repoName)
+        .setRevision(result.getRevision())
+        .setPathPart(result.getPath());
   }
 
   private GitilesView.Builder parseDocCommand(HttpServletRequest req, String repoName, String 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 2c0385d..6c1a7a2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
@@ -196,9 +196,8 @@
               public ObjectId apply(Ref ref) {
                 if (ref.getPeeledObjectId() != null) {
                   return ref.getPeeledObjectId();
-                } else {
-                  return ref.getObjectId();
                 }
+                return ref.getObjectId();
               }
             }));
   }
