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 5c3cb40..87f3456 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -19,13 +19,10 @@
 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;
@@ -40,24 +37,24 @@
     String time;
   }
 
-  static Commit toJsonData(RevCommit c) {
+  static Commit toJsonData(RevCommit c, GitDateFormatter df) {
     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.author = toJsonData(c.getAuthorIdent(), df);
+    result.committer = toJsonData(c.getCommitterIdent(), df);
     result.message = c.getFullMessage();
     return result;
   }
 
-  private static Ident toJsonData(PersonIdent ident) {
+  private static Ident toJsonData(PersonIdent ident, GitDateFormatter df) {
     Ident result = new Ident();
     result.name = ident.getName();
     result.email = ident.getEmailAddress();
-    result.time = dateFormatter.formatDate(ident);
+    result.time = df.formatDate(ident);
     return result;
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
index b7ce0c8..768c0f3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -44,7 +44,6 @@
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.eclipse.jgit.util.RelativeDateFormatter;
 import org.eclipse.jgit.util.io.NullOutputStream;
 
@@ -82,7 +81,6 @@
     }
   }
 
-  private final GitDateFormatter dateFormatter = new GitDateFormatter(Format.DEFAULT);
   private Linkifier linkifier;
   private Repository repo;
   private RevWalk walk;
@@ -105,8 +103,8 @@
     return this;
   }
 
-  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit, KeySet ks)
-      throws IOException {
+  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit, KeySet ks,
+      GitDateFormatter df) throws IOException {
     checkKeys(ks);
     checkNotNull(req, "request");
     repo = ServletUtils.getRepository(req);
@@ -114,10 +112,10 @@
 
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(KeySet.DEFAULT.keys.size());
     if (ks.contains("author")) {
-      data.put("author", toSoyData(commit.getAuthorIdent(), dateFormatter));
+      data.put("author", toSoyData(commit.getAuthorIdent(), df));
     }
     if (ks.contains("committer")) {
-      data.put("committer", toSoyData(commit.getCommitterIdent(), dateFormatter));
+      data.put("committer", toSoyData(commit.getCommitterIdent(), df));
     }
     if (ks.contains("sha")) {
       data.put("sha", ObjectId.toString(commit));
@@ -179,9 +177,9 @@
     return ImmutableMap.copyOf(data);
   }
 
-  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit)
-      throws IOException {
-    return toSoyData(req, commit, KeySet.DEFAULT);
+  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit,
+      GitDateFormatter df) throws IOException {
+    return toSoyData(req, commit, KeySet.DEFAULT, df);
   }
 
   private void checkKeys(KeySet ks) {
@@ -192,11 +190,11 @@
   }
 
   // TODO(dborowitz): Extract this.
-  static Map<String, String> toSoyData(PersonIdent ident, GitDateFormatter dateFormatter) {
+  static Map<String, String> toSoyData(PersonIdent ident, GitDateFormatter df) {
     return ImmutableMap.of(
         "name", ident.getName(),
         "email", ident.getEmailAddress(),
-        "time", dateFormatter.formatDate(ident),
+        "time", df.formatDate(ident),
         // TODO(dborowitz): Switch from relative to absolute at some threshold.
         "relativeTime", RelativeDateFormatter.format(ident.getWhen()));
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index e5fad23..02d81af 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -15,7 +15,6 @@
 package com.google.gitiles;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 
 import com.google.common.base.Charsets;
@@ -33,6 +32,8 @@
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -81,10 +82,11 @@
       Map<String, Object> data = getData(req);
       data.put("title", "Diff - " + view.getRevisionRange());
       if (showCommit) {
+        GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
         data.put("commit", new CommitSoyData()
             .setLinkifier(linkifier)
             .setArchiveFormat(archiveFormat)
-            .toSoyData(req, walk.parseCommit(view.getRevision().getId())));
+            .toSoyData(req, walk.parseCommit(view.getRevision().getId()), df));
       }
       if (!data.containsKey("repositoryName") && (view.getRepositoryName() != null)) {
         data.put("repositoryName", view.getRepositoryName());
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 ffad8d8..86bd5a7 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -45,6 +45,8 @@
 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,13 +86,14 @@
     }
 
     try {
-      Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null);
+      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+      Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null, df);
 
       if (!view.getRevision().nameIsId()) {
         List<Map<String, Object>> tags = Lists.newArrayListWithExpectedSize(1);
         for (RevObject o : RevisionServlet.listObjects(paginator.getWalk(), view.getRevision())) {
           if (o instanceof RevTag) {
-            tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o));
+            tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o, df));
           }
         }
         if (!tags.isEmpty()) {
@@ -128,11 +131,12 @@
     }
 
     try {
+      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
       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));
+        entries.add(CommitJsonData.toJsonData(c, df));
       }
       result.put("log", entries);
       if (paginator.getPreviousStart() != null) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
index 7056261..61c2ea4 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -21,6 +21,7 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.GitDateFormatter;
 
 import java.io.IOException;
 import java.util.List;
@@ -39,17 +40,17 @@
   }
 
   public Map<String, Object> toSoyData(RevWalk walk, int limit, @Nullable String revision,
-      @Nullable ObjectId start) throws IOException {
-    return toSoyData(new Paginator(walk, limit, start), revision);
+      @Nullable ObjectId start, GitDateFormatter df) throws IOException {
+    return toSoyData(new Paginator(walk, limit, start), revision, df);
   }
 
-  public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision)
-      throws IOException {
+  public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision,
+      GitDateFormatter df) throws IOException {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(3);
 
     List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
     for (RevCommit c : paginator) {
-      entries.add(new CommitSoyData().toSoyData(req, c, KeySet.SHORTLOG));
+      entries.add(new CommitSoyData().toSoyData(req, c, KeySet.SHORTLOG, df));
     }
 
     data.put("entries", entries);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index 18614a1..3fa73b6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -29,6 +29,8 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.util.List;
@@ -75,8 +77,8 @@
         if (head.getType() == Constants.OBJ_COMMIT) {
           walk.reset();
           walk.markStart((RevCommit) head);
-          data =
-              new LogSoyData(req, view).toSoyData(walk, LOG_LIMIT, "HEAD", null);
+          GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+          data = new LogSoyData(req, view).toSoyData(walk, LOG_LIMIT, "HEAD", null, df);
         } else {
           // TODO(dborowitz): Handle non-commit or missing HEAD?
           data = Maps.newHashMapWithExpectedSize(6);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
index f79df15..1e0b5b2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -36,6 +36,8 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,6 +67,7 @@
 
     RevWalk walk = new RevWalk(repo);
     try {
+      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
       List<RevObject> objects = listObjects(walk, view.getRevision());
       List<Map<String, ?>> soyObjects = Lists.newArrayListWithCapacity(objects.size());
       boolean hasBlob = false;
@@ -80,7 +83,7 @@
                       .setLinkifier(linkifier)
                       .setRevWalk(walk)
                       .setArchiveFormat(archiveFormat)
-                      .toSoyData(req, (RevCommit) obj, KeySet.DETAIL_DIFF_TREE)));
+                      .toSoyData(req, (RevCommit) obj, KeySet.DETAIL_DIFF_TREE, df)));
               break;
             case OBJ_TREE:
               soyObjects.add(ImmutableMap.of(
@@ -96,7 +99,7 @@
             case OBJ_TAG:
               soyObjects.add(ImmutableMap.of(
                   "type", Constants.TYPE_TAG,
-                  "data", new TagSoyData(linkifier, req).toSoyData((RevTag) obj)));
+                  "data", new TagSoyData(linkifier, req).toSoyData((RevTag) obj, df)));
               break;
             default:
               log.warn("Bad object type for {}: {}", ObjectId.toString(obj.getId()), obj.getType());
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
index 9ddf1e5..9e8d871 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
@@ -19,7 +19,6 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.util.Map;
 
@@ -29,19 +28,17 @@
 public class TagSoyData {
   private final Linkifier linkifier;
   private final HttpServletRequest req;
-  private final GitDateFormatter dateFormatter;
 
   public TagSoyData(Linkifier linkifier, HttpServletRequest req) {
     this.linkifier = linkifier;
     this.req = req;
-    this.dateFormatter = new GitDateFormatter(Format.DEFAULT);
   }
 
-  public Map<String, Object> toSoyData(RevTag tag) {
+  public Map<String, Object> toSoyData(RevTag tag, GitDateFormatter df) {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(4);
     data.put("sha", ObjectId.toString(tag));
     if (tag.getTaggerIdent() != null) {
-      data.put("tagger", CommitSoyData.toSoyData(tag.getTaggerIdent(), dateFormatter));
+      data.put("tagger", CommitSoyData.toSoyData(tag.getTaggerIdent(), df));
     }
     data.put("object", ObjectId.toString(tag.getObject()));
     data.put("message", linkifier.linkify(req, tag.getFullMessage()));
