diff --git a/splice.cabal b/splice.cabal
--- a/splice.cabal
+++ b/splice.cabal
@@ -1,6 +1,6 @@
 name:          splice
-version:       0.4
-stability:     stable on GNU/Linux, experimental on other operating systems
+version:       0.5
+stability:     stable on all operating systems
 synopsis:      Socket to Socket Data Splicing (supports all operating systems)
 description:   A library that implements most efficient socket to socket
                data transfer loops for proxy servers on each operating system.
diff --git a/src/Network/Socket/Splice.hs b/src/Network/Socket/Splice.hs
--- a/src/Network/Socket/Splice.hs
+++ b/src/Network/Socket/Splice.hs
@@ -18,7 +18,7 @@
 -- License     : BSD3
 -- Maintainer  : fusion@corsis.eu
 -- Stability   : stable
--- Portability : GHC-only, works on all operating systems
+-- Portability : works on all operating systems
 
 module Network.Socket.Splice (
 
diff --git a/src/Network/Socket/Splice/Internal.hsc b/src/Network/Socket/Splice/Internal.hsc
--- a/src/Network/Socket/Splice/Internal.hsc
+++ b/src/Network/Socket/Splice/Internal.hsc
@@ -5,7 +5,7 @@
 -- License     : BSD3
 -- Maintainer  : fusion@corsis.eu
 -- Stability   : stable
--- Portability : GHC-only, works on all operating systems
+-- Portability : works on all operating systems
 
 
 #ifdef LINUX_SPLICE
@@ -27,8 +27,12 @@
 
        [Initiate bi-directional continuous data transfer between two sockets:]
     
-       > void . forkIO . try_ $ splice 1024 (sourceSocket, _) (targetSocket, _)
-       > void . forkIO . try_ $ splice 1024 (targetSocket, _) (sourceSocket, _)
+       > void . forkIO . tryWith handler $ splice 1024 (sourceSocket, _) (targetSocket, _)
+       > void . forkIO . tryWith handler $ splice 1024 (targetSocket, _) (sourceSocket, _)
+
+       where @handler@ is an IO action that would do the necessary clean up –
+       such as ensuring the sockets are closed and any resources that may be
+       associated with the sockets are properly disposed of. 
   -}
 
     splice
@@ -36,6 +40,7 @@
   , zeroCopy
 
   -- * Combinators for Exception Handling
+  , tryWith
   , try_
 
   -- * Implementation Primitives
@@ -192,7 +197,7 @@
 hSplice len s t = do
 
   sb <- hGetBuffering s; hSetBuffering s NoBuffering
-  tb <- hGetBuffering s; hSetBuffering t NoBuffering
+  tb <- hGetBuffering t; hSetBuffering t NoBuffering
   a  <- mallocBytes len :: IO (Ptr Word8)
 
   finally
@@ -205,6 +210,15 @@
         try_ $ hSetBuffering s sb
         try_ $ hSetBuffering s tb)
 
+
+-- | Similar to 'Control.Exception.Base.try' but used when an obvious exception
+--   is expected and can be handled easily. Unlike 'finally' exceptions are
+--   not rethrown once handled.
+tryWith
+  :: (SomeException -> IO a) -- ^ exception handler.
+  -> IO a  -- ^ action to run which can throw /any/ exception.
+  -> IO a  -- ^ new action where all exceptions are handled by a single.
+tryWith h a = try a >>= \r -> case r of Left x -> h x; Right y -> return y
 
 
 -- | Similar to 'Control.Exception.Base.try' but used when an obvious exception
diff --git a/src/System/IO/Splice/Linux.hsc b/src/System/IO/Splice/Linux.hsc
--- a/src/System/IO/Splice/Linux.hsc
+++ b/src/System/IO/Splice/Linux.hsc
@@ -1,6 +1,6 @@
-{- | Exposes the GNU\/Linux system call @splice()@.
+{- | Exposes the GNU\/Linux system call @splice()@: <http://kerneltrap.org/node/6505>.
 
-     /This module is only available (compiled & exposed) on Linux./
+     /This module is only available (compiled & exposed) on GNU/\//Linux./
 -}
 --  
 -- Module      : System.IO.Splice.Linux
@@ -37,8 +37,8 @@
 type ChunkSize = (#type size_t)
 
 -- | Moves data between two file descriptors without copying between kernel
---   address space and user address space. It transfers up to 'len' bytes of
---   data from the file descriptor 'fd_in' to the file descriptor 'fd_out',
+--   address space and user address space. It transfers up to @len@ bytes of
+--   data from the file descriptor @fd_in@ to the file descriptor @fd_out@,
 --   where one of the descriptors must refer to a pipe.
 --
 --   'c_splice' is /NOT/ a loop and needs to be called repeatedly.
@@ -64,7 +64,7 @@
 
 
 -- | More data will be coming in a subsequent 'c_splice'. This is a helpful hint
---   when 'fd_out' refers to a socket.
+--   when @fd_out@ refers to a socket.
 sPLICE_F_MORE :: Word
 sPLICE_F_MORE = (#const "SPLICE_F_MORE")
 
