diff --git a/src/com/google/enterprise/adaptor/fs/FsAdaptor.java b/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
index 977f924..faa36f5 100644
--- a/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
+++ b/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
@@ -34,12 +34,14 @@
 import com.google.enterprise.adaptor.Response;
 import com.google.enterprise.adaptor.StartupException;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.nio.charset.Charset;
 import java.nio.file.AccessDeniedException;
+import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.attribute.AclFileAttributeView;
 import java.nio.file.attribute.BasicFileAttributes;
@@ -454,14 +456,6 @@
     DocId id = req.getDocId();
     Path doc = delegate.getPath(id.getUniqueId());
 
-    if (!isSupportedPath(doc)) {
-      log.log(Level.WARNING, "The path {0} is not a supported file type.", doc);
-      resp.respondNotFound();
-      return;
-    }
-
-    final boolean docIsDirectory = delegate.isDirectory(doc);
-
     if (!id.equals(delegate.newDocId(doc))) {
       log.log(Level.WARNING,
           "The {0} is not a valid id generated by the adaptor.", id);
@@ -475,18 +469,38 @@
     }
 
     // Populate the document metadata.
-    BasicFileAttributes attrs = delegate.readBasicAttributes(doc);
+    BasicFileAttributes attrs;
+    try {
+      attrs = delegate.readBasicAttributes(doc);
+    } catch (FileNotFoundException e) {
+      log.log(Level.INFO, "Not found: {0}", doc);
+      resp.respondNotFound();
+      return;
+    } catch (NoSuchFileException e) {
+      log.log(Level.INFO, "Not found: {0}", doc);
+      resp.respondNotFound();
+      return;
+    }      
+
+    if (!isFileOrFolder(doc)) {
+      log.log(Level.INFO, "The path {0} is not a regular file or directory.",
+              doc);
+      resp.respondNotFound();
+      return;
+    }
+
+    final boolean docIsDirectory = attrs.isDirectory();
     final FileTime lastAccessTime = attrs.lastAccessTime();
 
     if (!docIsDirectory) {
       if (lastAccessTimeFilter.excluded(lastAccessTime)) {
-        log.log(Level.WARNING, "Skipping {0} because it was last accessed {1}.",
+        log.log(Level.FINE, "Skipping {0} because it was last accessed {1}.",
             new Object[] {doc, lastAccessTime.toString().substring(0, 10)});
         resp.respondNotFound();
         return;
       }
       if (lastModifiedTimeFilter.excluded(attrs.lastModifiedTime())) {
-        log.log(Level.WARNING, "Skipping {0} because it was last modified {1}.",
+        log.log(Level.FINE, "Skipping {0} because it was last modified {1}.",
             new Object[] {doc, 
                 attrs.lastModifiedTime().toString().substring(0, 10)});
         resp.respondNotFound();
@@ -587,7 +601,7 @@
       HtmlResponseWriter writer = createHtmlResponseWriter(resp);
       writer.start(id, getFileName(doc));
       for (Path file : delegate.newDirectoryStream(doc)) {
-        if (isSupportedPath(file)) {
+        if (isFileOrFolder(file)) {
           writer.addLink(delegate.newDocId(file), getFileName(file));
         }
       }
@@ -631,8 +645,12 @@
     return name.isEmpty() ? file.getRoot().toString() : name;
   }
 
+  /**
+   * Returns true if the path is a regular file or a folder;
+   * false if the path is a link, a special file, or doesn't exist.
+   */
   @VisibleForTesting
-  boolean isSupportedPath(Path p) throws IOException {
+  boolean isFileOrFolder(Path p) throws IOException {
     return delegate.isRegularFile(p) || delegate.isDirectory(p);
   }
 
diff --git a/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java b/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java
index c756af8..6a5b25f 100644
--- a/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java
@@ -202,13 +202,13 @@
   }
 
   @Test
-  public void testIsSupportedPath() throws Exception {
+  public void testIsFileOrFolder() throws Exception {
     root.addChildren(new MockFile("foo"), new MockFile("bar", true),
                      new MockFile("link").setIsRegularFile(false));
-    assertTrue(adaptor.isSupportedPath(rootPath));
-    assertTrue(adaptor.isSupportedPath(getPath("foo")));
-    assertTrue(adaptor.isSupportedPath(getPath("bar")));
-    assertFalse(adaptor.isSupportedPath(getPath("link")));
+    assertTrue(adaptor.isFileOrFolder(rootPath));
+    assertTrue(adaptor.isFileOrFolder(getPath("foo")));
+    assertTrue(adaptor.isFileOrFolder(getPath("bar")));
+    assertFalse(adaptor.isFileOrFolder(getPath("link")));
   }
 
   @Test
@@ -321,13 +321,6 @@
     assertTrue(response.notFound);
   }
 
-  /*
-   * This test was invalidated when the check for isSupportedPath()
-   * was moved above the check for bad DocIds in the beginning of
-   * FsAdaptor.getDocumentContent().  This test still passes, but
-   * the notFound response is coming from the earlier check for
-   * isSupportedPath(), not from the bad DocId.
-   */
   @Test
   public void testGetDocContentBadDocId() throws Exception {
     root.addChildren(new MockFile("badfile"));
@@ -339,6 +332,15 @@
   }
 
   @Test
+  public void testGetDocContentFileNotFound() throws Exception {
+    adaptor.init(context);
+    MockResponse response = new MockResponse();
+    // The requested DocId is missing the root component of the path.
+    adaptor.getDocContent(new MockRequest(getDocId("non-existent")), response);
+    assertTrue(response.notFound);
+  }
+
+  @Test
   public void testGetDocContentHiddenFile() throws Exception {
     root.addChildren(new MockFile("hidden.txt").setIsHidden(true));
     adaptor.init(context);
diff --git a/test/com/google/enterprise/adaptor/fs/NioFileDelegateTest.java b/test/com/google/enterprise/adaptor/fs/NioFileDelegateTest.java
index 761fdd9..ee79e96 100644
--- a/test/com/google/enterprise/adaptor/fs/NioFileDelegateTest.java
+++ b/test/com/google/enterprise/adaptor/fs/NioFileDelegateTest.java
@@ -30,6 +30,7 @@
 import java.io.InputStreamReader;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.attribute.AclFileAttributeView;
@@ -43,6 +44,9 @@
   private FileDelegate delegate = new TestNioFileDelegate();
 
   @Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Rule
   public TemporaryFolder temp = new TemporaryFolder();
 
   private Path newTempDir(String name) throws IOException {
@@ -131,6 +135,13 @@
   }
 
   @Test
+  public void testReadBasicAttributesFileNotFound() throws Exception {
+    Path file = Paths.get(temp.getRoot().toString(), "notFound");
+    thrown.expect(NoSuchFileException.class);
+    BasicFileAttributes attrs = delegate.readBasicAttributes(file);
+  }
+
+  @Test
   public void testProbeContentType() throws Exception {
     TestHelper.assumeOsIsNotMac();
     String content = "<html><title>Foo</title><body>Bar</body></html>";
