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 df6e1ef..f48ec3b 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
 
+import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.revwalk.RevObject;
 
 import java.io.UnsupportedEncodingException;
@@ -309,7 +310,7 @@
     }
 
     private void checkLog() {
-      checkRevision();
+      checkRepositoryIndex();
     }
 
     private void checkPath() {
@@ -474,13 +475,16 @@
         url.append('/').append(path);
         break;
       case LOG:
-        url.append(repositoryName).append("/+log/");
-        if (oldRevision != Revision.NULL) {
-          url.append(oldRevision.getName()).append("..");
-        }
-        url.append(revision.getName());
-        if (path != null) {
-          url.append('/').append(path);
+        url.append(repositoryName).append("/+log");
+        if (revision != Revision.NULL) {
+          url.append('/');
+          if (oldRevision != Revision.NULL) {
+            url.append(oldRevision.getName()).append("..");
+          }
+          url.append(revision.getName());
+          if (path != null) {
+            url.append('/').append(path);
+          }
         }
         break;
       default:
@@ -530,12 +534,16 @@
       // separate links in "old..new".
       breadcrumbs.add(breadcrumb(getRevisionRange(), diff().copyFrom(this).setTreePath("")));
     } else if (type == Type.LOG) {
-      // TODO(dborowitz): Add something in the navigation area (probably not
-      // a breadcrumb) to allow switching between /+log/ and /+/.
-      if (oldRevision == Revision.NULL) {
-        breadcrumbs.add(breadcrumb(revision.getName(), log().copyFrom(this).setTreePath(null)));
+      if (revision != Revision.NULL) {
+        // TODO(dborowitz): Add something in the navigation area (probably not
+        // a breadcrumb) to allow switching between /+log/ and /+/.
+        if (oldRevision == Revision.NULL) {
+          breadcrumbs.add(breadcrumb(revision.getName(), log().copyFrom(this).setTreePath(null)));
+        } else {
+          breadcrumbs.add(breadcrumb(getRevisionRange(), log().copyFrom(this).setTreePath(null)));
+        }
       } else {
-        breadcrumbs.add(breadcrumb(getRevisionRange(), log().copyFrom(this).setTreePath(null)));
+        breadcrumbs.add(breadcrumb(Constants.HEAD, log().copyFrom(this)));
       }
       path = Strings.emptyToNull(path);
     } else if (revision != Revision.NULL) {
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 46b6c44..b75965c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -19,14 +19,12 @@
 import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import com.google.common.base.Optional;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.gitiles.CommitSoyData.KeySet;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -34,6 +32,7 @@
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.Ref;
@@ -46,12 +45,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gitiles.CommitSoyData.KeySet;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /** Serves an HTML page with a shortlog for commits and paths. */
 public class LogServlet extends BaseServlet {
@@ -69,9 +70,14 @@
   }
 
   @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    GitilesView view = ViewFilter.getView(req);
+  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     Repository repo = ServletUtils.getRepository(req);
+    GitilesView view = getView(req, repo);
+    if (view == null) {
+      res.setStatus(SC_NOT_FOUND);
+      return;
+    }
+
     RevWalk walk = null;
     try {
       try {
@@ -131,6 +137,26 @@
     }
   }
 
+  private static GitilesView getView(HttpServletRequest req, Repository repo) throws IOException {
+    GitilesView view = ViewFilter.getView(req);
+    if (view.getRevision() != Revision.NULL) {
+      return view;
+    }
+    Ref headRef = repo.getRef(Constants.HEAD);
+    if (headRef == null) {
+      return null;
+    }
+    RevWalk walk = new RevWalk(repo);
+    try {
+      return GitilesView.log()
+        .copyFrom(view)
+        .setRevision(Revision.peel(Constants.HEAD, headRef.getObjectId(), walk))
+        .build();
+    } finally {
+      walk.release();
+    }
+  }
+
   private static Optional<ObjectId> getStart(ListMultimap<String, String> params,
       ObjectReader reader) throws IOException {
     List<String> values = params.get(START_PARAM);
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 90cd94a..4f629be 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -104,6 +104,8 @@
       return GitilesView.hostIndex();
     } else if (command.equals(CMD_REFS) && path.isEmpty()) {
       return GitilesView.refs().setRepositoryName(repoName);
+    } else if (command.equals(CMD_LOG) && (path.isEmpty() || path.equals("/"))) {
+      return GitilesView.log().setRepositoryName(repoName);
     } else if (command.isEmpty()) {
       return GitilesView.repositoryIndex().setRepositoryName(repoName);
     } else if (path.isEmpty()) {
