diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
new file mode 100644
index 0000000..5c3cb40
--- /dev/null
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2013 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gitiles;
+
+import com.google.common.collect.Lists;
+
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
+
+import java.util.List;
+
+class CommitJsonData {
+  private static final GitDateFormatter dateFormatter = new GitDateFormatter(Format.DEFAULT);
+
+  static class Commit {
+    String commit;
+    List<String> parents;
+    Ident author;
+    Ident committer;
+    String message;
+  }
+
+  static class Ident {
+    String name;
+    String email;
+    String time;
+  }
+
+  static Commit toJsonData(RevCommit c) {
+    Commit result = new Commit();
+    result.commit = c.name();
+    result.parents = Lists.newArrayListWithCapacity(c.getParentCount());
+    for (RevCommit parent : c.getParents()) {
+      result.parents.add(parent.name());
+    }
+    result.author = toJsonData(c.getAuthorIdent());
+    result.committer = toJsonData(c.getCommitterIdent());
+    result.message = c.getFullMessage();
+    return result;
+  }
+
+  private static Ident toJsonData(PersonIdent ident) {
+    Ident result = new Ident();
+    result.name = ident.getName();
+    result.email = ident.getEmailAddress();
+    result.time = dateFormatter.formatDate(ident);
+    return result;
+  }
+
+  private CommitJsonData() {
+  }
+}
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 983451d..12280c2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
+import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.diff.DiffConfig;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -36,6 +37,7 @@
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.FollowFilter;
+import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
@@ -109,6 +111,36 @@
     }
   }
 
+  @Override
+  protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
+    Repository repo = ServletUtils.getRepository(req);
+    GitilesView view = getView(req, repo);
+    Paginator paginator = newPaginator(repo, view);
+    if (paginator == null) {
+      res.setStatus(SC_NOT_FOUND);
+      return;
+    }
+
+    try {
+      Map<String, Object> result = Maps.newLinkedHashMap();
+      List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
+      for (RevCommit c : paginator) {
+        paginator.getWalk().parseBody(c);
+        entries.add(CommitJsonData.toJsonData(c));
+      }
+      result.put("log", entries);
+      if (paginator.getPreviousStart() != null) {
+        result.put("previous", paginator.getPreviousStart().name());
+      }
+      if (paginator.getNextStart() != null) {
+        result.put("next", paginator.getNextStart().name());
+      }
+      renderJson(req, res, result, new TypeToken<Map<String, Object>>() {}.getType());
+    } finally {
+      paginator.getWalk().release();
+    }
+  }
+
   private static GitilesView getView(HttpServletRequest req, Repository repo) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     if (view.getRevision() != Revision.NULL) {
