diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
index ab56cd5..489bf77 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
@@ -1228,7 +1228,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit {
           }
         }
       }
-      if (anySegmentFlushed) {
+      if (anySegmentFlushed && config.getMaybeMergeAfterFlush()) {
         maybeMerge();
       }
     } catch (OutOfMemoryError oom) {
@@ -1450,7 +1450,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit {
         }
       }
 
-      if (anySegmentFlushed) {
+      if (anySegmentFlushed && config.getMaybeMergeAfterFlush()) {
         maybeMerge();
       }
     } catch (OutOfMemoryError oom) {
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
index c773326..cc42a57 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
@@ -466,6 +466,11 @@ public final class IndexWriterConfig extends LiveIndexWriterConfig implements Cl
     return super.getTermIndexInterval();
   }
   
+  @Override
+  public boolean getMaybeMergeAfterFlush() {
+    return super.getMaybeMergeAfterFlush();
+  }
+
   /** If non-null, information about merges, deletes and a
    * message when maxFieldLength is reached will be printed
    * to this.
@@ -514,4 +519,9 @@ public final class IndexWriterConfig extends LiveIndexWriterConfig implements Cl
     return (IndexWriterConfig) super.setTermIndexInterval(interval);
   }
 
+  @Override
+  public IndexWriterConfig setMaybeMergeAfterFlush(
+      boolean maybeMergeAfterFlush) {
+    return (IndexWriterConfig) super.setMaybeMergeAfterFlush(maybeMergeAfterFlush);
+  }
 }
diff --git a/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java b/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
index 7652fa2..0bc8f13 100755
--- a/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
@@ -43,6 +43,7 @@ public class LiveIndexWriterConfig {
   private volatile int maxBufferedDeleteTerms;
   private volatile int readerTermsIndexDivisor;
   private volatile IndexReaderWarmer mergedSegmentWarmer;
+  private volatile boolean maybeMergeAfterFlush;
   private volatile int termIndexInterval; // TODO: this should be private to the codec, not settable here
 
   // modified by IndexWriterConfig
@@ -122,6 +123,7 @@ public class LiveIndexWriterConfig {
     readerPooling = IndexWriterConfig.DEFAULT_READER_POOLING;
     indexerThreadPool = new ThreadAffinityDocumentsWriterThreadPool(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES);
     perThreadHardLimitMB = IndexWriterConfig.DEFAULT_RAM_PER_THREAD_HARD_LIMIT_MB;
+    maybeMergeAfterFlush = true;
   }
   
   /**
@@ -151,6 +153,7 @@ public class LiveIndexWriterConfig {
     readerPooling = config.getReaderPooling();
     flushPolicy = config.getFlushPolicy();
     perThreadHardLimitMB = config.getRAMPerThreadHardLimitMB();
+    maybeMergeAfterFlush = config.getMaybeMergeAfterFlush();
   }
 
   /** Returns the default analyzer to use for indexing documents. */
@@ -220,7 +223,7 @@ public class LiveIndexWriterConfig {
   public int getTermIndexInterval() { // TODO: this should be private to the codec, not settable here
     return termIndexInterval;
   }
-
+  
   /**
    * Determines the minimal number of delete terms required before the buffered
    * in-memory delete terms and queries are applied and flushed.
@@ -539,6 +542,26 @@ public class LiveIndexWriterConfig {
     return infoStream;
   }
   
+  /**
+   * Expert: If set to <code>true</code> the {@link IndexWriter} will consult the {@link MergePolicy}
+   * after a each segment flush in order to merge segments if necessary. If set to <code>false</code> segments merges
+   * will only occur if {@link IndexWriter#maybeMerge()} is explicitly called, if a new NRT reader is pulled or if the 
+   * {@link IndexWriter} is committed or closed. The default is <code>true</code>. 
+   */
+  public LiveIndexWriterConfig setMaybeMergeAfterFlush(boolean maybeMergeAfterFlush) {
+    this.maybeMergeAfterFlush = maybeMergeAfterFlush;
+    return this;
+  }
+  
+  /**
+   * Returns <code>true</code> iff the {@link IndexWriter} should consult the {@link MergePolicy}
+   * after a segment has been flushed. 
+   * @see IndexWriterConfig#setMaybeMergeAfterFlush(boolean)
+   */
+  public boolean getMaybeMergeAfterFlush() {
+    return maybeMergeAfterFlush;
+  }
+  
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();
@@ -564,6 +587,8 @@ public class LiveIndexWriterConfig {
     sb.append("indexerThreadPool=").append(getIndexerThreadPool()).append("\n");
     sb.append("readerPooling=").append(getReaderPooling()).append("\n");
     sb.append("perThreadHardLimitMB=").append(getRAMPerThreadHardLimitMB()).append("\n");
+    sb.append("maybeMergeAfterFlush=").append(getMaybeMergeAfterFlush()).append("\n");
+
     return sb.toString();
   }
 
diff --git a/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java b/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
index 1c01ad3..10340cc 100644
--- a/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
+++ b/lucene/core/src/test/org/apache/lucene/TestMergeSchedulerExternal.java
@@ -95,7 +95,7 @@ public class TestMergeSchedulerExternal extends LuceneTestCase {
     IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(
         TEST_VERSION_CURRENT, new MockAnalyzer(random())).setMergeScheduler(new MyMergeScheduler())
         .setMaxBufferedDocs(2).setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH)
-        .setMergePolicy(newLogMergePolicy()));
+        .setMergePolicy(newLogMergePolicy()).setMaybeMergeAfterFlush(true));
     LogMergePolicy logMP = (LogMergePolicy) writer.getConfig().getMergePolicy();
     logMP.setMergeFactor(10);
     for(int i=0;i<20;i++)
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
index 093d3b6..028200b 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
@@ -78,6 +78,7 @@ public class TestIndexWriterConfig extends LuceneTestCase {
     assertEquals(IndexWriterConfig.DEFAULT_RAM_PER_THREAD_HARD_LIMIT_MB, conf.getRAMPerThreadHardLimitMB());
     assertEquals(Codec.getDefault(), conf.getCodec());
     assertEquals(InfoStream.getDefault(), conf.getInfoStream());
+    assertTrue(conf.getMaybeMergeAfterFlush());
     // Sanity check - validate that all getters are covered.
     Set<String> getters = new HashSet<String>();
     getters.add("getAnalyzer");
@@ -104,6 +105,7 @@ public class TestIndexWriterConfig extends LuceneTestCase {
     getters.add("getRAMPerThreadHardLimitMB");
     getters.add("getCodec");
     getters.add("getInfoStream");
+    getters.add("getMaybeMergeAfterFlush");
     
     for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
       if (m.getDeclaringClass() == IndexWriterConfig.class && m.getName().startsWith("get")) {
diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
index eaefa92..bec44a6 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
@@ -763,6 +763,8 @@ public abstract class LuceneTestCase extends Assert {
     } else {
       c.setMergePolicy(newLogMergePolicy());
     }
+    
+    c.setMaybeMergeAfterFlush(!rarely(r));
 
     c.setReaderPooling(r.nextBoolean());
     c.setReaderTermsIndexDivisor(_TestUtil.nextInt(r, 1, 4));
