Index: solr/core/src/java/org/apache/solr/search/LuceneQueryOptimizer.java
===================================================================
--- solr/core/src/java/org/apache/solr/search/LuceneQueryOptimizer.java	(revision 1197111)
+++ solr/core/src/java/org/apache/solr/search/LuceneQueryOptimizer.java	(working copy)
@@ -55,7 +55,7 @@
   }
 
   public TopDocs optimize(BooleanQuery original,
-                          IndexSearcher searcher,
+                          SolrIndexSearcher searcher,
                           int numHits,
                           Query[] queryOut,
                           Filter[] filterOut
Index: solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
===================================================================
--- solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java	(revision 1197111)
+++ solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java	(working copy)
@@ -191,6 +191,13 @@
     return core;
   }
 
+  public final int maxDoc() {
+    return reader.maxDoc();
+  }
+  
+  public final int docFreq(Term term) throws IOException {
+    return reader.docFreq(term);
+  }
 
   /** Register sub-objects such as caches
    */
Index: modules/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java
===================================================================
--- modules/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java	(revision 1197111)
+++ modules/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java	(working copy)
@@ -470,7 +470,9 @@
     // obtainSearcher calls ensureOpen
     final IndexSearcher indexSearcher = obtainSearcher();
     try{
-      return indexSearcher.docFreq(new Term(F_WORD, word)) > 0;
+      // TODO: we should use ReaderUtil+seekExact, we dont care about the docFreq
+      // this is just an existence check
+      return indexSearcher.getIndexReader().docFreq(new Term(F_WORD, word)) > 0;
     } finally {
       releaseSearcher(indexSearcher);
     }
@@ -494,8 +496,9 @@
       IndexSearcher indexSearcher = obtainSearcher();
       final List<TermsEnum> termsEnums = new ArrayList<TermsEnum>();
 
-      if (searcher.maxDoc() > 0) {
-        new ReaderUtil.Gather(searcher.getIndexReader()) {
+      final IndexReader reader = searcher.getIndexReader();
+      if (reader.maxDoc() > 0) {
+        new ReaderUtil.Gather(reader) {
           @Override
           protected void add(int base, IndexReader r) throws IOException {
             Terms terms = r.terms(F_WORD);
Index: modules/facet/src/test/org/apache/lucene/facet/search/TestTopKInEachNodeResultHandler.java
===================================================================
--- modules/facet/src/test/org/apache/lucene/facet/search/TestTopKInEachNodeResultHandler.java	(revision 1197111)
+++ modules/facet/src/test/org/apache/lucene/facet/search/TestTopKInEachNodeResultHandler.java	(working copy)
@@ -109,7 +109,7 @@
       // Get all of the documents and run the query, then do different
       // facet counts and compare to control
       Query q = new TermQuery(new Term("content", "alpha"));
-      ScoredDocIdCollector scoredDoc = ScoredDocIdCollector.create(is.maxDoc(), true);
+      ScoredDocIdCollector scoredDoc = ScoredDocIdCollector.create(ir.maxDoc(), true);
 
       // Collector collector = new MultiCollector(scoredDoc);
       is.search(q, scoredDoc);
Index: modules/facet/src/test/org/apache/lucene/facet/search/sampling/BaseSampleTestTopK.java
===================================================================
--- modules/facet/src/test/org/apache/lucene/facet/search/sampling/BaseSampleTestTopK.java	(revision 1197111)
+++ modules/facet/src/test/org/apache/lucene/facet/search/sampling/BaseSampleTestTopK.java	(working copy)
@@ -61,7 +61,7 @@
         // Get all of the documents and run the query, then do different
         // facet counts and compare to control
         Query q = new TermQuery(new Term(CONTENT_FIELD, BETA)); // 90% of the docs
-        ScoredDocIdCollector docCollector = ScoredDocIdCollector.create(searcher.maxDoc(), false);
+        ScoredDocIdCollector docCollector = ScoredDocIdCollector.create(indexReader.maxDoc(), false);
         
         FacetSearchParams expectedSearchParams = searchParamsWithRequests(K, partitionSize); 
         FacetsCollector fc = new FacetsCollector(expectedSearchParams, indexReader, taxoReader);
Index: modules/grouping/src/test/org/apache/lucene/search/grouping/AllGroupHeadsCollectorTest.java
===================================================================
--- modules/grouping/src/test/org/apache/lucene/search/grouping/AllGroupHeadsCollectorTest.java	(revision 1197111)
+++ modules/grouping/src/test/org/apache/lucene/search/grouping/AllGroupHeadsCollectorTest.java	(working copy)
@@ -106,9 +106,10 @@
     doc.add(newField("id", "7", StringField.TYPE_STORED));
     w.addDocument(doc);
 
-    IndexSearcher indexSearcher = new IndexSearcher(w.getReader());
+    IndexReader reader = w.getReader();
+    IndexSearcher indexSearcher = new IndexSearcher(reader);
     w.close();
-    int maxDoc = indexSearcher.maxDoc();
+    int maxDoc = reader.maxDoc();
 
     Sort sortWithinGroup = new Sort(new SortField("id", SortField.Type.INT, true));
     AbstractAllGroupHeadsCollector c1 = createRandomCollector(groupField, sortWithinGroup);
Index: modules/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
===================================================================
--- modules/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java	(revision 1197111)
+++ modules/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java	(working copy)
@@ -950,7 +950,7 @@
               }
               
               if (searchIter == 14) {
-                for(int docIDX=0;docIDX<s.maxDoc();docIDX++) {
+                for(int docIDX=0;docIDX<s.getIndexReader().maxDoc();docIDX++) {
                   System.out.println("ID=" + docIDToID[docIDX] + " explain=" + s.explain(query, docIDX));
                 }
               }
Index: modules/queries/src/java/org/apache/lucene/queries/function/valuesource/DocFreqValueSource.java
===================================================================
--- modules/queries/src/java/org/apache/lucene/queries/function/valuesource/DocFreqValueSource.java	(revision 1197111)
+++ modules/queries/src/java/org/apache/lucene/queries/function/valuesource/DocFreqValueSource.java	(working copy)
@@ -148,7 +148,7 @@
   @Override
   public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     IndexSearcher searcher = (IndexSearcher)context.get("searcher");
-    int docfreq = searcher.docFreq(new Term(indexedField, indexedBytes));
+    int docfreq = searcher.getIndexReader().docFreq(new Term(indexedField, indexedBytes));
     return new ConstIntDocValues(docfreq, this);
   }
 
Index: modules/queries/src/java/org/apache/lucene/queries/function/valuesource/MaxDocValueSource.java
===================================================================
--- modules/queries/src/java/org/apache/lucene/queries/function/valuesource/MaxDocValueSource.java	(revision 1197111)
+++ modules/queries/src/java/org/apache/lucene/queries/function/valuesource/MaxDocValueSource.java	(working copy)
@@ -42,7 +42,7 @@
   @Override
   public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     IndexSearcher searcher = (IndexSearcher)context.get("searcher");
-    return new ConstIntDocValues(searcher.maxDoc(), this);
+    return new ConstIntDocValues(searcher.getIndexReader().maxDoc(), this);
   }
 
   @Override
Index: modules/queries/src/java/org/apache/lucene/queries/function/valuesource/IDFValueSource.java
===================================================================
--- modules/queries/src/java/org/apache/lucene/queries/function/valuesource/IDFValueSource.java	(revision 1197111)
+++ modules/queries/src/java/org/apache/lucene/queries/function/valuesource/IDFValueSource.java	(working copy)
@@ -46,8 +46,8 @@
     if (!(sim instanceof TFIDFSimilarity)) {
       throw new UnsupportedOperationException("requires a TFIDFSimilarity (such as DefaultSimilarity)");
     }
-    int docfreq = searcher.docFreq(new Term(indexedField, indexedBytes));
-    float idf = ((TFIDFSimilarity)sim).idf(docfreq, searcher.maxDoc());
+    int docfreq = searcher.getIndexReader().docFreq(new Term(indexedField, indexedBytes));
+    float idf = ((TFIDFSimilarity)sim).idf(docfreq, searcher.getIndexReader().maxDoc());
     return new ConstDoubleDocValues(idf, this);
   }
 }
Index: lucene/src/test/org/apache/lucene/search/TestSubScorerFreqs.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/TestSubScorerFreqs.java	(revision 1197111)
+++ lucene/src/test/org/apache/lucene/search/TestSubScorerFreqs.java	(working copy)
@@ -134,7 +134,7 @@
     CountingCollector c = new CountingCollector(TopScoreDocCollector.create(10,
         true));
     s.search(q, null, c);
-    final int maxDocs = s.maxDoc();
+    final int maxDocs = s.getIndexReader().maxDoc();
     assertEquals(maxDocs, c.docCounts.size());
     for (int i = 0; i < maxDocs; i++) {
       Map<Query, Float> doc0 = c.docCounts.get(i);
@@ -171,7 +171,7 @@
       CountingCollector c = new CountingCollector(TopScoreDocCollector.create(
           10, true), occur);
       s.search(query, null, c);
-      final int maxDocs = s.maxDoc();
+      final int maxDocs = s.getIndexReader().maxDoc();
       assertEquals(maxDocs, c.docCounts.size());
       boolean includeOptional = occur.contains(Occur.SHOULD.toString());
       for (int i = 0; i < maxDocs; i++) {
@@ -201,7 +201,7 @@
     CountingCollector c = new CountingCollector(TopScoreDocCollector.create(10,
         true));
     s.search(q, null, c);
-    final int maxDocs = s.maxDoc();
+    final int maxDocs = s.getIndexReader().maxDoc();
     assertEquals(maxDocs, c.docCounts.size());
     for (int i = 0; i < maxDocs; i++) {
       Map<Query, Float> doc0 = c.docCounts.get(i);
Index: lucene/src/test/org/apache/lucene/search/TestSearchAfter.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/TestSearchAfter.java	(revision 1197111)
+++ lucene/src/test/org/apache/lucene/search/TestSearchAfter.java	(working copy)
@@ -73,8 +73,9 @@
   }
   
   void assertQuery(Query query, Filter filter) throws Exception {
-    TopDocs all = searcher.search(query, filter, searcher.maxDoc());
-    int pageSize = _TestUtil.nextInt(random, 1, searcher.maxDoc()*2);
+    int maxDoc = searcher.getIndexReader().maxDoc();
+    TopDocs all = searcher.search(query, filter, maxDoc);
+    int pageSize = _TestUtil.nextInt(random, 1, maxDoc*2);
     int pageStart = 0;
     ScoreDoc lastBottom = null;
     while (pageStart < all.totalHits) {
Index: lucene/src/test/org/apache/lucene/index/TestDeletionPolicy.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestDeletionPolicy.java	(revision 1197111)
+++ lucene/src/test/org/apache/lucene/index/TestDeletionPolicy.java	(working copy)
@@ -717,7 +717,7 @@
               expectedCount -= 17;
             }
           }
-          assertEquals("maxDoc=" + searcher.maxDoc() + " numDocs=" + searcher.getIndexReader().numDocs(), expectedCount, hits.length);
+          assertEquals("maxDoc=" + searcher.getIndexReader().maxDoc() + " numDocs=" + searcher.getIndexReader().numDocs(), expectedCount, hits.length);
           searcher.close();
           reader.close();
           if (i == N) {
Index: lucene/src/java/org/apache/lucene/search/similarities/BM25Similarity.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/similarities/BM25Similarity.java	(revision 1197111)
+++ lucene/src/java/org/apache/lucene/search/similarities/BM25Similarity.java	(working copy)
@@ -82,7 +82,7 @@
       return 1f;
     }
     long sumTotalTermFreq = terms.getSumTotalTermFreq();
-    long maxdoc = searcher.maxDoc();
+    long maxdoc = searcher.getIndexReader().maxDoc();
     return sumTotalTermFreq == -1 ? 1f : (float) (sumTotalTermFreq / (double) maxdoc);
   }
   
@@ -133,13 +133,13 @@
 
   public Explanation idfExplain(TermContext stats, final IndexSearcher searcher) throws IOException {
     final int df = stats.docFreq();
-    final int max = searcher.maxDoc();
+    final int max = searcher.getIndexReader().maxDoc();
     final float idf = idf(df, max);
     return new Explanation(idf, "idf(docFreq=" + df + ", maxDocs=" + max + ")");
   }
 
   public Explanation idfExplain(final TermContext stats[], IndexSearcher searcher) throws IOException {
-    final int max = searcher.maxDoc();
+    final int max = searcher.getIndexReader().maxDoc();
     float idf = 0.0f;
     final Explanation exp = new Explanation();
     exp.setDescription("idf(), sum of:");
Index: lucene/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java	(revision 1197111)
+++ lucene/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java	(working copy)
@@ -583,7 +583,7 @@
    */
   public Explanation idfExplain(TermContext stats, final IndexSearcher searcher) throws IOException {
     final int df = stats.docFreq();
-    final int max = searcher.maxDoc();
+    final int max = searcher.getIndexReader().maxDoc();
     final float idf = idf(df, max);
     return new Explanation(idf, "idf(docFreq=" + df + ", maxDocs=" + max + ")");
   }
@@ -603,7 +603,7 @@
    * @throws IOException
    */
   public Explanation idfExplain(final TermContext stats[], IndexSearcher searcher) throws IOException {
-    final int max = searcher.maxDoc();
+    final int max = searcher.getIndexReader().maxDoc();
     float idf = 0.0f;
     final Explanation exp = new Explanation();
     exp.setDescription("idf(), sum of:");
Index: lucene/src/java/org/apache/lucene/search/IndexSearcher.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/IndexSearcher.java	(revision 1197111)
+++ lucene/src/java/org/apache/lucene/search/IndexSearcher.java	(working copy)
@@ -211,36 +211,6 @@
     return reader;
   }
 
-  /** Expert: Returns one greater than the largest possible document number.
-   * 
-   * @see org.apache.lucene.index.IndexReader#maxDoc()
-   */
-  public int maxDoc() {
-    return reader.maxDoc();
-  }
-
-  /** Returns total docFreq for this term. */
-  public int docFreq(final Term term) throws IOException {
-    if (executor == null) {
-      return reader.docFreq(term);
-    } else {
-      final ExecutionHelper<Integer> runner = new ExecutionHelper<Integer>(executor);
-      for(int i = 0; i < leafContexts.length; i++) {
-        final IndexReader leaf = leafContexts[i].reader;
-        runner.submit(new Callable<Integer>() {
-            public Integer call() throws IOException {
-              return Integer.valueOf(leaf.docFreq(term));
-            }
-          });
-      }
-      int docFreq = 0;
-      for (Integer num : runner) {
-        docFreq += num.intValue();
-      }
-      return docFreq;
-    }
-  }
-
   /* Sugar for <code>.getIndexReader().document(docID)</code> */
   public Document doc(int docID) throws CorruptIndexException, IOException {
     return reader.document(docID);
Index: lucene/src/test-framework/org/apache/lucene/search/CheckHits.java
===================================================================
--- lucene/src/test-framework/org/apache/lucene/search/CheckHits.java	(revision 1197111)
+++ lucene/src/test-framework/org/apache/lucene/search/CheckHits.java	(working copy)
@@ -61,7 +61,7 @@
       ignore.add(Integer.valueOf(results[i]));
     }
     
-    int maxDoc = searcher.maxDoc();
+    int maxDoc = searcher.getIndexReader().maxDoc();
     for (int doc = 0; doc < maxDoc; doc++) {
       if (ignore.contains(Integer.valueOf(doc))) continue;
 
