diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
index 67d5edc..9f551df 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -225,8 +225,8 @@
     }
   }
 
-  private static class RefJsonData {
-    public RefJsonData(Ref ref) {
+  static class RefJsonData {
+    RefJsonData(Ref ref) {
       value = ref.getObjectId().getName();
       if(ref.getPeeledObjectId() != null) {
         peeled = ref.getPeeledObjectId().getName();
@@ -236,8 +236,8 @@
       }
     }
 
-    public String value;
-    public String peeled;
-    public String target;
+    String value;
+    String peeled;
+    String target;
   }
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
index 6f50185..fcd91f3 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -15,8 +15,15 @@
 package com.google.gitiles;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.net.HttpHeaders;
+import com.google.gitiles.RefServlet.RefJsonData;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -29,6 +36,8 @@
 import org.junit.Test;
 
 import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 
 /** Tests for {@link Linkifier}. */
 public class RefServletTest {
@@ -185,4 +194,77 @@
         + peeled("refs/tags/atag") + " refs/tags/atag^{}\n",
         res.getActualBodyString());
   }
+
+  @Test
+  public void getRefsJsonAll() throws Exception {
+    Map<String, RefJsonData> result = buildJson("/test/+refs");
+    List<String> keys = ImmutableList.copyOf(result.keySet());
+    assertEquals(ImmutableList.of(
+          "HEAD",
+          "refs/heads/branch",
+          "refs/heads/master",
+          "refs/tags/atag",
+          "refs/tags/ctag"),
+        keys);
+
+    RefJsonData head = result.get(keys.get(0));
+    assertEquals(id("HEAD"), head.value);
+    assertNull(head.peeled);
+    assertEquals("refs/heads/master", head.target);
+
+    RefJsonData branch = result.get(keys.get(1));
+    assertEquals(id("refs/heads/branch"), branch.value);
+    assertNull(branch.peeled);
+    assertNull(branch.target);
+
+    RefJsonData master = result.get(keys.get(2));
+    assertEquals(id("refs/heads/master"), master.value);
+    assertNull(master.peeled);
+    assertNull(master.target);
+
+    RefJsonData atag = result.get(keys.get(3));
+    assertEquals(id("refs/tags/atag"), atag.value);
+    assertEquals(peeled("refs/tags/atag"), atag.peeled);
+    assertNull(atag.target);
+
+    RefJsonData ctag = result.get(keys.get(4));
+    assertEquals(id("refs/tags/ctag"), ctag.value);
+    assertNull(ctag.peeled);
+    assertNull(ctag.target);
+  }
+
+  @Test
+  public void getRefsHeadsJson() throws Exception {
+    Map<String, RefJsonData> result = buildJson("/test/+refs/heads");
+    List<String> keys = ImmutableList.copyOf(result.keySet());
+    assertEquals(ImmutableList.of(
+          "branch",
+          "master"),
+        keys);
+
+    RefJsonData branch = result.get(keys.get(0));
+    assertEquals(id("refs/heads/branch"), branch.value);
+    assertNull(branch.peeled);
+    assertNull(branch.target);
+
+    RefJsonData master = result.get(keys.get(1));
+    assertEquals(id("refs/heads/master"), master.value);
+    assertNull(master.peeled);
+    assertNull(master.target);
+  }
+
+  private Map<String, RefJsonData> buildJson(String path) throws Exception {
+    FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
+    req.setPathInfo(path);
+    req.setQueryString("format=JSON");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.service(req, res);
+
+    assertEquals(200, res.getStatus());
+    assertEquals("application/json", res.getHeader(HttpHeaders.CONTENT_TYPE));
+    String body = res.getActualBodyString();
+    String magic = ")]}'\n";
+    assertEquals(magic, body.substring(0, magic.length()));
+    return new Gson().fromJson(body.substring(magic.length()), new TypeToken<Map<String, RefJsonData>>() {}.getType());
+  }
 }
