diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
--- a/AUTHORS
+++ /dev/null
@@ -1,3 +0,0 @@
-Renzo Carbonara
-Gabriel Gonzalez
-Paolo Capriotti
diff --git a/PEOPLE b/PEOPLE
new file mode 100644
--- /dev/null
+++ b/PEOPLE
@@ -0,0 +1,7 @@
+The following people have participated in creating this library, either
+by directly contributing code or by providing thoughtful input in
+discussions about the library design.
+
+Renzo Carbonara
+Gabriel Gonzalez
+Paolo Capriotti
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -9,5 +9,5 @@
 license**. Read the file named ``LICENSE`` found in this same directory
 for details.
 
-See the ``AUTHORS`` file to learn about the people involved in this
+See the ``PEOPLE`` file to learn about the people involved in this
 effort.
diff --git a/pipes-network.cabal b/pipes-network.cabal
--- a/pipes-network.cabal
+++ b/pipes-network.cabal
@@ -1,19 +1,19 @@
-name: pipes-network
-version: 0.1.0.1
-license: BSD3
-license-file: LICENSE
-copyright: Copyright (c) Renzo Carbonara 2012-2013, Paolo Capriotti 2012-2012.
-author: Renzo Carbonara
-maintainer: renzocarbonaraλgmail.com
-stability: Experimental
-tested-with: GHC == 7.4.1
-homepage: https://github.com/k0001/pipes-network
-bug-reports: https://github.com/k0001/pipes-network/issues
-category: Control, Pipes, Network
-build-type: Simple
-synopsis: Use network sockets together with the pipes library.
-cabal-version: >=1.8
-extra-source-files: README.md AUTHORS
+name:               pipes-network
+version:            0.1.1.0
+license:            BSD3
+license-file:       LICENSE
+copyright:          Copyright (c) Renzo Carbonara 2012-2013, Paolo Capriotti 2012-2012.
+author:             Renzo Carbonara
+maintainer:         renzocarbonaraλgmail.com
+stability:          Experimental
+tested-with:        GHC == 7.4.1
+homepage:           https://github.com/k0001/pipes-network
+bug-reports:        https://github.com/k0001/pipes-network/issues
+category:           Pipes, Network
+build-type:         Simple
+synopsis:           Use network sockets together with the pipes library.
+cabal-version:      >=1.8
+extra-source-files: README.md PEOPLE
 description:
   Use network sockets together with the @pipes@ library.
   .
@@ -34,18 +34,20 @@
 library
     hs-source-dirs: src
     build-depends:
-        base (== 4.*),
-        bytestring (>= 0.9.2.1),
+        base           (==4.*),
+        bytestring     (>=0.9.2.1),
         network,
-        pipes (>=3.1 && <3.3),
-        pipes-safe (>=1.0),
-        transformers (>= 0.2 && < 0.4)
+        network-simple (>=0.1 && <0.2),
+        pipes          (>=3.1 && <3.3),
+        pipes-safe     (>=1.0),
+        transformers   (>=0.2 && <0.4)
     exposed-modules:
-        Control.Proxy.Network.Internal
         Control.Proxy.TCP
         Control.Proxy.TCP.Sync
         Control.Proxy.TCP.Safe
         Control.Proxy.TCP.Safe.Sync
+    other-modules:
+        Control.Proxy.Network.Internal
     ghc-options: -Wall -fno-warn-unused-do-bind
 
 test-suite simple
diff --git a/src/Control/Proxy/Network/Internal.hs b/src/Control/Proxy/Network/Internal.hs
--- a/src/Control/Proxy/Network/Internal.hs
+++ b/src/Control/Proxy/Network/Internal.hs
@@ -3,53 +3,16 @@
 
 -- | This module doesn't belong to this namespace, but really, I don't
 -- know where it belongs. Suggestions welcome.
-
--- Some code in this file was adapted from the @network-conduit@ library by
--- Michael Snoyman. Copyright (c) 2011. See its licensing terms (BSD3) at:
---   https://github.com/snoyberg/conduit/blob/master/network-conduit/LICENSE
+--
+-- There's a @data-timeout@ package, maybe we should depend on that.
 
 module Control.Proxy.Network.Internal (
-  HostPreference(..),
-  hpHostName,
   Timeout(..)
   ) where
 
 import qualified Control.Exception             as E
-import           Data.String                   (IsString (fromString))
 import           Data.Typeable                 (Typeable)
-import qualified Network.Socket as             NS
 
--- | Preferred host to bind.
-data HostPreference
-  = HostAny          -- ^Any available host.
-  | HostIPv4         -- ^Any available IPv4 host.
-  | HostIPv6         -- ^Any available IPv6 host.
-  | Host NS.HostName -- ^An explicit host name.
-  deriving (Eq, Ord, Show, Read)
-
-
--- | The following special values are recognized:
---
--- * @*@ means 'HostAny'
---
--- * @*4@ means 'HostIPv4'
---
--- * @*6@ means 'HostIPv6'
---
--- * Any other string is 'Host'
-instance IsString HostPreference where
-  fromString "*"  = HostAny
-  fromString "*4" = HostIPv4
-  fromString "*6" = HostIPv6
-  fromString s    = Host s
-
-
--- | Extract the 'NS.HostName' from a 'Host' preference, or 'Nothing' otherwise.
-hpHostName:: HostPreference -> Maybe NS.HostName
-hpHostName (Host s) = Just s
-hpHostName _        = Nothing
-
---------------------------------------------------------------------------------
 
 -- |Exception thrown when a timeout has elapsed.
 data Timeout
diff --git a/src/Control/Proxy/TCP.hs b/src/Control/Proxy/TCP.hs
--- a/src/Control/Proxy/TCP.hs
+++ b/src/Control/Proxy/TCP.hs
@@ -4,46 +4,43 @@
 -- Instead, if want to safely acquire and release resources within the
 -- pipeline itself, then you should use the functions exported by
 -- "Control.Proxy.TCP.Safe".
+--
+-- This module re-exports many functions from "Network.Simple.TCP"
+-- module in the @network-simple@ package. You might refer to that
+-- module for more documentation.
 
--- Some code in this file was adapted from the @network-conduit@ library by
--- Michael Snoyman. Copyright (c) 2011. See its licensing terms (BSD3) at:
---   https://github.com/snoyberg/conduit/blob/master/network-conduit/LICENSE
 
 module Control.Proxy.TCP (
   -- * Server side
   -- $server-side
-  serve,
-  serveFork,
+    S.serve
+  , S.serveFork
   -- ** Listening
-  listen,
+  , S.listen
   -- ** Accepting
-  accept,
-  acceptFork,
+  , S.accept
+  , S.acceptFork
 
   -- * Client side
   -- $client-side
-  connect,
+  , S.connect
 
   -- * Socket streams
   -- $socket-streaming
-  socketReadS,
-  nsocketReadS,
-  socketWriteD,
+  , socketReadS
+  , nsocketReadS
+  , socketWriteD
   -- ** Timeouts
   -- $socket-streaming-timeout
-  socketReadTimeoutS,
-  nsocketReadTimeoutS,
-  socketWriteTimeoutD,
-  -- * Low level support
-  bindSock,
-  connectSock,
+  , socketReadTimeoutS
+  , nsocketReadTimeoutS
+  , socketWriteTimeoutD
+
   -- * Exports
-  HostPreference(..),
-  Timeout(..)
+  , S.HostPreference(..)
+  , Timeout(..)
   ) where
 
-import           Control.Concurrent             (ThreadId, forkIO)
-import qualified Control.Exception              as E
 import           Control.Monad
 import           Control.Monad.Trans.Class
 import qualified Control.Proxy                  as P
@@ -51,9 +48,9 @@
 import           Control.Proxy.Network.Internal
 import qualified Data.ByteString                as B
 import           Data.Monoid
-import           Data.List                      (partition)
 import qualified Network.Socket                 as NS
 import           Network.Socket.ByteString      (recv, sendAll)
+import qualified Network.Simple.TCP             as S
 import           System.Timeout                 (timeout)
 
 --------------------------------------------------------------------------------
@@ -71,21 +68,6 @@
 -- >   -- possibly with any of the socketReadS, nsocketReadS or socketWriteD
 -- >   -- proxies explained below.
 
--- | Connect to a TCP server and use the connection.
---
--- The connection socket is closed when done or in case of exceptions.
---
--- If you prefer to acquire and close the socket yourself, then use
--- 'connectSock' and the 'NS.sClose' function from "Network.Socket" instead.
-connect
-  :: NS.HostName      -- ^Server hostname.
-  -> NS.ServiceName   -- ^Server service port.
-  -> ((NS.Socket, NS.SockAddr) -> IO r)
-                      -- ^Computation taking the communication socket
-                      -- and the server address.
-  -> IO r
-connect host port = E.bracket (connectSock host port) (NS.sClose . fst)
-
 --------------------------------------------------------------------------------
 
 -- $server-side
@@ -109,99 +91,6 @@
 -- example using a pretty general approach, you are encouraged to use simpler
 -- approaches such as 'serve' if those suit your needs.
 
--- | Bind a TCP listening socket and use it.
---
--- The listening socket is closed when done or in case of exceptions.
---
--- If you prefer to acquire and close the socket yourself, then use
--- 'bindSock' and the 'NS.listen' and 'NS.sClose' functions from
--- "Network.Socket" instead.
---
--- Note: 'N.maxListenQueue' is tipically 128, which is too small for high
--- performance servers. So, we use the maximum between 'N.maxListenQueue' and
--- 2048 as the default size of the listening queue.
-listen
-  :: HostPreference   -- ^Preferred host to bind.
-  -> NS.ServiceName   -- ^Service port to bind.
-  -> ((NS.Socket, NS.SockAddr) -> IO r)
-                      -- ^Computation taking the listening socket and
-                      -- the address it's bound to.
-  -> IO r
-listen hp port = E.bracket listen' (NS.sClose . fst)
-  where
-    listen' = do x@(bsock,_) <- bindSock hp port
-                 NS.listen bsock $ max 2048 NS.maxListenQueue
-                 return x
-
--- | Start a TCP server that sequentially accepts and uses each incoming
--- connection.
---
--- Both the listening and connection sockets are closed when done or in case of
--- exceptions.
---
--- Note: You don't need to use 'listen' nor 'accept' if you use this function.
-serve
-  :: HostPreference   -- ^Preferred host to bind.
-  -> NS.ServiceName   -- ^Service port to bind.
-  -> ((NS.Socket, NS.SockAddr) -> IO r)
-                      -- ^Computation to run once an incoming
-                      -- connection is accepted. Takes the connection socket
-                      -- and remote end address.
-  -> IO r
-serve hp port k = do
-    listen hp port $ \(lsock,_) -> do
-      forever $ accept lsock k
-
--- | Start a TCP server that accepts incoming connections and uses them
--- concurrently in different threads.
---
--- The listening and connection sockets are closed when done or in case of
--- exceptions.
---
--- Note: You don't need to use 'listen' nor 'acceptFork' if you use this
--- function.
-serveFork
-  :: HostPreference   -- ^Preferred host to bind.
-  -> NS.ServiceName   -- ^Service port to bind.
-  -> ((NS.Socket, NS.SockAddr) -> IO ())
-                      -- ^Computation to run in a different thread
-                      -- once an incoming connection is accepted. Takes the
-                      -- connection socket and remote end address.
-  -> IO ()
-serveFork hp port k = do
-    listen hp port $ \(lsock,_) -> do
-      forever $ acceptFork lsock k
-
--- | Accept a single incoming connection and use it.
---
--- The connection socket is closed when done or in case of exceptions.
-accept
-  :: NS.Socket        -- ^Listening and bound socket.
-  -> ((NS.Socket, NS.SockAddr) -> IO b)
-                      -- ^Computation to run once an incoming
-                      -- connection is accepted. Takes the connection socket
-                      -- and remote end address.
-  -> IO b
-accept lsock k = do
-    conn@(csock,_) <- NS.accept lsock
-    E.finally (k conn) (NS.sClose csock)
-{-# INLINABLE accept #-}
-
--- | Accept a single incoming connection and use it in a different thread.
---
--- The connection socket is closed when done or in case of exceptions.
-acceptFork
-  :: NS.Socket        -- ^Listening and bound socket.
-  -> ((NS.Socket, NS.SockAddr) -> IO ())
-                      -- ^Computation to run in a different thread
-                      -- once an incoming connection is accepted. Takes the
-                      -- connection socket and remote end address.
-  -> IO ThreadId
-acceptFork lsock f = do
-    client@(csock,_) <- NS.accept lsock
-    forkIO $ E.finally (f client) (NS.sClose csock)
-{-# INLINABLE acceptFork #-}
-
 --------------------------------------------------------------------------------
 
 -- $socket-streaming
@@ -312,74 +201,3 @@
     ex = Timeout $ "recv: " <> show wait <> " microseconds."
 {-# INLINABLE socketWriteTimeoutD #-}
 
---------------------------------------------------------------------------------
-
--- | Obtain a 'NS.Socket' connected to the given host and TCP service port.
---
--- The obtained 'NS.Socket' should be closed manually using 'NS.sClose' when
--- it's not needed anymore, otherwise you risk having the socket open for much
--- longer than needed.
---
--- Prefer to use 'connect' if you will be using the socket within a limited
--- scope and would like it to be closed immediately after its usage or in case
--- of exceptions.
-connectSock :: NS.HostName -> NS.ServiceName -> IO (NS.Socket, NS.SockAddr)
-connectSock host port = do
-    (addr:_) <- NS.getAddrInfo (Just hints) (Just host) (Just port)
-    E.bracketOnError (newSocket addr) NS.sClose $ \sock -> do
-       let sockAddr = NS.addrAddress addr
-       NS.connect sock sockAddr
-       return (sock, sockAddr)
-  where
-    hints = NS.defaultHints { NS.addrFlags = [NS.AI_ADDRCONFIG]
-                            , NS.addrSocketType = NS.Stream }
-
--- | Obtain a 'NS.Socket' bound to the given host name and TCP service port.
---
--- The obtained 'NS.Socket' should be closed manually using 'NS.sClose' when
--- it's not needed anymore.
---
--- Prefer to use 'listen' if you will be listening on this socket and using it
--- within a limited scope, and would like it to be closed immediately after its
--- usage or in case of exceptions.
-bindSock :: HostPreference -> NS.ServiceName -> IO (NS.Socket, NS.SockAddr)
-bindSock hp port = do
-    addrs <- NS.getAddrInfo (Just hints) (hpHostName hp) (Just port)
-    let addrs' = case hp of
-          HostIPv4 -> prioritize isIPv4addr addrs
-          HostIPv6 -> prioritize isIPv6addr addrs
-          _        -> addrs
-    tryAddrs addrs'
-  where
-    hints = NS.defaultHints { NS.addrFlags = [NS.AI_PASSIVE]
-                            , NS.addrSocketType = NS.Stream }
-
-    tryAddrs []     = error "bindSock: no addresses available"
-    tryAddrs [x]    = useAddr x
-    tryAddrs (x:xs) = E.catch (useAddr x)
-                              (\e -> let _ = e :: E.IOException in tryAddrs xs)
-
-    useAddr addr = E.bracketOnError (newSocket addr) NS.sClose $ \sock -> do
-      let sockAddr = NS.addrAddress addr
-      NS.setSocketOption sock NS.NoDelay 1
-      NS.setSocketOption sock NS.ReuseAddr 1
-      NS.bindSocket sock sockAddr
-      return (sock, sockAddr)
-
---------------------------------------------------------------------------------
-
--- Misc
-
-newSocket :: NS.AddrInfo -> IO NS.Socket
-newSocket addr = NS.socket (NS.addrFamily addr)
-                           (NS.addrSocketType addr)
-                           (NS.addrProtocol addr)
-
-isIPv4addr, isIPv6addr :: NS.AddrInfo -> Bool
-isIPv4addr x = NS.addrFamily x == NS.AF_INET
-isIPv6addr x = NS.addrFamily x == NS.AF_INET6
-
--- | Move the elements that match the predicate closer to the head of the list.
--- Preserve relative order.
-prioritize :: (a -> Bool) -> [a] -> [a]
-prioritize p = uncurry (++) . partition p
diff --git a/src/Control/Proxy/TCP/Safe.hs b/src/Control/Proxy/TCP/Safe.hs
--- a/src/Control/Proxy/TCP/Safe.hs
+++ b/src/Control/Proxy/TCP/Safe.hs
@@ -39,7 +39,7 @@
   socketWriteD,
 
   -- * Exports
-  HostPreference(..),
+  S.HostPreference(..),
   Timeout(..)
   ) where
 
@@ -48,12 +48,12 @@
 import           Control.Monad
 import qualified Control.Proxy                  as P
 import           Control.Proxy.Network.Internal
-import qualified Control.Proxy.TCP      as T
 import qualified Control.Proxy.Safe             as P
 import qualified Data.ByteString                as B
 import           Data.Monoid
 import qualified Network.Socket                 as NS
 import           Network.Socket.ByteString      (sendAll, recv)
+import qualified Network.Simple.TCP             as S
 import           System.Timeout                 (timeout)
 
 --------------------------------------------------------------------------------
@@ -79,7 +79,7 @@
 -- The connection socket is closed when done or in case of exceptions.
 --
 -- If you prefer to acquire close the socket yourself, then use
--- 'T.connectSock' and the 'NS.sClose' from "Network.Socket" instead.
+-- 'S.connectSock' and the 'NS.sClose' from "Network.Socket" instead.
 connect
   :: (P.Proxy p, Monad m)
   => (forall x. P.SafeIO x -> m x) -- ^Monad morphism.
@@ -91,7 +91,7 @@
                                    -- address.
   -> P.ExceptionP p a' a b' b m r
 connect morph host port =
-    P.bracket morph (T.connectSock host port) (NS.sClose . fst)
+    P.bracket morph (S.connectSock host port) (NS.sClose . fst)
 
 --------------------------------------------------------------------------------
 
@@ -180,7 +180,7 @@
 -- The listening socket is closed when done or in case of exceptions.
 --
 -- If you prefer to acquire and close the socket yourself, then use
--- 'T.bindSock' and the 'NS.listen' and 'NS.sClose' functions from
+-- 'S.bindSock' and the 'NS.listen' and 'NS.sClose' functions from
 -- "Network.Socket" instead.
 --
 -- Note: 'N.maxListenQueue' is tipically 128, which is too small for high
@@ -189,7 +189,7 @@
 listen
   :: (P.Proxy p, Monad m)
   => (forall x. P.SafeIO x -> m x) -- ^Monad morphism.
-  -> HostPreference                -- ^Preferred host to bind.
+  -> S.HostPreference              -- ^Preferred host to bind.
   -> NS.ServiceName                -- ^Service port to bind.
   -> ((NS.Socket, NS.SockAddr) -> P.ExceptionP p a' a b' b m r)
                                    -- ^Computation taking the listening
@@ -197,7 +197,7 @@
   -> P.ExceptionP p a' a b' b m r
 listen morph hp port = P.bracket morph listen' (NS.sClose . fst)
   where
-    listen' = do x@(bsock,_) <- T.bindSock hp port
+    listen' = do x@(bsock,_) <- S.bindSock hp port
                  NS.listen bsock $ max 2048 NS.maxListenQueue
                  return x
 
@@ -211,7 +211,7 @@
 serve
   :: (P.Proxy p, Monad m)
   => (forall x. P.SafeIO x -> m x) -- ^Monad morphism.
-  -> HostPreference                -- ^Preferred host to bind.
+  -> S.HostPreference              -- ^Preferred host to bind.
   -> NS.ServiceName                -- ^Service port to bind.
   -> ((NS.Socket, NS.SockAddr) -> P.ExceptionP p a' a b' b m r)
                                    -- ^Computation to run once an incoming
@@ -233,7 +233,7 @@
 serveFork
   :: (P.Proxy p, Monad m)
   => (forall x. P.SafeIO x -> m x) -- ^Monad morphism.
-  -> HostPreference                -- ^Preferred host to bind.
+  -> S.HostPreference              -- ^Preferred host to bind.
   -> NS.ServiceName                -- ^Service port to bind.
   -> ((NS.Socket, NS.SockAddr) -> IO ())
                                    -- ^Computation to run in a different thread
@@ -311,7 +311,7 @@
   :: P.Proxy p
   => Maybe Int          -- ^Optional timeout in microseconds (1/10^6 seconds).
   -> Int                -- ^Maximum number of bytes to receive at once.
-  -> HostPreference     -- ^Preferred host to bind.
+  -> S.HostPreference   -- ^Preferred host to bind.
   -> NS.ServiceName     -- ^Service port to bind.
   -> () -> P.Producer (P.ExceptionP p) B.ByteString P.SafeIO ()
 serveReadS mwait nbytes hp port () = do
@@ -340,7 +340,7 @@
 serveWriteD
   :: P.Proxy p
   => Maybe Int          -- ^Optional timeout in microseconds (1/10^6 seconds).
-  -> HostPreference     -- ^Preferred host to bind.
+  -> S.HostPreference   -- ^Preferred host to bind.
   -> NS.ServiceName     -- ^Service port to bind.
   -> x -> (P.ExceptionP p) x B.ByteString x B.ByteString P.SafeIO ()
 serveWriteD mwait hp port x = do
