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 9f23dae..983451d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -69,33 +69,18 @@
   protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     Repository repo = ServletUtils.getRepository(req);
     GitilesView view = getView(req, repo);
-    if (view == null) {
+    Paginator paginator = newPaginator(repo, view);
+    if (paginator == null) {
       res.setStatus(SC_NOT_FOUND);
       return;
     }
 
-    RevWalk walk = null;
     try {
-      try {
-        walk = newWalk(repo, view);
-      } catch (IncorrectObjectTypeException e) {
-        res.setStatus(SC_NOT_FOUND);
-        return;
-      }
-
-      Optional<ObjectId> start = getStart(view.getParameters(), walk.getObjectReader());
-      if (start == null) {
-        res.setStatus(SC_NOT_FOUND);
-        return;
-      }
-
-      Map<String, Object> data =
-          new LogSoyData(req, view)
-        .toSoyData(walk, LIMIT, null, start.orNull());
+      Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null);
 
       if (!view.getRevision().nameIsId()) {
         List<Map<String, Object>> tags = Lists.newArrayListWithExpectedSize(1);
-        for (RevObject o : RevisionServlet.listObjects(walk, view.getRevision())) {
+        for (RevObject o : RevisionServlet.listObjects(paginator.getWalk(), view.getRevision())) {
           if (o instanceof RevTag) {
             tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o));
           }
@@ -120,9 +105,7 @@
       res.setStatus(SC_INTERNAL_SERVER_ERROR);
       return;
     } finally {
-      if (walk != null) {
-        walk.release();
-      }
+      paginator.getWalk().release();
     }
   }
 
@@ -177,4 +160,29 @@
     }
     return walk;
   }
+
+  private static Paginator newPaginator(Repository repo, GitilesView view) throws IOException {
+    if (view == null) {
+      return null;
+    }
+
+    RevWalk walk = null;
+    try {
+      walk = newWalk(repo, view);
+    } catch (IncorrectObjectTypeException e) {
+      return null;
+    }
+
+    Optional<ObjectId> start;
+    try {
+      start = getStart(view.getParameters(), walk.getObjectReader());
+    } catch (IOException e) {
+      walk.release();
+      throw e;
+    }
+    if (start == null) {
+      return null;
+    }
+    return new Paginator(walk, LIMIT, start.orNull());
+  }
 }
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 f4be0a4..7056261 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -40,10 +40,14 @@
 
   public Map<String, Object> toSoyData(RevWalk walk, int limit, @Nullable String revision,
       @Nullable ObjectId start) throws IOException {
+    return toSoyData(new Paginator(walk, limit, start), revision);
+  }
+
+  public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision)
+      throws IOException {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(3);
 
-    Paginator paginator = new Paginator(walk, limit, start);
-    List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(limit);
+    List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
     for (RevCommit c : paginator) {
       entries.add(new CommitSoyData().toSoyData(req, c, KeySet.SHORTLOG));
     }
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 0454556..62dfb55 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
@@ -162,6 +162,14 @@
     };
   }
 
+  public int getLimit() {
+    return limit;
+  }
+
+  public RevWalk getWalk() {
+    return walk;
+  }
+
   private RevCommit nextUnchecked() {
     try {
       return next();
