diff --git a/src/com/google/enterprise/adaptor/DocIdSender.java b/src/com/google/enterprise/adaptor/DocIdSender.java
index 05eafa4..9776094 100644
--- a/src/com/google/enterprise/adaptor/DocIdSender.java
+++ b/src/com/google/enterprise/adaptor/DocIdSender.java
@@ -142,6 +142,11 @@
   public DocId pushNamedResources(Map<DocId, Acl> resources,
                                   ExceptionHandler handler)
       throws InterruptedException {
+    if (config.markAllDocsAsPublic()) {
+      log.finest("Ignoring attempt to send ACLs to the GSA because "
+                 + "markAllDocsAsPublic is true.");
+      return null;
+    }
     List<AclItem> acls = new ArrayList<AclItem>(resources.size());
     for (Map.Entry<DocId, Acl> me : resources.entrySet()) {
       acls.add(new AclItem(me.getKey(), me.getValue()));
@@ -202,6 +207,11 @@
       Map<GroupPrincipal, ? extends Collection<Principal>> defs,
       boolean caseSensitive, ExceptionHandler handler) 
       throws InterruptedException {
+    if (config.markAllDocsAsPublic()) {
+      log.finest("Ignoring attempt to send groups to the GSA because "
+                 + "markAllDocsAsPublic is true.");
+      return null;
+    }
     return pushGroupDefinitionsInternal(defs, caseSensitive, handler);
   }
 
diff --git a/test/com/google/enterprise/adaptor/DocIdSenderTest.java b/test/com/google/enterprise/adaptor/DocIdSenderTest.java
index 81dec24..2f8aee0 100644
--- a/test/com/google/enterprise/adaptor/DocIdSenderTest.java
+++ b/test/com/google/enterprise/adaptor/DocIdSenderTest.java
@@ -275,7 +275,7 @@
     }
 
     config.setValue("feed.maxUrls", "2");
-    docIdSender.pushGroupDefinitions(groups, false, null);
+    assertNull(docIdSender.pushGroupDefinitions(groups, false, null));
 
     assertEquals(2, fileMaker.i);
     assertEquals(goldenGroups, fileMaker.groupses);
@@ -289,11 +289,59 @@
   }
 
   @Test
+  public void testPushGroupsAllDocsPublic() throws Exception {
+    // Order of iteration matters
+    Map<GroupPrincipal, Collection<Principal>> groups
+        = new TreeMap<GroupPrincipal, Collection<Principal>>();
+    groups.put(new GroupPrincipal("g1"),
+        Arrays.asList(new UserPrincipal("u1"), new GroupPrincipal("g2")));
+    groups.put(new GroupPrincipal("g2"),
+        Arrays.asList(new UserPrincipal("u2"), new GroupPrincipal("g3")));
+    groups.put(new GroupPrincipal("g3"),
+        Arrays.asList(new UserPrincipal("u3"), new GroupPrincipal("g4")));
+    groups = Collections.unmodifiableMap(groups);
+
+    config.setValue("adaptor.markAllDocsAsPublic", "true");
+    assertNull(docIdSender.pushGroupDefinitions(groups, false, null));
+
+    assertEquals(0, fileMaker.i);
+    assertTrue(fileMaker.groupses.isEmpty());
+    assertTrue(fileArchiver.failedFeeds.isEmpty());
+  }
+
+  @Test
   public void testNamedResources() throws Exception {
     config.setValue("feed.name", "testing");
     assertNull(docIdSender.pushNamedResources(
         Collections.singletonMap(new DocId("test"), Acl.EMPTY),
         new NeverRetryExceptionHandler()));
+    assertEquals(1, fileMaker.i);
+    assertEquals(Collections.singletonList(Collections.singletonList(
+        new DocIdSender.AclItem(new DocId("test"), Acl.EMPTY)
+    )), fileMaker.recordses);
+    assertEquals(Arrays.asList(new String[] {
+      "0"
+    }), fileSender.xmlStrings);
+    assertEquals(Arrays.asList(new String[] {
+      "0"
+    }), fileArchiver.feeds);
+    assertTrue(fileMaker.groupses.isEmpty());
+    assertTrue(fileArchiver.failedFeeds.isEmpty());
+  }
+
+  @Test
+  public void testNamedResourcesAllDocsPublic() throws Exception {
+    config.setValue("adaptor.markAllDocsAsPublic", "true");
+    config.setValue("feed.name", "testing");
+    assertNull(docIdSender.pushNamedResources(
+        Collections.singletonMap(new DocId("test"), Acl.EMPTY),
+        new NeverRetryExceptionHandler()));
+    assertEquals(0, fileMaker.i);
+    assertTrue(fileMaker.recordses.isEmpty());
+    assertTrue(fileMaker.groupses.isEmpty());
+    assertTrue(fileSender.xmlStrings.isEmpty());
+    assertTrue(fileArchiver.feeds.isEmpty());
+    assertTrue(fileArchiver.failedFeeds.isEmpty());
   }
 
   @Test
