Index: src/main/java/org/apache/jackrabbit/core/query/lucene/MultiScorer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/MultiScorer.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/MultiScorer.java	(working copy)
@@ -75,7 +75,6 @@
                 currentDoc = NO_MORE_DOCS;
             }
         }
-
         return currentDoc;
     }
 
@@ -94,6 +93,18 @@
         if (currentDoc == NO_MORE_DOCS) {
             return currentDoc;
         }
+        // optimize in the case of an advance to finish.
+        // see https://issues.apache.org/jira/browse/JCR-3091
+        if (target == NO_MORE_DOCS) {
+            // exhaust all the internal scorers
+            for (Scorer s : scorers) {
+                if (s.docID() != target) {
+                    s.advance(target);
+                }
+            }
+            currentDoc = NO_MORE_DOCS;
+            return currentDoc;
+        }
 
         currentScorer = scorerIndex(target);
         if (scorers[currentScorer].advance(target - starts[currentScorer]) != NO_MORE_DOCS) {
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/NotQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/NotQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/NotQuery.java	(working copy)
@@ -225,6 +225,14 @@
                 return docNo;
             }
 
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                contextScorer.advance(target);
+                docNo = NO_MORE_DOCS;
+                return docNo;
+            }
+
             if (contextNo != -1 && contextNo < target) {
                 int docId = contextScorer.advance(target);
                 contextNo = docId == NO_MORE_DOCS ? -1 : docId;
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/DerefQuery.java	(working copy)
@@ -288,6 +288,13 @@
                 return nextDoc;
             }
 
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                nextDoc = NO_MORE_DOCS;
+                return nextDoc;
+            }
+
             calculateChildren();
             nextDoc = hits.nextSetBit(target);
             if (nextDoc < 0) {
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllScorer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllScorer.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/MatchAllScorer.java	(working copy)
@@ -109,6 +109,13 @@
             return nextDoc;
         }
 
+        // optimize in the case of an advance to finish.
+        // see https://issues.apache.org/jira/browse/JCR-3091
+        if (target == NO_MORE_DOCS) {
+            nextDoc = NO_MORE_DOCS;
+            return nextDoc;
+        }
+
         nextDoc = target - 1;
         return nextDoc();
     }
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/ParentAxisQuery.java	(working copy)
@@ -301,7 +301,12 @@
             if (nextDoc == NO_MORE_DOCS) {
                 return nextDoc;
             }
-
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                nextDoc = NO_MORE_DOCS;
+                return nextDoc;
+            }
             calculateParent();
             nextDoc = hits.nextSetBit(target);
             if (nextDoc < 0) {
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/QueryHitsQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/QueryHitsQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/QueryHitsQuery.java	(working copy)
@@ -239,6 +239,12 @@
             if (currentDoc == NO_MORE_DOCS) {
                 return currentDoc;
             }
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                currentDoc = NO_MORE_DOCS;
+                return currentDoc;
+            }
 
             do {
                 if (nextDoc() == NO_MORE_DOCS) {
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/WildcardQuery.java	(working copy)
@@ -350,6 +350,12 @@
             if (nextDoc == NO_MORE_DOCS) {
                 return nextDoc;
             }
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                nextDoc = NO_MORE_DOCS;
+                return nextDoc;
+            }
 
             calculateHits();
             nextDoc = hits.nextSetBit(target);
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java	(working copy)
@@ -419,6 +419,14 @@
             if (nextDoc == NO_MORE_DOCS) {
                 return nextDoc;
             }
+            
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                hits.skipTo(target);
+                nextDoc = NO_MORE_DOCS;
+                return nextDoc;
+            }
 
             calculateChildren();
             nextDoc = hits.skipTo(target);
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/RangeQuery.java	(working copy)
@@ -387,6 +387,12 @@
             if (nextDoc == NO_MORE_DOCS) {
                 return nextDoc;
             }
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                nextDoc = NO_MORE_DOCS;
+                return nextDoc;
+            }
 
             calculateHits();
             nextDoc = hits.nextSetBit(target);
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/PredicateDerefQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/PredicateDerefQuery.java	(revision 1179226)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/PredicateDerefQuery.java	(working copy)
@@ -287,6 +287,12 @@
             if (nextDoc == NO_MORE_DOCS) {
                 return nextDoc;
             }
+            // optimize in the case of an advance to finish.
+            // see https://issues.apache.org/jira/browse/JCR-3091
+            if (target == NO_MORE_DOCS) {
+                nextDoc = NO_MORE_DOCS;
+                return nextDoc;
+            }
 
             calculateChildren();
             nextDoc = hits.nextSetBit(target);
