diff --git a/java/com/google/gitiles/DescribeServlet.java b/java/com/google/gitiles/DescribeServlet.java
index ebd2ea4..ae1d4c8 100644
--- a/java/com/google/gitiles/DescribeServlet.java
+++ b/java/com/google/gitiles/DescribeServlet.java
@@ -53,7 +53,7 @@
 
   @Override
   protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    String name = describe(ServletUtils.getRepository(req), ViewFilter.getView(req), req, res);
+    String name = describe(ServletUtils.getRepository(req), ViewFilter.getView(req), req);
     if (name == null) {
       return;
     }
@@ -64,7 +64,7 @@
 
   @Override
   protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    String name = describe(ServletUtils.getRepository(req), ViewFilter.getView(req), req, res);
+    String name = describe(ServletUtils.getRepository(req), ViewFilter.getView(req), req);
     if (name == null) {
       return;
     }
@@ -75,9 +75,7 @@
         new TypeToken<Map<String, String>>() {}.getType());
   }
 
-  private ObjectId resolve(
-      Repository repo, GitilesView view, HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
+  private ObjectId resolve(Repository repo, GitilesView view) throws IOException {
     String rev = view.getPathPart();
     try {
       return repo.resolve(rev);
@@ -93,19 +91,18 @@
     }
   }
 
-  private String describe(
-      Repository repo, GitilesView view, HttpServletRequest req, HttpServletResponse res)
+  private String describe(Repository repo, GitilesView view, HttpServletRequest req)
       throws IOException {
     if (!getBooleanParam(view, CONTAINS_PARAM)) {
       throw new GitilesRequestFailureException(FailureReason.INCORECT_PARAMETER);
     }
-    ObjectId id = resolve(repo, view, req, res);
+    ObjectId id = resolve(repo, view);
     if (id == null) {
       return null;
     }
     String name;
     try (Git git = new Git(repo)) {
-      NameRevCommand cmd = nameRevCommand(git, id, req, res);
+      NameRevCommand cmd = nameRevCommand(git, id, req);
       if (cmd == null) {
         return null;
       }
@@ -119,8 +116,8 @@
     return name;
   }
 
-  private NameRevCommand nameRevCommand(
-      Git git, ObjectId id, HttpServletRequest req, HttpServletResponse res) throws IOException {
+  private NameRevCommand nameRevCommand(Git git, ObjectId id, HttpServletRequest req)
+      throws IOException {
     GitilesView view = ViewFilter.getView(req);
     NameRevCommand cmd = git.nameRev();
     boolean all = getBooleanParam(view, ALL_PARAM);
diff --git a/java/com/google/gitiles/HostIndexServlet.java b/java/com/google/gitiles/HostIndexServlet.java
index d64fc07..8b8a252 100644
--- a/java/com/google/gitiles/HostIndexServlet.java
+++ b/java/com/google/gitiles/HostIndexServlet.java
@@ -51,8 +51,7 @@
   }
 
   private Map<String, RepositoryDescription> list(
-      HttpServletRequest req, HttpServletResponse res, String prefix, Set<String> branches)
-      throws IOException {
+      HttpServletRequest req, String prefix, Set<String> branches) throws IOException {
     Map<String, RepositoryDescription> descs;
     try {
       descs = getAccess(req).listRepositories(prefix, branches);
@@ -85,7 +84,7 @@
     GitilesView view = ViewFilter.getView(req);
     String prefix = view.getRepositoryPrefix();
     if (prefix != null) {
-      Map<String, RepositoryDescription> descs = list(req, res, prefix, Collections.emptySet());
+      Map<String, RepositoryDescription> descs = list(req, prefix, Collections.emptySet());
       if (descs == null) {
         return;
       }
@@ -107,7 +106,7 @@
   protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     String prefix = view.getRepositoryPrefix();
-    Map<String, RepositoryDescription> descs = list(req, res, prefix, parseShowBranch(req));
+    Map<String, RepositoryDescription> descs = list(req, prefix, parseShowBranch(req));
     if (descs == null) {
       return;
     }
@@ -144,7 +143,7 @@
   protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
     String prefix = ViewFilter.getView(req).getRepositoryPrefix();
     Set<String> branches = parseShowBranch(req);
-    Map<String, RepositoryDescription> descs = list(req, res, prefix, branches);
+    Map<String, RepositoryDescription> descs = list(req, prefix, branches);
     if (descs == null) {
       return;
     }
@@ -169,7 +168,7 @@
   @Override
   protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
     String prefix = ViewFilter.getView(req).getRepositoryPrefix();
-    Map<String, RepositoryDescription> descs = list(req, res, prefix, parseShowBranch(req));
+    Map<String, RepositoryDescription> descs = list(req, prefix, parseShowBranch(req));
     if (descs == null) {
       return;
     }
diff --git a/java/com/google/gitiles/blame/BlameServlet.java b/java/com/google/gitiles/blame/BlameServlet.java
index 3fa84fb..0bc061b 100644
--- a/java/com/google/gitiles/blame/BlameServlet.java
+++ b/java/com/google/gitiles/blame/BlameServlet.java
@@ -75,7 +75,7 @@
 
     try (RevWalk rw = new RevWalk(repo)) {
       GitilesAccess access = getAccess(req);
-      RegionResult result = getRegions(view, access, repo, rw, res);
+      RegionResult result = getRegions(view, access, repo, rw);
       if (result == null) {
         return;
       }
@@ -117,7 +117,7 @@
     Repository repo = ServletUtils.getRepository(req);
 
     try (RevWalk rw = new RevWalk(repo)) {
-      RegionResult result = getRegions(view, getAccess(req), repo, rw, res);
+      RegionResult result = getRegions(view, getAccess(req), repo, rw);
       if (result == null) {
         return;
       }
@@ -155,8 +155,7 @@
   }
 
   private RegionResult getRegions(
-      GitilesView view, GitilesAccess access, Repository repo, RevWalk rw, HttpServletResponse res)
-      throws IOException {
+      GitilesView view, GitilesAccess access, Repository repo, RevWalk rw) throws IOException {
     RevCommit currCommit = rw.parseCommit(view.getRevision().getId());
     ObjectId currCommitBlobId = resolveBlob(view, rw, currCommit);
     if (currCommitBlobId == null) {
