diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
index d435289..5fda0df 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.CharMatcher;
+import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Queues;
@@ -105,10 +106,10 @@
   }
 
   @Override
-  public Map<String, RepositoryDescription> listRepositories(Set<String> branches)
-      throws IOException {
+  public Map<String, RepositoryDescription> listRepositories(String prefix,
+      Set<String> branches) throws IOException {
     Map<String, RepositoryDescription> repos = Maps.newTreeMap(US_COLLATOR);
-    for (Repository repo : scanRepositories(basePath, req)) {
+    for (Repository repo : scanRepositories(basePath, prefix, req)) {
       repos.put(getRepositoryName(repo), buildDescription(repo, branches));
       repo.close();
     }
@@ -219,15 +220,10 @@
     return "refs/heads/" + name;
   }
 
-  private Collection<Repository> scanRepositories(final File basePath, final HttpServletRequest req)
-      throws IOException {
+  private Collection<Repository> scanRepositories(File basePath, String prefix,
+      HttpServletRequest req) throws IOException {
     List<Repository> repos = Lists.newArrayList();
-    Queue<File> todo = Queues.newArrayDeque();
-    File[] baseFiles = basePath.listFiles();
-    if (baseFiles == null) {
-      throw new IOException("base path is not a directory: " + basePath.getPath());
-    }
-    Collections.addAll(todo, baseFiles);
+    Queue<File> todo = initScan(basePath, prefix);
     while (!todo.isEmpty()) {
       File file = todo.remove();
       try {
@@ -243,4 +239,28 @@
     }
     return repos;
   }
+
+  private Queue<File> initScan(File basePath, String prefix)
+      throws IOException {
+    Queue<File> todo = Queues.newArrayDeque();
+    File[] entries;
+    if (isValidPrefix(prefix)) {
+      entries = new File(basePath, CharMatcher.is('/').trimFrom(prefix)).listFiles();
+    } else {
+      entries = basePath.listFiles();
+    }
+    if (entries != null) {
+      Collections.addAll(todo, entries);
+    } else if (!basePath.isDirectory()) {
+      throw new IOException("base path is not a directory: " + basePath.getPath());
+    }
+    return todo;
+  }
+
+  private static boolean isValidPrefix(String prefix) {
+    return !Strings.isNullOrEmpty(prefix)
+        && !prefix.equals(".") && !prefix.equals("..")
+        && !prefix.contains("../")
+        && !prefix.endsWith("/..");
+  }
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
index 4572033..6434e55 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesAccess.java
@@ -22,6 +22,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 
 /**
@@ -39,16 +40,22 @@
   /**
    * List repositories on the host.
    *
+   * @param prefix repository base path to list. Trailing "/" is implicitly
+   *        added if missing. Null or empty string will match all repositories.
    * @param branches branches to list along with each repository.
    * @return map of repository names to descriptions.
    * @throws ServiceNotEnabledException to trigger an HTTP 403 Forbidden
-   *     (matching behavior in {@link org.eclipse.jgit.http.server.RepositoryFilter}).
+   *         (matching behavior in
+   *         {@link org.eclipse.jgit.http.server.RepositoryFilter}).
    * @throws ServiceNotAuthorizedException to trigger an HTTP 401 Unauthorized
-   *     (matching behavior in {@link org.eclipse.jgit.http.server.RepositoryFilter}).
+   *         (matching behavior in
+   *         {@link org.eclipse.jgit.http.server.RepositoryFilter}).
    * @throws IOException if an error occurred.
    */
-  public Map<String, RepositoryDescription> listRepositories(Set<String> branches)
-      throws ServiceNotEnabledException, ServiceNotAuthorizedException, IOException;
+  public Map<String, RepositoryDescription> listRepositories(
+      @Nullable String prefix, Set<String> branches)
+          throws ServiceNotEnabledException, ServiceNotAuthorizedException,
+          IOException;
 
   /**
    * @return an opaque object that uniquely identifies the end-user making the
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
index 2734380..d1960b8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
@@ -18,7 +18,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.gitiles.GitilesServlet.STATIC_PREFIX;
-import static com.google.gitiles.ViewFilter.getRegexGroup;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.FluentIterable;
@@ -33,17 +32,11 @@
 import com.google.gitiles.doc.DocServlet;
 
 import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.http.server.RepositoryFilter;
 import org.eclipse.jgit.http.server.glue.MetaFilter;
 import org.eclipse.jgit.http.server.glue.ServletBinder;
 import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
 import org.eclipse.jgit.transport.resolver.FileResolver;
 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
-import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
-import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 
 import java.io.File;
 import java.io.IOException;
@@ -195,7 +188,7 @@
     this.blameCache = blameCache;
     this.gitwebRedirect = gitwebRedirect;
     if (resolver != null) {
-      this.resolver = wrapResolver(resolver);
+      this.resolver = resolver;
     }
   }
 
@@ -285,19 +278,6 @@
     checkState(!initialized, "Gitiles already initialized");
   }
 
-  private static RepositoryResolver<HttpServletRequest> wrapResolver(
-      final RepositoryResolver<HttpServletRequest> resolver) {
-    checkNotNull(resolver, "resolver");
-    return new RepositoryResolver<HttpServletRequest>() {
-      @Override
-      public Repository open(HttpServletRequest req, String name)
-          throws RepositoryNotFoundException, ServiceNotAuthorizedException,
-          ServiceNotEnabledException, ServiceMayNotContinueException {
-        return resolver.open(req, ViewFilter.trimLeadingSlash(getRegexGroup(req, 1)));
-      }
-    };
-  }
-
   private synchronized Linkifier linkifier() {
     if (linkifier == null) {
       checkState(urls != null, "GitilesUrls not yet set");
@@ -362,7 +342,7 @@
       FileResolver<HttpServletRequest> fileResolver;
       if (resolver == null) {
         fileResolver = new FileResolver<>(new File(basePath), exportAll);
-        resolver = wrapResolver(fileResolver);
+        resolver = fileResolver;
       } else if (resolver instanceof FileResolver) {
         fileResolver = (FileResolver<HttpServletRequest>) resolver;
       } else {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
index 54cf377..0e7dc59 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -23,7 +23,9 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
 import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -36,6 +38,7 @@
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.List;
@@ -87,6 +90,7 @@
 
     private String hostName;
     private String servletPath;
+    private String repositoryPrefix;
     private String repositoryName;
     private Revision revision = Revision.NULL;
     private Revision oldRevision = Revision.NULL;
@@ -106,6 +110,9 @@
       hostName = other.hostName;
       servletPath = other.servletPath;
       switch (type) {
+        case HOST_INDEX:
+          repositoryPrefix = other.repositoryPrefix;
+          break;
         case LOG:
         case DIFF:
           oldRevision = other.oldRevision;
@@ -161,6 +168,19 @@
       return servletPath;
     }
 
+    public Builder setRepositoryPrefix(String prefix) {
+      switch (type) {
+        case HOST_INDEX:
+          this.repositoryPrefix = prefix != null
+              ? Strings.emptyToNull(maybeTrimLeadingAndTrailingSlash(prefix))
+              : null;
+          return this;
+        default:
+          throw new IllegalStateException(
+              String.format("cannot set repository prefix on %s view", type));
+      }
+    }
+
     public Builder setRepositoryName(String repositoryName) {
       switch (type) {
         case HOST_INDEX:
@@ -342,8 +362,9 @@
           checkRootedDoc();
           break;
       }
-      return new GitilesView(type, hostName, servletPath, repositoryName, revision,
-          oldRevision, path, extension, params, anchor);
+      return new GitilesView(type, hostName, servletPath, repositoryPrefix,
+          repositoryName, revision, oldRevision, path, extension, params,
+          anchor);
     }
 
     public String toUrl() {
@@ -470,6 +491,7 @@
   private final Type type;
   private final String hostName;
   private final String servletPath;
+  private final String repositoryPrefix;
   private final String repositoryName;
   private final Revision revision;
   private final Revision oldRevision;
@@ -481,6 +503,7 @@
   private GitilesView(Type type,
       String hostName,
       String servletPath,
+      String repositoryPrefix,
       String repositoryName,
       Revision revision,
       Revision oldRevision,
@@ -491,6 +514,7 @@
     this.type = type;
     this.hostName = hostName;
     this.servletPath = servletPath;
+    this.repositoryPrefix = repositoryPrefix;
     this.repositoryName = repositoryName;
     this.revision = firstNonNull(revision, Revision.NULL);
     this.oldRevision = firstNonNull(oldRevision, Revision.NULL);
@@ -516,6 +540,10 @@
     return servletPath;
   }
 
+  public String getRepositoryPrefix() {
+    return repositoryPrefix;
+  }
+
   public String getRepositoryName() {
     return repositoryName;
   }
@@ -574,6 +602,7 @@
         .omitNullValues()
         .add("host", hostName)
         .add("servlet", servletPath)
+        .add("prefix", repositoryPrefix)
         .add("repo", repositoryName)
         .add("rev", revision)
         .add("old", oldRevision)
@@ -592,8 +621,11 @@
     ListMultimap<String, String> params = this.params;
     switch (type) {
       case HOST_INDEX:
+        if (repositoryPrefix != null) {
+          url.append(repositoryPrefix).append('/');
+        }
         params = LinkedListMultimap.create();
-        if (!this.params.containsKey("format")) {
+        if (repositoryPrefix == null && !this.params.containsKey("format")) {
           params.put("format", FormatType.HTML.toString());
         }
         params.putAll(this.params);
@@ -712,9 +744,11 @@
         "hasSingleTree must be null for %s view", type);
     String path = this.path;
     ImmutableList.Builder<Map<String, String>> breadcrumbs = ImmutableList.builder();
-    breadcrumbs.add(breadcrumb(hostName, hostIndex().copyFrom(this)));
-    if (repositoryName != null) {
-      breadcrumbs.add(breadcrumb(repositoryName, repositoryIndex().copyFrom(this)));
+    breadcrumbs.add(breadcrumb(hostName, hostIndex().copyFrom(this).setRepositoryPrefix(null)));
+    if (repositoryPrefix != null) {
+      breadcrumbs.addAll(hostIndexBreadcrumbs(repositoryPrefix));
+    } else if (repositoryName != null) {
+      breadcrumbs.addAll(hostIndexBreadcrumbs(repositoryName));
     }
     if (type == Type.DIFF) {
       // TODO(dborowitz): Tweak the breadcrumbs template to allow us to render
@@ -762,6 +796,18 @@
     return breadcrumbs.build();
   }
 
+  private List<Map<String, String>> hostIndexBreadcrumbs(String name) {
+    List<String> parts = Splitter.on('/').splitToList(name);
+    List<Map<String, String>> r = new ArrayList<>(parts.size());
+    for (int i = 0; i < parts.size(); i++) {
+      String prefix = Joiner.on('/').join(parts.subList(0, i + 1));
+      r.add(breadcrumb(
+          parts.get(i),
+          hostIndex().copyFrom(this).setRepositoryPrefix(prefix)));
+    }
+    return r;
+  }
+
   private static Map<String, String> breadcrumb(String text, Builder url) {
     return ImmutableMap.of("text", text, "url", url.toUrl());
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
index 2d52359..aa2208a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import com.google.gson.reflect.TypeToken;
+import com.google.template.soy.data.SoyData;
 import com.google.template.soy.data.SoyListData;
 import com.google.template.soy.data.SoyMapData;
 
@@ -37,9 +38,12 @@
 import java.io.IOException;
 import java.io.Writer;
 import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -56,16 +60,12 @@
     this.urls = checkNotNull(urls, "urls");
   }
 
-  private Map<String, RepositoryDescription> getDescriptions(HttpServletRequest req,
-      HttpServletResponse res) throws IOException {
-    return getDescriptions(req, res, parseShowBranch(req));
-  }
-
-  private Map<String, RepositoryDescription> getDescriptions(HttpServletRequest req,
-      HttpServletResponse res, Set<String> branches) throws IOException {
+  private Map<String, RepositoryDescription> list(
+      HttpServletRequest req, HttpServletResponse res, String prefix,
+      Set<String> branches) throws IOException {
     Map<String, RepositoryDescription> descs;
     try {
-      descs = getAccess(req).listRepositories(branches);
+      descs = getAccess(req).listRepositories(prefix, branches);
     } catch (RepositoryNotFoundException e) {
       res.sendError(SC_NOT_FOUND);
       return null;
@@ -85,12 +85,17 @@
       res.sendError(SC_SERVICE_UNAVAILABLE);
       return null;
     }
+    if (prefix != null && descs.isEmpty()) {
+      res.sendError(SC_NOT_FOUND);
+      return null;
+    }
     return descs;
   }
 
-  private SoyMapData toSoyMapData(RepositoryDescription desc, GitilesView view) {
+  private SoyMapData toSoyMapData(RepositoryDescription desc,
+      @Nullable String prefix, GitilesView view) {
     return new SoyMapData(
-        "name", desc.name,
+        "name", stripPrefix(prefix, desc.name),
         "description", Strings.nullToEmpty(desc.description),
         "url", GitilesView.repositoryIndex()
             .copyFrom(view)
@@ -100,25 +105,37 @@
 
   @Override
   protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    Map<String, RepositoryDescription> descs = getDescriptions(req, res);
+    GitilesView view = ViewFilter.getView(req);
+    String prefix = view.getRepositoryPrefix();
+    Map<String, RepositoryDescription> descs = list(req, res, prefix, parseShowBranch(req));
     if (descs == null) {
       return;
     }
+
     SoyListData repos = new SoyListData();
     for (RepositoryDescription desc : descs.values()) {
-      repos.add(toSoyMapData(desc, ViewFilter.getView(req)));
+      repos.add(toSoyMapData(desc, prefix, view));
     }
 
+    String hostName = urls.getHostName(req);
+    List<Map<String, String>> breadcrumbs = null;
+    if (prefix != null) {
+      hostName = hostName + '/' + prefix;
+      breadcrumbs = view.getBreadcrumbs();
+    }
     renderHtml(req, res, "gitiles.hostIndex", ImmutableMap.of(
-        "hostName", urls.getHostName(req),
+        "hostName", hostName,
+        "breadcrumbs", SoyData.createFromExistingData(breadcrumbs),
         "baseUrl", urls.getBaseGitUrl(req),
+        "prefix", prefix != null ? prefix + '/' : "",
         "repositories", repos));
   }
 
   @Override
   protected void doGetText(HttpServletRequest req, HttpServletResponse res) throws IOException {
+    String prefix = ViewFilter.getView(req).getRepositoryPrefix();
     Set<String> branches = parseShowBranch(req);
-    Map<String, RepositoryDescription> descs = getDescriptions(req, res, branches);
+    Map<String, RepositoryDescription> descs = list(req, res, prefix, branches);
     if (descs == null) {
       return;
     }
@@ -134,7 +151,7 @@
         writer.write(ref);
         writer.write(' ');
       }
-      writer.write(GitilesUrls.NAME_ESCAPER.apply(repo.name));
+      writer.write(GitilesUrls.NAME_ESCAPER.apply(stripPrefix(prefix, repo.name)));
       writer.write('\n');
     }
     writer.flush();
@@ -143,13 +160,25 @@
 
   @Override
   protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    Map<String, RepositoryDescription> descs = getDescriptions(req, res);
+    String prefix = ViewFilter.getView(req).getRepositoryPrefix();
+    Map<String, RepositoryDescription> descs = list(req, res, prefix, parseShowBranch(req));
     if (descs == null) {
       return;
     }
+    if (prefix != null) {
+      Map<String, RepositoryDescription> r = new LinkedHashMap<>();
+      for (Map.Entry<String, RepositoryDescription> e : descs.entrySet()) {
+        r.put(stripPrefix(prefix, e.getKey()), e.getValue());
+      }
+      descs = r;
+    }
     renderJson(req, res, descs, new TypeToken<Map<String, RepositoryDescription>>() {}.getType());
   }
 
+  private static String stripPrefix(@Nullable String prefix, String name) {
+    return prefix != null ? name.substring(prefix.length() + 1) : name;
+  }
+
   private static Set<String> parseShowBranch(HttpServletRequest req) {
     // Roughly match Gerrit Code Review's /projects/ API by supporting
     // both show-branch and b as query parameters.
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
new file mode 100644
index 0000000..6eb5033
--- /dev/null
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryFilter.java
@@ -0,0 +1,69 @@
+// 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;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.gitiles.ViewFilter.getRegexGroup;
+import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
+import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
+import static org.eclipse.jgit.http.server.GitSmartHttpTools.sendError;
+import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
+
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.resolver.RepositoryResolver;
+import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
+import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
+
+import java.io.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+class RepositoryFilter extends AbstractHttpFilter {
+  private final RepositoryResolver<HttpServletRequest> resolver;
+
+  RepositoryFilter(RepositoryResolver<HttpServletRequest> resolver) {
+    this.resolver = checkNotNull(resolver, "resolver");
+  }
+
+  @Override
+  public void doFilter(HttpServletRequest req, HttpServletResponse res,
+      FilterChain chain) throws IOException, ServletException {
+    try {
+      String repo = ViewFilter.trimLeadingSlash(getRegexGroup(req, 1));
+      try (Repository git = resolver.open(req, repo)) {
+        req.setAttribute(ATTRIBUTE_REPOSITORY, git);
+        chain.doFilter(req, res);
+      } catch (RepositoryNotFoundException e) {
+        // Drop through the rest of the chain. ViewFilter will pass this
+        // to HostIndexServlet which will attempt to list repositories
+        // or send SC_NOT_FOUND there.
+        chain.doFilter(req, res);
+      } catch (ServiceMayNotContinueException e) {
+        sendError(req, res, SC_FORBIDDEN, e.getMessage());
+      } finally {
+        req.removeAttribute(ATTRIBUTE_REPOSITORY);
+      }
+    } catch (ServiceNotEnabledException e) {
+      sendError(req, res, SC_FORBIDDEN);
+    } catch (ServiceNotAuthorizedException e) {
+      res.sendError(SC_UNAUTHORIZED);
+    }
+  }
+}
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
index 390a271..9792270 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -18,6 +18,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
+import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
 
 import com.google.common.base.Strings;
 
@@ -152,7 +153,7 @@
     String path = getRegexGroup(req, 3);
 
     if (command.isEmpty()) {
-      return parseNoCommand(repoName);
+      return parseNoCommand(req, repoName);
     } else if (command.equals(CMD_ARCHIVE)) {
       return parseArchiveCommand(req, repoName, path);
     } else if (command.equals(CMD_AUTO)) {
@@ -176,7 +177,11 @@
     }
   }
 
-  private GitilesView.Builder parseNoCommand(String repoName) {
+  private GitilesView.Builder parseNoCommand(HttpServletRequest req,
+      String repoName) {
+    if (req.getAttribute(ATTRIBUTE_REPOSITORY) == null) {
+      return GitilesView.hostIndex().setRepositoryPrefix(repoName);
+    }
     return GitilesView.repositoryIndex().setRepositoryName(repoName);
   }
 
