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 ff1fb7b..519dc6d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -18,7 +18,6 @@
 import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 
-import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
@@ -34,7 +33,6 @@
 import org.eclipse.jgit.errors.RevWalkException;
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
-import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectReader;
@@ -88,16 +86,12 @@
 
     try {
       GitilesAccess access = getAccess(req);
-      Config config = access.getConfig();
       DateFormatter df = new DateFormatter(access, Format.DEFAULT);
 
       // Allow the user to select a logView variant with the "pretty" param.
       String pretty = Iterables.getFirst(view.getParameters().get(PRETTY_PARAM), "default");
-      Map<String, Object> data = new LogSoyData(req, view,
-          config.getBoolean("logFormat", pretty, "verbose", false)).toSoyData(paginator, null, df);
-      String variant = config.getString("logFormat", pretty, "variant");
-      data.put("logEntryPretty", pretty);
-      data.put("logEntryVariant", Objects.firstNonNull(variant, pretty));
+      Map<String, Object> data = new LogSoyData(req, access, pretty)
+          .toSoyData(paginator, null, df);
 
       if (!view.getRevision().nameIsId()) {
         List<Map<String, Object>> tags = Lists.newArrayListWithExpectedSize(1);
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 7b8036f..a2ef5cf 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -14,12 +14,16 @@
 
 package com.google.gitiles;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.Field;
 
+import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
@@ -39,17 +43,17 @@
   private static final ImmutableSet<Field> VERBOSE_FIELDS = Field.setOf(FIELDS, Field.DIFF_TREE);
 
   private final HttpServletRequest req;
-  private final GitilesView view;
-  private final boolean verbose;
+  private final Set<Field> fields;
+  private final String pretty;
+  private final String variant;
 
-  public LogSoyData(HttpServletRequest req, GitilesView view) {
-    this(req, view, false);
-  }
-
-  public LogSoyData(HttpServletRequest req, GitilesView view, boolean verbose) {
-    this.req = req;
-    this.view = view;
-    this.verbose = verbose;
+  public LogSoyData(HttpServletRequest req, GitilesAccess access, String pretty)
+      throws IOException {
+    this.req = checkNotNull(req);
+    this.pretty = checkNotNull(pretty);
+    Config config = access.getConfig();
+    fields = config.getBoolean("logFormat", pretty, "verbose", false) ? VERBOSE_FIELDS : FIELDS;
+    variant = Objects.firstNonNull(config.getString("logFormat", pretty, "variant"), pretty);
   }
 
   public Map<String, Object> toSoyData(RevWalk walk, int limit, @Nullable String revision,
@@ -60,19 +64,21 @@
   public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision,
       DateFormatter df) throws IOException {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(3);
+    data.put("logEntryPretty", pretty);
+    data.put("logEntryVariant", variant);
 
     List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
     for (RevCommit c : paginator) {
-      Set<Field> fs = verbose ? VERBOSE_FIELDS : FIELDS;
       Map<String, Object> entry = new CommitSoyData().setRevWalk(paginator.getWalk())
-          .toSoyData(req, c, fs, df);
+          .toSoyData(req, c, fields, df);
       if (!entry.containsKey("diffTree")) {
         entry.put("diffTree", null);
       }
       entries.add(entry);
     }
-
     data.put("entries", entries);
+
+    GitilesView view = ViewFilter.getView(req);
     ObjectId next = paginator.getNextStart();
     if (next != null) {
       data.put("nextUrl", copyAndCanonicalize(view, revision)
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 ca1a0dc..ec565b3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -83,7 +83,8 @@
           walk.reset();
           walk.markStart((RevCommit) head);
           DateFormatter df = new DateFormatter(access, Format.DEFAULT);
-          data = new LogSoyData(req, view).toSoyData(walk, LOG_LIMIT, "HEAD", null, df);
+          data = new LogSoyData(req, access, "oneline")
+              .toSoyData(walk, LOG_LIMIT, "HEAD", null, df);
         } else {
           // TODO(dborowitz): Handle non-commit or missing HEAD?
           data = Maps.newHashMapWithExpectedSize(7);
