Index: src/test/java/org/apache/jackrabbit/core/query/lucene/IndexMigrationTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/query/lucene/IndexMigrationTest.java	(revision 1199780)
+++ src/test/java/org/apache/jackrabbit/core/query/lucene/IndexMigrationTest.java	(working copy)
@@ -17,6 +17,8 @@
 package org.apache.jackrabbit.core.query.lucene;
 
 import junit.framework.TestCase;
+
+import org.apache.jackrabbit.core.JackrabbitThreadPool;
 import org.apache.jackrabbit.core.query.lucene.directory.DirectoryManager;
 import org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
@@ -29,6 +31,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.ScheduledExecutorService;
 
 /**
  * <code>IndexMigrationTest</code> contains a test case for JCR-2393.
@@ -48,12 +51,14 @@
         docs.add(createDocument("abc", "d"));
 
         DirectoryManager dirMgr = new RAMDirectoryManager();
+        
+        ScheduledExecutorService executor = new JackrabbitThreadPool();
 
         PersistentIndex idx = new PersistentIndex("index",
                 new StandardAnalyzer(Version.LUCENE_24), Similarity.getDefault(),
                 new DocNumberCache(100),
                 new IndexingQueue(new IndexingQueueStore(new RAMDirectory())),
-                dirMgr, 0);
+                dirMgr, 0, executor);
         idx.addDocuments(docs.toArray(new Document[docs.size()]));
         idx.commit();
 
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/VolatileIndex.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/VolatileIndex.java	(revision 1201657)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/VolatileIndex.java	(working copy)
@@ -25,6 +25,7 @@
 
 import java.io.IOException;
 import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
 
 /**
  * Implements an in-memory index with a pending buffer.
@@ -58,12 +59,15 @@
      * @param analyzer the analyzer to use.
      * @param similarity the similarity implementation.
      * @param indexingQueue the indexing queue.
+     * @param executor the repository's executor service
      * @throws IOException if an error occurs while opening the index.
      */
     VolatileIndex(Analyzer analyzer,
                   Similarity similarity,
-                  IndexingQueue indexingQueue) throws IOException {
-        super(analyzer, similarity, new RAMDirectory(), null, indexingQueue);
+                  IndexingQueue indexingQueue,
+                  ScheduledExecutorService executor) throws IOException {
+        super(analyzer, similarity, new RAMDirectory(), null, indexingQueue,
+                executor);
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/PersistentIndex.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/PersistentIndex.java	(revision 1201657)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/PersistentIndex.java	(working copy)
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.core.query.lucene;
 
 import java.io.IOException;
+import java.util.concurrent.ScheduledExecutorService;
 
 import org.apache.jackrabbit.core.query.lucene.directory.DirectoryManager;
 import org.apache.lucene.analysis.Analyzer;
@@ -65,16 +66,19 @@
      * @param directoryManager the directory manager.
      * @param generationMaxAge age in seconds after which an index generation is
      *          deleted.
+     * @param executor the repository's executor service
      * @throws IOException if an error occurs while opening / creating the
      *  index.
      */
     PersistentIndex(String name, Analyzer analyzer,
                     Similarity similarity, DocNumberCache cache,
                     IndexingQueue indexingQueue,
-                    DirectoryManager directoryManager, long generationMaxAge)
+                    DirectoryManager directoryManager, 
+                    long generationMaxAge,
+                    ScheduledExecutorService executor)
             throws IOException {
-        super(analyzer, similarity, directoryManager.getDirectory(name),
-                cache, indexingQueue);
+        super(analyzer, similarity, directoryManager.getDirectory(name), cache,
+                indexingQueue, executor);
         this.name = name;
         this.indexDelPolicy = new IndexDeletionPolicyImpl(this,
                 generationMaxAge * 1000);
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java	(revision 1201657)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java	(working copy)
@@ -25,6 +25,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ScheduledExecutorService;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
@@ -66,8 +67,7 @@
     /** PrintStream that pipes all calls to println(String) into log.info() */
     private static final LoggingPrintStream STREAM_LOGGER = new LoggingPrintStream();
 
-    /** Executor with a pool size equal to the number of available processors */
-    private final DynamicPooledExecutor executor = new DynamicPooledExecutor();
+    private final ScheduledExecutorService executor;
 
     /** The currently set IndexWriter or <code>null</code> if none is set */
     private IndexWriter indexWriter;
@@ -128,18 +128,21 @@
      *                      one; otherwise <code>cache</code> is
      *                      <code>null</code>.
      * @param indexingQueue the indexing queue.
+     * @param executor      the repository's executor service
      * @throws IOException if the index cannot be initialized.
      */
     AbstractIndex(Analyzer analyzer,
                   Similarity similarity,
                   Directory directory,
                   DocNumberCache cache,
-                  IndexingQueue indexingQueue) throws IOException {
+                  IndexingQueue indexingQueue,
+                  ScheduledExecutorService executor) throws IOException {
         this.analyzer = analyzer;
         this.similarity = similarity;
         this.directory = directory;
         this.cache = cache;
         this.indexingQueue = indexingQueue;
+        this.executor = executor;
         this.isExisting = IndexReader.indexExists(directory);
 
         if (!isExisting) {
@@ -406,7 +409,6 @@
                 directory = null;
             }
         }
-        executor.close();
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java	(revision 1201657)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java	(working copy)
@@ -285,9 +285,10 @@
                 continue;
             }
             PersistentIndex index = new PersistentIndex(name,
-                    handler.getTextAnalyzer(), handler.getSimilarity(),
-                    cache, indexingQueue, directoryManager,
-                    handler.getMaxHistoryAge());
+                    handler.getTextAnalyzer(), handler.getSimilarity(), cache,
+                    indexingQueue, directoryManager,
+                    handler.getMaxHistoryAge(), handler.getContext()
+                            .getExecutor());
             index.setMaxFieldLength(handler.getMaxFieldLength());
             index.setUseCompoundFile(handler.getUseCompoundFile());
             index.setTermInfosIndexDivisor(handler.getTermInfosIndexDivisor());
@@ -589,10 +590,10 @@
         }
         PersistentIndex index;
         try {
-            index = new PersistentIndex(indexName,
-                    handler.getTextAnalyzer(), handler.getSimilarity(),
-                    cache, indexingQueue, directoryManager,
-                    handler.getMaxHistoryAge());
+            index = new PersistentIndex(indexName, handler.getTextAnalyzer(),
+                    handler.getSimilarity(), cache, indexingQueue,
+                    directoryManager, handler.getMaxHistoryAge(), handler
+                            .getContext().getExecutor());
         } catch (IOException e) {
             // do some clean up
             if (!directoryManager.delete(indexName)) {
@@ -1011,7 +1012,9 @@
         synchronized (iq) {
             while (iq.getNumPendingDocuments() > 0 || indexingQueueCommitPending) {
                 try {
-                    log.debug("waiting for indexing queue to become empty");
+                    log.debug(
+                            "waiting for indexing queue to become empty. {} pending docs.",
+                            iq.getNumPendingDocuments());
                     iq.wait();
                     log.debug("notified");
                 } catch (InterruptedException e) {
@@ -1099,7 +1102,8 @@
      */
     private void resetVolatileIndex() throws IOException {
         volatileIndex = new VolatileIndex(handler.getTextAnalyzer(),
-                handler.getSimilarity(), indexingQueue);
+                handler.getSimilarity(), indexingQueue, handler.getContext()
+                        .getExecutor());
         volatileIndex.setUseCompoundFile(handler.getUseCompoundFile());
         volatileIndex.setMaxFieldLength(handler.getMaxFieldLength());
         volatileIndex.setBufferSize(handler.getBufferSize());
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java	(revision 1201657)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java	(working copy)
@@ -22,11 +22,17 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.jackrabbit.core.JackrabbitThreadPool;
+
 /**
  * <code>DynamicPooledExecutor</code> implements an executor, which dynamically
  * adjusts its maximum number of threads according to the number of available
  * processors returned by {@link Runtime#availableProcessors()}.
+ * 
+ * Use {@link JackrabbitThreadPool} instead.
+ *
  */
+@Deprecated
 public class DynamicPooledExecutor implements Executor {
 
     /**
