diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index c71092e..3ee29fd 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -1476,6 +1476,9 @@
         String webScopeId
             = w.getMetadata().getScopeID().toLowerCase(Locale.ENGLISH);
 
+        DocId rootFolderDocId
+            = encodeDocId(l.getMetadata().getRootFolder());
+
         Acl.Builder acl;
         if (scopeId.equals(webScopeId)) {
           acl = new Acl.Builder().setInheritFrom(new DocId(webUrl));
@@ -1485,11 +1488,23 @@
           acl = generateAcl(permissions, LIST_ITEM_MASK)
               .setInheritFrom(siteDocId, SITE_COLLECTION_ADMIN_FRAGMENT);
         }
-        response.setAcl(acl
+        response.setAcl(new Acl.Builder().setInheritFrom(rootFolderDocId)
             .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
             .build());
+        final Map<DocId, Acl> map = Collections.singletonMap(rootFolderDocId,
+            acl.setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
+            .build());
+        executor.execute(new Runnable() {
+          @Override public void run() {
+            try {
+              context.getDocIdPusher().pushNamedResources(map);
+            } catch (InterruptedException ie) {
+              log.log(Level.WARNING, "Error pushing named resource", ie);
+	    }
+          }
+        });
       }
-      
+
       response.addMetadata(METADATA_OBJECT_TYPE,
           ObjectType.LIST.value());
       response.addMetadata(METADATA_PARENT_WEB_TITLE,
@@ -1897,12 +1912,12 @@
         // doesn't have a leading '/'.
         DocId folderDocId = encodeDocId("/" + rawFileDirRef.split(";#")[1]);
         DocId rootFolderDocId = encodeDocId(l.rootFolder);
-        DocId listDocId = encodeDocId(l.defaultViewUrl);
-        // If the parent is the List, we must use the list's docId instead of
-        // folderDocId, since the root folder is a List and not actually a
-        // Folder.
-        boolean parentIsList = folderDocId.equals(rootFolderDocId);
-        DocId parentDocId = parentIsList ? listDocId : folderDocId;
+        // If the parent is a list, folderDocId will be same as 
+        // rootFolderDocId. If inheritance chain is not 
+        // broken, item will inherit its permission from list root folder.
+        // If parent is a folder, item will inherit its permissions from parent
+        // folder.
+        boolean parentIsList = folderDocId.equals(rootFolderDocId);      
         String parentScopeId;
         if (parentIsList) {
           com.microsoft.schemas.sharepoint.soap.List list
@@ -1938,7 +1953,7 @@
               .split(";#", 2)[1].toLowerCase(Locale.ENGLISH);
         }
         if (scopeId.equals(parentScopeId)) {
-          acl = new Acl.Builder().setInheritFrom(parentDocId);
+          acl = new Acl.Builder().setInheritFrom(folderDocId);
         } else {
           // We have to search for the correct scope within the scopes element.
           // The scope provided in the metadata is for the parent list, not for
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
index 586134b..95b1be8 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
@@ -24,6 +24,7 @@
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.Callables;
 import com.google.enterprise.adaptor.Acl;
 import com.google.enterprise.adaptor.Config;
@@ -794,6 +795,7 @@
 
     adaptor = new SharePointAdaptor(initableSoapFactory,
         new UnsupportedHttpClient(), executorFactory);
+    AccumulatingDocIdPusher pusher = new AccumulatingDocIdPusher();
     adaptor.init(new MockAdaptorContext(config, pusher));
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     GetContentsRequest request = new GetContentsRequest(
@@ -819,14 +821,23 @@
         + "</ul></body></html>";
     assertEquals(golden, responseString);
     assertEquals(new Acl.Builder()
-        .setEverythingCaseInsensitive()
-        .setInheritFrom(new DocId("http://localhost:1/sites/SiteCollection"),
-          "admin")
+        .setInheritFrom(new DocId(
+            "http://localhost:1/sites/SiteCollection/Lists/Custom List"))
         .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
-        .setPermitGroups(Arrays.asList(SITES_SITECOLLECTION_MEMBERS,
-            SITES_SITECOLLECTION_OWNERS, SITES_SITECOLLECTION_VISITORS))
         .build(),
         response.getAcl());
+    // Verify named resource for List Root Folder
+    assertEquals(ImmutableList.of(Collections.singletonMap(
+        new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List"),
+        new Acl.Builder()
+          .setEverythingCaseInsensitive()
+          .setInheritFrom(new DocId("http://localhost:1/sites/SiteCollection"),
+              "admin")
+          .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
+          .setPermitGroups(Arrays.asList(SITES_SITECOLLECTION_MEMBERS,
+              SITES_SITECOLLECTION_OWNERS, SITES_SITECOLLECTION_VISITORS))
+          .build())),
+        pusher.getNamedResources());
     assertEquals(URI.create("http://localhost:1/sites/SiteCollection/Lists/"
           + "Custom%20List/AllItems.aspx"), response.getDisplayUrl());
     assertEquals(new Date(1336166672000L), response.getLastModified());
@@ -1149,6 +1160,47 @@
   }
 
   @Test
+  public void testGetDocContentListItemWithListAsParent() throws Exception {
+    SiteDataSoap siteData = MockSiteData.blank()
+        .register(SITES_SITECOLLECTION_S_CONTENT_EXCHANGE)
+        .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_L_CONTENT_EXCHANGE)
+        .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_2_LI_CONTENT_EXCHANGE
+            .replaceInContent("ows_Attachments='1'", "ows_Attachments='0'")
+            .replaceInContent("Inside Folder", "Under List")
+            .replaceInContent("/Test Folder", "")
+            .replaceInContent("/Test%20Folder", "")
+            .replaceInContent(
+              "ows_ScopeId='2;#{2E29615C-59E7-493B-B08A-3642949CC069}'",
+              "ows_ScopeId='2;#{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}'"))
+        .register(new URLSegmentsExchange(
+            "http://localhost:1/sites/SiteCollection/Lists/Custom List/2_.000",
+          true, null, null, "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", "2"));
+    adaptor = new SharePointAdaptor(initableSoapFactory,
+        new UnsupportedHttpClient(), executorFactory);
+    adaptor.init(new MockAdaptorContext(config, pusher));
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    GetContentsRequest request = new GetContentsRequest(
+        new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List"
+          + "/2_.000"));
+    GetContentsResponse response = new GetContentsResponse(baos);
+    adaptor.new SiteAdaptor("http://localhost:1/sites/SiteCollection",
+          "http://localhost:1/sites/SiteCollection", siteData,
+          new UnsupportedUserGroupSoap(), new UnsupportedPeopleSoap(),
+          Callables.returning(SITES_SITECOLLECTION_MEMBER_MAPPING),
+          new UnsupportedCallable<MemberIdMapping>())
+        .getDocContent(request, response);
+    // just verify ACLs here
+    assertEquals(new Acl.Builder()
+        .setInheritFrom(new DocId("http://localhost:1/sites/SiteCollection/"
+            + "Lists/Custom List"))
+        .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES).build(),
+        response.getAcl());
+    assertEquals(URI.create("http://localhost:1/sites/SiteCollection/Lists/"
+          + "Custom%20List/DispForm.aspx?ID=2"),
+        response.getDisplayUrl());
+  }
+
+  @Test
   public void testGetDocContentListItemAnonymousAccess() throws Exception {
     SiteDataSoap siteData = MockSiteData.blank()
         .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_1_URLSEG_EXCHANGE)
@@ -1314,48 +1366,6 @@
         response.getNamedResources());
   }
 
-  public void testGetDocContentListItemScopeSameAsParent() throws Exception {
-    SiteDataSoap siteData = MockSiteData.blank()
-        .register(new URLSegmentsExchange(
-            "http://localhost:1/sites/SiteCollection/Lists/Custom List"
-              + "/Test Folder/2_.000",
-            true, null, null, "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", "2"))
-        .register(new ContentExchange(ObjectType.LIST_ITEM,
-              "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", null, "2", true, false,
-              null, loadTestString("tapasnay-Lists-Announcements-1-li.xml")))
-        .register(new ContentExchange(ObjectType.LIST,
-              "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", null, null, false,
-              false, null,
-              loadTestString("tapasnay-Lists-Announcements-l.xml")));
-    final MemberIdMapping memberIdMapping
-        = new MemberIdMappingBuilder()
-        .put(1, new UserPrincipal("SOMEHOST\\administrator", DEFAULT_NAMESPACE))
-        .build();
-
-    adaptor = new SharePointAdaptor(initableSoapFactory,
-        new UnsupportedHttpClient(), executorFactory);
-    adaptor.init(new MockAdaptorContext(config, pusher));
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    GetContentsRequest request = new GetContentsRequest(
-        new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List/"
-          + "Test Folder/2_.000"));
-    GetContentsResponse response = new GetContentsResponse(baos);
-    adaptor.new SiteAdaptor("http://localhost:1/sites/SiteCollection",
-        "http://localhost:1/sites/SiteCollection",
-        siteData, new UnsupportedUserGroupSoap(), new UnsupportedPeopleSoap(),
-        Callables.returning(memberIdMapping),
-        new UnsupportedCallable<MemberIdMapping>())
-        .getDocContent(request, response);
-    // It looks odd that nobody can access the document since there are no
-    // groups and users, but the policy permits GDC-PSL\administrator. Thus, the
-    // policy's PARENT_OVERRIDE behavior is important.
-    assertEquals(new Acl.Builder()
-        .setInheritFrom(new DocId(
-            "http://localhost:1/tapasnay/Lists/Announcements"))
-        .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES).build(),
-        response.getAcl());
-  }
-
   @Test
   public void testGetDocContentFolder() throws Exception {
     SiteDataSoap siteData = MockSiteData.blank()
