diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCache.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCache.java
index cf5e477..530227d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCache.java
@@ -14,73 +14,12 @@
 
 package com.google.gitiles.blame;
 
-import com.google.common.base.Objects;
-
-import org.eclipse.jgit.blame.BlameResult;
 import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
 
 import java.io.IOException;
 import java.util.List;
 
 public interface BlameCache {
-  public static class Region {
-    private final String sourcePath;
-    private final ObjectId sourceCommit;
-    private final PersonIdent sourceAuthor;
-    private int count;
-
-    public Region(BlameResult blame, int start) {
-      this.sourcePath = blame.getSourcePath(start);
-      RevCommit c = blame.getSourceCommit(start);
-      if (c != null) {
-        this.sourceCommit = c.copy();
-        this.sourceAuthor = c.getAuthorIdent();
-      } else {
-        // Unknown source commit due to JGit bug.
-        this.sourceCommit = null;
-        this.sourceAuthor = null;
-      }
-      this.count = 1;
-    }
-
-    public Region(String sourcePath, ObjectId sourceCommit, PersonIdent sourceAuthor, int count) {
-      this.sourcePath = sourcePath;
-      this.sourceCommit = sourceCommit;
-      this.sourceAuthor = sourceAuthor;
-      this.count = count;
-    }
-
-    public int getCount() {
-      return count;
-    }
-
-    public String getSourcePath() {
-      return sourcePath;
-    }
-
-    public ObjectId getSourceCommit() {
-      return sourceCommit;
-    }
-
-    public PersonIdent getSourceAuthor() {
-      return sourceAuthor;
-    }
-
-    public boolean growFrom(BlameResult blame, int i) {
-      // Don't compare line numbers, so we collapse regions from the same source
-      // but with deleted lines into one.
-      if (Objects.equal(blame.getSourcePath(i), sourcePath)
-          && Objects.equal(blame.getSourceCommit(i), sourceCommit)) {
-        count++;
-        return true;
-      } else {
-        return false;
-      }
-    }
-  }
-
   public List<Region> get(Repository repo, ObjectId commitId, String path) throws IOException;
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
index ea10d73..0f0f662 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
@@ -35,9 +35,9 @@
 /** Guava implementation of BlameCache, weighted by number of blame regions. */
 public class BlameCacheImpl implements BlameCache {
   public static CacheBuilder<Key, List<Region>> newBuilder() {
-    return CacheBuilder.newBuilder().weigher(new Weigher<Key, List<BlameCache.Region>>() {
+    return CacheBuilder.newBuilder().weigher(new Weigher<Key, List<Region>>() {
       @Override
-      public int weigh(Key key, List<BlameCache.Region> value) {
+      public int weigh(Key key, List<Region> value) {
         return value.size();
       }
     }).maximumWeight(10 << 10);
@@ -89,16 +89,16 @@
   }
 
   public BlameCacheImpl(CacheBuilder<Key, List<Region>> builder) {
-    this.cache = builder.build(new CacheLoader<Key, List<BlameCache.Region>>() {
+    this.cache = builder.build(new CacheLoader<Key, List<Region>>() {
       @Override
-      public List<BlameCache.Region> load(Key key) throws IOException {
+      public List<Region> load(Key key) throws IOException {
         return loadBlame(key);
       }
     });
   }
 
   @Override
-  public List<BlameCache.Region> get(Repository repo, ObjectId commitId, String path)
+  public List<Region> get(Repository repo, ObjectId commitId, String path)
       throws IOException {
     try {
       return cache.get(new Key(repo, commitId, path));
@@ -107,7 +107,7 @@
     }
   }
 
-  private List<BlameCache.Region> loadBlame(Key key) throws IOException {
+  private List<Region> loadBlame(Key key) throws IOException {
     try {
       BlameGenerator gen = new BlameGenerator(key.repo, key.path);
       BlameResult blame;
@@ -123,10 +123,10 @@
       int lineCount = blame.getResultContents().size();
       blame.discardResultContents();
 
-      List<BlameCache.Region> regions = Lists.newArrayList();
+      List<Region> regions = Lists.newArrayList();
       for (int i = 0; i < lineCount; i++) {
         if (regions.isEmpty() || !regions.get(regions.size() - 1).growFrom(blame, i)) {
-          regions.add(new BlameCache.Region(blame, i));
+          regions.add(new Region(blame, i));
         }
       }
       return Collections.unmodifiableList(regions);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
index b50b2fb..3d88ffc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
@@ -77,7 +77,7 @@
       String title = "Blame - " + view.getPathPart();
       Map<String, ?> blobData = new BlobSoyData(rw, view).toSoyData(view.getPathPart(), blobId);
       if (blobData.get("data") != null) {
-        List<BlameCache.Region> regions = cache.get(repo, commit, view.getPathPart());
+        List<Region> regions = cache.get(repo, commit, view.getPathPart());
         if (regions.isEmpty()) {
           res.setStatus(SC_NOT_FOUND);
           return;
@@ -116,10 +116,10 @@
   }
 
   private static List<Map<String, ?>> toSoyData(GitilesView view, ObjectReader reader,
-      List<BlameCache.Region> regions, GitDateFormatter df) throws IOException {
+      List<Region> regions, GitDateFormatter df) throws IOException {
     Map<ObjectId, String> abbrevShas = Maps.newHashMap();
     List<Map<String, ?>> result = Lists.newArrayListWithCapacity(regions.size());
-    for (BlameCache.Region r : regions) {
+    for (Region r : regions) {
       if (r.getSourceCommit() == null) {
         // JGit bug may fail to blame some regions. We should fix this
         // upstream, but handle it for now.
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/Region.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/Region.java
new file mode 100644
index 0000000..8b3fd41
--- /dev/null
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/Region.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2014 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.blame;
+
+import com.google.common.base.Objects;
+
+import org.eclipse.jgit.blame.BlameResult;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/** Region of the blame of a file. */
+public class Region {
+  private final String sourcePath;
+  private final ObjectId sourceCommit;
+  private final PersonIdent sourceAuthor;
+  private int count;
+
+  public Region(BlameResult blame, int start) {
+    this.sourcePath = blame.getSourcePath(start);
+    RevCommit c = blame.getSourceCommit(start);
+    if (c != null) {
+      this.sourceCommit = c.copy();
+      this.sourceAuthor = c.getAuthorIdent();
+    } else {
+      // Unknown source commit due to JGit bug.
+      this.sourceCommit = null;
+      this.sourceAuthor = null;
+    }
+    this.count = 1;
+  }
+
+  public Region(String sourcePath, ObjectId sourceCommit, PersonIdent sourceAuthor, int count) {
+    this.sourcePath = sourcePath;
+    this.sourceCommit = sourceCommit;
+    this.sourceAuthor = sourceAuthor;
+    this.count = count;
+  }
+
+  public int getCount() {
+    return count;
+  }
+
+  public String getSourcePath() {
+    return sourcePath;
+  }
+
+  public ObjectId getSourceCommit() {
+    return sourceCommit;
+  }
+
+  public PersonIdent getSourceAuthor() {
+    return sourceAuthor;
+  }
+
+  public boolean growFrom(BlameResult blame, int i) {
+    // Don't compare line numbers, so we collapse regions from the same source
+    // but with deleted lines into one.
+    if (Objects.equal(blame.getSourcePath(i), sourcePath)
+        && Objects.equal(blame.getSourceCommit(i), sourceCommit)) {
+      count++;
+      return true;
+    } else {
+      return false;
+    }
+  }
+}
