Index: lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java
===================================================================
--- lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java	(revision 1361970)
+++ lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java	(working copy)
@@ -223,47 +223,10 @@
     }
 
     public int nextDoc() throws IOException {
-      if (docsEnum != null) {
-        int docId;
-        do {
-          docId = docsEnum.nextDoc();
-          if (docId == DocIdSetIterator.NO_MORE_DOCS) {
-            break;
-          }
-        } while (alreadyEmittedDocs.get(docId));
-        if (docId == DocIdSetIterator.NO_MORE_DOCS) {
-          docsEnum = null;
-        } else {
-          alreadyEmittedDocs.set(docId);
-          return docId;
-        }
-      }
-
       for (;;) {
-        do {
-          if (upto == terms.size()) {
-            return DocIdSetIterator.NO_MORE_DOCS;
-          }
-
-          scoreUpto = upto;
-          TermsEnum.SeekStatus status = termsEnum.seekCeil(terms.get(ords[upto++], spare), true);
-          if (status == TermsEnum.SeekStatus.FOUND) {
-            docsEnum = reuse = termsEnum.docs(acceptDocs, reuse, false);
-          }
-        } while (docsEnum == null);
-
-        int docId;
-        do {
-          docId = docsEnum.nextDoc();
-          if (docId == DocIdSetIterator.NO_MORE_DOCS) {
-            break;
-          }
-        } while (alreadyEmittedDocs.get(docId));
-        if (docId == DocIdSetIterator.NO_MORE_DOCS) {
-          docsEnum = null;
-        } else {
-          alreadyEmittedDocs.set(docId);
-          return docId;
+        int doc = super.nextDoc();
+        if (doc == DocIdSetIterator.NO_MORE_DOCS || !alreadyEmittedDocs.getAndSet(doc)) {
+          return doc;
         }
       }
     }
