diff --git a/silently.cabal b/silently.cabal
--- a/silently.cabal
+++ b/silently.cabal
@@ -1,5 +1,5 @@
 name: silently
-version: 1.1.3
+version: 1.1.4
 cabal-version: >= 1.2
 build-type: Simple
 license: BSD3
diff --git a/src/other/System/IO/Silently.hs b/src/other/System/IO/Silently.hs
--- a/src/other/System/IO/Silently.hs
+++ b/src/other/System/IO/Silently.hs
@@ -32,11 +32,7 @@
   prepareAndRun (_,tmpHandle) = go handles
     where
       go []     = action
-      go (h:hs) = bracket (do old <- hDuplicate h
-                              hDuplicateTo tmpHandle h
-                              return old)
-                          (\old -> hDuplicateTo old h)
-                          (\_   -> go hs)
+      go hs = goBracket go tmpHandle hs
 
 
 getTempOrCurrentDirectory :: IO String
@@ -61,18 +57,20 @@
     removeFile tmpFile
   prepareAndRun (tmpFile,tmpHandle) = go handles
     where
-      go []     = do
-                 a <- action
-                 hClose tmpHandle
-                 str <- readFile tmpFile
-                 forceList str
-                 return (str,a)
-      go (h:hs) = bracket (do old <- hDuplicate h
-                              hDuplicateTo tmpHandle h
-                              return old)
-                          (\old -> hDuplicateTo old h)
-                          (\_   -> go hs)
+      go [] = do
+              a <- action
+              hClose tmpHandle
+              str <- readFile tmpFile
+              forceList str
+              return (str,a)
+      go hs = goBracket go tmpHandle hs
 
 forceList [] = return ()
 forceList (x:xs) = forceList xs
 
+goBracket :: ([Handle] -> IO a) -> Handle -> [Handle] -> IO a
+goBracket go tmpHandle (h:hs) = bracket (do old <- hDuplicate h
+                                            hDuplicateTo tmpHandle h
+                                            return old)
+                                        (\old -> hDuplicateTo old h >> hClose old)
+                                        (\_   -> go hs)
diff --git a/src/unix/System/IO/Silently.hs b/src/unix/System/IO/Silently.hs
--- a/src/unix/System/IO/Silently.hs
+++ b/src/unix/System/IO/Silently.hs
@@ -24,12 +24,8 @@
  where
   prepareAndRun tmpHandle = go handles
     where
-      go []     = action
-      go (h:hs) = bracket (do old <- hDuplicate h
-                              hDuplicateTo tmpHandle h
-                              return old)
-                          (\old -> hDuplicateTo old h)
-                          (\_   -> go hs)
+      go [] = action
+      go hs = goBracket go tmpHandle hs
 
 
 getTempOrCurrentDirectory :: IO String
@@ -54,13 +50,16 @@
     removeFile tmpFile
   prepareAndRun (tmpFile,tmpHandle) = go handles
     where
-      go []     = do
-                 a <- action
-                 hClose tmpHandle
-                 str <- readFile tmpFile
-                 return (str,a)
-      go (h:hs) = bracket (do old <- hDuplicate h
-                              hDuplicateTo tmpHandle h
-                              return old)
-                          (\old -> hDuplicateTo old h)
-                          (\_   -> go hs)
+      go [] = do
+              a <- action
+              hClose tmpHandle
+              str <- readFile tmpFile
+              return (str,a)
+      go hs = goBracket go tmpHandle hs
+
+goBracket :: ([Handle] -> IO a) -> Handle -> [Handle] -> IO a
+goBracket go tmpHandle (h:hs) = bracket (do old <- hDuplicate h
+                                            hDuplicateTo tmpHandle h
+                                            return old)
+                                        (\old -> hDuplicateTo old h >> hClose old)
+                                        (\_   -> go hs)
diff --git a/src/windows/System/IO/Silently.hs b/src/windows/System/IO/Silently.hs
--- a/src/windows/System/IO/Silently.hs
+++ b/src/windows/System/IO/Silently.hs
@@ -24,12 +24,8 @@
  where
   prepareAndRun tmpHandle = go handles
     where
-      go []     = action
-      go (h:hs) = bracket (do old <- hDuplicate h
-                              hDuplicateTo tmpHandle h
-                              return old)
-                          (\old -> hDuplicateTo old h)
-                          (\_   -> go hs)
+      go [] = action
+      go hs = goBracket go tmpHandle hs
 
 
 getTempOrCurrentDirectory :: IO String
@@ -54,17 +50,20 @@
     removeFile tmpFile
   prepareAndRun (tmpFile,tmpHandle) = go handles
     where
-      go []     = do
-                 a <- action
-                 hClose tmpHandle
-                 str <- readFile tmpFile
-                 forceList str
-                 return (str,a)
-      go (h:hs) = bracket (do old <- hDuplicate h
-                              hDuplicateTo tmpHandle h
-                              return old)
-                          (\old -> hDuplicateTo old h)
-                          (\_   -> go hs)
+      go [] = do
+              a <- action
+              hClose tmpHandle
+              str <- readFile tmpFile
+              forceList str
+              return (str,a)
+      go hs = goBracket go tmpHandle hs
 
 forceList [] = return ()
 forceList (x:xs) = forceList xs
+
+goBracket :: ([Handle] -> IO a) -> Handle -> [Handle] -> IO a
+goBracket go tmpHandle (h:hs) = bracket (do old <- hDuplicate h
+                                            hDuplicateTo tmpHandle h
+                                            return old)
+                                        (\old -> hDuplicateTo old h >> hClose old)
+                                        (\_   -> go hs)
