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 20cb9cd..b1d8d8f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -37,6 +37,12 @@
   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;
+    public String previous;
+    public String next;
+  }
+
   public static class Ident {
     public String name;
     public String email;
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 41a0239..ce9d38a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -156,21 +156,21 @@
 
     try {
       DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
-      Map<String, Object> result = Maps.newLinkedHashMap();
+      CommitJsonData.Log result = new CommitJsonData.Log();
       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));
       }
-      result.put("log", entries);
+      result.log = entries;
       if (paginator.getPreviousStart() != null) {
-        result.put("previous", paginator.getPreviousStart().name());
+        result.previous = paginator.getPreviousStart().name();
       }
       if (paginator.getNextStart() != null) {
-        result.put("next", paginator.getNextStart().name());
+        result.next = paginator.getNextStart().name();
       }
-      renderJson(req, res, result, new TypeToken<Map<String, Object>>() {}.getType());
+      renderJson(req, res, result, new TypeToken<CommitJsonData.Log>() {}.getType());
     } finally {
       paginator.getWalk().close();
     }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
index 0acb39d..261afec 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
@@ -16,11 +16,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.gitiles.CommitJsonData.Commit;
+import com.google.gitiles.CommitJsonData.Log;
 import com.google.gitiles.DateFormatter.Format;
-import com.google.gson.FieldNamingPolicy;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
+import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Test;
@@ -32,21 +31,16 @@
 /** Tests for {@link LogServlet}. */
 @RunWith(JUnit4.class)
 public class LogServletTest extends ServletTest {
+  private static final TypeToken<Log> LOG = new TypeToken<Log>() {};
+
   @Test
   public void basicLog() throws Exception {
     RevCommit commit = repo.branch("HEAD").commit().create();
-    repo.getRevWalk().parseBody(commit);
 
-    JsonElement result = buildJson("/repo/+log", "");
-    JsonArray log = result.getAsJsonObject().get("log").getAsJsonArray();
-
-    GitilesAccess access = new TestGitilesAccess(repo.getRepository()).forRequest(null);
-    DateFormatter df = new DateFormatter(access, Format.DEFAULT);
-
-    assertThat(log).hasSize(1);
-    CommitJsonData.Commit jsonCommit = getJsonCommit(log.get(0));
-    verifyJsonCommit(jsonCommit, commit, df);
-    assertThat(jsonCommit.treeDiff).isNull();
+    Log response = buildJson("/repo/+log", LOG.getType(), "");
+    assertThat(response.log).hasSize(1);
+    verifyJsonCommit(response.log.get(0), commit);
+    assertThat(response.log.get(0).treeDiff).isNull();
   }
 
   @Test
@@ -55,40 +49,29 @@
     String contents2 = "foo\ncontents\n";
     RevCommit c1 = repo.update("master", repo.commit().add("foo", contents1));
     RevCommit c2 = repo.update("master", repo.commit().parent(c1).add("foo", contents2));
-    repo.getRevWalk().parseBody(c1);
-    repo.getRevWalk().parseBody(c2);
 
-    JsonElement result = buildJson("/repo/+log/master", "&name-status=1");
-    JsonArray log = result.getAsJsonObject().get("log").getAsJsonArray();
+    Log response = buildJson("/repo/+log/master", LOG.getType(), "&name-status=1");
+    assertThat(response.log).hasSize(2);
 
+    Commit jc2 = response.log.get(0);
+    verifyJsonCommit(jc2, c2);
+    assertThat(jc2.treeDiff).hasSize(1);
+    assertThat(jc2.treeDiff.get(0).type).isEqualTo("modify");
+    assertThat(jc2.treeDiff.get(0).oldPath).isEqualTo("foo");
+    assertThat(jc2.treeDiff.get(0).newPath).isEqualTo("foo");
+
+    Commit jc1 = response.log.get(1);
+    verifyJsonCommit(jc1, c1);
+    assertThat(jc1.treeDiff).hasSize(1);
+    assertThat(jc1.treeDiff.get(0).type).isEqualTo("add");
+    assertThat(jc1.treeDiff.get(0).oldPath).isEqualTo("/dev/null");
+    assertThat(jc1.treeDiff.get(0).newPath).isEqualTo("foo");
+  }
+
+  private void verifyJsonCommit(Commit jsonCommit, RevCommit commit) throws Exception {
+    repo.getRevWalk().parseBody(commit);
     GitilesAccess access = new TestGitilesAccess(repo.getRepository()).forRequest(null);
     DateFormatter df = new DateFormatter(access, Format.DEFAULT);
-
-    assertThat(log).hasSize(2);
-
-    CommitJsonData.Commit jsonCommit2 = getJsonCommit(log.get(0));
-    verifyJsonCommit(jsonCommit2, c2, df);
-    assertThat(jsonCommit2.treeDiff).hasSize(1);
-    assertThat(jsonCommit2.treeDiff.get(0).type).isEqualTo("modify");
-    assertThat(jsonCommit2.treeDiff.get(0).oldPath).isEqualTo("foo");
-    assertThat(jsonCommit2.treeDiff.get(0).newPath).isEqualTo("foo");
-
-    CommitJsonData.Commit jsonCommit1 = getJsonCommit(log.get(1));
-    verifyJsonCommit(jsonCommit1, c1, df);
-    assertThat(jsonCommit1.treeDiff.get(0).type).isEqualTo("add");
-    assertThat(jsonCommit1.treeDiff.get(0).oldPath).isEqualTo("/dev/null");
-    assertThat(jsonCommit1.treeDiff.get(0).newPath).isEqualTo("foo");
-  }
-
-  private CommitJsonData.Commit getJsonCommit(JsonElement element) {
-    GsonBuilder builder = new GsonBuilder();
-    builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
-    return builder.create().fromJson(element, CommitJsonData.Commit.class);
-  }
-
-  private void verifyJsonCommit(
-      CommitJsonData.Commit jsonCommit, RevCommit commit, DateFormatter df)
-      throws Exception {
     assertThat(jsonCommit.commit).isEqualTo(commit.name());
     assertThat(jsonCommit.tree).isEqualTo(commit.getTree().name());
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
index 3eac7ea..83469a2 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
@@ -20,9 +20,9 @@
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
 import com.google.common.net.HttpHeaders;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import com.google.gson.FieldNamingPolicy;
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
@@ -101,16 +101,28 @@
     return body.substring(magic.length());
   }
 
-  protected JsonElement buildJson(String path, String additionalQueryString) throws Exception {
-    return new JsonParser().parse(buildJsonRaw(path, additionalQueryString));
+  protected <T> T buildJson(String path, Class<T> classOfT, String additionalQueryString)
+      throws Exception {
+    return newGson().fromJson(buildJsonRaw(path, additionalQueryString), classOfT);
   }
 
   protected <T> T buildJson(String path, Class<T> classOfT) throws Exception {
-    return new Gson().fromJson(buildJsonRaw(path, ""), classOfT);
+    return buildJson(path, classOfT, "");
+  }
+
+  protected <T> T buildJson(String path, Type typeOfT, String additionalQueryString)
+      throws Exception {
+    return newGson().fromJson(buildJsonRaw(path, additionalQueryString), typeOfT);
   }
 
   protected <T> T buildJson(String path, Type typeOfT) throws Exception {
-    return new Gson().<T>fromJson(buildJsonRaw(path, ""), typeOfT);
+    return buildJson(path, typeOfT, "");
+  }
+
+  private static Gson newGson() {
+    return new GsonBuilder()
+        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
+        .create();
   }
 
   protected void assertNotFound(String path, String queryString) throws Exception {
