diff --git a/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java b/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java
index 5911074..e728713 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java
@@ -14,6 +14,7 @@
 
 package com.ericsson.gerrit.plugins.goimport;
 
+import com.google.common.base.Strings;
 import com.google.gerrit.httpd.AllRequestFilter;
 import com.google.gerrit.httpd.HtmlDomUtil;
 import com.google.gerrit.reviewdb.client.Project;
@@ -27,6 +28,8 @@
 import java.io.OutputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
@@ -88,9 +91,7 @@
       HttpServletRequest req = (HttpServletRequest) request;
       HttpServletResponse rsp = (HttpServletResponse) response;
       String servletPath = req.getServletPath();
-      String goGet = req.getParameter("go-get");
-      if ("1".equals(goGet)) {
-        String projectName = getProjectName(servletPath);
+      if ("1".equals(req.getParameter("go-get"))) {
         // Because Gerrit allows for arbitrary-depth project names
         // (that is, both "a" and "a/b/c" are both legal), we are going
         // to find the most specific such project that matches the path.
@@ -103,34 +104,19 @@
         // 3. If the requested path is "a/c", then project "a" would be chosen.
         // 4. If the requested path is "a/b/c/d", then project "a/b" would be chosen.
         // 5. If the requested path is "x/y/z", then this will fail with a 404 error.
-        String[] pathParts = projectName.split("/");
-
-        byte[] tosend = PAGE_404.getBytes();
+        String existent = getLongestMatch(getProjectName(servletPath));
+        byte[] toSend = PAGE_404.getBytes();
         rsp.setStatus(404);
-        // Start with the longest-length project name first.
-        for (int length = pathParts.length; length > 0; length--) {
-          // Create a new project name of the specified length; each time that we
-          // go through this loop, the project name will become shorter and shorter.
-          projectName = "";
-          for (int i = 0; i < length; i++) {
-            if (i > 0) {
-              projectName += "/";
-            }
-            projectName += pathParts[i];
-          }
-
-          if (projectExists(projectName)) {
-            tosend = PAGE_200.replace("${content}", getContent(projectName)).getBytes();
-            rsp.setStatus(200);
-            break;
-          }
+        if (!Strings.isNullOrEmpty(existent)) {
+          toSend = PAGE_200.replace("${content}", getContent(existent)).getBytes();
+          rsp.setStatus(200);
         }
         CacheHeaders.setNotCacheable(rsp);
         rsp.setContentType("text/html");
         rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-        rsp.setContentLength(tosend.length);
+        rsp.setContentLength(toSend.length);
         try (OutputStream out = rsp.getOutputStream()) {
-          out.write(tosend);
+          out.write(toSend);
         }
       } else {
         chain.doFilter(request, response);
@@ -140,6 +126,21 @@
     }
   }
 
+  private String getLongestMatch(String projectName) {
+    Path projectPath = Paths.get(projectName);
+    while (projectPath.getNameCount() >= 1) {
+      String asString = projectPath.toString();
+      if (projectExists(asString)) {
+        return asString;
+      }
+      projectPath = projectPath.getParent();
+      if (projectPath == null) {
+        break;
+      }
+    }
+    return null;
+  }
+
   private String getProjectName(String servletPath) {
     return servletPath.replaceFirst("/", "");
   }
