Index: src/java/org/apache/lucene/search/FieldValueHitQueue.java
===================================================================
--- src/java/org/apache/lucene/search/FieldValueHitQueue.java	(revision 834707)
+++ src/java/org/apache/lucene/search/FieldValueHitQueue.java	(working copy)
@@ -36,20 +36,17 @@
  */
 public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueue.Entry> {
 
-  final static class Entry {
+  final static class Entry extends ScoreDoc {
     int slot;
-    int docID;
-    float score;
 
-    Entry(int slot, int docID, float score) {
+    Entry(int slot, int doc, float score) {
+      super(doc, score);
       this.slot = slot;
-      this.docID = docID;
-      this.score = score;
     }
     
     @Override
     public String toString() {
-      return "slot:" + slot + " docID:" + docID + " score=" + score;
+      return "slot:" + slot + " " + super.toString();
     }
   }
 
@@ -97,7 +94,7 @@
       }
 
       // avoid random sort order that could lead to duplicates (bug #31241):
-      return hitA.docID > hitB.docID;
+      return hitA.doc > hitB.doc;
     }
 
   }
@@ -139,7 +136,7 @@
       }
 
       // avoid random sort order that could lead to duplicates (bug #31241):
-      return hitA.docID > hitB.docID;
+      return hitA.doc > hitB.doc;
     }
     
   }
@@ -214,7 +211,7 @@
       fields[i] = comparators[i].value(entry.slot);
     }
     //if (maxscore > 1.0f) doc.score /= maxscore;   // normalize scores
-    return new FieldDoc(entry.docID, entry.score, fields);
+    return new FieldDoc(entry.doc, entry.score, fields);
   }
 
   /** Returns the SortFields being used by this hit queue. */
Index: src/java/org/apache/lucene/search/TopDocsCollector.java
===================================================================
--- src/java/org/apache/lucene/search/TopDocsCollector.java	(revision 834707)
+++ src/java/org/apache/lucene/search/TopDocsCollector.java	(working copy)
@@ -28,7 +28,7 @@
  * Extending classes can override {@link #topDocs(int, int)} and
  * {@link #getTotalHits()} in order to provide their own implementation.
  */
-public abstract class TopDocsCollector<T> extends Collector {
+public abstract class TopDocsCollector<T extends ScoreDoc> extends Collector {
 
   // This is used in case topDocs() is called with illegal parameters, or there
   // simply aren't (enough) results.
@@ -55,7 +55,7 @@
    */
   protected void populateResults(ScoreDoc[] results, int howMany) {
     for (int i = howMany - 1; i >= 0; i--) { 
-      results[i] = (ScoreDoc) pq.pop();
+      results[i] = pq.pop();
     }
   }
 
Index: src/java/org/apache/lucene/search/TopFieldCollector.java
===================================================================
--- src/java/org/apache/lucene/search/TopFieldCollector.java	(revision 834707)
+++ src/java/org/apache/lucene/search/TopFieldCollector.java	(working copy)
@@ -59,7 +59,7 @@
     
     final void updateBottom(int doc) {
       // bottom.score is already set to Float.NaN in add().
-      bottom.docID = docBase + doc;
+      bottom.doc = docBase + doc;
       bottom = pq.updateTop();
     }
 
@@ -122,7 +122,7 @@
       if (queueFull) {
         // Fastmatch: return if this hit is not competitive
         final int cmp = reverseMul * comparator.compareBottom(doc);
-        if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.docID)) {
+        if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
           return;
         }
         
@@ -164,7 +164,7 @@
     }
     
     final void updateBottom(int doc, float score) {
-      bottom.docID = docBase + doc;
+      bottom.doc = docBase + doc;
       bottom.score = score;
       bottom = pq.updateTop();
     }
@@ -230,7 +230,7 @@
       if (queueFull) {
         // Fastmatch: return if this hit is not competitive
         final int cmp = reverseMul * comparator.compareBottom(doc);
-        if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.docID)) {
+        if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
           return;
         }
         
@@ -280,7 +280,7 @@
     }
     
     final void updateBottom(int doc, float score) {
-      bottom.docID = docBase + doc;
+      bottom.doc = docBase + doc;
       bottom.score = score;
       bottom =  pq.updateTop();
     }
@@ -347,7 +347,7 @@
       if (queueFull) {
         // Fastmatch: return if this hit is not competitive
         final int cmp = reverseMul * comparator.compareBottom(doc);
-        if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.docID)) {
+        if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
           return;
         }
         
@@ -392,7 +392,7 @@
     
     final void updateBottom(int doc) {
       // bottom.score is already set to Float.NaN in add().
-      bottom.docID = docBase + doc;
+      bottom.doc = docBase + doc;
       bottom = pq.updateTop();
     }
 
@@ -488,7 +488,7 @@
             break;
           } else if (i == comparators.length - 1) {
             // This is the equals case.
-            if (doc + docBase > bottom.docID) {
+            if (doc + docBase > bottom.doc) {
               // Definitely not competitive
               return;
             }
@@ -545,7 +545,7 @@
     }
     
     final void updateBottom(int doc, float score) {
-      bottom.docID = docBase + doc;
+      bottom.doc = docBase + doc;
       bottom.score = score;
       bottom =  pq.updateTop();
     }
@@ -640,7 +640,7 @@
             break;
           } else if (i == comparators.length - 1) {
             // This is the equals case.
-            if (doc + docBase > bottom.docID) {
+            if (doc + docBase > bottom.doc) {
               // Definitely not competitive
               return;
             }
@@ -695,7 +695,7 @@
     }
     
     final void updateBottom(int doc, float score) {
-      bottom.docID = docBase + doc;
+      bottom.doc = docBase + doc;
       bottom.score = score;
       bottom = pq.updateTop();
     }
@@ -788,7 +788,7 @@
             break;
           } else if (i == comparators.length - 1) {
             // This is the equals case.
-            if (doc + docBase > bottom.docID) {
+            if (doc + docBase > bottom.doc) {
               // Definitely not competitive
               return;
             }
@@ -972,7 +972,7 @@
     } else {
       for (int i = howMany - 1; i >= 0; i--) {
         Entry entry = pq.pop();
-        results[i] = new FieldDoc(entry.docID, entry.score);
+        results[i] = new FieldDoc(entry.doc, entry.score);
       }
     }
   }
