diff --git a/Web/Twitter/Enumerator.hs b/Web/Twitter/Enumerator.hs
--- a/Web/Twitter/Enumerator.hs
+++ b/Web/Twitter/Enumerator.hs
@@ -2,9 +2,11 @@
        ( module Web.Twitter.Enumerator.Types
        , module Web.Twitter.Enumerator.Monad
        , module Web.Twitter.Enumerator.Fetch
+       , module Web.Twitter.Enumerator.Post
        )
        where
 
 import Web.Twitter.Enumerator.Types
 import Web.Twitter.Enumerator.Monad
 import Web.Twitter.Enumerator.Fetch
+import Web.Twitter.Enumerator.Post
diff --git a/Web/Twitter/Enumerator/Api.hs b/Web/Twitter/Enumerator/Api.hs
new file mode 100644
--- /dev/null
+++ b/Web/Twitter/Enumerator/Api.hs
@@ -0,0 +1,50 @@
+module Web.Twitter.Enumerator.Api
+       ( api
+       , endpoint
+       ) where
+
+import Web.Twitter.Enumerator.Types
+import Web.Twitter.Enumerator.Monad
+
+import Network.HTTP.Enumerator
+import qualified Network.HTTP.Types as HT
+import Data.Enumerator (Iteratee, throwError, liftTrans)
+
+import Data.ByteString (ByteString)
+
+import Control.Monad.Trans.Class
+import Control.Monad.IO.Class (MonadIO (liftIO))
+
+endpoint :: String
+endpoint = "https://api.twitter.com/1/"
+
+api :: ByteString -- ^ HTTP request method (GET or POST)
+    -> String -- ^ API Resource URL
+    -> HT.Query -- ^ Query
+    -> Iteratee ByteString IO a
+    -> Iteratee ByteString TW a
+api m url query iter = do
+  req <- lift $ apiRequest m url query
+  httpMgr req (handleError iter)
+  where
+    handleError iter' st@(HT.Status sc _) _ =
+      if 200 <= sc && sc < 300
+      then iter'
+      else throwError $ HTTPStatusCodeException st
+
+httpMgr :: Request IO
+        -> (HT.Status
+            -> HT.ResponseHeaders
+            -> Iteratee ByteString IO a)
+        -> Iteratee ByteString TW a
+httpMgr req iterf = do
+  mgr <- lift getManager
+  liftTrans $ http req iterf mgr
+
+
+apiRequest :: ByteString -> String -> HT.Query -> TW (Request IO)
+apiRequest m uri query = do
+  p <- getProxy
+  req <- liftIO $ parseUrl uri >>= \r ->
+    return $ r { method = m, queryString = query, proxy = p }
+  signOAuthTW req
diff --git a/Web/Twitter/Enumerator/Fetch.hs b/Web/Twitter/Enumerator/Fetch.hs
--- a/Web/Twitter/Enumerator/Fetch.hs
+++ b/Web/Twitter/Enumerator/Fetch.hs
@@ -1,8 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Web.Twitter.Enumerator.Fetch
-       ( api
-       , QueryUser(..)
+       ( QueryUser(..)
        , QueryList(..)
 
        -- * Timelines
@@ -77,11 +76,11 @@
 import Web.Twitter.Enumerator.Types
 import Web.Twitter.Enumerator.Monad
 import Web.Twitter.Enumerator.Utils
+import Web.Twitter.Enumerator.Api
 
 import Data.Aeson hiding (Error)
 import qualified Data.Aeson.Types as AE
 
-import Network.HTTP.Enumerator
 import qualified Network.HTTP.Types as HT
 import Data.Enumerator hiding (map, filter, drop, span, iterate)
 import qualified Data.Enumerator.List as EL
@@ -89,7 +88,8 @@
 import qualified Data.Text as T
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as B8
-import Control.Monad.Trans
+import Control.Monad.Trans.Class
+import Control.Monad.IO.Class (MonadIO (liftIO))
 import Control.Applicative
 
 import qualified Data.Map as M
@@ -99,36 +99,9 @@
 data QueryList = QListId Integer | QListName String
                deriving (Show, Eq)
 
-endpoint :: String
-endpoint = "https://api.twitter.com/1/"
 
-api :: String -> HT.Query -> Iteratee ByteString IO a -> Iteratee ByteString TW a
-api url query iter = do
-  req <- lift $ apiRequest url query
-  httpMgr req (handleError iter)
-  where
-    handleError iter' st@(HT.Status sc _) _ =
-      if 200 <= sc && sc < 300
-      then iter'
-      else throwError $ HTTPStatusCodeException st
-
-httpMgr :: Request IO
-        -> (HT.Status
-            -> HT.ResponseHeaders
-            -> Iteratee ByteString IO a)
-        -> Iteratee ByteString TW a
-httpMgr req iterf = do
-  mgr <- lift getManager
-  liftTrans $ http req iterf mgr
-
-apiRequest :: String -> HT.Query -> TW (Request IO)
-apiRequest uri query = do
-  p <- getProxy
-  req <- liftIO $ parseUrl uri >>= \r -> return $ r { queryString = query, proxy = p }
-  signOAuthTW req
-
 apiGet :: FromJSON a => String -> HT.Query -> Iteratee a IO b -> TW b
-apiGet uri query iter = run_ $ api uri query (handleParseError iter')
+apiGet uri query iter = run_ $ api "GET" uri query (handleParseError iter')
   where iter' = enumJSON =$ EL.map fromJSON' =$ skipNothing =$ iter
 
 statuses :: (FromJSON a, Show a) => String -> HT.Query -> Enumerator a TW b
@@ -141,7 +114,7 @@
   where
     go loop page k = do
       let query' = insertQuery "page" (toMaybeByteString page) query
-      res <- lift $ run_ $ api uri query' (handleParseError (enumJSON =$ iterPageC))
+      res <- lift $ run_ $ api "GET" uri query' (handleParseError (enumJSON =$ iterPageC))
       case res of
         Just [] -> k EOF
         Just xs -> k (Chunks xs) >>== loop (page + 1)
@@ -269,7 +242,7 @@
   where
     go loop cursor k = do
       let query' = insertQuery "cursor" (toMaybeByteString cursor) query
-      res <- lift $ run_ $ api uri query' (iterCursor cursorKey)
+      res <- lift $ run_ $ api "GET" uri query' (iterCursor cursorKey)
       case res of
         Just r -> do
           let nextCur = cursorNext r
@@ -286,10 +259,10 @@
 apiIter iter = enumLine =$ handleParseError (enumJSON =$ EL.map fromJSON' =$ skipNothing =$ iter)
 
 userstream :: Iteratee StreamingAPI IO a -> Iteratee ByteString TW a
-userstream = api "https://userstream.twitter.com/2/user.json" [] . apiIter
+userstream = api "GET" "https://userstream.twitter.com/2/user.json" [] . apiIter
 
 statusesFilter :: HT.Query -> Iteratee StreamingAPI IO a -> Iteratee ByteString TW a
-statusesFilter query = api "https://stream.twitter.com/1/statuses/filter.json" query . apiIter
+statusesFilter query = api "GET" "https://stream.twitter.com/1/statuses/filter.json" query . apiIter
 
 toMaybeByteString :: Show a => a -> Maybe ByteString
 toMaybeByteString = Just . B8.pack . show
diff --git a/Web/Twitter/Enumerator/Monad.hs b/Web/Twitter/Enumerator/Monad.hs
--- a/Web/Twitter/Enumerator/Monad.hs
+++ b/Web/Twitter/Enumerator/Monad.hs
@@ -14,7 +14,8 @@
 
 import Web.Authenticate.OAuth
 import Network.HTTP.Enumerator
-import Control.Monad.Reader
+import Control.Monad.Trans.Reader
+import Control.Monad.IO.Class (MonadIO (liftIO))
 
 type TW = ReaderT TWEnv IO
 
diff --git a/Web/Twitter/Enumerator/Post.hs b/Web/Twitter/Enumerator/Post.hs
new file mode 100644
--- /dev/null
+++ b/Web/Twitter/Enumerator/Post.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Web.Twitter.Enumerator.Post
+       ( statusesUpdate
+
+         -- * Friendship
+         -- , friendshipCreate
+         -- , friendshipDestroy
+
+         -- * Favorites
+         -- , favoritesCreate
+         -- , favoritesDestroy
+
+         -- * Lists
+         -- , listsCreate
+         -- , listsDestroy
+         -- , listsUpdate
+         -- , listsMembersCreate
+         -- , listsMembersDestroy
+       )
+       where
+
+import Web.Twitter.Enumerator.Monad
+import Web.Twitter.Enumerator.Api
+
+import Data.ByteString (ByteString)
+
+import Data.Enumerator (Iteratee)
+
+statusesUpdate :: ByteString -> Iteratee ByteString IO a -> Iteratee ByteString TW a
+statusesUpdate tweet iter = api "POST" (endpoint ++ "statuses/update.json") [("status", Just tweet)] iter
diff --git a/Web/Twitter/Enumerator/Utils.hs b/Web/Twitter/Enumerator/Utils.hs
--- a/Web/Twitter/Enumerator/Utils.hs
+++ b/Web/Twitter/Enumerator/Utils.hs
@@ -15,7 +15,7 @@
 import qualified Data.Enumerator.Binary as EB
 import Data.ByteString (ByteString)
 import Data.Maybe
-import Control.Monad.Trans
+import Control.Monad.IO.Class (MonadIO (liftIO))
 
 enumLine :: Monad m => E.Enumeratee ByteString ByteString m a
 enumLine = EB.splitWhen newline
diff --git a/twitter-enumerator.cabal b/twitter-enumerator.cabal
--- a/twitter-enumerator.cabal
+++ b/twitter-enumerator.cabal
@@ -1,5 +1,5 @@
 name:              twitter-enumerator
-version:           0.0.1.2
+version:           0.0.2
 license:           BSD3
 license-file:      LICENSE
 author:            Takahiro HIMURA
@@ -19,14 +19,14 @@
 source-repository this
   type: git
   location: git://github.com/himura/twitter-enumerator.git
-  tag: 0.0.1.1
+  tag: 0.0.2
 
 library
   ghc-options: -Wall
 
   build-depends:
       base >= 4 && < 5
-    , mtl
+    , transformers >= 0.2 && < 0.3
     , authenticate >= 0.9 && < 0.11
     , enumerator >= 0.4.14 && < 0.5
     , http-types
@@ -42,7 +42,9 @@
     Web.Twitter.Enumerator
     Web.Twitter.Enumerator.Types
     Web.Twitter.Enumerator.Monad
+    Web.Twitter.Enumerator.Api
     Web.Twitter.Enumerator.Fetch
+    Web.Twitter.Enumerator.Post
 
   other-modules:
     Web.Twitter.Enumerator.Utils
