diff --git a/Control/Pipe/Zlib.hs b/Control/Pipe/Zlib.hs
deleted file mode 100644
--- a/Control/Pipe/Zlib.hs
+++ /dev/null
@@ -1,59 +0,0 @@
-module Control.Pipe.Zlib (
-  gzip,
-  gunzip,
-  decompress,
-  compress
-  ) where
-
-import Codec.Zlib
-import Control.Monad
-import Control.Monad.IO.Class
-import Control.Pipe
-import Control.Pipe.Combinators
-import qualified Data.ByteString as B
-import Prelude hiding (catch)
-
--- | Gzip compression with default parameters.
-gzip :: MonadIO m => Pipe B.ByteString B.ByteString m r
-gzip = compress 1 (WindowBits 31)
-
--- | Gzip decompression with default parameters.
-gunzip :: MonadIO m => Pipe B.ByteString B.ByteString m r
-gunzip = decompress (WindowBits 31)
-
-decompress
-    :: MonadIO m
-    => WindowBits
-    -> Pipe B.ByteString B.ByteString m r
-decompress config = do
-    inf <- liftIO $ initInflate config
-    let finalize = do chunk <- liftIO $ finishInflate inf
-                      unless (B.null chunk) $ yield chunk
-    forP' finalize $ \x -> do
-      popper <- liftIO $ feedInflate inf x
-      yieldPopper popper
-
-compress
-    :: MonadIO m
-    => Int
-    -> WindowBits
-    -> Pipe B.ByteString B.ByteString m r
-compress level config = do
-    def <- liftIO $ initDeflate level config
-    let finalize = yieldPopper (finishDeflate def)
-    forP' finalize $ \x -> do
-      popper <- liftIO $ feedDeflate def x
-      yieldPopper popper
-
-forP' :: Monad m
-      => Pipe a b m r2
-      -> (a -> Pipe a b m r1)
-      -> Pipe a b m r
-forP' p f = forP f >> p >> discard
-
-yieldPopper :: MonadIO m => Popper -> Pipe a B.ByteString m ()
-yieldPopper pop = do
-  x <- liftIO pop
-  case x of
-    Nothing -> return ()
-    Just chunk -> yield chunk >> yieldPopper pop
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,5 @@
-Copyright (c) 2012 Paolo Capriotti <p.capriotti@gmail.com>,
+Copyright (c) 2012 Paolo Capriotti <p.capriotti@gmail.com>
+Copyright (c) 2013 Renzo Carbonara <renzocarbonaraλgmail.com>
 
 All rights reserved.
 
diff --git a/PEOPLE b/PEOPLE
new file mode 100644
--- /dev/null
+++ b/PEOPLE
@@ -0,0 +1,6 @@
+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
+Paolo Capriotti
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,12 @@
+# pipes-zlib
+
+Utilities to deal with zlib compressed streams the **pipes** and libraries.
+
+Check the source or rendered Haddocks for extensive documentation.
+
+This code is licensed under the terms of the so called **3-clause BSD
+license**. Read the file named ``LICENSE`` found in this same directory
+for details.
+
+See the ``PEOPLE`` file to learn about the people involved in this
+effort.
diff --git a/pipes-zlib.cabal b/pipes-zlib.cabal
--- a/pipes-zlib.cabal
+++ b/pipes-zlib.cabal
@@ -1,27 +1,32 @@
-Name: pipes-zlib
-Version: 0.1.0
-License: BSD3
-License-file: LICENSE
-Author: Paolo Capriotti
-Maintainer: p.capriotti@gmail.com
-Stability: Experimental
-Homepage: https://github.com/pcapriotti/pipes-extra
-Category: Control, Enumerator, Compression
-Build-type: Simple
-Synopsis: Pipes to deal with zipped data.
-Description: Pipes to deal with zipped data.
-Cabal-version: >=1.8
+name:               pipes-zlib
+version:            0.2.0.0
+license:            BSD3
+license-file:       LICENSE
+Copyright:          Copyright (c) Paolo Capriotti 2012,
+                                  Renzo Carbonara 2013
+author:             Renzo Carbonara, Paolo Capriotti
+maintainer:         renzocarbonaraλgmail.com
+stability:          Experimental
+homepage:           https://github.com/k0001/pipes-zlib
+bug-reports:        https://github.com/k0001/pipes-zlib/issues
+category:           Pipes, Compression
+build-type:         Simple
+synopsis:           Pipes to deal with zlib compressed data.
+description:        Pipes to deal with zlib compressed data.
+cabal-version:      >=1.8
+extra-source-files: README.md PEOPLE
 
-Source-Repository head
-    Type: git
-    Location: https://github.com/pcapriotti/pipes-extra
+source-repository head
+    type: git
+    location: git://github.com/k0001/pipes-zlib.git
 
-Library
-    Build-Depends:
-        base (== 4.*),
-        transformers (>= 0.2 && < 0.4),
-        pipes-core (== 0.1.*),
-        bytestring (== 0.9.*),
-        zlib-bindings (== 0.1.*)
-    Exposed-Modules:
-        Control.Pipe.Zlib
+library
+    hs-source-dirs:  src
+    exposed-modules: Control.Proxy.Zlib
+    build-depends:   base             (>= 4.5 && < 5.0)
+                   , transformers     (>= 0.2 && < 0.4)
+                   , pipes            (>= 3.3 && < 3.4)
+                   , bytestring       (>= 0.9.2.1)
+                   , zlib             (>= 0.5 && < 0.7)
+                   , zlib-bindings    (>= 0.1 && < 0.2)
+    ghc-options: -Wall
diff --git a/src/Control/Proxy/Zlib.hs b/src/Control/Proxy/Zlib.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Proxy/Zlib.hs
@@ -0,0 +1,95 @@
+-- | This module exports utilities to compress and decompress @pipes@ streams
+-- using the zlib compression codec.
+
+module Control.Proxy.Zlib (
+  -- * Streams
+    decompressD
+  , compressD
+
+  -- * Compression level
+  -- $ccz-re-export
+  , ZC.defaultCompression
+  , ZC.noCompression
+  , ZC.bestSpeed
+  , ZC.bestCompression
+  , ZC.compressionLevel
+
+  -- * Window size
+  -- $ccz-re-export
+  , ZC.defaultWindowBits
+  , ZC.windowBits
+  ) where
+
+import qualified Codec.Zlib                as Z
+import qualified Codec.Compression.Zlib    as ZC
+import           Control.Monad             (forever, unless)
+import           Control.Monad.Trans.Class (lift)
+import           Control.Proxy             ((>->))
+import qualified Control.Proxy             as P
+import qualified Data.ByteString           as B
+import           Data.Traversable          (mapM)
+import           Prelude                   hiding (mapM)
+
+--------------------------------------------------------------------------------
+
+-- | Decompress bytes flowing downstream using the given 'Z.WindowBits'.
+--
+-- See the "Codec.Zlib" module for details about this values.
+decompressD
+  :: P.Proxy p
+  => Z.WindowBits
+  -> () -> P.Pipe p B.ByteString B.ByteString IO r
+decompressD config () = P.runIdentityP . forever $ do
+    inf <- lift (Z.initInflate config)
+    popper <- lift . Z.feedInflate inf =<< P.request ()
+    (P.unitD >-> fromPopperS popper) ()
+    bs <- lift (Z.finishInflate inf)
+    unless (B.null bs) $ P.respond bs
+
+-- | Compress bytes flowing downstream.
+--
+-- See the "Codec.Zlib" module for details about these values.
+compressD
+  :: P.Proxy p
+  => ZC.CompressionLevel
+  -> Z.WindowBits
+  -> () -> P.Pipe p B.ByteString B.ByteString IO r
+compressD level config () = P.runIdentityP loop where
+    loop = forever $ do
+        def <- lift (Z.initDeflate level' config)
+        popper <- lift . Z.feedDeflate def =<< P.request ()
+        (P.unitD >-> fromPopperS popper) ()
+        mapM P.respond =<< lift (Z.finishDeflate def)
+    level' = fromCompressionLevel level
+
+--------------------------------------------------------------------------------
+
+-- $ccz-re-export
+--
+-- The following are re-exported from "Codec.Compression.Zlib" for your
+-- convenience.
+
+--------------------------------------------------------------------------------
+-- Internal stuff
+
+-- | Produce values from the given 'Z.Poppler' until exhausted.
+fromPopperS :: P.Proxy p => Z.Popper -> () -> P.Producer p B.ByteString IO ()
+fromPopperS pop () = P.runIdentityP loop where
+    loop = do
+        mbs <- lift pop
+        case mbs of
+          Nothing -> return ()
+          Just bs -> P.respond bs >> loop
+
+-- We need this function until the @zlib@ library hides the
+-- 'ZC.CompressionLevel' constructors in future version 0.7.
+fromCompressionLevel :: ZC.CompressionLevel -> Int
+fromCompressionLevel level = case level of
+    ZC.DefaultCompression   -> -1
+    ZC.NoCompression        -> 0
+    ZC.BestSpeed            -> 1
+    ZC.BestCompression      -> 9
+    ZC.CompressionLevel n
+         | n >= 0 && n <= 9 -> fromIntegral n
+    _  -> error "CompressLevel must be in the range 1..9"
+
