diff --git a/Web/Twitter/Conduit.hs b/Web/Twitter/Conduit.hs
--- a/Web/Twitter/Conduit.hs
+++ b/Web/Twitter/Conduit.hs
@@ -19,12 +19,12 @@
        -- * Re-exports
          module Web.Twitter.Conduit.Api
        , module Web.Twitter.Conduit.Cursor
-       , module Web.Twitter.Conduit.Monad
        , module Web.Twitter.Conduit.Parameters
        , module Web.Twitter.Conduit.Request
        , module Web.Twitter.Conduit.Response
        , module Web.Twitter.Conduit.Status
        , module Web.Twitter.Conduit.Stream
+       , module Web.Twitter.Conduit.Types
 
        -- * 'Web.Twitter.Conduit.Base'
        , TwitterBaseM
@@ -37,27 +37,19 @@
        , sourceWithCursor
        , sourceWithCursor'
 
-#if !MIN_VERSION_twitter_types(0,5,0)
-       , UploadedMedia
-       , mediaId
-       , mediaSize
-       , mediaImage
-       , ImageSizeType
-       , imageWidth
-       , imageHeight
-       , imageType
-#endif
+       -- * Backward compativility
+       -- $backward
        ) where
 
 import Web.Twitter.Conduit.Api
 import Web.Twitter.Conduit.Base
 import Web.Twitter.Conduit.Cursor
-import Web.Twitter.Conduit.Monad
 import Web.Twitter.Conduit.Parameters
 import Web.Twitter.Conduit.Request
 import Web.Twitter.Conduit.Response
 import Web.Twitter.Conduit.Status
 import Web.Twitter.Conduit.Stream
+import Web.Twitter.Conduit.Types
 
 -- for haddock
 import Web.Authenticate.OAuth
@@ -65,7 +57,6 @@
 import qualified Data.Conduit.List as CL
 import qualified Data.Text as T
 import qualified Data.Text.IO as T
-import Control.Monad.Logger
 import Control.Monad.IO.Class
 import Control.Lens
 
@@ -84,13 +75,13 @@
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- >
 -- > import Web.Twitter.Conduit
--- > import Web.Twitter.Types
+-- > import Web.Twitter.Types.Lens
 -- > import Web.Authenticate.OAuth
+-- > import Network.HTTP.Conduit
 -- > import Data.Conduit
 -- > import qualified Data.Conduit.List as CL
 -- > import qualified Data.Text as T
 -- > import qualified Data.Text.IO as T
--- > import Control.Monad.Logger
 -- > import Control.Monad.IO.Class
 -- > import Control.Lens
 --
@@ -137,15 +128,12 @@
 --
 -- > twInfo = setCredential tokens credential def
 --
--- Every twitter API functions are run in the 'TW' monad.
--- By using 'runTW' function, you can perform computation in 'TW' monad.
---
 -- Twitter API requests are performed by 'call' function.
 -- For example, <https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline GET statuses/home_timeline>
 -- could be obtained by:
 --
 -- @
--- timeline <- 'call' 'homeTimeline'
+-- timeline \<- 'withManager' $ \\mgr -\> 'call' twInfo mgr 'homeTimeline'
 -- @
 --
 -- The response of 'call' function is wrapped by the suitable type of
@@ -158,7 +146,7 @@
 -- includes 20 tweets, and you can change the number of tweets by the /count/ parameter.
 --
 -- @
--- timeline <- 'call' '$' 'homeTimeline' '&' 'count' '?~' 200
+-- timeline \<- 'withManager' $ \\mgr -\> 'call' twInfo mgr '$' 'homeTimeline' '&' 'count' '?~' 200
 -- @
 --
 -- If you need more statuses, you can obtain those with multiple API requests.
@@ -168,7 +156,7 @@
 -- or use the conduit wrapper 'sourceWithCursor' as below:
 --
 -- @
--- friends <- 'sourceWithCursor' ('friendsList' ('ScreenNameParam' \"thimura\") '&' 'count' '?~' 200) '$$' 'CL.consume'
+-- friends \<- 'withManager' $ \\mgr -\> 'sourceWithCursor' twInfo mgr ('friendsList' ('ScreenNameParam' \"thimura\") '&' 'count' '?~' 200) '$$' 'CL.consume'
 -- @
 --
 -- Statuses APIs, for instance, 'homeTimeline', are also wrapped by 'sourceWithMaxId'.
@@ -177,8 +165,8 @@
 --
 -- @
 -- main :: IO ()
--- main = runNoLoggingT . runTW twInfo $ do
---     'sourceWithMaxId' 'homeTimeline'
+-- main = withManager $ \mgr -> do
+--     'sourceWithMaxId' twInfo mgr 'homeTimeline'
 --         $= CL.isolate 60
 --         $$ CL.mapM_ $ \status -> liftIO $ do
 --             T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId
@@ -188,3 +176,10 @@
 --                                   , status ^. statusText
 --                                   ]
 -- @
+
+-- $backward
+--
+-- In the version below 0.1.0, twitter-conduit provides the TW monad,
+-- and every Twitter API functions are run in the TW monad.
+--
+-- For backward compatibility, TW monad and the functions are provided in the Web.Twitter.Conduit.Monad module.
diff --git a/Web/Twitter/Conduit/Api.hs b/Web/Twitter/Conduit/Api.hs
--- a/Web/Twitter/Conduit/Api.hs
+++ b/Web/Twitter/Conduit/Api.hs
@@ -195,7 +195,7 @@
 -- You can perform a query using 'call':
 --
 -- @
--- res <- 'call' '$' 'directMessages' '&' 'count' '?~' 100
+-- res <- 'call' twInfo mgr '$' 'directMessages' '&' 'count' '?~' 100
 -- @
 --
 -- >>> directMessages
@@ -218,7 +218,7 @@
 -- You can perform a query using 'call':
 --
 -- @
--- res <- 'call' '$' 'directMessagesSent' '&' 'count' '?~' 100
+-- res <- 'call' twInfo mgr '$' 'directMessagesSent' '&' 'count' '?~' 100
 -- @
 --
 -- >>> directMessagesSent
@@ -242,7 +242,7 @@
 -- You can perform a query using 'call':
 --
 -- @
--- res <- 'call' '$' 'directMessagesShow' 1234567890
+-- res <- 'call' twInfo mgr '$' 'directMessagesShow' 1234567890
 -- @
 --
 -- >>> directMessagesShow 1234567890
@@ -256,7 +256,7 @@
 -- You can perform a query using 'call':
 --
 -- @
--- res <- 'call' '$' 'directMessagesDestroy' 1234567890
+-- res <- 'call' twInfo mgr '$' 'directMessagesDestroy' 1234567890
 -- @
 --
 -- >>> directMessagesDestroy 1234567890
@@ -273,7 +273,7 @@
 -- You can perform a post using 'call':
 --
 -- @
--- res <- 'call' '$' 'directMessagesNew' (ScreenNameParam \"thimura\") \"Hello DM\"
+-- res <- 'call' twInfo mgr '$' 'directMessagesNew' (ScreenNameParam \"thimura\") \"Hello DM\"
 -- @
 --
 -- >>> directMessagesNew (ScreenNameParam "thimura") "Hello DM"
@@ -289,7 +289,7 @@
 -- You can perform a request using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendshipsNoRetweetsIds'
+-- res <- 'call' twInfo mgr '$' 'friendshipsNoRetweetsIds'
 -- @
 --
 -- >>> friendshipsNoRetweetsIds
@@ -303,7 +303,7 @@
 -- You can perform a query using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendsIds' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'friendsIds' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- Or, you can iterate with 'sourceWithCursor':
@@ -330,7 +330,7 @@
 -- You can perform a query using 'call':
 --
 -- @
--- res <- 'call' '$' 'followersIds' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'followersIds' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- Or, you can iterate with 'sourceWithCursor':
@@ -357,7 +357,7 @@
 -- You can perform a request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendshipsIncoming'
+-- res <- 'call' twInfo mgr '$' 'friendshipsIncoming'
 -- @
 --
 -- Or, you can iterate with 'sourceWithCursor':
@@ -381,7 +381,7 @@
 -- You can perform a request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendshipsOutgoing'
+-- res <- 'call' twInfo mgr '$' 'friendshipsOutgoing'
 -- @
 --
 -- Or, you can iterate with 'sourceWithCursor':
@@ -405,7 +405,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendshipsCreate' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'friendshipsCreate' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- >>> friendshipsCreate (ScreenNameParam "thimura")
@@ -424,7 +424,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendshipsDestroy' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'friendshipsDestroy' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- >>> friendshipsDestroy (ScreenNameParam "thimura")
@@ -440,7 +440,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'friendsList' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'friendsList' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- Or, you can iterate with 'sourceWithCursor':
@@ -468,7 +468,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'followersList' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'followersList' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- Or, you can iterate with 'sourceWithCursor':
@@ -496,7 +496,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'accountVerifyCredentials'
+-- res <- 'call' twInfo mgr '$' 'accountVerifyCredentials'
 -- @
 --
 -- >>> accountVerifyCredentials
@@ -514,7 +514,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'usersLookup' ('ScreenNameListParam' [\"thimura\", \"twitterapi\"])
+-- res <- 'call' twInfo mgr '$' 'usersLookup' ('ScreenNameListParam' [\"thimura\", \"twitterapi\"])
 -- @
 --
 -- >>> usersLookup (ScreenNameListParam ["thimura", "twitterapi"])
@@ -531,7 +531,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'usersShow' ('ScreenNameParam' \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'usersShow' ('ScreenNameParam' \"thimura\")
 -- @
 --
 -- >>> usersShow (ScreenNameParam "thimura")
@@ -548,7 +548,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'favoritesList' (ScreenNameParam \"thimura\")
+-- res <- 'call' twInfo mgr '$' 'favoritesList' (ScreenNameParam \"thimura\")
 -- @
 --
 -- >>> favoritesList Nothing
@@ -575,7 +575,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'favoritesCreate' 1234567890
+-- res <- 'call' twInfo mgr '$' 'favoritesCreate' 1234567890
 -- @
 --
 -- >>> favoritesCreate 1234567890
@@ -592,7 +592,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'favoritesDestroy' 1234567890
+-- res <- 'call' twInfo mgr '$' 'favoritesDestroy' 1234567890
 -- @
 --
 -- >>> favoritesDestroy 1234567890
@@ -609,7 +609,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsStatuses' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsStatuses' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- If you need more statuses, you can obtain those by using 'sourceWithMaxId':
@@ -637,7 +637,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsMembersDestroy' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")
+-- res <- 'call' twInfo mgr '$' 'listsMembersDestroy' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")
 -- @
 --
 -- >>> listsMembersDestroy (ListNameParam "thimura/haskell") (ScreenNameParam "thimura")
@@ -654,7 +654,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsMemberships' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsMemberships' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsMemberships Nothing
@@ -676,7 +676,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsSubscribers' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsSubscribers' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsSubscribers (ListNameParam "thimura/haskell")
@@ -697,7 +697,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsSubscriptions' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsSubscriptions' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsSubscriptions Nothing
@@ -719,7 +719,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsOwnerships' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsOwnerships' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsOwnerships Nothing
@@ -741,7 +741,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsMembers' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsMembers' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsMembers (ListNameParam "thimura/haskell")
@@ -761,7 +761,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsMembersCreate' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")
+-- res <- 'call' twInfo mgr '$' 'listsMembersCreate' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")
 -- @
 --
 -- >>> listsMembersCreate (ListNameParam "thimura/haskell") (ScreenNameParam "thimura")
@@ -777,7 +777,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsDestroy' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsDestroy' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsDestroy (ListNameParam "thimura/haskell")
@@ -793,7 +793,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsUpdate' ('ListNameParam' "thimura/haskell") True (Just "Haskellers")
+-- res <- 'call' twInfo mgr '$' 'listsUpdate' ('ListNameParam' "thimura/haskell") True (Just "Haskellers")
 -- @
 --
 -- >>> listsUpdate (ListNameParam "thimura/haskell") True (Just "Haskellers")
@@ -815,7 +815,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsCreate' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsCreate' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsCreate "haskell" True Nothing
@@ -841,7 +841,7 @@
 -- You can perform request by using 'call':
 --
 -- @
--- res <- 'call' '$' 'listsShow' ('ListNameParam' "thimura/haskell")
+-- res <- 'call' twInfo mgr '$' 'listsShow' ('ListNameParam' "thimura/haskell")
 -- @
 --
 -- >>> listsShow (ListNameParam "thimura/haskell")
@@ -859,14 +859,14 @@
 -- First, you should upload media with 'mediaUpload':
 --
 -- @
--- res1 <- 'call' '$' 'mediaUpload' ('MediaFromFile' \"\/path\/to\/upload\/file1.png\")
--- res2 <- 'call' '$' 'mediaUpload' ('MediaRequestBody' \"file2.png\" \"[.. file body ..]\")
+-- res1 <- 'call' twInfo mgr '$' 'mediaUpload' ('MediaFromFile' \"\/path\/to\/upload\/file1.png\")
+-- res2 <- 'call' twInfo mgr '$' 'mediaUpload' ('MediaRequestBody' \"file2.png\" \"[.. file body ..]\")
 -- @
 --
 -- and then collect the resulting media IDs and update your status by calling 'update':
 --
 -- @
--- 'call' '$' 'update' \"Hello World\" '&' 'mediaIds' '?~' ['mediaId' res1, 'mediaId' res2]
+-- 'call' twInfo mgr '$' 'update' \"Hello World\" '&' 'mediaIds' '?~' ['mediaId' res1, 'mediaId' res2]
 -- @
 --
 -- See: <https://dev.twitter.com/docs/api/multiple-media-extended-entities>
diff --git a/Web/Twitter/Conduit/Base.hs b/Web/Twitter/Conduit/Base.hs
--- a/Web/Twitter/Conduit/Base.hs
+++ b/Web/Twitter/Conduit/Base.hs
@@ -1,12 +1,10 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE RecordWildCards #-}
 
 module Web.Twitter.Conduit.Base
-       ( api
-       , getResponse
+       ( getResponse
        , call
        , call'
        , callWithResponse
@@ -21,43 +19,37 @@
        , makeRequest
        , sinkJSON
        , sinkFromJSON
-       , showBS
        ) where
 
-import Web.Twitter.Conduit.Monad
+import Web.Twitter.Conduit.Cursor
 import Web.Twitter.Conduit.Parameters
 import Web.Twitter.Conduit.Request
 import Web.Twitter.Conduit.Response
-import Web.Twitter.Conduit.Cursor
+import Web.Twitter.Conduit.Types
 import Web.Twitter.Types.Lens
 
-import qualified Network.HTTP.Conduit as HTTP
-import Network.HTTP.Client.MultipartFormData
-import qualified Network.HTTP.Types as HT
-import qualified Data.Conduit as C
-import qualified Data.Conduit.List as CL
-
+import Control.Lens
+import Control.Monad.IO.Class
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Resource (MonadResource, MonadThrow, monadThrow)
 import Data.Aeson
 import Data.Aeson.Lens
+import Data.ByteString (ByteString)
+import qualified Data.Conduit as C
 import qualified Data.Conduit.Attoparsec as CA
-import qualified Data.Text as T
+import qualified Data.Conduit.List as CL
 import qualified Data.Text.Encoding as T
-import Data.ByteString (ByteString)
-import qualified Data.ByteString.Char8 as S8
-import Control.Monad.IO.Class
-import Control.Monad.Trans.Class (lift)
-import Control.Monad.Trans.Resource (MonadResource, MonadThrow, monadThrow)
-import Control.Monad.Logger
-import Control.Lens
+import Network.HTTP.Client.MultipartFormData
+import qualified Network.HTTP.Conduit as HTTP
+import qualified Network.HTTP.Types as HT
 import Unsafe.Coerce
+import Web.Authenticate.OAuth (signOAuth)
 
 type TwitterBaseM m = ( MonadResource m
-                      , MonadLogger m
                       )
 
-makeRequest :: (MonadThrow m, MonadIO m)
-            => APIRequest apiName responseType
-            -> m HTTP.Request
+makeRequest :: APIRequest apiName responseType
+            -> IO HTTP.Request
 makeRequest (APIRequestGet u pa) = makeRequest' "GET" u (makeSimpleQuery pa)
 makeRequest (APIRequestPost u pa) = makeRequest' "POST" u (makeSimpleQuery pa)
 makeRequest (APIRequestPostMultipart u param prt) =
@@ -66,11 +58,10 @@
     body = prt ++ partParam
     partParam = Prelude.map (uncurry partBS . over _1 T.decodeUtf8) (makeSimpleQuery param)
 
-makeRequest' :: MonadThrow m
-             => HT.Method -- ^ HTTP request method (GET or POST)
+makeRequest' :: HT.Method -- ^ HTTP request method (GET or POST)
              -> String -- ^ API Resource URL
              -> HT.SimpleQuery -- ^ Query
-             -> m HTTP.Request
+             -> IO HTTP.Request
 makeRequest' m url query = do
     req <- HTTP.parseUrl url
     return $ req { HTTP.method = m
@@ -78,26 +69,14 @@
                  , HTTP.checkStatus = \_ _ _ -> Nothing
                  }
 
-{-# DEPRECATED api "use `getResponse =<< makeRequest'`" #-}
-api :: TwitterBaseM m
-    => HT.Method -- ^ HTTP request method (GET or POST)
-    -> String -- ^ API Resource URL
-    -> HT.SimpleQuery -- ^ Query
-    -> TW m (Response (C.ResumableSource (TW m) ByteString))
-api m url query =
-    getResponse =<< makeRequest' m url query
-
-getResponse :: TwitterBaseM m
-            => HTTP.Request
-            -> TW m (Response (C.ResumableSource (TW m) ByteString))
-getResponse req = do
-    proxy <- getProxy
-    signedReq <- signOAuthTW $ req { HTTP.proxy = proxy }
-    $(logDebug) $ T.pack $ "Signed Request: " ++ show signedReq
-    mgr <- getManager
+getResponse :: MonadResource m
+            => TWInfo
+            -> HTTP.Manager
+            -> HTTP.Request
+            -> m (Response (C.ResumableSource m ByteString))
+getResponse TWInfo{..} mgr req = do
+    signedReq <- signOAuth (twOAuth twToken) (twCredential twToken) $ req { HTTP.proxy = twProxy }
     res <- HTTP.http signedReq mgr
-    $(logDebug) $ T.pack $ "Response Status: " ++ show (HTTP.responseStatus res)
-    $(logDebug) $ T.pack $ "Response Header: " ++ show (HTTP.responseHeaders res)
     return
         Response { responseStatus = HTTP.responseStatus res
                  , responseHeaders = HTTP.responseHeaders res
@@ -107,7 +86,7 @@
 endpoint :: String
 endpoint = "https://api.twitter.com/1.1/"
 
-getValue :: (MonadLogger m, MonadThrow m)
+getValue :: MonadThrow m
          => Response (C.ResumableSource m ByteString)
          -> m (Response Value)
 getValue res = do
@@ -131,7 +110,7 @@
   where
     sci = HT.statusCode responseStatus
 
-getValueOrThrow :: (MonadThrow m, MonadLogger m, FromJSON a)
+getValueOrThrow :: (MonadThrow m, FromJSON a)
                 => Response (C.ResumableSource m ByteString)
                 -> m (Response a)
 getValueOrThrow res = do
@@ -143,37 +122,92 @@
         Success r -> return $ res' { responseBody = r }
         Error err -> monadThrow $ FromJSONError err
 
-call :: (TwitterBaseM m, FromJSON responseType)
-     => APIRequest apiName responseType
-     -> TW m responseType
+-- | Perform an 'APIRequest' and then provide the response which is mapped to a suitable type of
+-- <http://hackage.haskell.org/package/twitter-types twitter-types>.
+--
+-- Example:
+--
+-- @
+-- 'HTTP.withManager' $ \\mgr -\> do
+--      user <- 'call' twInfo mgr $ 'accountVerifyCredentials'
+--      'liftIO' $ print user
+-- @
+--
+-- If you need raw JSON value which is parsed by <http://hackage.haskell.org/package/aeson aeson>,
+-- use 'call'' to obtain it.
+call :: (MonadResource m, FromJSON responseType)
+     => TWInfo -- ^ Twitter Setting
+     -> HTTP.Manager
+     -> APIRequest apiName responseType
+     -> m responseType
 call = call'
 
-call' :: (TwitterBaseM m, FromJSON value)
-      => APIRequest apiName responseType
-      -> TW m value
-call' = fmap responseBody . callWithResponse'
+-- | Perform an 'APIRequest' and then provide the response.
+-- The response of this function is not restrict to @responseType@,
+-- so you can choose an arbitrarily type of FromJSON instances.
+call' :: (MonadResource m, FromJSON value)
+      => TWInfo -- ^ Twitter Setting
+      -> HTTP.Manager
+      -> APIRequest apiName responseType
+      -> m value
+call' info mgr req = responseBody `fmap` callWithResponse' info mgr req
 
-callWithResponse :: (TwitterBaseM m, FromJSON responseType)
-                 => APIRequest apiName responseType
-                 -> TW m (Response responseType)
+-- | Perform an 'APIRequest' and then provide the 'Response'.
+--
+-- Example:
+--
+-- @
+-- res \<- 'HTTP.withManager' $ \\mgr -\> do
+--     'callWithResponse' twInfo mgr $ 'accountVerifyCredentials'
+-- 'print' $ 'responseStatus' res
+-- 'print' $ 'responseHeaders' res
+-- 'print' $ 'responseBody' res
+-- @
+callWithResponse :: (MonadResource m, FromJSON responseType)
+                 => TWInfo -- ^ Twitter Setting
+                 -> HTTP.Manager
+                 -> APIRequest apiName responseType
+                 -> m (Response responseType)
 callWithResponse = callWithResponse'
 
-callWithResponse' :: (TwitterBaseM m, FromJSON value)
-                  => APIRequest apiName responseType
-                  -> TW m (Response value)
-callWithResponse' req = getValueOrThrow =<< getResponse =<< makeRequest req
+-- | Perform an 'APIRequest' and then provide the 'Response'.
+-- The response of this function is not restrict to @responseType@,
+-- so you can choose an arbitrarily type of FromJSON instances.
+--
+-- Example:
+--
+-- @
+-- res \<- 'HTTP.withManager' $ \\mgr -\> do
+--     'callWithResponse'' twInfo mgr $ 'accountVerifyCredentials'
+-- 'print' $ 'responseStatus' res
+-- 'print' $ 'responseHeaders' res
+-- 'print' $ 'responseBody' (res :: Value)
+-- @
+callWithResponse' :: (MonadResource m, FromJSON value)
+                  => TWInfo
+                  -> HTTP.Manager
+                  -> APIRequest apiName responseType
+                  -> m (Response value)
+callWithResponse' info mgr req = do
+    res <- getResponse info mgr =<< liftIO (makeRequest req)
+    getValueOrThrow res
 
-sourceWithMaxId :: ( TwitterBaseM m
+-- | A wrapper function to perform multiple API request with changing @max_id@ parameter.
+--
+-- This function cooperate with instances of 'HasMaxIdParam'.
+sourceWithMaxId :: ( MonadResource m
                    , FromJSON responseType
                    , AsStatus responseType
                    , HasMaxIdParam (APIRequest apiName [responseType])
                    )
-                => APIRequest apiName [responseType]
-                -> C.Source (TW m) responseType
-sourceWithMaxId = loop
+                => TWInfo -- ^ Twitter Setting
+                -> HTTP.Manager
+                -> APIRequest apiName [responseType]
+                -> C.Source m responseType
+sourceWithMaxId info mgr = loop
   where
     loop req = do
-        res <- lift $ call req
+        res <- lift $ call info mgr req
         case getMinId res of
             Just mid -> do
                 CL.sourceList res
@@ -181,15 +215,22 @@
             Nothing -> CL.sourceList res
     getMinId = minimumOf (traverse . status_id)
 
-sourceWithMaxId' :: ( TwitterBaseM m
+-- | A wrapper function to perform multiple API request with changing @max_id@ parameter.
+-- The response of this function is not restrict to @responseType@,
+-- so you can choose an arbitrarily type of FromJSON instances.
+--
+-- This function cooperate with instances of 'HasMaxIdParam'.
+sourceWithMaxId' :: ( MonadResource m
                     , HasMaxIdParam (APIRequest apiName [responseType])
                     )
-                 => APIRequest apiName [responseType]
-                 -> C.Source (TW m) Value
-sourceWithMaxId' = loop
+                 => TWInfo -- ^ Twitter Setting
+                 -> HTTP.Manager
+                 -> APIRequest apiName [responseType]
+                 -> C.Source m Value
+sourceWithMaxId' info mgr = loop
   where
     loop req = do
-        res <- lift $ call' req
+        res <- lift $ call' info mgr req
         case getMinId res of
             Just mid -> do
                 CL.sourceList res
@@ -197,29 +238,41 @@
             Nothing -> CL.sourceList res
     getMinId = minimumOf (traverse . key "id" . _Integer)
 
-sourceWithCursor :: ( TwitterBaseM m
+-- | A wrapper function to perform multiple API request with changing @cursor@ parameter.
+--
+-- This function cooperate with instances of 'HasCursorParam'.
+sourceWithCursor :: ( MonadResource m
                     , FromJSON responseType
                     , CursorKey ck
                     , HasCursorParam (APIRequest apiName (WithCursor ck responseType))
                     )
-                 => APIRequest apiName (WithCursor ck responseType)
-                 -> C.Source (TW m) responseType
-sourceWithCursor req = loop (-1)
+                 => TWInfo -- ^ Twitter Setting
+                 -> HTTP.Manager
+                 -> APIRequest apiName (WithCursor ck responseType)
+                 -> C.Source m responseType
+sourceWithCursor info mgr req = loop (-1)
   where
     loop 0 = CL.sourceNull
     loop cur = do
-        res <- lift $ call $ req & cursor ?~ cur
+        res <- lift $ call info mgr $ req & cursor ?~ cur
         CL.sourceList $ contents res
         loop $ nextCursor res
 
-sourceWithCursor' :: ( TwitterBaseM m
+-- | A wrapper function to perform multiple API request with changing @cursor@ parameter.
+-- The response of this function is not restrict to @responseType@,
+-- so you can choose an arbitrarily type of FromJSON instances.
+--
+-- This function cooperate with instances of 'HasCursorParam'.
+sourceWithCursor' :: ( MonadResource m
                      , FromJSON responseType
                      , CursorKey ck
                      , HasCursorParam (APIRequest apiName (WithCursor ck responseType))
                      )
-                  => APIRequest apiName (WithCursor ck responseType)
-                  -> C.Source (TW m) Value
-sourceWithCursor' req = loop (-1)
+                  => TWInfo -- ^ Twitter Setting
+                  -> HTTP.Manager
+                  -> APIRequest apiName (WithCursor ck responseType)
+                  -> C.Source m Value
+sourceWithCursor' info mgr req = loop (-1)
   where
     relax :: FromJSON value
           => APIRequest apiName (WithCursor ck responseType)
@@ -227,27 +280,19 @@
     relax = unsafeCoerce
     loop 0 = CL.sourceNull
     loop cur = do
-        res <- lift $ call $ relax $ req & cursor ?~ cur
+        res <- lift $ call info mgr $ relax $ req & cursor ?~ cur
         CL.sourceList $ contents res
         loop $ nextCursor res
 
 sinkJSON :: ( MonadThrow m
-            , MonadLogger m
             ) => C.Consumer ByteString m Value
-sinkJSON = do
-    js <- CA.sinkParser json
-    $(logDebug) $ T.pack $ "Response JSON: " ++ show js
-    return js
+sinkJSON = CA.sinkParser json
 
 sinkFromJSON :: ( FromJSON a
                 , MonadThrow m
-                , MonadLogger m
                 ) => C.Consumer ByteString m a
 sinkFromJSON = do
     v <- sinkJSON
     case fromJSON v of
         Error err -> monadThrow $ FromJSONError err
         Success r -> return r
-
-showBS :: Show a => a -> ByteString
-showBS = S8.pack . show
diff --git a/Web/Twitter/Conduit/Monad.hs b/Web/Twitter/Conduit/Monad.hs
--- a/Web/Twitter/Conduit/Monad.hs
+++ b/Web/Twitter/Conduit/Monad.hs
@@ -1,82 +1,64 @@
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE CPP #-}
 
 module Web.Twitter.Conduit.Monad
-       ( TW
-       , TWToken (..)
-       , TWInfo (..)
-       , setCredential
+       (
+       -- * How to use this library
+       -- $howto
+
+       -- * Re-exports
+         module Web.Twitter.Conduit.Api
+       , module Web.Twitter.Conduit.Cursor
+       , module Web.Twitter.Conduit.Parameters
+       , module Web.Twitter.Conduit.Request
+       , module Web.Twitter.Conduit.Response
+       , module Web.Twitter.Conduit.Status
+       , module Web.Twitter.Conduit.Stream
+       , module Web.Twitter.Conduit.Types
+
+       -- * 'Web.Twitter.Conduit.Monad'
+       , Base.TwitterBaseM
+       , TW
        , runTW
        , runTWManager
-       , getProxy
-       , getManager
-       , signOAuthTW
-       , twitterOAuth
-       )
-       where
+       , call
+       , call'
+       , callWithResponse
+       , callWithResponse'
+       , sourceWithMaxId
+       , sourceWithMaxId'
+       , sourceWithCursor
+       , sourceWithCursor'
+       ) where
 
-import Web.Authenticate.OAuth
-import Network.HTTP.Conduit
-import Data.Default
+import Web.Twitter.Conduit.Api
+import qualified Web.Twitter.Conduit.Base as Base
+import Web.Twitter.Conduit.Cursor
+import Web.Twitter.Conduit.Parameters
+import Web.Twitter.Conduit.Request
+import Web.Twitter.Conduit.Response
+import Web.Twitter.Conduit.Status
+import Web.Twitter.Conduit.Stream
+import Web.Twitter.Conduit.Types
+import qualified Network.HTTP.Conduit as HTTP
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Reader
 import Control.Monad.Trans.Resource
+import Data.Aeson
+import Web.Twitter.Types.Lens
+import qualified Data.Conduit as C
+import Control.Monad.Trans.Class (lift)
 
+#ifdef HLINT
+{-# ANN module "HLint: ignore Use import/export shortcut" #-}
+#endif
+
 -- $setup
 -- >>> :set -XOverloadedStrings
 
 type TW m = ReaderT TWEnv m
 
-data TWToken = TWToken
-    { twOAuth :: OAuth
-    , twCredential :: Credential
-    } deriving Show
-instance Default TWToken where
-    def = TWToken twitterOAuth (Credential [])
-
-data TWInfo = TWInfo
-    { twToken :: TWToken
-    , twProxy :: Maybe Proxy
-    } deriving Show
-instance Default TWInfo where
-    def = TWInfo
-        { twToken = def
-        , twProxy = Nothing
-        }
-
-twitterOAuth :: OAuth
-twitterOAuth =
-    def { oauthServerName = "twitter"
-        , oauthRequestUri = "https://api.twitter.com/oauth/request_token"
-        , oauthAccessTokenUri = "https://api.twitter.com/oauth/access_token"
-        , oauthAuthorizeUri = "https://api.twitter.com/oauth/authorize"
-        , oauthConsumerKey = error "You MUST specify oauthConsumerKey parameter."
-        , oauthConsumerSecret = error "You MUST specify oauthConsumerSecret parameter."
-        , oauthSignatureMethod = HMACSHA1
-        , oauthCallback = Nothing
-        }
-
-data TWEnv = TWEnv
-    { twInfo :: TWInfo
-    , twManager :: Manager
-    }
-
--- | set OAuth keys and Credentials to TWInfo.
---
--- >>> let proxy = Proxy "localhost" 8080
--- >>> let twinfo = def { twProxy = Just proxy }
--- >>> let oauth = twitterOAuth { oauthConsumerKey = "consumer_key", oauthConsumerSecret = "consumer_secret" }
--- >>> let credential = Credential [("oauth_token","...")]
--- >>> let twinfo2 = setCredential oauth credential twinfo
--- >>> oauthConsumerKey . twOAuth . twToken $ twinfo2
--- "consumer_key"
--- >>> twProxy twinfo2 == Just proxy
--- True
-setCredential :: OAuth -> Credential -> TWInfo -> TWInfo
-setCredential oa cred env
-  = TWInfo
-    { twToken = TWToken oa cred
-    , twProxy = twProxy env
-    }
+data TWEnv = TWEnv TWInfo HTTP.Manager
 
 -- | create a new http-conduit manager and run TW monad.
 --
@@ -87,20 +69,73 @@
 runTW :: ( MonadBaseControl IO m
          , MonadIO m
          ) => TWInfo -> TW (ResourceT m) a -> m a
-runTW info st = withManager $ \mgr -> runTWManager info mgr st
+runTW info st = HTTP.withManager $ \mgr -> runTWManager info mgr st
 
-runTWManager :: MonadBaseControl IO m => TWInfo -> Manager -> TW (ResourceT m) a -> ResourceT m a
+runTWManager :: MonadBaseControl IO m => TWInfo -> HTTP.Manager -> TW (ResourceT m) a -> ResourceT m a
 runTWManager info mgr st = runReaderT st $ TWEnv info mgr
 
-getProxy ::Monad m => TW m (Maybe Proxy)
-getProxy = asks (twProxy . twInfo)
+call :: (MonadResource m, FromJSON responseType)
+     => APIRequest apiName responseType
+     -> TW m responseType
+call = call'
 
-getManager :: Monad m => TW m Manager
-getManager = asks twManager
+call' :: (MonadResource m, FromJSON value)
+      => APIRequest apiName responseType
+      -> TW m value
+call' req = do
+    TWEnv info mgr <- ask
+    lift $ Base.call' info mgr req
 
-signOAuthTW :: MonadIO m
-            => Request
-            -> TW m Request
-signOAuthTW req = do
-    TWToken oa cred <- asks (twToken . twInfo)
-    signOAuth oa cred req
+callWithResponse :: (MonadResource m, FromJSON responseType)
+                 => APIRequest apiName responseType
+                 -> TW m (Response responseType)
+callWithResponse = callWithResponse'
+
+callWithResponse' :: (MonadResource m, FromJSON value)
+                  => APIRequest apiName responseType
+                  -> TW m (Response value)
+callWithResponse' req = do
+    TWEnv info mgr <- ask
+    lift $ Base.callWithResponse' info mgr req
+
+sourceWithMaxId :: ( MonadResource m
+                   , FromJSON responseType
+                   , AsStatus responseType
+                   , HasMaxIdParam (APIRequest apiName [responseType])
+                   )
+                => APIRequest apiName [responseType]
+                -> C.Source (TW m) responseType
+sourceWithMaxId req = do
+    TWEnv info mgr <- lift ask
+    Base.sourceWithMaxId info mgr req
+
+sourceWithMaxId' :: ( MonadResource m
+                    , HasMaxIdParam (APIRequest apiName [responseType])
+                    )
+                 => APIRequest apiName [responseType]
+                 -> C.Source (TW m) Value
+sourceWithMaxId' req = do
+    TWEnv info mgr <- lift ask
+    Base.sourceWithMaxId' info mgr req
+
+sourceWithCursor :: ( MonadResource m
+                    , FromJSON responseType
+                    , CursorKey ck
+                    , HasCursorParam (APIRequest apiName (WithCursor ck responseType))
+                    )
+                 => APIRequest apiName (WithCursor ck responseType)
+                 -> C.Source (TW m) responseType
+sourceWithCursor req = do
+    TWEnv info mgr <- lift ask
+    Base.sourceWithCursor info mgr req
+
+sourceWithCursor' :: ( MonadResource m
+                     , FromJSON responseType
+                     , CursorKey ck
+                     , HasCursorParam (APIRequest apiName (WithCursor ck responseType))
+                     )
+                  => APIRequest apiName (WithCursor ck responseType)
+                  -> C.Source (TW m) Value
+sourceWithCursor' req = do
+    TWEnv info mgr <- lift ask
+    Base.sourceWithCursor' info mgr req
diff --git a/Web/Twitter/Conduit/Status.hs b/Web/Twitter/Conduit/Status.hs
--- a/Web/Twitter/Conduit/Status.hs
+++ b/Web/Twitter/Conduit/Status.hs
@@ -156,7 +156,7 @@
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' '$' 'retweetsId' 1234567890
+-- res <- 'call' twInfo mgr '$' 'retweetsId' 1234567890
 -- @
 --
 -- >>> retweetsId 1234567890
@@ -177,7 +177,7 @@
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' '$' 'showId' 1234567890
+-- res <- 'call' twInfo mgr '$' 'showId' 1234567890
 -- @
 --
 -- >>> showId 1234567890
@@ -199,7 +199,7 @@
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' '$' 'destroyId' 1234567890
+-- res <- 'call' twInfo mgr '$' 'destroyId' 1234567890
 -- @
 --
 -- >>> destroyId 1234567890
@@ -218,7 +218,7 @@
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' '$' 'update' \"Hello World\"
+-- res <- 'call' twInfo mgr '$' 'update' \"Hello World\"
 -- @
 --
 -- >>> update "Hello World"
@@ -243,7 +243,7 @@
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' '$' 'retweetId' 1234567890
+-- res <- 'call' twInfo mgr '$' 'retweetId' 1234567890
 -- @
 --
 -- >>> retweetId 1234567890
@@ -261,7 +261,7 @@
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' '$' 'updateWithMedia' \"Hello World\" ('MediaFromFile' \"/home/thimura/test.jpeg\")
+-- res <- 'call' twInfo mgr '$' 'updateWithMedia' \"Hello World\" ('MediaFromFile' \"/home/thimura/test.jpeg\")
 -- @
 --
 -- >>> updateWithMedia "Hello World" (MediaFromFile "/home/fuga/test.jpeg")
@@ -289,7 +289,7 @@
 -- You can perform a request using 'call':
 --
 -- @
--- res <- 'call' '$' 'lookup' [20, 432656548536401920]
+-- res <- 'call' twInfo mgr '$' 'lookup' [20, 432656548536401920]
 -- @
 --
 -- >>> lookup [10]
diff --git a/Web/Twitter/Conduit/Stream.hs b/Web/Twitter/Conduit/Stream.hs
--- a/Web/Twitter/Conduit/Stream.hs
+++ b/Web/Twitter/Conduit/Stream.hs
@@ -22,8 +22,8 @@
        , stream'
   ) where
 
+import Web.Twitter.Conduit.Types
 import Web.Twitter.Conduit.Base
-import Web.Twitter.Conduit.Monad
 import Web.Twitter.Types
 import Web.Twitter.Conduit.Parameters
 import Web.Twitter.Conduit.Parameters.TH
@@ -36,6 +36,8 @@
 import qualified Data.Text as T
 import Control.Monad.IO.Class
 import Data.Aeson
+import Control.Monad.Trans.Resource (MonadResource)
+import qualified Network.HTTP.Conduit as HTTP
 
 #if MIN_VERSION_conduit(1,0,16)
 ($=+) :: MonadIO m
@@ -49,16 +51,20 @@
     return $ CI.ResumableSource (src C.$= cndt) finalizer
 #endif
 
-stream :: (TwitterBaseM m, FromJSON responseType)
-       => APIRequest apiName responseType
-       -> TW m (C.ResumableSource (TW m) responseType)
+stream :: (MonadResource m, FromJSON responseType)
+       => TWInfo
+       -> HTTP.Manager
+       -> APIRequest apiName responseType
+       -> m (C.ResumableSource m responseType)
 stream = stream'
 
-stream' :: (TwitterBaseM m, FromJSON value)
-        => APIRequest apiName responseType
-        -> TW m (C.ResumableSource (TW m) value)
-stream' req = do
-    rsrc <- getResponse =<< makeRequest req
+stream' :: (MonadResource m, FromJSON value)
+        => TWInfo
+        -> HTTP.Manager
+        -> APIRequest apiName responseType
+        -> m (C.ResumableSource m value)
+stream' info mgr req = do
+    rsrc <- getResponse info mgr =<< liftIO (makeRequest req)
     responseBody rsrc $=+ CL.sequence sinkFromJSON
 
 data Userstream
diff --git a/Web/Twitter/Conduit/Types.hs b/Web/Twitter/Conduit/Types.hs
new file mode 100644
--- /dev/null
+++ b/Web/Twitter/Conduit/Types.hs
@@ -0,0 +1,57 @@
+module Web.Twitter.Conduit.Types
+       ( TWToken (..)
+       , TWInfo (..)
+       , twitterOAuth
+       , setCredential
+       ) where
+
+import Data.Default
+import Web.Authenticate.OAuth
+import Network.HTTP.Conduit
+
+data TWToken = TWToken
+    { twOAuth :: OAuth
+    , twCredential :: Credential
+    } deriving (Show, Eq)
+instance Default TWToken where
+    def = TWToken twitterOAuth (Credential [])
+
+data TWInfo = TWInfo
+    { twToken :: TWToken
+    , twProxy :: Maybe Proxy
+    } deriving (Show, Eq)
+instance Default TWInfo where
+    def = TWInfo
+        { twToken = def
+        , twProxy = Nothing
+        }
+
+twitterOAuth :: OAuth
+twitterOAuth =
+    def { oauthServerName = "twitter"
+        , oauthRequestUri = "https://api.twitter.com/oauth/request_token"
+        , oauthAccessTokenUri = "https://api.twitter.com/oauth/access_token"
+        , oauthAuthorizeUri = "https://api.twitter.com/oauth/authorize"
+        , oauthConsumerKey = error "You MUST specify oauthConsumerKey parameter."
+        , oauthConsumerSecret = error "You MUST specify oauthConsumerSecret parameter."
+        , oauthSignatureMethod = HMACSHA1
+        , oauthCallback = Nothing
+        }
+
+-- | set OAuth keys and Credentials to TWInfo.
+--
+-- >>> let proxy = Proxy "localhost" 8080
+-- >>> let twinfo = def { twProxy = Just proxy }
+-- >>> let oauth = twitterOAuth { oauthConsumerKey = "consumer_key", oauthConsumerSecret = "consumer_secret" }
+-- >>> let credential = Credential [("oauth_token","...")]
+-- >>> let twinfo2 = setCredential oauth credential twinfo
+-- >>> oauthConsumerKey . twOAuth . twToken $ twinfo2
+-- "consumer_key"
+-- >>> twProxy twinfo2 == Just proxy
+-- True
+setCredential :: OAuth -> Credential -> TWInfo -> TWInfo
+setCredential oa cred env
+  = TWInfo
+    { twToken = TWToken oa cred
+    , twProxy = twProxy env
+    }
diff --git a/sample/Common.hs b/sample/Common.hs
--- a/sample/Common.hs
+++ b/sample/Common.hs
@@ -6,19 +6,15 @@
 
 import Web.Twitter.Conduit
 
-import Web.Authenticate.OAuth as OA
-import qualified Network.URI as URI
-import Network.HTTP.Conduit
-import qualified Data.Map as M
+import Control.Applicative
+import Control.Lens
 import qualified Data.ByteString.Char8 as S8
 import qualified Data.CaseInsensitive as CI
-import Control.Applicative
-import Control.Monad.IO.Class
-import Control.Monad.Base
-import Control.Monad.Trans.Resource
+import qualified Data.Map as M
+import Network.HTTP.Conduit
+import qualified Network.URI as URI
 import System.Environment
-import Control.Monad.Logger
-import Control.Lens
+import Web.Authenticate.OAuth as OA
 
 getOAuthTokens :: IO (OAuth, Credential)
 getOAuthTokens = do
@@ -51,12 +47,8 @@
     parsePort (':':xs) = read xs
     parsePort xs       = error $ "port number parse failed " ++ xs
 
-runTwitterFromEnv :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT m) a -> m a
-runTwitterFromEnv task = do
-    pr <- liftBase getProxyEnv
-    (oa, cred) <- liftBase getOAuthTokens
-    let env = (setCredential oa cred def) { twProxy = pr }
-    runTW env task
-
-runTwitterFromEnv' :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT (NoLoggingT m)) a -> m a
-runTwitterFromEnv' = runNoLoggingT . runTwitterFromEnv
+getTWInfoFromEnv :: IO TWInfo
+getTWInfoFromEnv = do
+    pr <- getProxyEnv
+    (oa, cred) <- getOAuthTokens
+    return $ (setCredential oa cred def) { twProxy = pr }
diff --git a/sample/fav.hs b/sample/fav.hs
--- a/sample/fav.hs
+++ b/sample/fav.hs
@@ -2,17 +2,21 @@
 
 module Main where
 
-import Control.Monad.IO.Class
 import Web.Twitter.Conduit
-import System.Environment
 import Common
+
 import Control.Lens
+import Control.Monad.IO.Class
+import Network.HTTP.Conduit
+import System.Environment
 
 main :: IO ()
-main = runTwitterFromEnv' $ do
+main = do
     [statusIdStr] <- liftIO getArgs
+    twInfo <- getTWInfoFromEnv
     let sId = read statusIdStr
-    targetStatus <- call $ showId sId
-    liftIO . putStrLn $ "Favorite Tweet: " ++ targetStatus ^. to show
-    res <- call $ favoritesCreate sId
-    liftIO $ print res
+    withManager $ \mgr -> do
+        targetStatus <- call twInfo mgr $ showId sId
+        liftIO . putStrLn $ "Favorite Tweet: " ++ targetStatus ^. to show
+        res <- call twInfo mgr $ favoritesCreate sId
+        liftIO $ print res
diff --git a/sample/oauth_callback.hs b/sample/oauth_callback.hs
--- a/sample/oauth_callback.hs
+++ b/sample/oauth_callback.hs
@@ -9,7 +9,7 @@
 
 import Web.Scotty
 import qualified Network.HTTP.Types as HT
-import Web.Twitter.Conduit hiding (text, lookup)
+import Web.Twitter.Conduit hiding (lookup)
 import Web.Authenticate.OAuth (OAuth(..), Credential(..))
 import qualified Web.Authenticate.OAuth as OA
 import qualified Network.HTTP.Conduit as HTTP
diff --git a/sample/oauth_pin.hs b/sample/oauth_pin.hs
--- a/sample/oauth_pin.hs
+++ b/sample/oauth_pin.hs
@@ -11,7 +11,6 @@
 import Web.Twitter.Conduit hiding (lookup)
 import Web.Authenticate.OAuth as OA
 import Network.HTTP.Conduit
-import qualified Data.Conduit as C
 import qualified Data.ByteString.Char8 as S8
 import Data.Maybe
 import Data.Monoid
diff --git a/sample/oslist.hs b/sample/oslist.hs
--- a/sample/oslist.hs
+++ b/sample/oslist.hs
@@ -1,21 +1,26 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
+import Web.Twitter.Conduit hiding (map)
+import Common
+
+import Control.Monad.IO.Class
 import qualified Data.Conduit as C
 import qualified Data.Conduit.List as CL
 import qualified Data.Map as M
-import Control.Monad.IO.Class
+import Network.HTTP.Conduit
 import System.Environment
 
-import Web.Twitter.Conduit
-import Common
-
 main :: IO ()
-main = runTwitterFromEnv' $ do
+main = do
     [screenName] <- liftIO getArgs
+    twInfo <- getTWInfoFromEnv
     let sn = ScreenNameParam screenName
-    folids <- sourceWithCursor (followersIds sn) C.$$ CL.consume
-    friids <- sourceWithCursor (friendsIds sn) C.$$ CL.consume
+
+    (folids, friids) <- withManager $ \mgr -> do
+        folids <- sourceWithCursor twInfo mgr (followersIds sn) C.$$ CL.consume
+        friids <- sourceWithCursor twInfo mgr (friendsIds sn) C.$$ CL.consume
+        return (folids, friids)
 
     let folmap = M.fromList $ map (flip (,) True) folids
         os = filter (\uid -> M.notMember uid folmap) friids
diff --git a/sample/post.hs b/sample/post.hs
--- a/sample/post.hs
+++ b/sample/post.hs
@@ -1,18 +1,21 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
+import Web.Twitter.Conduit hiding (map)
+import Common
+
+import Control.Applicative
+import Data.Monoid
 import qualified Data.Text as T
 import qualified Data.Text.IO as T
-import Data.Monoid
-import Control.Applicative
-import Control.Monad.IO.Class
-import Web.Twitter.Conduit
+import Network.HTTP.Conduit
 import System.Environment
-import Common
 
 main :: IO ()
-main = runTwitterFromEnv' $ do
-    status <- T.concat . map T.pack <$> liftIO getArgs
-    liftIO $ T.putStrLn $ "Post message: " <> status
-    res <- call $ update status
-    liftIO $ print res
+main = do
+    status <- T.concat . map T.pack <$> getArgs
+    T.putStrLn $ "Post message: " <> status
+    twInfo <- getTWInfoFromEnv
+    res <- withManager $ \mgr -> do
+        call twInfo mgr $ update status
+    print res
diff --git a/sample/postWithMedia.hs b/sample/postWithMedia.hs
--- a/sample/postWithMedia.hs
+++ b/sample/postWithMedia.hs
@@ -1,15 +1,18 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
-import qualified Data.Text as T
-import Control.Monad.IO.Class
 import Web.Twitter.Conduit
-import System.Environment
 import Common
 
+import qualified Data.Text as T
+import Network.HTTP.Conduit
+import System.Environment
+
 main :: IO ()
-main = runTwitterFromEnv' $ do
-    [status, filepath] <- liftIO getArgs
-    liftIO $ putStrLn $ "Post message: " ++ status
-    res <- call $ updateWithMedia (T.pack status) (MediaFromFile filepath)
-    liftIO $ print res
+main = do
+    [status, filepath] <- getArgs
+    putStrLn $ "Post message: " ++ status
+    twInfo <- getTWInfoFromEnv
+    res <- withManager $ \mgr -> do
+        call twInfo mgr $ updateWithMedia (T.pack status) (MediaFromFile filepath)
+    print res
diff --git a/sample/postWithMultipleMedia.hs b/sample/postWithMultipleMedia.hs
--- a/sample/postWithMultipleMedia.hs
+++ b/sample/postWithMultipleMedia.hs
@@ -1,27 +1,32 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
-import qualified Data.Text as T
 import Web.Twitter.Conduit
+import Web.Twitter.Types.Lens
+import Common
+
+import Control.Lens
+import Control.Monad
+import Control.Monad.IO.Class
+import qualified Data.Text as T
+import Network.HTTP.Conduit
 import System.Environment
 import System.Exit (exitFailure)
 import System.IO
-import Control.Lens
-import Control.Monad.IO.Class
-import Control.Monad
-import Common
 
 main :: IO ()
-main = runTwitterFromEnv' $ do
-    (status:filepathList) <- liftIO getArgs
-    when (length filepathList > 4) $ liftIO $ do
+main = do
+    (status:filepathList) <- getArgs
+    when (length filepathList > 4) $ do
         hPutStrLn stderr $ "You can upload upto 4 images in a single tweet, but we got " ++ show (length filepathList) ++ " images. abort."
         exitFailure
-    uploadedMediaList <- forM filepathList $ \filepath -> do
-        liftIO $ putStrLn $ "Upload media: " ++ filepath
-        ret <- call $ mediaUpload (MediaFromFile filepath)
-        liftIO $ putStrLn $ "Upload completed: media_id: " ++ ret ^. mediaId . to show ++ ", filepath: " ++ filepath
-        return ret
-    liftIO $ putStrLn $ "Post message: " ++ status
-    res <- call $ update (T.pack status) & mediaIds ?~ (uploadedMediaList ^.. traversed .  mediaId)
-    liftIO $ print res
+    twInfo <- getTWInfoFromEnv
+    withManager $ \mgr -> do
+        uploadedMediaList <- forM filepathList $ \filepath -> do
+            liftIO . putStrLn $ "Upload media: " ++ filepath
+            ret <- call twInfo mgr $ mediaUpload (MediaFromFile filepath)
+            liftIO . putStrLn $ "Upload completed: media_id: " ++ ret ^. uploadedMediaId . to show ++ ", filepath: " ++ filepath
+            return ret
+        liftIO $ putStrLn $ "Post message: " ++ status
+        res <- call twInfo mgr $ update (T.pack status) & mediaIds ?~ (uploadedMediaList ^.. traversed .  uploadedMediaId)
+        liftIO $ print res
diff --git a/sample/search.hs b/sample/search.hs
--- a/sample/search.hs
+++ b/sample/search.hs
@@ -1,19 +1,23 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
-import Control.Monad.IO.Class
-import System.Environment
-
 import Web.Twitter.Conduit
+import Web.Twitter.Types.Lens
 import Common
-import qualified Data.Text as T
+
 import Control.Lens
+import Control.Monad.IO.Class
+import qualified Data.Text as T
+import Network.HTTP.Conduit
+import System.Environment
 
 main :: IO ()
-main = runTwitterFromEnv' $ do
-    [keyword] <- liftIO getArgs
+main = do
+    [keyword] <- getArgs
 
-    res <- call . search $ T.pack keyword
+    twInfo <- getTWInfoFromEnv
+
+    res <- withManager $ \mgr -> call twInfo mgr $ search $ T.pack keyword
     let metadata = res ^. searchResultSearchMetadata
     liftIO . putStrLn $ "search completed in: " ++ metadata ^. searchMetadataCompletedIn . to show
     liftIO . putStrLn $ "search result max id: " ++ metadata ^. searchMetadataMaxId . to show
diff --git a/sample/simple.hs b/sample/simple.hs
--- a/sample/simple.hs
+++ b/sample/simple.hs
@@ -5,21 +5,21 @@
 
 import Web.Twitter.Conduit
 import Web.Twitter.Types.Lens
+
 import Control.Lens
-import Web.Authenticate.OAuth (OAuth(..), Credential(..))
-import qualified Web.Authenticate.OAuth as OA
-import Network.HTTP.Conduit
+import Control.Monad.IO.Class
+import Control.Monad.Trans.Control
+import Control.Monad.Trans.Resource
+import qualified Data.ByteString.Char8 as B8
 import qualified Data.Conduit as C
 import qualified Data.Conduit.List as CL
+import Data.Default
 import qualified Data.Text as T
 import qualified Data.Text.IO as T
-import qualified Data.ByteString.Char8 as B8
-import Data.Default
-import Control.Monad.Logger
-import Control.Monad.Trans.Control
-import Control.Monad.Trans.Resource
-import Control.Monad.IO.Class
+import Network.HTTP.Conduit
 import System.IO (hFlush, stdout)
+import Web.Authenticate.OAuth (OAuth(..), Credential(..))
+import qualified Web.Authenticate.OAuth as OA
 
 tokens :: OAuth
 tokens = twitterOAuth
@@ -38,11 +38,10 @@
     pin <- getPIN url
     OA.getAccessToken oauth (OA.insert "oauth_verifier" (B8.pack pin) cred) mgr
 
-withCredential :: (MonadLogger m, MonadBaseControl IO m, MonadIO m) => TW (ResourceT m) a -> m a
-withCredential task = do
-    cred <- liftIO $ withManager $ \mgr -> authorize tokens getPIN mgr
-    let env = setCredential tokens cred def
-    runTW env task
+getTWInfo :: IO TWInfo
+getTWInfo = do
+    cred <- withManager $ \mgr -> authorize tokens getPIN mgr
+    return $ setCredential tokens cred def
   where
     getPIN url = liftIO $ do
         putStrLn $ "browse URL: " ++ url
@@ -51,14 +50,16 @@
         getLine
 
 main :: IO ()
-main = runNoLoggingT . withCredential $ do
-    liftIO . putStrLn $ "# your home timeline (up to 100 tweets):"
-    sourceWithMaxId homeTimeline
-        C.$= CL.isolate 100
-        C.$$ CL.mapM_ $ \status -> liftIO $ do
-            T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId
-                                  , ": "
-                                  , status ^. statusUser . userScreenName
-                                  , ": "
-                                  , status ^. statusText
-                                  ]
+main = do
+    twInfo <- getTWInfo
+    putStrLn $ "# your home timeline (up to 100 tweets):"
+    withManager $ \mgr -> do
+        sourceWithMaxId twInfo mgr homeTimeline
+            C.$= CL.isolate 100
+            C.$$ CL.mapM_ $ \status -> liftIO $ do
+                T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId
+                                      , ": "
+                                      , status ^. statusUser . userScreenName
+                                      , ": "
+                                      , status ^. statusText
+                                      ]
diff --git a/sample/unfav.hs b/sample/unfav.hs
deleted file mode 100644
--- a/sample/unfav.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-module Main where
-
-import Control.Monad.IO.Class
-import Web.Twitter.Conduit
-import System.Environment
-import Common
-import Control.Lens
-
-main :: IO ()
-main = runTwitterFromEnv' $ do
-    [statusIdStr] <- liftIO getArgs
-    let sId = read statusIdStr
-    targetStatus <- call $ showId sId
-    liftIO . putStrLn $ "Unfavorite Tweet: " ++ targetStatus ^. to show
-    res <- call $ favoritesDestroy sId
-    liftIO $ print res
diff --git a/sample/userstream.hs b/sample/userstream.hs
--- a/sample/userstream.hs
+++ b/sample/userstream.hs
@@ -2,24 +2,24 @@
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE PatternGuards #-}
 
-import qualified Data.Conduit as C
-import qualified Data.Conduit.List as CL
-import qualified Data.Text.IO as T
-import qualified Data.Text as T
-import System.Process
+import Web.Twitter.Conduit
+import Web.Twitter.Types.Lens
+import Common
+
+import Control.Applicative
+import Control.Lens
 import Control.Monad
 import Control.Monad.IO.Class
-import Control.Applicative
-import System.FilePath
-import System.Directory
 import Data.Conduit
+import qualified Data.Conduit as C
 import qualified Data.Conduit.Binary as CB
+import qualified Data.Conduit.List as CL
+import qualified Data.Text as T
+import qualified Data.Text.IO as T
 import Network.HTTP.Conduit as HTTP
-
-import Web.Twitter.Conduit
-import Web.Twitter.Types.Lens
-import Common
-import Control.Lens
+import System.Directory
+import System.FilePath
+import System.Process
 
 ensureDirectoryExist :: FilePath -> IO FilePath
 ensureDirectoryExist dir = do
@@ -33,9 +33,11 @@
 iconPath = (</> "icons") <$> confdir >>= ensureDirectoryExist
 
 main :: IO ()
-main = runTwitterFromEnv' $ do
-    src <- stream userstream
-    src C.$$+- CL.mapM_ (^! act (liftIO . printTL))
+main = do
+    twInfo <- getTWInfoFromEnv
+    withManager $ \mgr -> do
+        src <- stream twInfo mgr userstream
+        src C.$$+- CL.mapM_ (^! act (liftIO . printTL))
 
 showStatus :: AsStatus s => s -> T.Text
 showStatus s = T.concat [ s ^. user . userScreenName
diff --git a/tests/ApiSpec.hs b/tests/ApiSpec.hs
--- a/tests/ApiSpec.hs
+++ b/tests/ApiSpec.hs
@@ -3,22 +3,22 @@
 
 module ApiSpec where
 
+import Control.Lens
 import Data.Conduit
 import qualified Data.Conduit.List as CL
-import Web.Twitter.Conduit (call, sourceWithCursor)
+import Network.HTTP.Conduit
+import System.IO.Unsafe
+import TestUtils
+import Web.Twitter.Conduit (call, sourceWithCursor, TWInfo)
 import Web.Twitter.Conduit.Api
 import Web.Twitter.Conduit.Lens
 import qualified Web.Twitter.Conduit.Parameters as Param
 import Web.Twitter.Types.Lens
-import Control.Lens
-import TestUtils
 
 import Test.Hspec
 
-import System.IO.Unsafe
-
-self :: User
-self = unsafePerformIO . run . call $ accountVerifyCredentials
+twInfo :: TWInfo
+twInfo = unsafePerformIO getTWInfo
 
 spec :: Spec
 spec = do
@@ -34,26 +34,26 @@
 integrated = do
     describe "friendsIds" $ do
         it "returns a cursored collection of users IDs" $ do
-            res <- run . call $ friendsIds (Param.ScreenNameParam "thimura")
+            res <- withManager $ \mgr -> call twInfo mgr $ friendsIds (Param.ScreenNameParam "thimura")
             res ^. contents . to length `shouldSatisfy` (> 0)
 
         it "iterate with sourceWithCursor" $ do
-            friends <- run $ do
-                let src = sourceWithCursor $ friendsIds (Param.ScreenNameParam "thimura")
+            friends <- withManager $ \mgr -> do
+                let src = sourceWithCursor twInfo mgr $ friendsIds (Param.ScreenNameParam "thimura")
                 src $$ CL.consume
             length friends `shouldSatisfy` (>= 0)
 
     describe "listsMembers" $ do
         it "returns a cursored collection of the member of specified list" $ do
-            res <- run . call $ listsMembers (Param.ListNameParam "thimura/haskell")
+            res <- withManager $ \mgr -> call twInfo mgr $ listsMembers (Param.ListNameParam "thimura/haskell")
             res ^. contents . to length `shouldSatisfy` (>= 0)
 
         it "should raise error when specified list does not exists" $ do
-            let action = run . call $ listsMembers (Param.ListNameParam "thimura/haskell_ne")
+            let action = withManager $ \mgr -> call twInfo mgr $ listsMembers (Param.ListNameParam "thimura/haskell_ne")
             action `shouldThrow` anyException
 
         it "iterate with sourceWithCursor" $ do
-            members <- run $ do
-                let src = sourceWithCursor $ listsMembers (Param.ListNameParam "thimura/haskell")
+            members <- withManager $ \mgr -> do
+                let src = sourceWithCursor twInfo mgr $ listsMembers (Param.ListNameParam "thimura/haskell")
                 src $$ CL.consume
             members ^.. traversed . userScreenName `shouldContain` ["Hackage"]
diff --git a/tests/StatusSpec.hs b/tests/StatusSpec.hs
--- a/tests/StatusSpec.hs
+++ b/tests/StatusSpec.hs
@@ -3,21 +3,26 @@
 
 module StatusSpec where
 
+import Control.Lens
 import Data.Conduit
 import qualified Data.Conduit.List as CL
-import Web.Twitter.Conduit (call, accountVerifyCredentials, sourceWithMaxId)
-import Web.Twitter.Conduit.Status as Status
+import Network.HTTP.Conduit
+import System.IO.Unsafe
+import Web.Twitter.Conduit (call, accountVerifyCredentials, sourceWithMaxId, TWInfo)
 import qualified Web.Twitter.Conduit.Parameters as Param
+import Web.Twitter.Conduit.Status as Status
 import Web.Twitter.Types.Lens
-import Control.Lens
-import TestUtils
 
+import TestUtils
 import Test.Hspec
 
-import System.IO.Unsafe
 
+twInfo :: TWInfo
+twInfo = unsafePerformIO getTWInfo
+
 self :: User
-self = unsafePerformIO . run . call $ accountVerifyCredentials
+self = unsafePerformIO $ withManager $ \mgr -> do
+    call twInfo mgr $ accountVerifyCredentials
 
 spec :: Spec
 spec = do
@@ -33,7 +38,7 @@
 integrated = do
     describe "mentionsTimeline" $ do
         it "returns the 20 most resent mentions for user" $ do
-            res <- run $ call mentionsTimeline
+            res <- withManager $ \mgr -> call twInfo mgr mentionsTimeline
             length res `shouldSatisfy` (> 0)
             let mentionsScreenName = res ^.. traversed . statusEntities . _Just . enUserMentions . traversed . entityBody . userEntityUserScreenName
             mentionsScreenName `shouldSatisfy` allOf folded (== (self ^. userScreenName))
@@ -41,17 +46,18 @@
 
     describe "userTimeline" $ do
         it "returns the 20 most recent tweets posted by the user indicated by ScreenNameParam" $ do
-            res <- run . call $ userTimeline (Param.ScreenNameParam "thimura")
+            res <- withManager $ \mgr -> call twInfo mgr $ userTimeline (Param.ScreenNameParam "thimura")
             length res `shouldSatisfy` (== 20)
             res `shouldSatisfy` (allOf folded (^. statusUser . userScreenName . to (== "thimura")))
         it "returns the recent tweets which include RTs when specified include_rts option" $ do
-            res <- run . call
+            res <- withManager $ \mgr -> call twInfo mgr
                    $ userTimeline (Param.ScreenNameParam "thimura")
                    & Param.count ?~ 100 & Param.includeRts ?~ True
             res `shouldSatisfy` (anyOf (folded . statusRetweetedStatus . _Just . statusUser . userScreenName) (/= "thimura"))
         it "iterate with sourceWithMaxId" $ do
-            tl <- run $ do
-                let src = sourceWithMaxId $ userTimeline (Param.ScreenNameParam "thimura") & Param.count ?~ 200
+            tl <- withManager $ \mgr -> do
+                let src = sourceWithMaxId twInfo mgr $
+                          userTimeline (Param.ScreenNameParam "thimura") & Param.count ?~ 200
                 src $$ CL.isolate 600 =$ CL.consume
             length tl `shouldSatisfy` (== 600)
 
@@ -60,12 +66,12 @@
 
     describe "homeTimeline" $ do
         it "returns the most recent tweets in home timeline" $ do
-            res <- run $ call homeTimeline
+            res <- withManager $ \mgr -> call twInfo mgr homeTimeline
             length res `shouldSatisfy` (> 0)
 
     describe "showId" $ do
         it "works for the known tweets" $ do
-            res <- run . call $ showId 477833886768959488
+            res <- withManager $ \mgr -> call twInfo mgr $ showId 477833886768959488
             res ^. statusId `shouldBe` 477833886768959488
             res ^. statusText `shouldBe` "真紅かわいいはアレセイア"
             res ^. statusCreatedAt `shouldBe` "Sat Jun 14 15:24:10 +0000 2014"
@@ -73,15 +79,15 @@
 
     describe "update & destroyId" $ do
         it "posts new tweet and destroy it" $ do
-            res1 <- run . call $ update "おまえの明日が、今日よりもずっと、楽しい事で溢れているようにと、祈っているよ"
+            res1 <- withManager $ \mgr -> call twInfo mgr $ update "おまえの明日が、今日よりもずっと、楽しい事で溢れているようにと、祈っているよ"
             res1 ^. statusUser . userScreenName `shouldBe` self ^. userScreenName
 
-            res2 <- run . call $ destroyId (res1 ^. statusId)
+            res2 <- withManager $ \mgr -> call twInfo mgr $ destroyId (res1 ^. statusId)
             res2 ^. statusId `shouldBe` res1 ^. statusId
 
     describe "lookup" $ do
         it "works for the known tweets" $ do
-            res <- run . call $ Status.lookup [438691466345340928, 477757405942411265]
+            res <- withManager $ \mgr -> call twInfo mgr $ Status.lookup [438691466345340928, 477757405942411265]
             length res `shouldSatisfy` (== 2)
             (res !! 0) ^. statusId `shouldBe` 438691466345340928
             (res !! 1) ^. statusId `shouldBe` 477757405942411265
diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs
--- a/tests/TestUtils.hs
+++ b/tests/TestUtils.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE CPP #-}
 
-module TestUtils (runTwitterFromEnv, run) where
+module TestUtils (getTWInfo) where
 
 import Web.Twitter.Conduit
 
@@ -14,11 +14,8 @@
 import qualified Data.ByteString.Char8 as S8
 import qualified Data.CaseInsensitive as CI
 import Control.Applicative
-import Control.Monad.IO.Class
 import Control.Monad.Base
-import Control.Monad.Trans.Resource
 import System.Environment
-import Control.Monad.Logger
 import Control.Lens
 
 getOAuthTokens :: IO (OAuth, Credential)
@@ -52,17 +49,8 @@
     parsePort (':':xs) = read xs
     parsePort xs       = error $ "port number parse failed " ++ xs
 
-runTwitterFromEnv :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT m) a -> m a
-runTwitterFromEnv task = do
+getTWInfo :: IO TWInfo
+getTWInfo = do
     pr <- liftBase getProxyEnv
     (oa, cred) <- liftBase getOAuthTokens
-    let env = (setCredential oa cred def) { twProxy = pr }
-    runTW env task
-
-#ifdef USE_DEBUG_OUTPUT
-run :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT (LoggingT m)) a -> m a
-run = runStderrLoggingT . runTwitterFromEnv
-#else
-run :: (MonadIO m, MonadBaseControl IO m) => TW (ResourceT (NoLoggingT m)) a -> m a
-run = runNoLoggingT . runTwitterFromEnv
-#endif
+    return $ (setCredential oa cred def) { twProxy = pr }
diff --git a/twitter-conduit.cabal b/twitter-conduit.cabal
--- a/twitter-conduit.cabal
+++ b/twitter-conduit.cabal
@@ -1,5 +1,5 @@
 name:              twitter-conduit
-version:           0.0.8.1
+version:           0.1.0
 license:           BSD3
 license-file:      LICENSE
 author:            HATTORI Hiroki, Hideyuki Tanaka, Takahiro HIMURA
@@ -43,10 +43,6 @@
   description: build samples
   default: False
 
-flag use-debug-output
-  description: use debug output when running testsuites
-  default: False
-
 flag run-integrated-test
   description: use debug output when running testsuites
   default: False
@@ -62,7 +58,6 @@
     , resourcet >= 1.0
     , conduit >= 1.1
     , conduit-extra >= 1.1
-    , monad-logger
     , http-types
     , http-conduit >= 2.0 && < 2.2
     , http-client >= 0.3
@@ -87,6 +82,7 @@
   exposed-modules:
     Web.Twitter.Conduit
     Web.Twitter.Conduit.Lens
+    Web.Twitter.Conduit.Types
     Web.Twitter.Conduit.Api
     Web.Twitter.Conduit.Stream
     Web.Twitter.Conduit.Status
@@ -122,8 +118,6 @@
   type: exitcode-stdio-1.0
   main-is: spec_main.hs
   hs-source-dirs: tests, .
-  if flag(use-debug-output)
-    CPP-Options: -DUSE_DEBUG_OUTPUT
 
   if flag(run-integrated-test)
     CPP-Options: -DRUN_INTEGRATED_TEST
@@ -147,7 +141,6 @@
     , http-types
     , http-conduit
     , http-client
-    , monad-logger
     , authenticate-oauth
     , case-insensitive
     , containers
@@ -188,7 +181,6 @@
       , resourcet
       , conduit
       , http-conduit
-      , monad-logger
       , authenticate-oauth
       , twitter-types
       , twitter-types-lens
@@ -220,7 +212,6 @@
       , conduit
       , conduit-extra
       , http-conduit
-      , monad-logger
       , authenticate-oauth
       , twitter-conduit
       , twitter-types
