diff --git a/couchdb-conduit.cabal b/couchdb-conduit.cabal
--- a/couchdb-conduit.cabal
+++ b/couchdb-conduit.cabal
@@ -1,8 +1,8 @@
 name:           couchdb-conduit
-version:        0.7.6
+version:        0.8.0
 cabal-version:  >= 1.8
 build-type:     Simple
-stability:      Stable
+stability:      Testing
 category:       Database, Conduit
 license:        BSD3
 license-file:   LICENSE
@@ -28,23 +28,22 @@
                    base >= 4 && < 5,
                    aeson >= 0.6 && < 0.7,
                    attoparsec >= 0.8 && < 0.11,
-                   attoparsec-conduit >= 0.2 && < 0.3,
+                   attoparsec-conduit >= 0.4 && < 0.5,
+                   blaze-builder >= 0.2.1 && < 0.4,
                    bytestring >= 0.9 && < 0.10,
-                   conduit >= 0.2 && < 0.3,
+                   conduit >= 0.4 && < 0.5,
                    containers >= 0.2,
-                   http-conduit >= 1.2 && < 1.3,
+                   data-default,
+                   http-conduit >= 1.4 && < 1.5,
                    http-types >= 0.6 && < 0.7,
-                   monad-control >= 0.3 && < 0.4,
-                   transformers >= 0.2 && < 0.3,
-                   transformers-base >= 0.4 && < 0.5,
                    lifted-base >= 0.1 && < 0.2,
-                   utf8-string >= 0.3 && < 0.4,
-                   text >= 0.11 && < 0.12,
-                   unordered-containers >= 0.1,
+                   monad-control >= 0.3 && < 0.4,
                    string-conversions,
                    syb,
-                   data-default,
-                   blaze-builder >= 0.2.1 && < 0.4
+                   transformers >= 0.2 && < 0.4,
+                   transformers-base >= 0.4 && < 0.5,
+                   text >= 0.11 && < 0.12,
+                   unordered-containers >= 0.1
   ghc-options:      -Wall
   exposed-modules:  
                     Database.CouchDB.Conduit,
@@ -52,14 +51,14 @@
                     Database.CouchDB.Conduit.Design,
                     Database.CouchDB.Conduit.Explicit,
                     Database.CouchDB.Conduit.Generic,
+                    Database.CouchDB.Conduit.Implicit,
                     Database.CouchDB.Conduit.LowLevel,
                     Database.CouchDB.Conduit.View
   other-modules:    
                     Database.CouchDB.Conduit.Internal.Doc,
                     Database.CouchDB.Conduit.Internal.Parser,
                     Database.CouchDB.Conduit.Internal.View,
-                    Database.CouchDB.Conduit.Internal.Connection,
-                    Database.CouchDB.Conduit.Implicit
+                    Database.CouchDB.Conduit.Internal.Connection
 
 test-suite test
   type:            exitcode-stdio-1.0
@@ -72,31 +71,31 @@
                    couchdb-conduit,
                    aeson >= 0.6 && < 0.7,
                    attoparsec >= 0.8 && < 0.11,
-                   attoparsec-conduit >= 0.2 && < 0.3,
+                   attoparsec-conduit >= 0.4 && < 0.5,
+                   blaze-builder >= 0.2.1 && < 0.4,
                    bytestring >= 0.9 && < 0.10,
-                   conduit >= 0.2 && < 0.3,
+                   conduit >= 0.4 && < 0.5,
                    containers >= 0.2,
-                   http-conduit >= 1.2 && < 1.3,
+                   data-default,
+                   http-conduit >= 1.4 && < 1.5,
                    http-types >= 0.6 && < 0.7,
+                   lifted-base >= 0.1 && < 0.2,
                    monad-control >= 0.3 && < 0.4,
-                   transformers >= 0.2 && < 0.3,
+                   string-conversions,
+                   syb,
+                   transformers >= 0.2 && < 0.4,
                    transformers-base >= 0.4 && < 0.5,
-                   lifted-base >= 0.1 && < 0.2,
-                   utf8-string >= 0.3 && < 0.4,
                    text >= 0.11 && < 0.12,
-                   unordered-containers >= 0.1,
-                   syb,
-                   data-default,
-                   blaze-builder >= 0.2.1 && < 0.4
+                   unordered-containers >= 0.1
                    
   ghc-options:     -Wall -rtsopts -threaded
   hs-source-dirs:  test
   main-is:         Main.hs
-  other-modules:   
-                   Database.CouchDB.Conduit.Test.Explicit,
-                   Database.CouchDB.Conduit.Test.Util,
-                   Database.CouchDB.Conduit.Test.View,
-                   Database.CouchDB.Conduit.Test.Generic,
-                   CouchDBAuth,
-                   Database.CouchDB.Conduit.Test.Base
+  other-modules:   
+                   CouchDBAuth,
+                   Database.CouchDB.Conduit.Test.Base,
+                   Database.CouchDB.Conduit.Test.Explicit,
+                   Database.CouchDB.Conduit.Test.Generic,
+                   Database.CouchDB.Conduit.Test.Util,
+                   Database.CouchDB.Conduit.Test.View
 
diff --git a/src/Database/CouchDB/Conduit.hs b/src/Database/CouchDB/Conduit.hs
--- a/src/Database/CouchDB/Conduit.hs
+++ b/src/Database/CouchDB/Conduit.hs
@@ -24,7 +24,6 @@
     def,
     couchHost,
     couchPort,
-    couchManager,
     couchLogin,
     couchPass,
     couchPrefix,
@@ -48,7 +47,6 @@
     
 ) where
 
-import Data.Conduit (ResourceT)
 import Database.CouchDB.Conduit.Internal.Connection
 import qualified Database.CouchDB.Conduit.Internal.Doc as D
 
@@ -56,7 +54,7 @@
 couchRev :: MonadCouch m => 
        Path       -- ^ Database.
     -> Path       -- ^ Document path.
-    -> ResourceT m Revision
+    -> m Revision
 couchRev db p = D.couchRev (mkPath [db, p]) 
 
 -- | Brain-free version of 'couchRev'. If document absent, 
@@ -64,7 +62,7 @@
 couchRev' :: MonadCouch m => 
        Path       -- ^ Database.
     -> Path       -- ^ Document path.
-    -> ResourceT m Revision
+    -> m Revision
 couchRev' db p = D.couchRev' (mkPath [db, p]) 
 
 -- | Delete the given revision of the object.  
@@ -72,5 +70,5 @@
        Path       -- ^ Database.
     -> Path       -- ^ Document path.
     -> Revision             -- ^ Revision
-    -> ResourceT m ()
+    -> m ()
 couchDelete db p = D.couchDelete (mkPath [db, p]) 
diff --git a/src/Database/CouchDB/Conduit/DB.hs b/src/Database/CouchDB/Conduit/DB.hs
--- a/src/Database/CouchDB/Conduit/DB.hs
+++ b/src/Database/CouchDB/Conduit/DB.hs
@@ -23,11 +23,11 @@
 import qualified Data.ByteString as B
 import qualified Data.Aeson as A
 
-import Data.Conduit (ResourceT)
-
 import qualified Network.HTTP.Conduit as H
 import qualified Network.HTTP.Types as HT
 
+
+
 import Database.CouchDB.Conduit.Internal.Connection 
             (MonadCouch(..), Path, mkPath)
 import Database.CouchDB.Conduit.LowLevel (couch, couch', protect, protect')
@@ -36,7 +36,7 @@
 -- | Create CouchDB database. 
 couchPutDB :: MonadCouch m => 
        Path             -- ^ Database
-    -> ResourceT m ()
+    -> m ()
 couchPutDB db = void $ couch HT.methodPut 
                             (mkPath [db]) [] [] 
                             (H.RequestBodyBS B.empty)
@@ -46,7 +46,7 @@
 --   absence. For this it handles @412@ responses.
 couchPutDB_ :: MonadCouch m => 
        Path             -- ^ Database
-    -> ResourceT m ()
+    -> m ()
 couchPutDB_ db = void $ couch HT.methodPut 
                     (mkPath [db]) [] []
                     (H.RequestBodyBS B.empty) 
@@ -55,7 +55,7 @@
 -- | Delete a database.
 couchDeleteDB :: MonadCouch m => 
        Path             -- ^ Database
-    -> ResourceT m ()
+    -> m ()
 couchDeleteDB db = void $ couch HT.methodDelete 
                     (mkPath [db]) [] []
                     (H.RequestBodyBS B.empty) protect' 
@@ -67,7 +67,7 @@
     -> [B.ByteString]   -- ^ Admin names
     -> [B.ByteString]   -- ^ Readers roles 
     -> [B.ByteString]   -- ^ Readers names
-    -> ResourceT m ()       
+    -> m ()       
 couchSecureDB db adminRoles adminNames readersRoles readersNames = 
     void $ couch HT.methodPut 
             (mkPath [db, "_security"]) [] []
@@ -89,7 +89,7 @@
     -> Bool             -- ^ Target creation flag
     -> Bool             -- ^ Continuous flag
     -> Bool             -- ^ Cancel flag
-    -> ResourceT m ()
+    -> m ()
 couchReplicateDB source target createTarget continuous cancel = 
     void $ couch' HT.methodPost (const "/_replicate") [] []
             reqBody protect' 
diff --git a/src/Database/CouchDB/Conduit/Design.hs b/src/Database/CouchDB/Conduit/Design.hs
--- a/src/Database/CouchDB/Conduit/Design.hs
+++ b/src/Database/CouchDB/Conduit/Design.hs
@@ -7,12 +7,10 @@
     couchPutView
 ) where
 
-import              Prelude hiding (catch)
+import Prelude hiding (catch)
 import Control.Monad (void)
 import Control.Exception.Lifted (catch)
 
-import Data.Conduit (ResourceT)
-
 import qualified Data.ByteString as B
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as TE
@@ -32,7 +30,7 @@
     -> Path                 -- ^ View name
     -> B.ByteString         -- ^ Map function
     -> Maybe B.ByteString   -- ^ Reduce function
-    -> ResourceT m ()
+    -> m ()
 couchPutView db designName viewName mapF reduceF = do
     (_, A.Object d) <- getDesignDoc path
     void $ couchPutWith' A.encode path [] $ inferViews (purge_ d)
@@ -53,7 +51,7 @@
 
 getDesignDoc :: MonadCouch m => 
        Path 
-    -> ResourceT m (Revision, AT.Value)
+    -> m (Revision, AT.Value)
 getDesignDoc designName = catch 
         (couchGetWith A.Success designName [])
         (\(_ :: CouchError) -> return (B.empty, AT.emptyObject))
diff --git a/src/Database/CouchDB/Conduit/Explicit.hs b/src/Database/CouchDB/Conduit/Explicit.hs
--- a/src/Database/CouchDB/Conduit/Explicit.hs
+++ b/src/Database/CouchDB/Conduit/Explicit.hs
@@ -52,7 +52,7 @@
 ) where
 
 import qualified Data.Aeson as A
-import Data.Conduit (ResourceT, Conduit(..), ResourceIO)
+import Data.Conduit (Conduit, MonadResource)
 
 import Network.HTTP.Types (Query)
 
@@ -71,7 +71,7 @@
        Path         -- ^ Database
     -> Path         -- ^ Document path
     -> Query     -- ^ Query
-    -> ResourceT m (Revision, a)
+    -> m (Revision, a)
 couchGet db p = couchGetWith A.fromJSON (mkPath [db, p])
 
 -- | Put an 'A.FromJSON' object in Couch DB with revision, returning the 
@@ -82,7 +82,7 @@
     -> Revision    -- ^ Document revision. For new docs provide empty string.
     -> Query    -- ^ Query arguments.
     -> a           -- ^ The object to store.
-    -> ResourceT m Revision      
+    -> m Revision      
 couchPut db p = couchPutWith A.encode (mkPath [db, p])
 
 -- | \"Don't care\" version of 'couchPut'. Creates document only in its 
@@ -92,7 +92,7 @@
     -> Path         -- ^ Document path
     -> Query    -- ^ Query arguments.
     -> a           -- ^ The object to store.
-    -> ResourceT m Revision      
+    -> m Revision      
 couchPut_ db p = couchPutWith_ A.encode (mkPath [db, p])
 
 -- | Brute force version of 'couchPut'. Creates a document regardless of 
@@ -102,7 +102,7 @@
     -> Path         -- ^ Document path
     -> Query    -- ^ Query arguments.
     -> a           -- ^ The object to store.
-    -> ResourceT m Revision      
+    -> m Revision      
 couchPut' db p = couchPutWith' A.encode (mkPath [db, p])
 
 ------------------------------------------------------------------------------
@@ -113,7 +113,7 @@
 --   to concrete 'A.FromJSON' type.
 --   
 -- > res <- couchView "mydesign" "myview" [] $ rowValue =$= toType =$ consume
-toType :: (ResourceIO m, A.FromJSON a) => Conduit A.Value m a
+toType :: (MonadResource m, A.FromJSON a) => Conduit A.Value m a
 toType = toTypeWith A.fromJSON 
 
 
diff --git a/src/Database/CouchDB/Conduit/Generic.hs b/src/Database/CouchDB/Conduit/Generic.hs
--- a/src/Database/CouchDB/Conduit/Generic.hs
+++ b/src/Database/CouchDB/Conduit/Generic.hs
@@ -51,7 +51,7 @@
 import Data.Generics (Data)
 import qualified    Data.Aeson as A
 import qualified    Data.Aeson.Generic as AG
-import Data.Conduit (ResourceT, Conduit(..), ResourceIO)
+import Data.Conduit (Conduit, MonadResource)
 
 import Network.HTTP.Types (Query)
 
@@ -66,7 +66,7 @@
        Path         -- ^ Database
     -> Path         -- ^ Document path
     -> Query     -- ^ Query
-    -> ResourceT m (Revision, a)
+    -> m (Revision, a)
 couchGet db p = couchGetWith AG.fromJSON (mkPath [db, p])  
 
 -- | Put an object in Couch DB with revision, returning the new Revision.
@@ -76,7 +76,7 @@
     -> Revision     -- ^ Document revision. For new docs provide empty string.
     -> Query        -- ^ Query arguments.
     -> a            -- ^ The object to store.
-    -> ResourceT m Revision      
+    -> m Revision      
 couchPut db p = couchPutWith AG.encode (mkPath [db, p])
     
 -- | \"Don't care\" version of 'couchPut'. Creates document only in its 
@@ -86,7 +86,7 @@
     -> Path         -- ^ Document path
     -> Query    -- ^ Query arguments.
     -> a           -- ^ The object to store.
-    -> ResourceT m Revision      
+    -> m Revision      
 couchPut_ db p = couchPutWith_ AG.encode (mkPath [db, p])
 
 -- | Brute force version of 'couchPut'. Creates a document regardless of 
@@ -96,7 +96,7 @@
     -> Path         -- ^ Document path
     -> Query    -- ^ Query arguments.
     -> a           -- ^ The object to store.
-    -> ResourceT m Revision      
+    -> m Revision      
 couchPut' db p = couchPutWith' AG.encode (mkPath [db, p])
 
 ------------------------------------------------------------------------------
@@ -107,5 +107,5 @@
 --   to concrete type.
 --   
 -- > res <- couchView "mydesign" "myview" [] $ rowValue =$= toType =$ consume
-toType :: (ResourceIO m, Data a) => Conduit A.Value m a
+toType :: (MonadResource m, Data a) => Conduit A.Value m a
 toType = toTypeWith AG.fromJSON 
diff --git a/src/Database/CouchDB/Conduit/Implicit.hs b/src/Database/CouchDB/Conduit/Implicit.hs
--- a/src/Database/CouchDB/Conduit/Implicit.hs
+++ b/src/Database/CouchDB/Conduit/Implicit.hs
@@ -13,7 +13,6 @@
 
 import qualified Data.Aeson as A
 import qualified Data.ByteString.Lazy as BL (ByteString)
-import Data.Conduit (ResourceT)
 
 import Database.CouchDB.Conduit.Internal.Connection 
         (MonadCouch(..), Path, mkPath, Revision)
@@ -30,7 +29,7 @@
     -> Path                       -- ^ Document path.
     -> Path                       -- ^ Document path.
     -> Query                      -- ^ Query
-    -> ResourceT m (Revision, a)
+    -> m (Revision, a)
 couchGet f db p = couchGetWith f (mkPath [db, p])
 
 -- | Put document, with given encoder
@@ -42,7 +41,7 @@
                             -- ^ empty string.
    -> Query                 -- ^ Query arguments.
    -> a                     -- ^ The object to store.
-   -> ResourceT m Revision
+   -> m Revision
 couchPut f db p = couchPutWith f (mkPath [db, p])
 
 -- | \"Don't care\" version of 'couchPut'. Creates document only in its 
@@ -53,7 +52,7 @@
    -> Path                  -- ^ Document path.
    -> Query                 -- ^ Query arguments.
    -> a                     -- ^ The object to store.
-   -> ResourceT m Revision
+   -> m Revision
 couchPut_ f db p = couchPutWith_ f (mkPath [db, p])
 
 -- | Brute force version of 'couchPut'. Creates a document regardless of 
@@ -64,6 +63,6 @@
    -> Path                  -- ^ Document path.
    -> Query                 -- ^ Query arguments.
    -> a                     -- ^ The object to store.
-   -> ResourceT m Revision
+   -> m Revision
 couchPut' f db p = couchPutWith' f (mkPath [db, p])
 
diff --git a/src/Database/CouchDB/Conduit/Internal/Connection.hs b/src/Database/CouchDB/Conduit/Internal/Connection.hs
--- a/src/Database/CouchDB/Conduit/Internal/Connection.hs
+++ b/src/Database/CouchDB/Conduit/Internal/Connection.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FlexibleContexts #-}
 
@@ -16,7 +17,6 @@
     def,
     couchHost,
     couchPort,
-    couchManager,
     couchLogin,
     couchPass,
     couchPrefix,
@@ -32,14 +32,19 @@
 import Control.Monad.Trans.Reader (ReaderT, ask, runReaderT)
 import Control.Exception (Exception)
 import Control.Monad.Trans.Class (lift)
+import Control.Monad.IO.Class (MonadIO)
+import Control.Monad.Trans.Control (MonadBaseControl (..))
+ 
+import Data.Conduit (MonadResource, MonadThrow, MonadUnsafeIO, 
+    ResourceT, runResourceT)
 
 import Data.Generics (Typeable)
 import Data.Default (Default (def))
 import qualified Data.ByteString as B
 import qualified Data.Text.Encoding as TE
 import qualified Blaze.ByteString.Builder as BLB
-import Data.Conduit (ResourceIO, ResourceT, runResourceT)
 
+
 import qualified Network.HTTP.Conduit as H
 import qualified Network.HTTP.Types as HT
 
@@ -88,10 +93,6 @@
         -- ^ Hostname. Default value is \"localhost\"
     , couchPort :: Int              
         -- ^ Port. 5984 by default.
-    , couchManager :: Maybe H.Manager  
-        -- ^ Connection 'Manager'. 'Nothing' by default. If you need to use
-        --   your 'H.Manager' (for connection pooling for example), set it to
-        --   'Just' 'H.Manager'.
     , couchLogin :: B.ByteString
         -- ^ CouchDB login. By default is 'B.empty'.
     , couchPass :: B.ByteString
@@ -102,7 +103,7 @@
 }
 
 instance Default CouchConnection where
-    def = CouchConnection "localhost" 5984 Nothing B.empty B.empty B.empty
+    def = CouchConnection "localhost" 5984 B.empty B.empty B.empty
 
 -----------------------------------------------------------------------------
 -- Runtime
@@ -119,12 +120,16 @@
 -- larger monad an instance of 'MonadCouch' and skip the intermediate ReaderT, 
 -- since then performance is improved by eliminating one monad from the final 
 -- transformer stack.
-class ResourceIO m => MonadCouch m where
-    couchConnection :: m CouchConnection
+class (MonadResource m, MonadBaseControl IO m) => MonadCouch m where
+    couchConnection :: m (H.Manager, CouchConnection)
 
-instance (ResourceIO m) => MonadCouch (ReaderT CouchConnection m) where
+instance (MonadResource m, MonadBaseControl IO m) => 
+        MonadCouch (ReaderT (H.Manager, CouchConnection) m) where
     couchConnection = ask
 
+--No instance for (MonadCouch (ResourceT (ReaderT 
+-- (H.Manager, CouchConnection) (ResourceT IO)))) 
+
 -- | A CouchDB Error.
 data CouchError 
     = CouchHttpError Int B.ByteString
@@ -139,28 +144,32 @@
   deriving (Show, Typeable)
 instance Exception CouchError
 
--- | Run a sequence of CouchDB actions. This function is a combination of 
+-- | Connect to a CouchDB server, run a sequence of CouchDB actions, and then 
+--   close the connection.. This function is a combination of 'H.withManager', 
 --   'withCouchConnection', 'runReaderT' and 'runResourceT'.
 --  
---   If you create your own instance of 'MonadCouch', use 'withCouchConnection'.  
-runCouch :: ResourceIO m =>
-       CouchConnection                            -- ^ Couch connection
-    -> ResourceT (ReaderT CouchConnection m) a    -- ^ CouchDB actions
+--   If you create your own instance of 'MonadCouch' or use connection pool, 
+--   use 'withCouchConnection'.  
+runCouch :: (MonadThrow m, MonadUnsafeIO m, MonadIO m, MonadBaseControl IO m) =>
+       CouchConnection            -- ^ Couch connection
+    -> ReaderT (H.Manager, CouchConnection) (ResourceT m) a 
+                                  -- ^ Actions
     -> m a
-runCouch c = withCouchConnection c . runReaderT . runResourceT
+runCouch c f = H.withManager $ \manager -> 
+    withCouchConnection manager c . runReaderT . runResourceT . lift $ f
 
--- | Connect to a CouchDB server, call the supplied function, and then close 
---   the connection.
+-- | Run a sequence of CouchDB actions with provided 'H.Manager' and 
+--   'CouchConnection'. 
 -- 
--- > withCouchConnection def {couchDB = "db"} . runReaderT . runResourceT $ do
+-- > withCouchConnection manager def {couchDB = "db"} . runReaderT . 
+-- >          runResourceT . lift $ do
 -- >    ... -- actions
-withCouchConnection :: ResourceIO m =>
-       CouchConnection              -- ^ Couch connection
-    -> (CouchConnection -> m a)     -- ^ Function to run
+withCouchConnection :: (MonadResource m, MonadBaseControl IO m) => 
+       H.Manager            -- ^ Connection manager
+    -> CouchConnection      -- ^ Couch connection
+    -> ((H.Manager, CouchConnection) -> m a) 
+                            -- ^ Actions
     -> m a
-withCouchConnection c@(CouchConnection _ _ mayMan  _ _ _) f = 
-    case mayMan of
-        -- Allocate manager with helper
-        Nothing -> H.withManager $ \m -> lift $ f $ c {couchManager = Just m}
-        _ -> f c
+withCouchConnection man c@(CouchConnection{}) f = 
+    f (man, c)
 
diff --git a/src/Database/CouchDB/Conduit/Internal/Doc.hs b/src/Database/CouchDB/Conduit/Internal/Doc.hs
--- a/src/Database/CouchDB/Conduit/Internal/Doc.hs
+++ b/src/Database/CouchDB/Conduit/Internal/Doc.hs
@@ -15,15 +15,14 @@
 import              Prelude hiding (catch)
 
 import Control.Monad (void)
-import Control.Exception.Lifted (catch)
-import Control.Monad.Trans.Class (lift)
+import Control.Exception.Lifted (catch, throw)
 
 import Data.Maybe (fromJust)
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.Text.Encoding as TE
 import qualified Data.Aeson as A
-import Data.Conduit (ResourceT, resourceThrow, ($$))
+import Data.Conduit (($$),)
 import qualified Data.Conduit.Attoparsec as CA
 
 import qualified Network.HTTP.Conduit as H
@@ -40,9 +39,9 @@
 -- | Get Revision of a document. 
 couchRev :: MonadCouch m => 
        Path                 -- ^ Correct 'Path' with escaped fragments.
-    -> ResourceT m Revision
+    -> m Revision
 couchRev p = do
-    (H.Response _ hs _) <- couch HT.methodHead p [] [] 
+    (H.Response _ _ hs _) <- couch HT.methodHead p [] [] 
                                  (H.RequestBodyBS B.empty) protect' 
     return $ peekRev hs        
   where
@@ -52,18 +51,18 @@
 --   just return 'B.empty'.
 couchRev' :: MonadCouch m =>
        Path                 -- ^ Correct 'Path' with escaped fragments.
-    -> ResourceT m Revision
+    -> m Revision
 couchRev' p = 
     catch (couchRev p) handler404
   where
     handler404 (CouchHttpError 404 _) = return B.empty
-    handler404 e = lift $ resourceThrow e
+    handler404 e = throw e
 
 -- | Delete the given revision of the object.    
 couchDelete :: MonadCouch m => 
        Path                 -- ^ Correct 'Path' with escaped fragments.
     -> Revision             -- ^ Revision
-    -> ResourceT m ()
+    -> m ()
 couchDelete p r = void $
   couch methodDelete p 
         [] [("rev", Just r)]
@@ -78,14 +77,14 @@
           (A.Value -> A.Result a)    -- ^ Parser
        -> Path                       -- ^ Correct 'Path' with escaped fragments.
        -> Query                      -- ^ Query
-       -> ResourceT m (Revision, a)
+       -> m (Revision, a)
 couchGetWith f p q = do
-    H.Response _ _ bsrc <- couch HT.methodGet 
+    H.Response _ _ _ bsrc <- couch HT.methodGet 
                                  p [] q 
                                  (H.RequestBodyBS B.empty) protect'
     j <- bsrc $$ CA.sinkParser A.json
-    A.String r <- lift $ either resourceThrow return $ extractField "_rev" j
-    o <- lift $ jsonToTypeWith f j 
+    A.String r <- either throw return $ extractField "_rev" j
+    o <- jsonToTypeWith f j 
     return (TE.encodeUtf8 r, o)
 
 -- | Put document, with given encoder
@@ -96,13 +95,13 @@
                             -- ^ empty string.
    -> Query                 -- ^ Query arguments.
    -> a                     -- ^ The object to store.
-   -> ResourceT m Revision
+   -> m Revision
 couchPutWith f p r q val = do
-    H.Response _ _ bsrc <- couch HT.methodPut 
+    H.Response _ _ _ bsrc <- couch HT.methodPut 
                                  p (ifMatch r) q 
                                  (H.RequestBodyLBS $ f val) protect'
     j <- bsrc $$ CA.sinkParser A.json
-    lift $ either resourceThrow return $ extractRev j
+    either throw return $ extractRev j
   where 
     ifMatch "" = []
     ifMatch rv = [("If-Match", rv)]
@@ -114,7 +113,7 @@
    -> Path                  -- ^ Correct 'Path' with escaped fragments.
    -> HT.Query              -- ^ Query arguments.
    -> a                     -- ^ The object to store.
-   -> ResourceT m Revision      
+   -> m Revision      
 couchPutWith_ f p q val = do
     rev <- couchRev' p
     if rev == "" 
@@ -127,7 +126,7 @@
    -> Path                  -- ^ Correct 'Path' with escaped fragments.
    -> HT.Query              -- ^ Query arguments.
    -> a                     -- ^ The object to store.
-   -> ResourceT m Revision      
+   -> m Revision      
 couchPutWith' f p q val = do
     rev <- couchRev' p
     couchPutWith f p rev q val
diff --git a/src/Database/CouchDB/Conduit/Internal/Parser.hs b/src/Database/CouchDB/Conduit/Internal/Parser.hs
--- a/src/Database/CouchDB/Conduit/Internal/Parser.hs
+++ b/src/Database/CouchDB/Conduit/Internal/Parser.hs
@@ -2,7 +2,9 @@
 
 module Database.CouchDB.Conduit.Internal.Parser where
 
-import Data.Conduit
+import Control.Exception.Lifted (throw)
+
+import Data.Conduit (MonadResource)
 import qualified Data.Text as T
 import qualified Data.HashMap.Lazy as M
 import qualified Data.Aeson as A
@@ -24,12 +26,12 @@
     look _ = Left $ CouchInternalError "CouchDB object has't revision"
 
 -- | Convert to type with given convertor
-jsonToTypeWith :: ResourceIO m =>
+jsonToTypeWith :: MonadResource m =>
                 (A.Value -> A.Result a) 
              -> A.Value 
              -> m a
 jsonToTypeWith f j = case f j of
-        A.Error e -> resourceThrow $ CouchInternalError $ 
+        A.Error e -> throw $ CouchInternalError $ 
                         "Error parsing json: " <> cs e
         A.Success o -> return o
 
diff --git a/src/Database/CouchDB/Conduit/Internal/View.hs b/src/Database/CouchDB/Conduit/Internal/View.hs
--- a/src/Database/CouchDB/Conduit/Internal/View.hs
+++ b/src/Database/CouchDB/Conduit/Internal/View.hs
@@ -2,8 +2,10 @@
 
 module Database.CouchDB.Conduit.Internal.View where
 
+import Control.Exception.Lifted (throw)
+
 import qualified Data.Aeson as A
-import Data.Conduit (resourceThrow, Conduit(..), ResourceIO)
+import Data.Conduit (Conduit(..), MonadResource)
 import qualified Data.Conduit.List as CL (mapM)
 import Data.String.Conversions ((<>), cs)
 
@@ -13,10 +15,10 @@
 --   to concrete type.
 --   
 -- > res <- couchView "mydesign" "myview" [] $ rowValue =$= toType =$ consume
-toTypeWith :: ResourceIO m =>
+toTypeWith :: MonadResource m =>
     (A.Value -> A.Result a)       -- ^ Parser 
     -> Conduit A.Value m a
 toTypeWith f = CL.mapM (\v -> case f v of
-            A.Error e -> resourceThrow $ CouchInternalError $
+            A.Error e -> throw $ CouchInternalError $
                            "Error parsing json: " <> cs e
             A.Success o -> return o)
diff --git a/src/Database/CouchDB/Conduit/LowLevel.hs b/src/Database/CouchDB/Conduit/LowLevel.hs
--- a/src/Database/CouchDB/Conduit/LowLevel.hs
+++ b/src/Database/CouchDB/Conduit/LowLevel.hs
@@ -12,25 +12,22 @@
     couch',
     
     -- * Response protection
-    protect,
+    protect
+    ,
     protect'
 ) where
 
 import              Prelude hiding (catch)
 
-import Control.Exception.Lifted (catch)
+import Control.Exception.Lifted (catch, throw)
 import Control.Exception (SomeException)
-import Control.Monad.Trans.Class (lift)
-import Control.Monad.Base (liftBase)
 
-import Data.Maybe (fromJust)
 import qualified Data.ByteString as B
 import qualified Data.Aeson as A
 import qualified Data.HashMap.Lazy as M
 import Data.String.Conversions ((<>), cs)
 
-import Data.Conduit (ResourceT, Source, 
-                        ($$), resourceThrow)
+import Data.Conduit (Source, ($$))
 import Data.Conduit.Attoparsec (sinkParser)
                         
 import qualified Network.HTTP.Conduit as H
@@ -52,9 +49,9 @@
     -> HT.RequestHeaders        -- ^ Headers
     -> HT.Query                 -- ^ Query args
     -> H.RequestBody m          -- ^ Request body
-    -> (CouchResponse m -> ResourceT m (CouchResponse m))
+    -> (CouchResponse m -> m (CouchResponse m))
                                 -- ^ Protect function. See 'protect'
-    -> ResourceT m (CouchResponse m)
+    -> m (CouchResponse m)
 couch meth path = 
     couch' meth withPrefix
   where
@@ -71,11 +68,11 @@
     -> HT.RequestHeaders        -- ^ Headers
     -> HT.Query                 -- ^ Query args
     -> H.RequestBody m          -- ^ Request body
-    -> (CouchResponse m -> ResourceT m (CouchResponse m))
+    -> (CouchResponse m -> m (CouchResponse m))
                                 -- ^ Protect function. See 'protect'
-    -> ResourceT m (CouchResponse m)
-couch' meth pathFn hdrs qs reqBody protectFn = do
-    conn <- lift couchConnection
+    -> m (CouchResponse m)
+couch' meth pathFn hdrs qs reqBody protectFn =  do
+    (manager, conn) <- couchConnection
     let req = H.def 
             { H.method          = meth
             , H.host            = couchHost conn
@@ -88,7 +85,7 @@
     -- Apply auth if needed
     let req' = if couchLogin conn == B.empty then req else H.applyBasicAuth 
             (couchLogin conn) (couchPass conn) req
-    res <- H.http req' (fromJust $ couchManager conn)
+    res <- H.http req' manager
     protectFn res
 
 -- | Protect 'H.Response' from bad status codes. If status code in list 
@@ -100,16 +97,16 @@
 --   To protect from typical errors use 'protect''.
 protect :: MonadCouch m => 
        [Int]             -- ^ Good codes
-    -> (CouchResponse m -> ResourceT m (CouchResponse m)) -- ^ handler
+    -> (CouchResponse m -> m (CouchResponse m)) -- ^ handler
     -> CouchResponse m   -- ^ Response
-    -> ResourceT m (CouchResponse m)
-protect goodCodes h ~resp@(H.Response (HT.Status sc sm) _ bsrc)
-    | sc == 304 = liftBase $ resourceThrow NotModified
+    -> m (CouchResponse m)
+protect goodCodes h ~resp@(H.Response (HT.Status sc sm) _ _ bsrc)
+    | sc == 304 = throw NotModified
     | sc `elem` goodCodes = h resp
     | otherwise = do
         v <- catch (bsrc $$ sinkParser A.json)
                    (\(_::SomeException) -> return A.Null)
-        liftBase $ resourceThrow $ CouchHttpError sc $ msg v
+        throw $ CouchHttpError sc $ msg v
         where 
         msg v = sm <> reason v
         reason (A.Object v) = case M.lookup "reason" v of
@@ -124,5 +121,5 @@
 --   See 'protect' for details.       
 protect' :: MonadCouch m => 
        CouchResponse m   -- ^ Response
-    -> ResourceT m (CouchResponse m)
+    -> m (CouchResponse m)
 protect' = protect [200, 201, 202, 304] return
diff --git a/src/Database/CouchDB/Conduit/View.hs b/src/Database/CouchDB/Conduit/View.hs
--- a/src/Database/CouchDB/Conduit/View.hs
+++ b/src/Database/CouchDB/Conduit/View.hs
@@ -50,8 +50,8 @@
 )
  where
 
-import Control.Monad.Trans.Class (lift)
 import Control.Applicative ((<|>))
+import Control.Exception.Lifted (throw)
 
 import Data.Monoid (mconcat)
 import qualified Data.ByteString as B
@@ -61,10 +61,10 @@
 import qualified Data.Aeson as A
 import Data.Attoparsec
 
-import Data.Conduit (ResourceIO, ResourceT, 
+import Data.Conduit (MonadResource, 
                         Source, Conduit, Sink, ($$), ($=), 
                         sequenceSink, SequencedSinkResponse(..),
-                        resourceThrow )
+                        )
 import qualified Data.Conduit.List as CL
 import qualified Data.Conduit.Attoparsec as CA
 
@@ -257,9 +257,9 @@
     -> Path                 -- ^ Design document
     -> Path                 -- ^ View name
     -> HT.Query             -- ^ Query parameters
-    -> ResourceT m (Source m A.Object)
+    -> m (Source m A.Object)
 couchView db design view q = do
-    H.Response _ _ bsrc <- couch HT.methodGet 
+    H.Response _ _ _ bsrc <- couch HT.methodGet 
             (viewPath db design view)
             [] q 
             (H.RequestBodyBS B.empty) protect'
@@ -281,7 +281,7 @@
     -> Path                 -- ^ View name
     -> HT.Query             -- ^ Query parameters
     -> Sink A.Object m a    -- ^ Sink for handle view rows.
-    -> ResourceT m a
+    -> m a
 couchView' db design view q sink = do
     raw <- couchView db design view q
     raw $$ sink
@@ -301,9 +301,9 @@
     -> Path                 -- ^ View name
     -> HT.Query             -- ^ Query parameters
     -> a                    -- ^ View @keys@. Must be list or cortege.
-    -> ResourceT m (Source m A.Object)    
+    -> m (Source m A.Object)    
 couchViewPost db design view q ks = do
-    H.Response _ _ bsrc <- couch HT.methodPost 
+    H.Response _ _ _ bsrc <- couch HT.methodPost 
             (viewPath db design view)  
             [] 
             q 
@@ -320,16 +320,16 @@
     -> HT.Query             -- ^ Query parameters
     -> a                    -- ^ View @keys@. Must be list or cortege.
     -> Sink A.Object m a    -- ^ Sink for handle view rows.
-    -> ResourceT m a
+    -> m a
 couchViewPost' db design view q ks sink = do
     raw <- couchViewPost db design view q ks
     raw $$ sink
 
 -- | Conduit for extract \"value\" field from CouchDB view row.
-rowValue :: ResourceIO m => Conduit A.Object m A.Value
+rowValue :: Monad m => Conduit A.Object m A.Value
 rowValue = CL.mapM (\v -> case M.lookup "value" v of
             (Just o) -> return o
-            _ -> resourceThrow $ CouchInternalError $ BS8.pack
+            _ -> throw $ CouchInternalError $ BS8.pack
                     ("View row does not contain value: " ++ show v))
 
 -----------------------------------------------------------------------------
@@ -344,20 +344,20 @@
 -- Internal view parser
 -----------------------------------------------------------------------------
 
-conduitCouchView :: ResourceIO m => Conduit B.ByteString m A.Object
+conduitCouchView :: MonadResource m => Conduit B.ByteString m A.Object
 conduitCouchView = sequenceSink () $ \() -> do
     b <- CA.sinkParser viewStart
     if b then return $ StartConduit viewLoop
          else return Stop
 
-viewLoop :: ResourceIO m => Conduit B.ByteString m A.Object   
+viewLoop :: MonadResource m => Conduit B.ByteString m A.Object   
 viewLoop = sequenceSink False $ \isLast -> 
     if isLast then return Stop
     else do 
         v <- CA.sinkParser (A.json <?> "json object")
         vobj <- case v of
             (A.Object o) -> return o
-            _ -> lift $ resourceThrow $ 
+            _ -> throw $ 
                  CouchInternalError "view entry is not an object"
         res <- CA.sinkParser (commaOrClose <?> "comma or close")
         case res of
diff --git a/test/Database/CouchDB/Conduit/Test/Base.hs b/test/Database/CouchDB/Conduit/Test/Base.hs
--- a/test/Database/CouchDB/Conduit/Test/Base.hs
+++ b/test/Database/CouchDB/Conduit/Test/Base.hs
@@ -12,8 +12,8 @@
 import Control.Monad.IO.Class (liftIO)
 
 import qualified Data.ByteString as B
---import Data.Conduit
---import qualified Data.Conduit.List as CL
+import Data.Conduit (($$))
+import qualified Data.Conduit.List as CL
 
 import qualified Network.HTTP.Conduit as H
 import qualified Network.HTTP.Types as HT
@@ -24,20 +24,39 @@
 
 tests :: Test
 tests = mutuallyExclusive $ testGroup "Base" [
-    testCase "Just connect" case_justConnect,
-    testCase "Put DB" case_dbPut
+    testCase "Just HTTP" caseJustHttp,
+    testCase "Just HTTP IO" caseJustHttpIO,
+    testCase "Just connect" caseJustConnect,
+    testCase "Put and delete DB" caseDbPut
     ]
+--    testCase "Put DB" case_dbPut
 
+caseJustHttp :: Assertion
+caseJustHttp = do
+    request <- H.parseUrl "http://google.com/"
+    r <- H.withManager $ \manager -> do
+          H.Response _ _ _ bsrc <- H.http request manager
+          bsrc $$ CL.consume
+    print r
+
+caseJustHttpIO :: Assertion
+caseJustHttpIO = do
+    request <- H.parseUrl "http://google.com/"
+    H.withManager $ \manager -> do
+          H.Response _ _ _ bsrc <- H.http request manager
+          r <- bsrc $$ CL.consume
+          liftIO $ print r
+
 -- | Just connect
-case_justConnect :: Assertion
-case_justConnect = runCouch def $ do
-    H.Response (HT.Status sc _) _h _bsrc <- couch HT.methodGet "" [] [] 
+caseJustConnect :: Assertion
+caseJustConnect = runCouch def $ do
+    H.Response (HT.Status sc _) _ _h _bsrc <- couch HT.methodGet "" [] [] 
                     (H.RequestBodyBS B.empty) protect'
     liftIO $ sc @=? 200
 
 -- | Put and delete
-case_dbPut :: Assertion    
-case_dbPut =  runCouch def {couchLogin = login, 
+caseDbPut :: Assertion    
+caseDbPut =  runCouch def {couchLogin = login, 
                             couchPass=pass} $ do
     couchPutDB_ "cdbc_dbputdel"
     couchDeleteDB "cdbc_dbputdel"
diff --git a/test/Database/CouchDB/Conduit/Test/Explicit.hs b/test/Database/CouchDB/Conduit/Test/Explicit.hs
--- a/test/Database/CouchDB/Conduit/Test/Explicit.hs
+++ b/test/Database/CouchDB/Conduit/Test/Explicit.hs
@@ -15,15 +15,15 @@
 
 import Data.ByteString (ByteString)
 import Data.Aeson
-import Data.ByteString.UTF8 (fromString)
+import Data.String.Conversions ((<>), cs)
 import Database.CouchDB.Conduit
 import Database.CouchDB.Conduit.Explicit
 
 tests :: Test
 tests = mutuallyExclusive $ testGroup "Explicit" [
-    testCase "Just put-get-delete" case_justPutGet,
-    testCase "Mass flow" case_massFlow,
-    testCase "Mass Iter" case_massIter
+    testCase "Just put-get-delete" caseJustPutGet,
+    testCase "Mass flow" caseMassFlow,
+    testCase "Mass Iter" caseMassIter
     ]
     
 data TestDoc = TestDoc { kind :: String, intV :: Int, strV :: String } 
@@ -36,8 +36,8 @@
 instance ToJSON TestDoc where
    toJSON (TestDoc k i s) = object ["kind" .= k, "intV" .= i, "strV" .= s]
 
-case_justPutGet :: Assertion
-case_justPutGet = bracket_
+caseJustPutGet :: Assertion
+caseJustPutGet = bracket_
     setup teardown $
     runCouch conn $ do
         rev <- couchPut dbName "doc-just" "" [] $ TestDoc "doc" 1 "1"
@@ -46,25 +46,25 @@
         liftIO $ rev' @=? rev''
         couchDelete dbName "doc-just" rev''
 
-case_massFlow :: Assertion
-case_massFlow = bracket_
+caseMassFlow :: Assertion
+caseMassFlow = bracket_
     setup teardown $
     runCouch conn $ do
         revs <- mapM (\n -> 
                 couchPut dbName (docn n) "" [] $ TestDoc "doc" n $ show n
             ) [1..100]
         liftIO $ length revs @=? 100
-        revs' <- mapM (\n -> couchRev dbName $ docn n) [1..100]
+        revs' <- mapM (couchRev dbName . docn) [1..100]
         liftIO $ revs @=? revs'
         liftIO $ length revs' @=? 100
         mapM_ (\(n,r) ->
             couchDelete dbName (docn n) r) $ zip [1..100] revs'
   where
-    docn n = fromString $ "doc-" ++ show (n :: Int)    
+    docn n = cs $ "doc-" <> show (n :: Int)    
 
 
-case_massIter :: Assertion
-case_massIter = bracket_
+caseMassIter :: Assertion
+caseMassIter = bracket_
     setup teardown $
     runCouch conn $ 
         mapM_ (\n -> do
@@ -79,7 +79,7 @@
             couchDelete dbName (docn n) rev''
          ) [1..100]
   where
-    docn n = fromString $ "doc-" ++ show (n :: Int) 
+    docn n = cs $ "doc-" <> show (n :: Int) 
     
 setup :: IO ()
 setup = setupDB dbName
diff --git a/test/Database/CouchDB/Conduit/Test/Generic.hs b/test/Database/CouchDB/Conduit/Test/Generic.hs
--- a/test/Database/CouchDB/Conduit/Test/Generic.hs
+++ b/test/Database/CouchDB/Conduit/Test/Generic.hs
@@ -15,22 +15,22 @@
 
 import Data.ByteString (ByteString)
 import Data.Generics (Data, Typeable)
-import Data.ByteString.UTF8 (fromString)
+import Data.String.Conversions (cs, (<>))
 import Database.CouchDB.Conduit
 import Database.CouchDB.Conduit.Generic
 
 tests :: Test
 tests = mutuallyExclusive $ testGroup "Generic" [
-    testCase "Just put-get-delete" case_justPutGet,
---    testCase "Mass flow" case_massFlow,
-    testCase "Mass Iter" case_massIter
+    testCase "Just put-get-delete" caseJustPutGet,
+    testCase "Mass flow" caseMassFlow,
+    testCase "Mass Iter" caseMassIter
     ]
     
 data TestDoc = TestDoc { kind :: String, intV :: Int, strV :: String } 
     deriving (Show, Eq, Data, Typeable)
 
-case_justPutGet :: Assertion
-case_justPutGet = bracket_
+caseJustPutGet :: Assertion
+caseJustPutGet = bracket_
     setup teardown $ 
     runCouch conn $ do
         rev <- couchPut dbName "doc-just" "" [] $ TestDoc "doc" 1 "1"
@@ -39,25 +39,25 @@
         liftIO $ rev' @=? rev''
         couchDelete dbName "doc-just" rev''
 
-case_massFlow :: Assertion
-case_massFlow = bracket_
+caseMassFlow :: Assertion
+caseMassFlow = bracket_
     setup teardown $ 
     runCouch conn $ do
         revs <- mapM (\n -> 
                 couchPut dbName (docn n) "" [] $ TestDoc "doc" n $ show n
             ) [1..100]
         liftIO $ length revs @=? 100
-        revs' <- mapM (\n -> couchRev dbName $ docn n) [1..100]
+        revs' <- mapM (couchRev dbName . docn) [1..100]
         liftIO $ revs @=? revs'
         liftIO $ length revs' @=? 100
         mapM_ (\(n,r) ->
             couchDelete dbName (docn n) r) $ zip [1..100] revs'
   where
-    docn n = fromString $ "doc-" ++ show (n :: Int)    
+    docn n = cs $ "doc-" <> show (n :: Int)    
 
 
-case_massIter :: Assertion
-case_massIter = bracket_
+caseMassIter :: Assertion
+caseMassIter = bracket_
     setup teardown $ 
     runCouch conn $ 
         mapM_ (\n -> do
@@ -72,7 +72,7 @@
             couchDelete dbName (docn n) rev''
          ) [1..100]
   where
-    docn n = fromString $ "doc-" ++ show (n :: Int)
+    docn n = cs $ "doc-" <> show (n :: Int)   
     
 setup :: IO ()
 setup = setupDB dbName
diff --git a/test/Database/CouchDB/Conduit/Test/View.hs b/test/Database/CouchDB/Conduit/Test/View.hs
--- a/test/Database/CouchDB/Conduit/Test/View.hs
+++ b/test/Database/CouchDB/Conduit/Test/View.hs
@@ -15,7 +15,7 @@
 import Control.Applicative ((<$>), (<*>), empty)
 
 import qualified Data.ByteString as B
-import Data.ByteString.UTF8 (fromString)
+import Data.String.Conversions ((<>), cs)
 import Data.Aeson ((.:), (.=))
 import qualified Data.Aeson as A
 --import qualified Data.Aeson.Generic as AG
@@ -131,4 +131,4 @@
     doc n = T "doc" n $ show n
   
 docName :: Int -> B.ByteString
-docName n = fromString $ "doc" ++ show n    
+docName n = cs $ "doc" <> show n    
