diff --git a/Network/Wai/Handler/Warp/Recv.hs b/Network/Wai/Handler/Warp/Recv.hs
--- a/Network/Wai/Handler/Warp/Recv.hs
+++ b/Network/Wai/Handler/Warp/Recv.hs
@@ -21,6 +21,7 @@
 
 #ifdef mingw32_HOST_OS
 import GHC.IO.FD (FD(..), readRawBufferPtr)
+import Network.Wai.Handler.Warp.Windows
 #endif
 
 ----------------------------------------------------------------
@@ -47,7 +48,7 @@
 #endif
 receiveloop sock buf size = do
 #ifdef mingw32_HOST_OS
-    bytes <- fmap fromIntegral $ readRawBufferPtr "recv" (FD sock 1) buf 0 size
+    bytes <- windowsThreadBlockHack $ fmap fromIntegral $ readRawBufferPtr "recv" (FD sock 1) buf 0 size
 #else
     bytes <- c_recv sock buf size 0
 #endif
diff --git a/Network/Wai/Handler/Warp/Run.hs b/Network/Wai/Handler/Warp/Run.hs
--- a/Network/Wai/Handler/Warp/Run.hs
+++ b/Network/Wai/Handler/Warp/Run.hs
@@ -23,7 +23,7 @@
 #define bindPortTCP bindPort
 #endif
 import Network (sClose, Socket)
-import Network.Socket (accept, SockAddr)
+import Network.Socket (accept, withSocketsDo, SockAddr)
 import qualified Network.Socket.ByteString as Sock
 import Network.Wai
 import qualified Network.Wai.Handler.Warp.Date as D
@@ -40,9 +40,7 @@
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
 
 #if WINDOWS
-import qualified Control.Concurrent.MVar as MV
-import Network.Socket (withSocketsDo)
-import Control.Concurrent (forkIO)
+import Network.Wai.Handler.Warp.Windows
 #else
 import System.Posix.IO (FdOption(CloseOnExec), setFdOption)
 import Network.Socket (fdSocket)
@@ -77,26 +75,13 @@
 
 -- | Run an 'Application' with the given 'Settings'.
 runSettings :: Settings -> Application -> IO ()
-#if WINDOWS
-runSettings set app = withSocketsDo $ do
-    var <- MV.newMVar Nothing
-    let clean = MV.modifyMVar_ var $ \s -> maybe (return ()) sClose s >> return Nothing
-    void . forkIO $ bracket
-        (bindPortTCP (settingsPort set) (settingsHost set))
-        (const clean)
-        (\s -> do
-            MV.modifyMVar_ var (\_ -> return $ Just s)
-            runSettingsSocket set s app)
-    forever (threadDelay maxBound) `finally` clean
-#else
-runSettings set app =
+runSettings set app = withSocketsDo $
     bracket
         (bindPortTCP (settingsPort set) (settingsHost set))
         sClose
         (\socket -> do
             setSocketCloseOnExec socket
             runSettingsSocket set socket app)
-#endif
 
 -- | Same as 'runSettings', but uses a user-supplied socket instead of opening
 -- one. This allows the user to provide, for example, Unix named socket, which
@@ -109,7 +94,11 @@
     runSettingsConnection set getConn app
   where
     getConn = do
+#if WINDOWS
+        (s, sa) <- windowsThreadBlockHack $ accept socket
+#else
         (s, sa) <- accept socket
+#endif
         setSocketCloseOnExec s
         conn <- socketConnection s
         return (conn, sa)
diff --git a/Network/Wai/Handler/Warp/Windows.hs b/Network/Wai/Handler/Warp/Windows.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Handler/Warp/Windows.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE CPP #-}
+module Network.Wai.Handler.Warp.Windows
+  ( windowsThreadBlockHack
+  ) where
+
+#if WINDOWS
+import Control.Exception
+import Control.Concurrent.MVar
+import Control.Concurrent
+import Control.Monad
+
+windowsThreadBlockHack :: IO a -> IO a
+windowsThreadBlockHack act = 
+  do
+    var <- newEmptyMVar :: IO (MVar (Either SomeException a))
+    void . forkIO $ try act >>= putMVar var
+    res <- takeMVar var
+    case res of
+      Left  e -> throwIO e
+      Right r -> return r
+#else
+windowsThreadBlockHack :: IO a -> IO a
+windowsThreadBlockHack = id
+#endif
diff --git a/test/RunSpec.hs b/test/RunSpec.hs
--- a/test/RunSpec.hs
+++ b/test/RunSpec.hs
@@ -77,6 +77,7 @@
 
 nextPort :: I.IORef Int
 nextPort = unsafePerformIO $ I.newIORef 5000
+{-# NOINLINE nextPort #-}
 
 getPort :: IO Int
 getPort = do
diff --git a/warp.cabal b/warp.cabal
--- a/warp.cabal
+++ b/warp.cabal
@@ -1,5 +1,5 @@
 Name:                warp
-Version:             2.1.5
+Version:             2.1.5.1
 Synopsis:            A fast, light-weight web server for WAI applications.
 License:             MIT
 License-file:        LICENSE
@@ -81,6 +81,7 @@
                      Network.Wai.Handler.Warp.Settings
                      Network.Wai.Handler.Warp.Thread
                      Network.Wai.Handler.Warp.Types
+                     Network.Wai.Handler.Warp.Windows
                      Paths_warp
   Ghc-Options:       -Wall
 
