diff --git a/src/com/google/enterprise/adaptor/AsyncDocIdPusher.java b/src/com/google/enterprise/adaptor/AsyncDocIdPusher.java
index 5186cb8..8b310db 100644
--- a/src/com/google/enterprise/adaptor/AsyncDocIdPusher.java
+++ b/src/com/google/enterprise/adaptor/AsyncDocIdPusher.java
@@ -20,13 +20,6 @@
  */
 public interface AsyncDocIdPusher {
   /**
-   * Push a {@code Item} asynchronously to the GSA. The {@code Item} is
-   * enqueued and sent in the next batch to the GSA. If the queue is full,
-   * then the item will be dropped and a warning will be logged.
-   */
-  public void pushItem(DocIdPusher.Item item);
-
-  /**
    * Push a {@code DocId} asynchronously to the GSA. The {@code DocId} is
    * enqueued and sent in the next batch to the GSA. If the queue is full,
    * then the item will be dropped and a warning will be logged.
diff --git a/src/com/google/enterprise/adaptor/AsyncDocIdSender.java b/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
index 6f965e6..ce59de9 100644
--- a/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
+++ b/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
@@ -23,7 +23,8 @@
  * Asynchronous sender of feed items. {@code worker()} must be started by client
  * and running for items to be sent.
  */
-class AsyncDocIdSender implements AsyncDocIdPusher {
+class AsyncDocIdSender implements AsyncDocIdPusher,
+    DocumentHandler.AsyncPusher {
   private static final Logger log
       = Logger.getLogger(AsyncDocIdSender.class.getName());
 
@@ -56,8 +57,12 @@
     this.queue = new ArrayBlockingQueue<DocIdPusher.Item>(queueCapacity);
   }
 
+  /**
+   * Enqueue {@code item} to be sent by worker. If the queue is full, then the
+   * item will be dropped and a warning will be logged.
+   */
   @Override
-  public void pushItem(final DocIdPusher.Item item) {
+  public void asyncPushItem(final DocIdPusher.Item item) {
     if (!queue.offer(item)) {
       log.log(Level.WARNING, "Failed to queue item: {0}", item);
     }
@@ -65,17 +70,17 @@
 
   @Override
   public void pushDocId(DocId docId) {
-    pushItem(new DocIdPusher.Record.Builder(docId).build());
+    asyncPushItem(new DocIdPusher.Record.Builder(docId).build());
   }
 
   @Override
   public void pushRecord(DocIdPusher.Record record) {
-    pushItem(record);
+    asyncPushItem(record);
   }
 
   @Override
   public void pushNamedResource(DocId docId, Acl acl) {
-    pushItem(new DocIdSender.AclItem(docId, null, acl));
+    asyncPushItem(new DocIdSender.AclItem(docId, null, acl));
   }
 
   public Runnable worker() {
diff --git a/src/com/google/enterprise/adaptor/DocumentHandler.java b/src/com/google/enterprise/adaptor/DocumentHandler.java
index 6038426..b323d43 100644
--- a/src/com/google/enterprise/adaptor/DocumentHandler.java
+++ b/src/com/google/enterprise/adaptor/DocumentHandler.java
@@ -49,7 +49,7 @@
   private final Adaptor adaptor;
   private final AuthzAuthority authzAuthority;
   private final Watchdog watchdog;
-  private final AsyncDocIdPusher pusher;
+  private final AsyncPusher pusher;
   /**
    * List of Common Names of Subjects that are provided full access when in
    * secure mode. All entries should be lower case.
@@ -79,7 +79,7 @@
                          SamlServiceProvider samlServiceProvider,
                          TransformPipeline transform, AclTransform aclTransform,
                          boolean useCompression,
-                         Watchdog watchdog, AsyncDocIdPusher pusher,
+                         Watchdog watchdog, AsyncPusher pusher,
                          boolean sendDocControls, long headerTimeoutMillis,
                          long contentTimeoutMillis, String scoringType) {
     if (docIdDecoder == null || docIdEncoder == null || journal == null
@@ -807,7 +807,7 @@
           if (displayUrl != null || crawlOnce || lock) {
             // Emulate these crawl-time values by sending them in feeds
             // since they aren't supported at crawl-time on GSA 7.0.
-            pusher.pushItem(new DocIdPusher.Record.Builder(docId)
+            pusher.asyncPushItem(new DocIdPusher.Record.Builder(docId)
                 .setResultLink(displayUrl).setCrawlOnce(crawlOnce).setLock(lock)
                 .build());
             // TODO(ejona): figure out how to notice that a true went false
@@ -849,7 +849,7 @@
       HttpExchanges.startResponse(
           ex, HttpURLConnection.HTTP_OK, contentType, hasContent);
       for (Map.Entry<String, Acl> fragment : fragments.entrySet()) {
-        pusher.pushItem(new DocIdSender.AclItem(docId,
+        pusher.asyncPushItem(new DocIdSender.AclItem(docId,
             fragment.getKey(), fragment.getValue()));
       }
     }
@@ -886,7 +886,7 @@
         // CHILD_OVERRIDES and PARENT_OVERRIDES are fine as-is.
       }
       final String fragment = "generated";
-      pusher.pushItem(
+      pusher.asyncPushItem(
           new DocIdSender.AclItem(docId, fragment, namedResourceAcl.build()));
       return new Acl.Builder()
           .setInheritanceType(acl.getInheritanceType())
@@ -1024,4 +1024,8 @@
       buffer.write(b, off, len);
     }
   }
+
+  interface AsyncPusher {
+    public void asyncPushItem(DocIdPusher.Item item);
+  }
 }
diff --git a/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java b/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java
index 48b176b..445961d 100644
--- a/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java
+++ b/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java
@@ -64,11 +64,11 @@
         new DocIdPusher.Record.Builder(new DocId("2")).build(),
         new DocIdPusher.Record.Builder(new DocId("3")).build());
     for (DocIdPusher.Record record : golden) {
-      sender.pushItem(record);
+      sender.asyncPushItem(record);
     }
     // We shouldn't block while adding this item, even though the queue is full.
     // Instead, it should simply be dropped.
-    sender.pushItem(
+    sender.asyncPushItem(
         new DocIdPusher.Record.Builder(new DocId("4")).build());
     Thread workerThread = new Thread(sender.worker());
     workerThread.start();
@@ -85,7 +85,7 @@
         1, TimeUnit.SECONDS, 1 /* queueCapacity */);
     final List<DocIdPusher.Record> golden = Arrays.asList(
         new DocIdPusher.Record.Builder(new DocId("1")).build());
-    sender.pushItem(golden.get(0));
+    sender.asyncPushItem(golden.get(0));
     Thread workerThread = new Thread(sender.worker());
     workerThread.start();
     // We want to trigger the code that waits on maxLatency.
@@ -101,7 +101,7 @@
         1, TimeUnit.SECONDS, 1 /* queueCapacity */);
     final List<DocIdPusher.Record> golden = Arrays.asList(
         new DocIdPusher.Record.Builder(new DocId("1")).build());
-    sender.pushItem(golden.get(0));
+    sender.asyncPushItem(golden.get(0));
     final Runnable worker = sender.worker();
     Thread workerThread = new Thread(new Runnable() {
       @Override
diff --git a/test/com/google/enterprise/adaptor/DocumentHandlerTest.java b/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
index 31bd18e..def1a80 100644
--- a/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
+++ b/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
@@ -1163,9 +1163,9 @@
         response.getOutputStream();
       }
     };
-    AsyncDocIdPusher pusher = new MockPusher() {
+    DocumentHandler.AsyncPusher pusher = new DocumentHandler.AsyncPusher() {
       @Override
-      public void pushItem(DocIdPusher.Item item) {
+      public void asyncPushItem(DocIdPusher.Item item) {
         assertTrue(item instanceof DocIdPusher.Record);
         DocIdPusher.Record record = (DocIdPusher.Record) item;
         assertEquals(URI.create("http://example.com"), record.getResultLink());
@@ -1203,9 +1203,9 @@
         .setPermitUsers(Arrays.asList(
             new UserPrincipal("user2"), new UserPrincipal("user", "ns")))
         .build());
-    handler = builder.setPusher(new MockPusher() {
+    handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void pushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdPusher.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1227,9 +1227,9 @@
         .setDenyUsers(Arrays.asList(new UserPrincipal("user", "ns")))
         .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
         .build());
-    handler = builder.setPusher(new MockPusher() {
+    handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void pushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdPusher.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1250,9 +1250,9 @@
         .setPermitGroups(Arrays.asList(new GroupPrincipal("group", "ns")))
         .setInheritanceType(Acl.InheritanceType.CHILD_OVERRIDES)
         .build());
-    handler = builder.setPusher(new MockPusher() {
+    handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void pushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdPusher.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1273,9 +1273,9 @@
         .setDenyGroups(Arrays.asList(new GroupPrincipal("group", "ns")))
         .setInheritanceType(Acl.InheritanceType.CHILD_OVERRIDES)
         .build());
-    handler = builder.setPusher(new MockPusher() {
+    handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void pushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdPusher.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1312,7 +1312,12 @@
     };
     DocumentHandler handler = createHandlerBuilder()
         .setAdaptor(adaptor)
-        .setPusher(new MockPusher())
+        .setPusher(new DocumentHandler.AsyncPusher() {
+          @Override
+          public void asyncPushItem(DocIdPusher.Item item) {
+            fail("Should not have been called");
+          }
+        })
         .setFullAccessHosts(new String[] {remoteIp})
         .build();
     ex = new MockHttpExchange("GET", defaultPath, new MockHttpContext("/"));
@@ -1348,21 +1353,9 @@
       }
     };
 
-  private static class MockPusher implements AsyncDocIdPusher {
+  private static class MockPusher implements DocumentHandler.AsyncPusher {
     @Override
-    public void pushItem(DocIdPusher.Item item) {
-      fail("Should not have been called");
-    }
-    @Override
-    public void pushDocId(DocId docId) {
-      fail("Should not have been called");
-    }
-    @Override
-    public void pushRecord(DocIdPusher.Record record) {
-      fail("Should not have been called");
-    }
-    @Override
-    public void pushNamedResource(DocId docId, Acl acl) {
+    public void asyncPushItem(DocIdPusher.Item item) {
       fail("Should not have been called");
     }
   }
@@ -1419,7 +1412,7 @@
     private boolean transformRequired;
     private boolean useCompression;
     private Watchdog watchdog;
-    private AsyncDocIdPusher pusher;
+    private DocumentHandler.AsyncPusher pusher;
     private boolean sendDocControls;
     private long headerTimeoutMillis = 30 * 1000;
     private long contentTimeoutMillis = 180 * 1000;
@@ -1488,7 +1481,7 @@
     }
 
     public DocumentHandlerBuilder setPusher(
-        AsyncDocIdPusher pusher) {
+        DocumentHandler.AsyncPusher pusher) {
       this.pusher = pusher;
       return this;
     }
