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 9f551df..05a985d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -22,6 +22,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Ordering;
+import com.google.common.primitives.Ints;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.google.gson.reflect.TypeToken;
 
@@ -37,9 +38,9 @@
 import java.io.IOException;
 import java.io.Writer;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.LinkedHashMap;
 
 import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
@@ -165,7 +166,7 @@
       @Nullable Ref headLeaf,
       int limit) throws IOException {
     Collection<Ref> refs = refdb.getRefs(prefix).values();
-    refs = ordering.leastOf(refs, limit > 0 ? limit + 1 : refs.size());
+    refs = ordering.leastOf(refs, limit > 0 ? Ints.saturatedCast(limit + 1L) : refs.size());
     List<Map<String, Object>> result = Lists.newArrayListWithCapacity(refs.size());
 
     for (Ref ref : refs) {
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 fcd91f3..c5b6482 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -14,11 +14,13 @@
 
 package com.google.gitiles;
 
+import static com.google.gitiles.TestGitilesUrls.URLS;
 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.collect.ImmutableMap;
 import com.google.common.net.HttpHeaders;
 import com.google.gitiles.RefServlet.RefJsonData;
 import com.google.gson.Gson;
@@ -32,6 +34,7 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -39,6 +42,8 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.servlet.http.HttpServletRequest;
+
 /** Tests for {@link Linkifier}. */
 public class RefServletTest {
   private TestRepository<DfsRepository> repo;
@@ -48,28 +53,21 @@
   public void setUp() throws Exception {
     DfsRepository r = new InMemoryRepository(new DfsRepositoryDescription("test"));
     repo = new TestRepository<DfsRepository>(r);
+    servlet = TestGitilesServlet.create(repo);
+  }
 
+  private void setUpSimpleRefs() throws Exception {
     RevCommit commit = repo.branch("refs/heads/master").commit().create();
     repo.update("refs/heads/branch", commit);
     repo.update("refs/tags/ctag", commit);
     RevTag tag = repo.tag("atag", commit);
     repo.update("refs/tags/atag", tag);
-    r.updateRef("HEAD").link("refs/heads/master");
-
-    servlet = TestGitilesServlet.create(repo);
-  }
-
-  private String id(String refName) throws IOException {
-    return ObjectId.toString(repo.getRepository().getRef(refName).getObjectId());
-  }
-
-  private String peeled(String refName) throws IOException {
-    return ObjectId.toString(repo.getRepository().peel(
-          repo.getRepository().getRef(refName)).getPeeledObjectId());
+    repo.getRepository().updateRef("HEAD").link("refs/heads/master");
   }
 
   @Test
   public void evilRefName() throws Exception {
+    setUpSimpleRefs();
     String evilRefName = "refs/evil/<script>window.close();</script>/&foo";
     assertTrue(Repository.isValidRefName(evilRefName));
     repo.branch(evilRefName).commit().create();
@@ -87,6 +85,7 @@
 
   @Test
   public void getRefsTextAll() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs");
     req.setQueryString("format=TEXT");
@@ -106,6 +105,7 @@
 
   @Test
   public void getRefsTextAllTrailingSlash() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs");
     req.setQueryString("format=TEXT");
@@ -125,6 +125,7 @@
 
   @Test
   public void getRefsHeadsText() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs/heads");
     req.setQueryString("format=TEXT");
@@ -140,6 +141,7 @@
 
   @Test
   public void getRefsHeadsTextTrailingSlash() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs/heads/");
     req.setQueryString("format=TEXT");
@@ -155,6 +157,7 @@
 
   @Test
   public void noHeadText() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs/HEAD");
     req.setQueryString("format=TEXT");
@@ -168,6 +171,7 @@
 
   @Test
   public void singleHeadText() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs/heads/master");
     req.setQueryString("format=TEXT");
@@ -182,6 +186,7 @@
 
   @Test
   public void singlePeeledTagText() throws Exception {
+    setUpSimpleRefs();
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo("/test/+refs/tags/atag");
     req.setQueryString("format=TEXT");
@@ -197,6 +202,7 @@
 
   @Test
   public void getRefsJsonAll() throws Exception {
+    setUpSimpleRefs();
     Map<String, RefJsonData> result = buildJson("/test/+refs");
     List<String> keys = ImmutableList.copyOf(result.keySet());
     assertEquals(ImmutableList.of(
@@ -235,6 +241,7 @@
 
   @Test
   public void getRefsHeadsJson() throws Exception {
+    setUpSimpleRefs();
     Map<String, RefJsonData> result = buildJson("/test/+refs/heads");
     List<String> keys = ImmutableList.copyOf(result.keySet());
     assertEquals(ImmutableList.of(
@@ -267,4 +274,112 @@
     assertEquals(magic, body.substring(0, magic.length()));
     return new Gson().fromJson(body.substring(magic.length()), new TypeToken<Map<String, RefJsonData>>() {}.getType());
   }
+
+  @Test
+  public void emptySoy() throws Exception {
+    assertEquals(ImmutableList.of(), buildBranchesSoyData());
+    assertEquals(ImmutableList.of(), buildTagsSoyData());
+  }
+
+  @Test
+  public void branchesAndTagsSoy() throws Exception {
+    repo.branch("refs/heads/foo").commit().create();
+    repo.branch("refs/heads/bar").commit().create();
+    repo.branch("refs/tags/baz").commit().create();
+    repo.branch("refs/nope/quux").commit().create();
+
+    assertEquals(
+        ImmutableList.of(
+            ref("/b/test/+/bar", "bar"),
+            ref("/b/test/+/foo", "foo")),
+        buildBranchesSoyData());
+    assertEquals(
+        ImmutableList.of(
+            ref("/b/test/+/baz", "baz")),
+        buildTagsSoyData());
+  }
+
+  @Test
+  public void ambiguousBranchSoy() throws Exception {
+    repo.branch("refs/heads/foo").commit().create();
+    repo.branch("refs/heads/bar").commit().create();
+    repo.branch("refs/tags/foo").commit().create();
+
+    assertEquals(
+        ImmutableList.of(
+            ref("/b/test/+/bar", "bar"),
+            ref("/b/test/+/refs/heads/foo", "foo")),
+        buildBranchesSoyData());
+    assertEquals(
+        ImmutableList.of(
+            // refs/tags/ is searched before refs/heads/, so this does not
+            // appear ambiguous.
+            ref("/b/test/+/foo", "foo")),
+        buildTagsSoyData());
+  }
+
+  @Test
+  public void ambiguousRelativeToNonBranchOrTagSoy() throws Exception {
+    repo.branch("refs/foo").commit().create();
+    repo.branch("refs/heads/foo").commit().create();
+    repo.branch("refs/tags/foo").commit().create();
+
+    assertEquals(
+        ImmutableList.of(
+            ref("/b/test/+/refs/heads/foo", "foo")),
+        buildBranchesSoyData());
+    assertEquals(
+        ImmutableList.of(
+            ref("/b/test/+/refs/tags/foo", "foo")),
+        buildTagsSoyData());
+  }
+
+  @Test
+  public void refsHeadsSoy() throws Exception {
+    repo.branch("refs/heads/foo").commit().create();
+    repo.branch("refs/heads/refs/heads/foo").commit().create();
+
+    assertEquals(
+        ImmutableList.of(
+            ref("/b/test/+/foo", "foo"),
+            ref("/b/test/+/refs/heads/refs/heads/foo", "refs/heads/foo")),
+        buildBranchesSoyData());
+  }
+
+  private HttpServletRequest buildSoyRequest() {
+    HttpServletRequest req = FakeHttpServletRequest.newRequest(repo.getRepository());
+    ViewFilter.setView(req, GitilesView.repositoryIndex()
+        .setHostName(URLS.getHostName(req))
+        .setServletPath(req.getServletPath())
+        .setRepositoryName("test")
+        .build());
+    return req;
+  }
+
+  private List<?> buildBranchesSoyData() throws Exception {
+    return RefServlet.getBranchesSoyData(buildSoyRequest(), Integer.MAX_VALUE);
+  }
+
+  private List<?> buildTagsSoyData() throws Exception {
+    RevWalk rw = new RevWalk(repo.getRepository());
+    try {
+      return RefServlet.getTagsSoyData(buildSoyRequest(),
+          new TimeCache(TimeCache.defaultBuilder()), rw, Integer.MAX_VALUE);
+    } finally {
+      rw.release();
+    }
+  }
+
+  private String id(String refName) throws IOException {
+    return ObjectId.toString(repo.getRepository().getRef(refName).getObjectId());
+  }
+
+  private String peeled(String refName) throws IOException {
+    return ObjectId.toString(repo.getRepository().peel(
+          repo.getRepository().getRef(refName)).getPeeledObjectId());
+  }
+
+  private Map<String, String> ref(String url, String name) {
+    return ImmutableMap.of("url", url, "name", name);
+  }
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
deleted file mode 100644
index b4243c4..0000000
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2012 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 static com.google.gitiles.TestGitilesUrls.URLS;
-import static org.junit.Assert.assertEquals;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-/** Tests for {@link RepositoryIndexServlet}. */
-public class RepositoryIndexServletTest {
-  private TestRepository<DfsRepository> repo;
-  private RepositoryIndexServlet servlet;
-
-  @Before
-  public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("test")));
-    servlet = new RepositoryIndexServlet(
-        new TestGitilesAccess(repo.getRepository()),
-        new DefaultRenderer(),
-        new TimeCache());
-  }
-
-  @Test
-  public void empty() throws Exception {
-    Map<String, ?> data = buildData();
-    assertEquals(ImmutableList.of(), data.get("branches"));
-    assertEquals(ImmutableList.of(), data.get("tags"));
-  }
-
-  @Test
-  public void branchesAndTags() throws Exception {
-    repo.branch("refs/heads/foo").commit().create();
-    repo.branch("refs/heads/bar").commit().create();
-    repo.branch("refs/tags/baz").commit().create();
-    repo.branch("refs/nope/quux").commit().create();
-    Map<String, ?> data = buildData();
-
-    assertEquals(
-        ImmutableList.of(
-            ref("/b/test/+/bar", "bar"),
-            ref("/b/test/+/foo", "foo")),
-        data.get("branches"));
-    assertEquals(
-        ImmutableList.of(
-            ref("/b/test/+/baz", "baz")),
-        data.get("tags"));
-  }
-
-  @Test
-  public void ambiguousBranch() throws Exception {
-    repo.branch("refs/heads/foo").commit().create();
-    repo.branch("refs/heads/bar").commit().create();
-    repo.branch("refs/tags/foo").commit().create();
-    Map<String, ?> data = buildData();
-
-    assertEquals(
-        ImmutableList.of(
-            ref("/b/test/+/bar", "bar"),
-            ref("/b/test/+/refs/heads/foo", "foo")),
-        data.get("branches"));
-    assertEquals(
-        ImmutableList.of(
-            // refs/tags/ is searched before refs/heads/, so this does not
-            // appear ambiguous.
-            ref("/b/test/+/foo", "foo")),
-        data.get("tags"));
-  }
-
-  @Test
-  public void ambiguousRelativeToNonBranchOrTag() throws Exception {
-    repo.branch("refs/foo").commit().create();
-    repo.branch("refs/heads/foo").commit().create();
-    repo.branch("refs/tags/foo").commit().create();
-    Map<String, ?> data = buildData();
-
-    assertEquals(
-        ImmutableList.of(
-            ref("/b/test/+/refs/heads/foo", "foo")),
-        data.get("branches"));
-    assertEquals(
-        ImmutableList.of(
-            ref("/b/test/+/refs/tags/foo", "foo")),
-        data.get("tags"));
-  }
-
-  @Test
-  public void refsHeads() throws Exception {
-    repo.branch("refs/heads/foo").commit().create();
-    repo.branch("refs/heads/refs/heads/foo").commit().create();
-    Map<String, ?> data = buildData();
-
-    assertEquals(
-        ImmutableList.of(
-            ref("/b/test/+/foo", "foo"),
-            ref("/b/test/+/refs/heads/refs/heads/foo", "refs/heads/foo")),
-        data.get("branches"));
-  }
-
-  private Map<String, ?> buildData() throws IOException {
-    HttpServletRequest req = FakeHttpServletRequest.newRequest(repo.getRepository());
-    ViewFilter.setView(req, GitilesView.repositoryIndex()
-        .setHostName(URLS.getHostName(req))
-        .setServletPath(req.getServletPath())
-        .setRepositoryName("test")
-        .build());
-    return servlet.buildData(req);
-  }
-
-  private Map<String, String> ref(String url, String name) {
-    return ImmutableMap.of("url", url, "name", name);
-  }
-}
