diff --git a/Network/Wai/Handler/Warp/FdCache.hs b/Network/Wai/Handler/Warp/FdCache.hs
--- a/Network/Wai/Handler/Warp/FdCache.hs
+++ b/Network/Wai/Handler/Warp/FdCache.hs
@@ -114,7 +114,7 @@
     getFd' Nothing = do
         ent@(FdEntry _ fd mst) <- newFdEntry path
         update mfc (insert key ent)
-        return $ (fd, refresh mst)
+        return (fd, refresh mst)
     getFd' (Just (FdEntry _ fd mst)) = do
         refresh mst
-        return $ (fd, refresh mst)
+        return (fd, refresh mst)
diff --git a/Network/Wai/Handler/Warp/Response.hs b/Network/Wai/Handler/Warp/Response.hs
--- a/Network/Wai/Handler/Warp/Response.hs
+++ b/Network/Wai/Handler/Warp/Response.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE CPP #-}
 
 module Network.Wai.Handler.Warp.Response (
@@ -51,18 +50,18 @@
 
     sendResponse' (Right (lengthyHeaders, cl))
       | hasBody s req = liftIO $ do
+          lheader <- composeHeader version s lengthyHeaders
           connSendFile conn path beg end (T.tickle th) [lheader] cleaner
           T.tickle th
           return isPersist
       | otherwise = liftIO $ do
-          connSendAll conn $ composeHeader version s hs
+          composeHeader version s hs >>= connSendAll conn
           T.tickle th
           return isPersist -- FIXME isKeepAlive?
       where
         (beg,end) = case mpart of
             Nothing  -> (0,cl)
             Just prt -> (filePartOffset prt, filePartByteCount prt)
-        lheader = composeHeader version s lengthyHeaders
         version = httpVersion req
         (isPersist,_) = infoFromRequest req
 
@@ -75,21 +74,21 @@
 
 sendResponse cleaner req conn (ResponseBuilder s hs b)
   | hasBody s req = liftIO $ do
+      header <- composeHeaderBuilder version s hs needsChunked
+      let body
+            | needsChunked = header `mappend` chunkedTransferEncoding b
+                                    `mappend` chunkedTransferTerminator
+            | otherwise    = header `mappend` b
       flip toByteStringIO body $ \bs -> do
           connSendAll conn bs
           T.tickle th
       return isKeepAlive
   | otherwise = liftIO $ do
-      connSendAll conn $ composeHeader version s hs
+      composeHeader version s hs >>= connSendAll conn
       T.tickle th
       return isPersist
   where
     th = threadHandle cleaner
-    header = composeHeaderBuilder version s hs needsChunked
-    body
-      | needsChunked = header `mappend` chunkedTransferEncoding b
-                              `mappend` chunkedTransferTerminator
-      | otherwise    = header `mappend` b
     version = httpVersion req
     reqinfo@(isPersist,_) = infoFromRequest req
     (isKeepAlive, needsChunked) = infoFromResponse hs reqinfo
@@ -98,16 +97,16 @@
 
 sendResponse cleaner req conn (ResponseSource s hs bodyFlush)
   | hasBody s req = do
+      header <- liftIO $ composeHeaderBuilder version s hs needsChunked
       let src = CL.sourceList [header] `mappend` cbody
       src $$ builderToByteString =$ connSink conn th
       return isKeepAlive
   | otherwise = liftIO $ do
-      connSendAll conn $ composeHeader version s hs
+      composeHeader version s hs >>= connSendAll conn
       T.tickle th
       return isPersist
   where
     th = threadHandle cleaner
-    header = composeHeaderBuilder version s hs needsChunked
     body = mapOutput (\x -> case x of
                     Flush -> flush
                     Chunk builder -> builder) bodyFlush
@@ -205,11 +204,11 @@
 
 ----------------------------------------------------------------
 
-composeHeader :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> ByteString
+composeHeader :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> IO ByteString
 composeHeader version s hs = RH.composeHeader version s (addServerHeader hs)
 
-composeHeaderBuilder :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> Bool -> Builder
+composeHeaderBuilder :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> Bool -> IO Builder
 composeHeaderBuilder ver s hs True =
-    fromByteString $ composeHeader ver s (addEncodingHeader hs)
+    fromByteString <$> composeHeader ver s (addEncodingHeader hs)
 composeHeaderBuilder ver s hs False =
-    fromByteString $ composeHeader ver s hs
+    fromByteString <$> composeHeader ver s hs
diff --git a/Network/Wai/Handler/Warp/ResponseHeader.hs b/Network/Wai/Handler/Warp/ResponseHeader.hs
--- a/Network/Wai/Handler/Warp/ResponseHeader.hs
+++ b/Network/Wai/Handler/Warp/ResponseHeader.hs
@@ -6,7 +6,7 @@
 import Control.Monad
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as S
-import Data.ByteString.Internal (ByteString(..), unsafeCreate, memcpy)
+import Data.ByteString.Internal (ByteString(..), create, memcpy)
 import qualified Data.CaseInsensitive as CI
 import Data.List (foldl')
 import Data.Word (Word8)
@@ -17,8 +17,8 @@
 
 ----------------------------------------------------------------
 
-composeHeader :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> ByteString
-composeHeader !httpversion !status !responseHeaders = unsafeCreate len $ \ptr -> do
+composeHeader :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> IO ByteString
+composeHeader !httpversion !status !responseHeaders = create len $ \ptr -> do
     ptr1 <- copyStatus ptr httpversion status
     ptr2 <- copyHeaders ptr1 responseHeaders
     void $ copyCRLF ptr2
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
@@ -1,6 +1,5 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE CPP #-}
 
 module Network.Wai.Handler.Warp.Run where
 
@@ -154,7 +153,7 @@
                     restore $ serveConnection set cleaner port app conn addr
                     cleanup
                 cleanup = connClose conn >> T.cancel th >> onClose
-            handle onE $ (serve `onException` cleanup)
+            handle onE (serve `onException` cleanup)
   where
     -- FIXME: only IOEception is caught. What about other exceptions?
     getConnLoop = getConn `catch` \(e :: IOException) -> do
diff --git a/Network/Wai/Handler/Warp/Timeout.hs b/Network/Wai/Handler/Warp/Timeout.hs
--- a/Network/Wai/Handler/Warp/Timeout.hs
+++ b/Network/Wai/Handler/Warp/Timeout.hs
@@ -14,8 +14,7 @@
 
 import Control.Concurrent (forkIO, threadDelay, myThreadId, killThread)
 import qualified Control.Exception as E
-import Control.Monad (forever)
-import Control.Monad (void)
+import Control.Monad (forever, void)
 import qualified Data.IORef as I
 import System.IO.Unsafe (unsafePerformIO)
 
diff --git a/warp.cabal b/warp.cabal
--- a/warp.cabal
+++ b/warp.cabal
@@ -1,5 +1,5 @@
 Name:                warp
-Version:             1.3.4.1
+Version:             1.3.4.2
 Synopsis:            A fast, light-weight web server for WAI applications.
 License:             MIT
 License-file:        LICENSE
