Index: lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java	(revision 1427796)
+++ lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java	(working copy)
@@ -18,9 +18,8 @@
  */
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
-import org.apache.lucene.util.ThreadInterruptedException;
-
 /**
  * hangs onto files a little bit longer (50ms in close).
  * MockDirectoryWrapper acts like windows: you can't delete files
@@ -39,7 +38,10 @@
     try {
       Thread.sleep(50);
     } catch (InterruptedException ie) {
-      throw new ThreadInterruptedException(ie);
+      Thread.currentThread().interrupt(); // restore status
+      IOException e = new InterruptedIOException("close interrupted");
+      e.initCause(ie);
+      throw e;
     } finally {
       super.close();
     }
Index: lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java	(revision 1427796)
+++ lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java	(working copy)
@@ -18,9 +18,8 @@
  */
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
-import org.apache.lucene.util.ThreadInterruptedException;
-
 /**
  * Takes a while to open files: gives testThreadInterruptDeadlock
  * a chance to find file leaks if opening an input throws exception
@@ -36,7 +35,10 @@
       try {
         super.close();
       } catch (Throwable ignore) {} // we didnt open successfully
-      throw new ThreadInterruptedException(ie);
+      Thread.currentThread().interrupt(); // restore status
+      IOException e = new InterruptedIOException("open interrupted");
+      e.initCause(ie);
+      throw e;
     }
   }
 }
Index: lucene/test-framework/src/java/org/apache/lucene/util/ThrottledIndexOutput.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/util/ThrottledIndexOutput.java	(revision 1427796)
+++ lucene/test-framework/src/java/org/apache/lucene/util/ThrottledIndexOutput.java	(working copy)
@@ -17,6 +17,7 @@
  * limitations under the License.
  */
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
 import org.apache.lucene.store.DataInput;
 import org.apache.lucene.store.IndexOutput;
@@ -70,7 +71,14 @@
 
   @Override
   public void flush() throws IOException {
-    sleep(flushDelayMillis);
+    try {
+      sleep(flushDelayMillis);
+    } catch (InterruptedException ie) {
+      Thread.currentThread().interrupt(); // restore status
+      IOException e = new InterruptedIOException("flush interrupted");
+      e.initCause(ie);
+      throw e;
+    }
     delegate.flush();
   }
 
@@ -78,6 +86,11 @@
   public void close() throws IOException {
     try {
       sleep(closeDelayMillis + getDelay(true));
+    } catch (InterruptedException ie) {
+      Thread.currentThread().interrupt(); // restore status
+      IOException e = new InterruptedIOException("close interrupted");
+      e.initCause(ie);
+      throw e;
     } finally {
       delegate.close();
     }
@@ -105,8 +118,14 @@
     delegate.writeBytes(b, offset, length);
     timeElapsed += System.nanoTime() - before;
     pendingBytes += length;
-    sleep(getDelay(false));
-
+    try {
+      sleep(getDelay(false));
+    } catch (InterruptedException ie) {
+      Thread.currentThread().interrupt(); // restore status
+      IOException e = new InterruptedIOException("write interrupted");
+      e.initCause(ie);
+      throw e;
+    }
   }
 
   protected long getDelay(boolean closing) {
@@ -124,14 +143,10 @@
 
   }
 
-  private static final void sleep(long ms) {
+  private static final void sleep(long ms) throws InterruptedException {
     if (ms <= 0)
       return;
-    try {
-      Thread.sleep(ms);
-    } catch (InterruptedException e) {
-      throw new ThreadInterruptedException(e);
-    }
+    Thread.sleep(ms);
   }
   
   @Override
Index: lucene/facet/src/test/org/apache/lucene/util/SlowRAMDirectory.java
===================================================================
--- lucene/facet/src/test/org/apache/lucene/util/SlowRAMDirectory.java	(revision 1427796)
+++ lucene/facet/src/test/org/apache/lucene/util/SlowRAMDirectory.java	(working copy)
@@ -18,6 +18,7 @@
  */
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
 import java.util.Random;
 
 import org.apache.lucene.store.IOContext;
@@ -62,16 +63,12 @@
     return super.openInput(name, context);
   }
 
-  void doSleep(int length) {
+  void doSleep(int length) throws InterruptedException {
     int sTime = length<10 ? sleepMillis : (int) (sleepMillis * Math.log(length));
     if (random!=null) {
       sTime = random.nextInt(sTime);
     }
-    try {
-      Thread.sleep(sTime);
-    } catch (InterruptedException e) {
-      throw new ThreadInterruptedException(e);
-    }
+    Thread.sleep(sTime);
   }
 
   /**
@@ -90,7 +87,14 @@
     @Override
     public byte readByte() throws IOException {
       if (numRead >= IO_SLEEP_THRESHOLD) {
-        doSleep(0);
+        try {
+          doSleep(0);
+        } catch (InterruptedException ie) {
+          Thread.currentThread().interrupt(); // restore status
+          IOException e = new InterruptedIOException("read interrupted");
+          e.initCause(ie);
+          throw e;
+        }
         numRead = 0;
       }
       ++numRead;
@@ -100,7 +104,14 @@
     @Override
     public void readBytes(byte[] b, int offset, int len) throws IOException {
       if (numRead >= IO_SLEEP_THRESHOLD) {
-        doSleep(len);
+        try {
+          doSleep(len);
+        } catch (InterruptedException ie) {
+          Thread.currentThread().interrupt(); // restore status
+          IOException e = new InterruptedIOException("read interrupted");
+          e.initCause(ie);
+          throw e;
+        }
         numRead = 0;
       }
       numRead += len;
@@ -133,7 +144,14 @@
     @Override
     public void writeByte(byte b) throws IOException {
       if (numWrote >= IO_SLEEP_THRESHOLD) {
-        doSleep(0);
+        try {
+          doSleep(0);
+        } catch (InterruptedException ie) {
+          Thread.currentThread().interrupt(); // restore status
+          IOException e = new InterruptedIOException("write interrupted");
+          e.initCause(ie);
+          throw e;
+        }
         numWrote = 0;
       }
       ++numWrote;
@@ -143,7 +161,14 @@
     @Override
     public void writeBytes(byte[] b, int offset, int length) throws IOException {
       if (numWrote >= IO_SLEEP_THRESHOLD) {
-        doSleep(length);
+        try {
+          doSleep(length);
+        } catch (InterruptedException ie) {
+          Thread.currentThread().interrupt(); // restore status
+          IOException e = new InterruptedIOException("write interrupted");
+          e.initCause(ie);
+          throw e;
+        }
         numWrote = 0;
       }
       numWrote += length;
Index: lucene/core/src/test/org/apache/lucene/search/TestNRTManager.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/search/TestNRTManager.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/search/TestNRTManager.java	(working copy)
@@ -39,7 +39,6 @@
 import org.apache.lucene.store.NRTCachingDirectory;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 @SuppressCodecs({ "SimpleText", "Memory", "Direct" })
 public class TestNRTManager extends ThreadedIndexingAndSearchingTestCase {
@@ -385,7 +384,8 @@
           latch.await();
         }
       } catch (InterruptedException e) {
-        throw new ThreadInterruptedException(e);
+        Thread.currentThread().interrupt();
+        throw new RuntimeException(e);
       }
     }
   }
Index: lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java	(working copy)
@@ -32,7 +32,6 @@
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.Counter;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * Tests the {@link TimeLimitingCollector}.  This test checks (1) search
@@ -340,7 +339,8 @@
         try {
           Thread.sleep(slowdown);
         } catch (InterruptedException ie) {
-          throw new ThreadInterruptedException(ie);
+          Thread.currentThread().interrupt();
+          throw new RuntimeException(ie);
         }
       }
       assert docId >= 0: " base=" + docBase + " doc=" + doc;
Index: lucene/core/src/test/org/apache/lucene/index/TestIndexWriterReader.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestIndexWriterReader.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/index/TestIndexWriterReader.java	(working copy)
@@ -40,7 +40,6 @@
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.util._TestUtil;
 
 public class TestIndexWriterReader extends LuceneTestCase {
@@ -425,7 +424,8 @@
         try {
           threads[i].join();
         } catch (InterruptedException ie) {
-          throw new ThreadInterruptedException(ie);
+          Thread.currentThread().interrupt();
+          throw new RuntimeException(ie);
         }
     }
 
Index: lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java	(working copy)
@@ -27,7 +27,6 @@
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * Unit test for {@link DocumentsWriterDeleteQueue}
@@ -238,7 +237,8 @@
       try {
         latch.await();
       } catch (InterruptedException e) {
-        throw new ThreadInterruptedException(e);
+        Thread.currentThread().interrupt(); // restore status
+        throw new RuntimeException(e);
       }
       int i = 0;
       while ((i = index.getAndIncrement()) < ids.length) {
Index: lucene/core/src/test/org/apache/lucene/index/TestIndexWriterWithThreads.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestIndexWriterWithThreads.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/index/TestIndexWriterWithThreads.java	(working copy)
@@ -39,7 +39,6 @@
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LineFileDocs;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.util._TestUtil;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 
@@ -96,7 +95,8 @@
             try {
               Thread.sleep(1);
             } catch (InterruptedException ie) {
-              throw new ThreadInterruptedException(ie);
+              Thread.currentThread().interrupt();
+              throw new RuntimeException(ie);
             }
             if (fullCount++ >= 5)
               break;
Index: lucene/core/src/test/org/apache/lucene/index/TestSnapshotDeletionPolicy.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestSnapshotDeletionPolicy.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/index/TestSnapshotDeletionPolicy.java	(working copy)
@@ -30,7 +30,6 @@
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.MockDirectoryWrapper;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.junit.Test;
 
 //
@@ -135,7 +134,8 @@
             try {
               Thread.sleep(1);
             } catch (InterruptedException ie) {
-              throw new ThreadInterruptedException(ie);
+              Thread.currentThread().interrupt();
+              throw new RuntimeException(ie);
             }
           } while(System.currentTimeMillis() < stopTime);
         }
Index: lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java	(working copy)
@@ -19,6 +19,7 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InterruptedIOException;
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -63,7 +64,6 @@
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.util._TestUtil;
 import org.apache.lucene.util.packed.PackedInts;
 import org.junit.Test;
@@ -1007,8 +1007,7 @@
 
     @Override
     public void run() {
-      // LUCENE-2239: won't work with NIOFS/MMAP
-      Directory dir = new MockDirectoryWrapper(random(), new RAMDirectory());
+      Directory dir = newDirectory(); // new MockDirectoryWrapper(random(), new RAMDirectory());
       IndexWriter w = null;
       while(!finish) {
         try {
@@ -1045,13 +1044,12 @@
             // until we've done the above loop.
             allowInterrupt = true;
           }
-        } catch (ThreadInterruptedException re) {
+        } catch (Exception re) {
           if (true || VERBOSE) {
             System.out.println("TEST: got interrupt");
             re.printStackTrace(System.out);
           }
-          Throwable e = re.getCause();
-          assertTrue(e instanceof InterruptedException);
+          assertTrue(Thread.interrupted());
           if (finish) {
             break;
           }
@@ -1108,7 +1106,8 @@
     // up front... else we can see a false failure if 2nd
     // interrupt arrives while class loader is trying to
     // init this class (in servicing a first interrupt):
-    assertTrue(new ThreadInterruptedException(new InterruptedException()).getCause() instanceof InterruptedException);
+    // TODO: do we need this ?!
+    Class.forName(InterruptedIOException.class.getName());
 
     // issue 300 interrupts to child thread
     final int numInterrupts = atLeast(300);
Index: lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java	(revision 1427796)
+++ lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java	(working copy)
@@ -25,7 +25,6 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * Tests for {@link DocumentsWriterStallControl}
@@ -231,7 +230,8 @@
               assertTrue(sync.await());
             } catch (InterruptedException e) {
               System.out.println("[Waiter] got interrupted - wait count: " + sync.waiter.getCount());
-              throw new ThreadInterruptedException(e);
+              Thread.currentThread().interrupt();
+              throw new RuntimeException(e);
             }
           }
         }
@@ -278,7 +278,8 @@
               assertTrue(sync.await());
             } catch (InterruptedException e) {
               System.out.println("[Updater] got interrupted - wait count: " + sync.waiter.getCount());
-              throw new ThreadInterruptedException(e);
+              Thread.currentThread().interrupt();
+              throw new RuntimeException(e);
             }
             sync.leftCheckpoint.countDown();
           }
Index: lucene/core/src/java/org/apache/lucene/store/RateLimiter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/store/RateLimiter.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/store/RateLimiter.java	(working copy)
@@ -17,8 +17,6 @@
  * limitations under the License.
  */
 
-import org.apache.lucene.util.ThreadInterruptedException;
-
 /** Abstract base class to rate limit IO.  Typically implementations are
  *  shared across multiple IndexInputs or IndexOutputs (for example
  *  those involved all merging).  Those IndexInputs and
@@ -42,7 +40,7 @@
    *  </p>
    *  @return the pause time in nano seconds 
    * */
-  public abstract long pause(long bytes);
+  public abstract long pause(long bytes) throws InterruptedException;
   
   /**
    * Simple class to rate limit IO.
@@ -89,7 +87,7 @@
      *  @return the pause time in nano seconds 
      * */
     @Override
-    public long pause(long bytes) {
+    public long pause(long bytes) throws InterruptedException {
       if (bytes == 1) {
         return 0;
       }
@@ -107,11 +105,7 @@
       while(true) {
         final long pauseNS = targetNS - curNS;
         if (pauseNS > 0) {
-          try {
-            Thread.sleep((int) (pauseNS/1000000), (int) (pauseNS % 1000000));
-          } catch (InterruptedException ie) {
-            throw new ThreadInterruptedException(ie);
-          }
+          Thread.sleep((int) (pauseNS/1000000), (int) (pauseNS % 1000000));
           curNS = System.nanoTime();
           continue;
         }
Index: lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/store/FSDirectory.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/store/FSDirectory.java	(working copy)
@@ -21,6 +21,7 @@
 import java.io.FileNotFoundException;
 import java.io.FilenameFilter;
 import java.io.IOException;
+import java.io.InterruptedIOException;
 import java.io.RandomAccessFile;
 
 import java.util.Collection;
@@ -29,7 +30,6 @@
 import java.util.Set;
 import java.util.concurrent.Future;
 
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.util.Constants;
 
 /**
@@ -532,7 +532,10 @@
           // Pause 5 msec
           Thread.sleep(5);
         } catch (InterruptedException ie) {
-          throw new ThreadInterruptedException(ie);
+          Thread.currentThread().interrupt(); // restore status
+          IOException e = new InterruptedIOException("fsync interrupted");
+          e.initCause(ie);
+          throw e;
         }
       }
     }
Index: lucene/core/src/java/org/apache/lucene/store/RateLimitedIndexOutput.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/store/RateLimitedIndexOutput.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/store/RateLimitedIndexOutput.java	(working copy)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
 /**
  * A {@link RateLimiter rate limiting} {@link IndexOutput}
@@ -42,7 +43,14 @@
   
   @Override
   protected void flushBuffer(byte[] b, int offset, int len) throws IOException {
-    rateLimiter.pause(len);
+    try {
+      rateLimiter.pause(len);
+    } catch (InterruptedException ie) {
+      Thread.currentThread().interrupt(); // restore status
+      IOException e = new InterruptedIOException("flush interrupted");
+      e.initCause(ie);
+      throw e;
+    }
     if (bufferedDelegate != null) {
       bufferedDelegate.flushBuffer(b, offset, len);
     } else {
Index: lucene/core/src/java/org/apache/lucene/store/Lock.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/store/Lock.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/store/Lock.java	(working copy)
@@ -17,8 +17,8 @@
  * limitations under the License.
  */
 
-import org.apache.lucene.util.ThreadInterruptedException;
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
 /** An interprocess mutex lock.
  * <p>Typical use might look like:<pre class="prettyprint">
@@ -90,7 +90,10 @@
       try {
         Thread.sleep(LOCK_POLL_INTERVAL);
       } catch (InterruptedException ie) {
-        throw new ThreadInterruptedException(ie);
+        Thread.currentThread().interrupt(); // restore status
+        IOException e = new InterruptedIOException("obtain interrupted");
+        e.initCause(ie);
+        throw e;
       }
       locked = obtain();
     }
Index: lucene/core/src/java/org/apache/lucene/search/NRTManager.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/NRTManager.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/search/NRTManager.java	(working copy)
@@ -34,7 +34,6 @@
 import org.apache.lucene.search.IndexSearcher; // javadocs
 import org.apache.lucene.search.SearcherFactory; // javadocs
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * Utility class to manage sharing near-real-time searchers
@@ -318,7 +317,8 @@
         genLock.unlock();
       }
     } catch (InterruptedException ie) {
-      throw new ThreadInterruptedException(ie);
+      Thread.currentThread().interrupt();
+      throw new RuntimeException(ie);
     }
   }
   
Index: lucene/core/src/java/org/apache/lucene/search/TimeLimitingCollector.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/TimeLimitingCollector.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/search/TimeLimitingCollector.java	(working copy)
@@ -19,7 +19,6 @@
 
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.util.Counter;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 import java.io.IOException;
 
@@ -266,7 +265,8 @@
         try {
           Thread.sleep( resolution );
         } catch (InterruptedException ie) {
-          throw new ThreadInterruptedException(ie);
+          Thread.currentThread().interrupt();
+          throw new RuntimeException(ie);
         }
       }
     }
Index: lucene/core/src/java/org/apache/lucene/search/NRTManagerReopenThread.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/NRTManagerReopenThread.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/search/NRTManagerReopenThread.java	(working copy)
@@ -20,8 +20,6 @@
 import java.io.Closeable;
 import java.io.IOException;
 
-import org.apache.lucene.util.ThreadInterruptedException;
-
 /**
  * Utility class that runs a reopen thread to periodically
  * reopen the NRT searchers in the provided {@link
@@ -122,7 +120,8 @@
     try {
       join();
     } catch (InterruptedException ie) {
-      throw new ThreadInterruptedException(ie);
+      Thread.currentThread().interrupt();
+      throw new RuntimeException(ie);
     }
   }
 
Index: lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java	(working copy)
@@ -47,7 +47,6 @@
 import org.apache.lucene.search.similarities.DefaultSimilarity;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.NIOFSDirectory;    // javadoc
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.index.IndexWriter; // javadocs
 
 /** Implements search over a single IndexReader.
@@ -836,7 +835,8 @@
       try {
         return service.take().get();
       } catch (InterruptedException e) {
-        throw new ThreadInterruptedException(e);
+        Thread.currentThread().interrupt();
+        throw new RuntimeException(e);
       } catch (ExecutionException e) {
         throw new RuntimeException(e);
       } finally {
Index: lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java	(working copy)
@@ -43,7 +43,6 @@
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.store.NoSuchDirectoryException;
 import org.apache.lucene.util.IOUtils;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * A collection of segmentInfo objects with methods for operating on
Index: lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java	(working copy)
@@ -18,7 +18,6 @@
  */
 
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.util.CollectionUtil;
 
 import java.io.IOException;
@@ -347,7 +346,8 @@
         try {
           wait();
         } catch (InterruptedException ie) {
-          throw new ThreadInterruptedException(ie);
+          Thread.currentThread().interrupt();
+          throw new RuntimeException(ie);
         }
       }
 
@@ -527,7 +527,8 @@
       // cases:
       Thread.sleep(250);
     } catch (InterruptedException ie) {
-      throw new ThreadInterruptedException(ie);
+      Thread.currentThread().interrupt();
+      throw new RuntimeException(ie);
     }
     throw new MergePolicy.MergeException(exc, dir);
   }
Index: lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java	(working copy)
@@ -26,7 +26,6 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.lucene.index.DocumentsWriterPerThreadPool.ThreadState;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * This class controls {@link DocumentsWriterPerThread} flushing during
@@ -244,7 +243,8 @@
       try {
         this.wait();
       } catch (InterruptedException e) {
-        throw new ThreadInterruptedException(e);
+        Thread.currentThread().interrupt();
+        throw new RuntimeException(e);
       }
     }
   }
Index: lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/IndexWriter.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/index/IndexWriter.java	(working copy)
@@ -51,7 +51,6 @@
 import org.apache.lucene.util.Constants;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.InfoStream;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
   An <code>IndexWriter</code> creates and maintains an index.
@@ -152,13 +151,6 @@
   synchronize on the <code>IndexWriter</code> instance as
   this may cause deadlock; use your own (non-Lucene) objects
   instead. </p>
-  
-  <p><b>NOTE</b>: If you call
-  <code>Thread.interrupt()</code> on a thread that's within
-  IndexWriter, IndexWriter will try to catch this (eg, if
-  it's in a wait() or Thread.sleep()), and will then throw
-  the unchecked exception {@link ThreadInterruptedException}
-  and <b>clear</b> the interrupt status on the thread.</p>
 */
 
 /*
@@ -923,11 +915,15 @@
               // Give merge scheduler last chance to run, in case
               // any pending merges are waiting:
               mergeScheduler.merge(this);
-            } catch (ThreadInterruptedException tie) {
-              // ignore any interruption, does not matter
-              interrupted = true;
-              if (infoStream.isEnabled("IW")) {
-                infoStream.message("IW", "interrupted while waiting for final merges");
+            } catch (Throwable t) {
+              if (Thread.interrupted()) {
+                // ignore any interruption, does not matter
+                interrupted = true;
+                if (infoStream.isEnabled("IW")) {
+                  infoStream.message("IW", "interrupted while waiting for final merges");
+                }
+              } else {
+                throw new RuntimeException(t);
               }
             }
           }
@@ -937,13 +933,17 @@
               try {
                 finishMerges(waitForMerges && !interrupted);
                 break;
-              } catch (ThreadInterruptedException tie) {
+              } catch (Throwable t) {
                 // by setting the interrupted status, the
                 // next call to finishMerges will pass false,
                 // so it will not wait
-                interrupted = true;
-                if (infoStream.isEnabled("IW")) {
-                  infoStream.message("IW", "interrupted while waiting for merges to finish");
+                if (Thread.interrupted()) {
+                  interrupted = true;
+                  if (infoStream.isEnabled("IW")) {
+                    infoStream.message("IW", "interrupted while waiting for merges to finish");
+                  }
+                } else {
+                  throw new RuntimeException(t);
                 }
               }
             }
@@ -3846,7 +3846,8 @@
     try {
       wait(1000);
     } catch (InterruptedException ie) {
-      throw new ThreadInterruptedException(ie);
+      Thread.currentThread().interrupt();
+      throw new RuntimeException(ie);
     }
   }
 
Index: lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java	(working copy)
@@ -20,7 +20,6 @@
 import java.util.Map;
 
 import org.apache.lucene.index.DocumentsWriterPerThreadPool.ThreadState;
-import org.apache.lucene.util.ThreadInterruptedException;
 
 /**
  * Controls the health status of a {@link DocumentsWriter} sessions. This class
@@ -74,7 +73,8 @@
             wait();
             assert  decrWaiters();
           } catch (InterruptedException e) {
-            throw new ThreadInterruptedException(e);
+            Thread.currentThread().interrupt();
+            throw new RuntimeException(e);
           }
         }
       }
Index: lucene/core/src/java/org/apache/lucene/util/ThreadInterruptedException.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/util/ThreadInterruptedException.java	(revision 1427796)
+++ lucene/core/src/java/org/apache/lucene/util/ThreadInterruptedException.java	(working copy)
@@ -1,30 +0,0 @@
-package org.apache.lucene.util;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Thrown by lucene on detecting that Thread.interrupt() had
- * been called.  Unlike Java's InterruptedException, this
- * exception is not checked..
- */
-
-public final class ThreadInterruptedException extends RuntimeException {
-  public ThreadInterruptedException(InterruptedException ie) {
-    super(ie);
-  }
-}
Index: lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/EnwikiContentSource.java
===================================================================
--- lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/EnwikiContentSource.java	(revision 1427796)
+++ lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/EnwikiContentSource.java	(working copy)
@@ -30,7 +30,6 @@
 
 import org.apache.lucene.benchmark.byTask.utils.Config;
 import org.apache.lucene.benchmark.byTask.utils.StreamUtils;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.lucene.util.IOUtils;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
@@ -75,7 +74,8 @@
           try {
             wait();
           } catch (InterruptedException ie) {
-            throw new ThreadInterruptedException(ie);
+            Thread.currentThread().interrupt();
+            throw new RuntimeException(ie);
           }
         }
         if (tuple != null) {
@@ -137,7 +137,8 @@
                 try {
                   wait();
                 } catch (InterruptedException ie) {
-                  throw new ThreadInterruptedException(ie);
+                  Thread.currentThread().interrupt();
+                  throw new RuntimeException(ie);
                 }
               }
               tuple = tmpTuple;
Index: solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java
===================================================================
--- solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java	(revision 1427796)
+++ solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java	(working copy)
@@ -30,7 +30,6 @@
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.InfoStream;
 import org.apache.lucene.util.PrintStreamInfoStream;
-import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.schema.IndexSchema;
 import org.slf4j.Logger;
@@ -140,24 +139,16 @@
     Directory directory = getDirectory();
     final InfoStream infoStream = isClosed ? null : getConfig().getInfoStream();
     try {
-      while (true) {
+      super.close();
+    } catch (Throwable t) {
+      log.error("Error closing IndexWriter, trying rollback", t);
+      super.rollback();
+      if (IndexWriter.isLocked(directory)) {
         try {
-          super.close();
-        } catch (ThreadInterruptedException e) {
-          // don't allow interruption
-          continue;
-        } catch (Throwable t) {
-          log.error("Error closing IndexWriter, trying rollback", t);
-          super.rollback();
+          IndexWriter.unlock(directory);
+        } catch (Throwable tt) {
+          log.error("Coud not unlock directory after seemingly failed IndexWriter#close()", tt);
         }
-        if (IndexWriter.isLocked(directory)) {
-          try {
-            IndexWriter.unlock(directory);
-          } catch (Throwable t) {
-            log.error("Coud not unlock directory after seemingly failed IndexWriter#close()", t);
-          }
-        }
-        break;
       }
     } finally {
       if (infoStream != null) {
@@ -175,15 +166,7 @@
   @Override
   public void rollback() throws IOException {
     try {
-      while (true) {
-        try {
-          super.rollback();
-        } catch (ThreadInterruptedException e) {
-          // don't allow interruption
-          continue;
-        }
-        break;
-      }
+      super.rollback();
     } finally {
       isClosed = true;
       directoryFactory.release(getDirectory());
