Index: src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- src/java/org/apache/lucene/index/IndexWriter.java	(revision 834721)
+++ src/java/org/apache/lucene/index/IndexWriter.java	(working copy)
@@ -17,31 +17,35 @@
  * limitations under the License.
  */
 
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.DocumentsWriter.IndexingChain;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Scorer;
 import org.apache.lucene.search.Similarity;
-import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.store.AlreadyClosedException;
+import org.apache.lucene.store.BufferedIndexInput;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.Lock;
 import org.apache.lucene.store.LockObtainFailedException;
-import org.apache.lucene.store.AlreadyClosedException;
-import org.apache.lucene.store.BufferedIndexInput;
 import org.apache.lucene.util.Constants;
 
-import java.io.IOException;
-import java.io.Closeable;
-import java.io.PrintStream;
-import java.util.List;
-import java.util.Collection;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Iterator;
-import java.util.Map;
-
 /**
   An <code>IndexWriter</code> creates and maintains an index.
 
@@ -1957,14 +1961,73 @@
   public void deleteDocuments(Term term) throws CorruptIndexException, IOException {
     ensureOpen();
     try {
-      boolean doFlush = docWriter.bufferDeleteTerm(term);
-      if (doFlush)
-        flush(true, false, false);
+      if (poolReaders) {
+        deleteTermsLive(term);
+      } else {
+        boolean doFlush = docWriter.bufferDeleteTerm(term);
+        if (doFlush)
+          flush(true, false, false);
+      }
     } catch (OutOfMemoryError oom) {
       handleOOM(oom, "deleteDocuments(Term)");
     }
   }
-
+  
+  protected synchronized void deleteQueriesLive(Query... queries) throws IOException {
+    for (SegmentInfo info : segmentInfos) {
+      SegmentReader reader = readerPool.get(info, false);
+      try {
+        deleteQueriesLive(reader, queries);
+      } finally {
+        readerPool.release(reader);
+      }
+    }
+  }
+  
+  protected synchronized void deleteQueriesLive(IndexReader reader, Query... queries) throws IOException {
+    IndexSearcher searcher = new IndexSearcher(reader);
+    for (Query query : queries) {
+      Weight weight = query.weight(searcher);
+      Scorer scorer = weight.scorer(reader, true, false);
+      if (scorer != null) {
+        while(true)  {
+          int docID = scorer.nextDoc();
+          if (docID != DocIdSetIterator.NO_MORE_DOCS) {
+            reader.deleteDocument(docID);
+            break;
+          }
+        }
+      }
+    }
+    searcher.close();
+  }
+  
+  protected synchronized void deleteTermsLive(Term... terms) throws IOException {
+    for (SegmentInfo info : segmentInfos) {
+      SegmentReader reader = readerPool.get(info, false);
+      try { 
+        deleteTermsLive(reader, terms);
+      } finally {
+        readerPool.release(reader);
+      }
+    }
+  }
+  
+  protected synchronized void deleteTermsLive(IndexReader reader, Term... terms) throws IOException {
+    TermDocs docs = reader.termDocs();
+    try {
+      for (Term term : terms) {
+        docs.seek(term);
+        while (docs.next()) {
+          int docID = docs.doc();
+          reader.deleteDocument(docID);
+        }
+      }
+    } finally {
+      docs.close();
+    }
+  }
+  
   /**
    * Deletes the document(s) containing any of the
    * terms. All deletes are flushed at the same time.
@@ -1981,9 +2044,13 @@
   public void deleteDocuments(Term... terms) throws CorruptIndexException, IOException {
     ensureOpen();
     try {
-      boolean doFlush = docWriter.bufferDeleteTerms(terms);
-      if (doFlush)
-        flush(true, false, false);
+      if (poolReaders) {
+        deleteTermsLive(terms);
+      } else {
+        boolean doFlush = docWriter.bufferDeleteTerms(terms);
+        if (doFlush)
+          flush(true, false, false);
+      }
     } catch (OutOfMemoryError oom) {
       handleOOM(oom, "deleteDocuments(Term..)");
     }
@@ -2002,9 +2069,13 @@
    */
   public void deleteDocuments(Query query) throws CorruptIndexException, IOException {
     ensureOpen();
-    boolean doFlush = docWriter.bufferDeleteQuery(query);
-    if (doFlush)
-      flush(true, false, false);
+    if (poolReaders) {
+      deleteQueriesLive(query);
+    } else {
+      boolean doFlush = docWriter.bufferDeleteQuery(query);
+      if (doFlush)
+        flush(true, false, false);
+    }
   }
 
   /**
@@ -2022,9 +2093,13 @@
    */
   public void deleteDocuments(Query... queries) throws CorruptIndexException, IOException {
     ensureOpen();
-    boolean doFlush = docWriter.bufferDeleteQueries(queries);
-    if (doFlush)
-      flush(true, false, false);
+    if (poolReaders) {
+      deleteQueriesLive(queries);
+    } else {
+      boolean doFlush = docWriter.bufferDeleteQueries(queries);
+      if (doFlush)
+        flush(true, false, false);
+    }
   }
 
   /**
