diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index 16e682a..dfb3af3 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -2338,12 +2338,20 @@
         log.exiting("SiteAdaptor", "getAttachmentDocContent", true);
         return true;
       }
-      // TODO(ejona): Figure out a way to give a Not Found if the itemId is
-      // wrong. getContentItem() will throw an exception if the itemId does not
-      // exist.
+
       ItemData itemData = siteDataClient.getContentItem(listId, itemId);
       Xml xml = itemData.getXml();
       Element data = getFirstChildWithName(xml, DATA_ELEMENT);
+      String itemCount = data.getAttribute("ItemCount");
+      if ("0".equals(itemCount)) {
+        log.fine("Could not get parent list item as ItemCount is 0.");
+        log.exiting("SiteAdaptor", "getAttachmentDocContent", false);
+        // Returing false here instead of returing 404 to avoid wrongly
+        // identifying file documents as attachments when DocumentLibrary has
+        // folder name Attachments. Returing false here would allow code
+        // to see if this document was a regular file in DocumentLibrary.
+        return false;
+      }
       Element row = getChildrenWithName(data, ROW_ELEMENT).get(0);
       String scopeId
           = row.getAttribute(OWS_SCOPEID_ATTRIBUTE).split(";#", 2)[1];
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
index 210a391..682b0e8 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
@@ -1207,6 +1207,54 @@
         response.getDisplayUrl());
     assertEquals(new Date(1335910481000L), response.getLastModified());
   }
+  
+  @Test
+  public void testGetDocContentAttachmentDeletedParent() throws Exception {
+    SiteDataSoap siteData = MockSiteData.blank()
+        .register(SITES_SITECOLLECTION_S_CONTENT_EXCHANGE)
+        .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_URLSEG_EXCHANGE)
+        .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_L_CONTENT_EXCHANGE)
+        .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_2_LI_CONTENT_EXCHANGE
+            .replaceInContent("data ItemCount=\"1\"", "data ItemCount=\"0\""))
+        .register(new URLSegmentsExchange(
+            "http://localhost:1/sites/SiteCollection/Lists/Custom List"
+                + "/Attachments/2/1046000.pdf", false, null, null, null, null));
+
+    final String site = "http://localhost:1/sites/SiteCollection";
+    final String attachmentId = site 
+        + "/Lists/Custom List/Attachments/2/1046000.pdf";
+    adaptor = new SharePointAdaptor(initableSoapFactory,
+        new HttpClient() {
+      @Override
+      public FileInfo issueGetRequest(URL url,
+          List<String> authenticationCookies) {
+        throw new UnsupportedOperationException();
+      }
+
+      @Override
+      public String getRedirectLocation(URL url,
+          List<String> authenticationCookies) throws IOException {
+        assertEquals(
+            "http://localhost:1/sites/SiteCollection/Lists/Custom%20List",
+            url.toString());
+
+        return "http://localhost:1/sites/SiteCollection/Lists/Custom List"
+            + "/AllItems.aspx";
+      }
+    }, executorFactory, new MockAuthenticationClientFactoryForms());
+    adaptor.init(new MockAdaptorContext(config, pusher));
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    GetContentsRequest request = new GetContentsRequest(
+        new DocId(attachmentId));
+    GetContentsResponse response = new GetContentsResponse(baos);
+    adaptor.new SiteAdaptor("http://localhost:1/sites/SiteCollection",
+          "http://localhost:1/sites/SiteCollection", siteData,
+          new UnsupportedUserGroupSoap(), new UnsupportedPeopleSoap(),
+          new UnsupportedCallable<MemberIdMapping>(),
+          new UnsupportedCallable<MemberIdMapping>())
+        .getDocContent(request, response);
+    assertTrue(response.isNotFound());
+  }
 
   @Test
   public void testGetDocContentAttachmentSpecialMimeType() throws Exception {
