diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
index 2718e6e..0ef13bd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
@@ -166,6 +166,7 @@
   private void showDoc(HttpServletRequest req, HttpServletResponse res,
       GitilesView view, RootNode nav, RootNode doc) throws IOException {
     Map<String, Object> data = new HashMap<>();
+    data.putAll(Navbar.bannerSoyData(view, nav));
     data.put("pageTitle", MoreObjects.firstNonNull(
         MarkdownHelper.getTitle(doc),
         view.getPathPart()));
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java
new file mode 100644
index 0000000..784f990
--- /dev/null
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/Navbar.java
@@ -0,0 +1,76 @@
+// Copyright 2015 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.doc;
+
+import com.google.gitiles.GitilesView;
+import com.google.gitiles.doc.html.HtmlBuilder;
+import com.google.template.soy.shared.restricted.Sanitizers;
+
+import org.pegdown.ast.HeaderNode;
+import org.pegdown.ast.Node;
+import org.pegdown.ast.ReferenceNode;
+import org.pegdown.ast.RootNode;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+class Navbar {
+  static Map<String, Object> bannerSoyData(GitilesView view, RootNode nav) {
+    Map<String, Object> data = new HashMap<>();
+    data.put("siteTitle", null);
+    data.put("logoUrl", null);
+    data.put("homeUrl", null);
+
+    if (nav == null) {
+      return data;
+    }
+
+    for (Iterator<Node> i = nav.getChildren().iterator(); i.hasNext();) {
+      Node n = i.next();
+      if (n instanceof HeaderNode) {
+        HeaderNode h = (HeaderNode) n;
+        if (h.getLevel() == 1) {
+          data.put("siteTitle", MarkdownHelper.getInnerText(h));
+          i.remove();
+          break;
+        }
+      }
+    }
+
+    for (ReferenceNode r : nav.getReferences()) {
+      String key = MarkdownHelper.getInnerText(r);
+      String url = r.getUrl();
+      if ("logo".equalsIgnoreCase(key)) {
+        Object src;
+        if (HtmlBuilder.isImageDataUri(url)) {
+          src = Sanitizers.filterImageDataUri(url);
+        } else {
+          src = url;
+        }
+        data.put("logoUrl", src);
+      } else if ("home".equalsIgnoreCase(key)) {
+        if (MarkdownHelper.isAbsolutePathToMarkdown(url)) {
+          url = GitilesView.doc().copyFrom(view).setPathPart(url).toUrl();
+        }
+        data.put("homeUrl", url);
+      }
+    }
+    return data;
+  }
+
+  private Navbar() {
+  }
+}
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java
index c80c28c..6676ed3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/html/HtmlBuilder.java
@@ -58,6 +58,11 @@
   private static final FilterNormalizeUri URI = FilterNormalizeUri.INSTANCE;
   private static final FilterImageDataUri IMAGE_DATA = FilterImageDataUri.INSTANCE;
 
+  /** Check if URL is valid for {@code <img src="data:image/*;base64,...">}. */
+  public static boolean isImageDataUri(String url) {
+    return IMAGE_DATA.getValueFilter().matcher(url).find();
+  }
+
   private final StringBuilder htmlBuf;
   private final Appendable textBuf;
   private String tag;
@@ -118,7 +123,7 @@
         && URI.getValueFilter().matcher(val).find()) {
       return URI.escape(val);
     }
-    if (IMAGE_DATA.getValueFilter().matcher(val).find()) {
+    if (isImageDataUri(val)) {
       return val; // pass through data:image/*;base64,...
     }
     return IMAGE_DATA.getInnocuousOutput();
