diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
index 51154b0..441fe61 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
@@ -44,7 +44,12 @@
 
   @Test
   public void httpLink() {
-    MarkdownToHtml md = new MarkdownToHtml(view, config, "index.md");
+    MarkdownToHtml md =
+        MarkdownToHtml.builder()
+            .setGitilesView(view)
+            .setConfig(new MarkdownConfig(config))
+            .setFilePath("index.md")
+            .build();
     String url;
 
     url = "http://example.com/foo.html";
@@ -59,7 +64,12 @@
 
   @Test
   public void absolutePath() {
-    MarkdownToHtml md = new MarkdownToHtml(view, config, "index.md");
+    MarkdownToHtml md =
+        MarkdownToHtml.builder()
+            .setGitilesView(view)
+            .setConfig(new MarkdownConfig(config))
+            .setFilePath("index.md")
+            .build();
 
     assertThat(md.href("/")).isEqualTo("/g/repo/+/HEAD/");
     assertThat(md.href("/index.md")).isEqualTo("/g/repo/+/HEAD/index.md");
@@ -133,10 +143,11 @@
   }
 
   private MarkdownToHtml file(String path) {
-    return new MarkdownToHtml(
-        GitilesView.doc().copyFrom(view).setPathPart(path).build(),
-        config,
-        path);
+    return MarkdownToHtml.builder()
+        .setGitilesView(GitilesView.doc().copyFrom(view).setPathPart(path).build())
+        .setConfig(new MarkdownConfig(config))
+        .setFilePath(path)
+        .build();
   }
 
   private MarkdownToHtml repoIndexReadme() {
@@ -154,7 +165,11 @@
   }
 
   private MarkdownToHtml readme(GitilesView v, String path) {
-    return new MarkdownToHtml(v, config, path);
+    return MarkdownToHtml.builder()
+        .setGitilesView(v)
+        .setConfig(new MarkdownConfig(config))
+        .setFilePath(path)
+        .build();
   }
 
   @Test
@@ -200,12 +215,16 @@
   }
 
   private MarkdownToHtml rootedDoc(String path, String file) {
-    GitilesView view = GitilesView.rootedDoc()
-        .setHostName("gerritcodereview.com")
-        .setServletPath("")
-        .setRevision(RootedDocServlet.BRANCH)
-        .setPathPart(path)
+    return MarkdownToHtml.builder()
+        .setGitilesView(
+            GitilesView.rootedDoc()
+                .setHostName("gerritcodereview.com")
+                .setServletPath("")
+                .setRevision(RootedDocServlet.BRANCH)
+                .setPathPart(path)
+                .build())
+        .setConfig(new MarkdownConfig(config))
+        .setFilePath(file)
         .build();
-    return new MarkdownToHtml(view, config, file);
   }
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/PathResolverTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/PathResolverTest.java
new file mode 100644
index 0000000..d788f43
--- /dev/null
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/PathResolverTest.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// 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.doc;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gitiles.doc.PathResolver.resolve;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class PathResolverTest {
+  @Test
+  public void resolveTests() {
+    assertThat(resolve(null, "/foo.md")).isEqualTo("foo.md");
+    assertThat(resolve(null, "////foo.md")).isEqualTo("foo.md");
+    assertThat(resolve("/index.md", "/foo.md")).isEqualTo("foo.md");
+    assertThat(resolve("index.md", "/foo.md")).isEqualTo("foo.md");
+    assertThat(resolve("index.md", "foo.md")).isEqualTo("foo.md");
+    assertThat(resolve(null, "foo.md")).isNull();
+
+    assertThat(resolve("doc/index.md", "../foo.md")).isEqualTo("foo.md");
+    assertThat(resolve("/doc/index.md", "../foo.md")).isEqualTo("foo.md");
+    assertThat(resolve("/doc/index.md", ".././foo.md")).isEqualTo("foo.md");
+    assertThat(resolve("/a/b/c/index.md", "../../foo.md")).isEqualTo("a/foo.md");
+    assertThat(resolve("/a/index.md", "../../../foo.md")).isNull();
+  }
+}
