diff --git a/src/com/google/enterprise/adaptor/AsyncDocIdSender.java b/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
index ce59de9..384f889 100644
--- a/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
+++ b/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
@@ -32,7 +32,7 @@
   private final int maxBatchSize;
   private final long maxLatency;
   private final TimeUnit maxLatencyUnit;
-  private final BlockingQueue<DocIdPusher.Item> queue;
+  private final BlockingQueue<DocIdSender.Item> queue;
   private final Runnable worker = new WorkerRunnable();
 
   /**
@@ -54,7 +54,7 @@
     this.maxBatchSize = maxBatchSize;
     this.maxLatency = maxLatency;
     this.maxLatencyUnit = maxLatencyUnit;
-    this.queue = new ArrayBlockingQueue<DocIdPusher.Item>(queueCapacity);
+    this.queue = new ArrayBlockingQueue<DocIdSender.Item>(queueCapacity);
   }
 
   /**
@@ -62,7 +62,7 @@
    * item will be dropped and a warning will be logged.
    */
   @Override
-  public void asyncPushItem(final DocIdPusher.Item item) {
+  public void asyncPushItem(final DocIdSender.Item item) {
     if (!queue.offer(item)) {
       log.log(Level.WARNING, "Failed to queue item: {0}", item);
     }
@@ -90,7 +90,7 @@
   private class WorkerRunnable implements Runnable {
     @Override
     public void run() {
-      Set<DocIdPusher.Item> items = new LinkedHashSet<DocIdPusher.Item>();
+      Set<DocIdSender.Item> items = new LinkedHashSet<DocIdSender.Item>();
       try {
         while (true) {
           BlockingQueueBatcher.take(
@@ -128,7 +128,7 @@
      * @returns {@code null} for success, or the first item that failed if not
      *     all items were sent
      */
-    public <T extends DocIdPusher.Item> T pushItems(Iterator<T> items,
+    public <T extends DocIdSender.Item> T pushItems(Iterator<T> items,
         ExceptionHandler handler) throws InterruptedException;
   }
 }
diff --git a/src/com/google/enterprise/adaptor/DocIdPusher.java b/src/com/google/enterprise/adaptor/DocIdPusher.java
index 3df413d..2816983 100644
--- a/src/com/google/enterprise/adaptor/DocIdPusher.java
+++ b/src/com/google/enterprise/adaptor/DocIdPusher.java
@@ -169,13 +169,10 @@
       boolean caseSensitive, ExceptionHandler handler)
       throws InterruptedException;
 
-  /** Marker interface for an item that can exist in a feed. */
-  interface Item {}
-
   /**
    * Immutable feed attributes for a document identified by its {@code DocId}.
    */
-  public static final class Record implements Item {
+  public static final class Record implements DocIdSender.Item {
     private final DocId id;
     private final boolean delete;
     private final Date lastModified;
diff --git a/src/com/google/enterprise/adaptor/DocIdSender.java b/src/com/google/enterprise/adaptor/DocIdSender.java
index bf1414f..d1b3740 100644
--- a/src/com/google/enterprise/adaptor/DocIdSender.java
+++ b/src/com/google/enterprise/adaptor/DocIdSender.java
@@ -359,6 +359,9 @@
     return success ? null : items.get(0);
   }
 
+  /** Marker interface for an item that can exist in a feed. */
+  interface Item {}
+
   /**
    * Represents the ACL tag sent in feeds.
    */
diff --git a/src/com/google/enterprise/adaptor/DocumentHandler.java b/src/com/google/enterprise/adaptor/DocumentHandler.java
index b323d43..f72fb8e 100644
--- a/src/com/google/enterprise/adaptor/DocumentHandler.java
+++ b/src/com/google/enterprise/adaptor/DocumentHandler.java
@@ -1026,6 +1026,6 @@
   }
 
   interface AsyncPusher {
-    public void asyncPushItem(DocIdPusher.Item item);
+    public void asyncPushItem(DocIdSender.Item item);
   }
 }
diff --git a/src/com/google/enterprise/adaptor/GsaFeedFileMaker.java b/src/com/google/enterprise/adaptor/GsaFeedFileMaker.java
index 439dc60..52bfe01 100644
--- a/src/com/google/enterprise/adaptor/GsaFeedFileMaker.java
+++ b/src/com/google/enterprise/adaptor/GsaFeedFileMaker.java
@@ -204,10 +204,10 @@
   /** Adds all the DocIds into feed-file-document one record
     at a time. */
   private void constructMetadataAndUrlFeedFileBody(Document doc,
-      Element root, List<? extends DocIdPusher.Item> items) {
+      Element root, List<? extends DocIdSender.Item> items) {
     Element group = doc.createElement("group");
     root.appendChild(group);
-    for (DocIdPusher.Item item : items) {
+    for (DocIdSender.Item item : items) {
       if (item instanceof DocIdPusher.Record) {
         constructSingleMetadataAndUrlFeedFileRecord(doc, group,
                                                     (DocIdPusher.Record) item);
@@ -223,7 +223,7 @@
 
   /** Puts all DocId into metadata-and-url GSA feed file. */
   private void constructMetadataAndUrlFeedFile(Document doc,
-      String srcName, List<? extends DocIdPusher.Item> items) {
+      String srcName, List<? extends DocIdSender.Item> items) {
     Element root = doc.createElement("gsafeed");
     doc.appendChild(root);
     constructMetadataAndUrlFeedFileHead(doc, root, srcName);
@@ -252,7 +252,7 @@
      provided DocIds and source name.  Is used by
      GsaCommunicationHandler.pushDocIds(). */
   public String makeMetadataAndUrlXml(String srcName,
-      List<? extends DocIdPusher.Item> items) {
+      List<? extends DocIdSender.Item> items) {
     try {
       DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
       DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
diff --git a/src/com/google/enterprise/adaptor/Journal.java b/src/com/google/enterprise/adaptor/Journal.java
index df98adc..b9e6e52 100644
--- a/src/com/google/enterprise/adaptor/Journal.java
+++ b/src/com/google/enterprise/adaptor/Journal.java
@@ -107,7 +107,7 @@
     }
   }
 
-  synchronized void recordDocIdPush(List<? extends DocIdPusher.Item> pushed) {
+  synchronized void recordDocIdPush(List<? extends DocIdSender.Item> pushed) {
     for (Object item : pushed) {
       if (item instanceof DocIdPusher.Record) {
         DocIdPusher.Record record = (DocIdPusher.Record) item;
diff --git a/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java b/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java
index 445961d..e15044a 100644
--- a/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java
+++ b/test/com/google/enterprise/adaptor/AsyncDocIdSenderTest.java
@@ -150,7 +150,7 @@
   }
 
   private void verifyPushedItems(AsyncDocIdSender sender,
-      List<? extends DocIdPusher.Item> expected) throws Exception {
+      List<? extends DocIdSender.Item> expected) throws Exception {
     final Runnable worker = sender.worker();
     Thread workerThread = new Thread(new Runnable() {
       @Override
@@ -166,11 +166,11 @@
 
   private static class AccumulatingPusher
       implements AsyncDocIdSender.ItemPusher {
-    private final List<DocIdPusher.Item> items
-        = new LinkedList<DocIdPusher.Item>();
+    private final List<DocIdSender.Item> items
+        = new LinkedList<DocIdSender.Item>();
 
     @Override
-    public <T extends DocIdPusher.Item> T pushItems(Iterator<T> items,
+    public <T extends DocIdSender.Item> T pushItems(Iterator<T> items,
         ExceptionHandler handler) throws InterruptedException {
       while (items.hasNext()) {
         this.items.add(items.next());
@@ -178,7 +178,7 @@
       return null;
     }
 
-    public List<DocIdPusher.Item> getItems() {
+    public List<DocIdSender.Item> getItems() {
       return items;
     }
   }
diff --git a/test/com/google/enterprise/adaptor/DocIdSenderTest.java b/test/com/google/enterprise/adaptor/DocIdSenderTest.java
index c7af4b7..75f49dd 100644
--- a/test/com/google/enterprise/adaptor/DocIdSenderTest.java
+++ b/test/com/google/enterprise/adaptor/DocIdSenderTest.java
@@ -318,8 +318,8 @@
 
   private static class MockGsaFeedFileMaker extends GsaFeedFileMaker {
     List<String> names = new ArrayList<String>();
-    List<List<? extends DocIdPusher.Item>> recordses
-        = new ArrayList<List<? extends DocIdPusher.Item>>();
+    List<List<? extends DocIdSender.Item>> recordses
+        = new ArrayList<List<? extends DocIdSender.Item>>();
     // Don't use generics because of limitations in Java
     List<Object> groupses = new ArrayList<Object>();
     int i;
@@ -330,7 +330,7 @@
 
     @Override
     public String makeMetadataAndUrlXml(String name,
-        List<? extends DocIdPusher.Item> items) {
+        List<? extends DocIdSender.Item> items) {
       names.add(name);
       recordses.add(items);
       return "" + i++;
diff --git a/test/com/google/enterprise/adaptor/DocumentHandlerTest.java b/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
index def1a80..d7f6273 100644
--- a/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
+++ b/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
@@ -1165,7 +1165,7 @@
     };
     DocumentHandler.AsyncPusher pusher = new DocumentHandler.AsyncPusher() {
       @Override
-      public void asyncPushItem(DocIdPusher.Item item) {
+      public void asyncPushItem(DocIdSender.Item item) {
         assertTrue(item instanceof DocIdPusher.Record);
         DocIdPusher.Record record = (DocIdPusher.Record) item;
         assertEquals(URI.create("http://example.com"), record.getResultLink());
@@ -1205,7 +1205,7 @@
         .build());
     handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void asyncPushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdSender.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1229,7 +1229,7 @@
         .build());
     handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void asyncPushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdSender.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1252,7 +1252,7 @@
         .build());
     handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void asyncPushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdSender.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1275,7 +1275,7 @@
         .build());
     handler = builder.setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void asyncPushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdSender.Item item) {
             assertTrue(item instanceof DocIdSender.AclItem);
             DocIdSender.AclItem aclItem = (DocIdSender.AclItem) item;
             assertEquals(defaultDocId, aclItem.getDocId());
@@ -1314,7 +1314,7 @@
         .setAdaptor(adaptor)
         .setPusher(new DocumentHandler.AsyncPusher() {
           @Override
-          public void asyncPushItem(DocIdPusher.Item item) {
+          public void asyncPushItem(DocIdSender.Item item) {
             fail("Should not have been called");
           }
         })
@@ -1355,7 +1355,7 @@
 
   private static class MockPusher implements DocumentHandler.AsyncPusher {
     @Override
-    public void asyncPushItem(DocIdPusher.Item item) {
+    public void asyncPushItem(DocIdSender.Item item) {
       fail("Should not have been called");
     }
   }
diff --git a/test/com/google/enterprise/adaptor/GsaFeedFileMakerTest.java b/test/com/google/enterprise/adaptor/GsaFeedFileMakerTest.java
index af1c209..79d63dc 100644
--- a/test/com/google/enterprise/adaptor/GsaFeedFileMakerTest.java
+++ b/test/com/google/enterprise/adaptor/GsaFeedFileMakerTest.java
@@ -234,7 +234,7 @@
 
   @Test
   public void testUnsupportedDocIdSenderItemMetadataAndUrl() {
-    class UnsupportedItem implements DocIdPusher.Item {};
+    class UnsupportedItem implements DocIdSender.Item {};
     List<UnsupportedItem> items = new ArrayList<UnsupportedItem>();
     items.add(new UnsupportedItem());
     thrown.expect(IllegalArgumentException.class);
diff --git a/test/com/google/enterprise/adaptor/JournalTest.java b/test/com/google/enterprise/adaptor/JournalTest.java
index 5d5a17b..8f449e2 100644
--- a/test/com/google/enterprise/adaptor/JournalTest.java
+++ b/test/com/google/enterprise/adaptor/JournalTest.java
@@ -59,7 +59,7 @@
 
   @Test
   public void testUnsupportedDocIdPush() {
-    class UnsupportedItem implements DocIdPusher.Item {};
+    class UnsupportedItem implements DocIdSender.Item {};
     Journal journal = new Journal(true, new MockTimeProvider());
     thrown.expect(IllegalArgumentException.class);
     journal.recordDocIdPush(Collections.singletonList(new UnsupportedItem()));
diff --git a/test/com/google/enterprise/adaptor/MockJournal.java b/test/com/google/enterprise/adaptor/MockJournal.java
index af7652d..b9569bd 100644
--- a/test/com/google/enterprise/adaptor/MockJournal.java
+++ b/test/com/google/enterprise/adaptor/MockJournal.java
@@ -26,7 +26,7 @@
   }
 
   @Override
-  void recordDocIdPush(List<? extends DocIdPusher.Item> pushed) {
+  void recordDocIdPush(List<? extends DocIdSender.Item> pushed) {
     throw new UnsupportedOperationException();
   }
 
