diff --git a/msgpack-rpc.cabal b/msgpack-rpc.cabal
--- a/msgpack-rpc.cabal
+++ b/msgpack-rpc.cabal
@@ -1,5 +1,5 @@
 Name:                msgpack-rpc
-Version:             0.5.0.0
+Version:             0.6.0.0
 Synopsis:            A MessagePack-RPC Implementation
 Description:
   A MessagePack-RPC Implementation <http://msgpack.org/>
@@ -20,12 +20,14 @@
   test/Cli.hs
 
 Library
-  Build-depends:     base >= 4 && <5,
+  Build-depends:     base >= 4 && < 5,
+                     bytestring >= 0.9 && < 0.10,
                      network >= 2.3 && < 2.4,
-                     msgpack >= 0.5 && < 0.6,
-                     random >= 1.0.0.2 && < 1.1,
+                     random >= 1.0 && < 1.1,
+                     enumerator >= 0.4 && < 0.5,
+                     attoparsec-enumerator >= 0.2 && < 0.3,
+                     msgpack >= 0.6 && < 0.7,
                      transformers >= 0.2 && < 0.3,
-                     iteratee >= 0.8 && < 0.9,
                      deepseq >= 1.1 && < 1.2
 
   Ghc-options:       -Wall
diff --git a/src/Network/MessagePackRpc/Client.hs b/src/Network/MessagePackRpc/Client.hs
--- a/src/Network/MessagePackRpc/Client.hs
+++ b/src/Network/MessagePackRpc/Client.hs
@@ -43,6 +43,10 @@
 
 import Control.Exception
 import Control.Monad
+import Data.Attoparsec.Enumerator
+import qualified Data.ByteString.Lazy as BL
+import Data.Enumerator
+import Data.Enumerator.Binary
 import Data.Functor
 import Data.MessagePack
 import Data.Typeable
@@ -50,6 +54,9 @@
 import System.IO
 import System.Random
 
+bufferSize :: Integer
+bufferSize = 4096
+
 -- | RPC connection type
 data Connection
   = Connection
@@ -105,9 +112,10 @@
 rpcCall :: Connection -> String -> [Object] -> IO Object
 rpcCall Connection{ connHandle = h } m args = do
   msgid <- (`mod`2^(30::Int)) <$> randomIO :: IO Int
-  packToHandle' h $ put (0 ::Int, msgid, m, args)
-  unpackFromHandleI h $ do
-    (rtype, rmsgid, rerror, rresult) <- getI
+  BL.hPutStr h $ pack (0 ::Int, msgid, m, args)
+  hFlush h
+  run_ $ enumHandle bufferSize h $$ do
+    (rtype, rmsgid, rerror, rresult) <- iterParser get
     when (rtype /= (1 :: Int)) $
       throw $ ProtocolError $ "response type is not 1 (got " ++ show rtype ++ ")"
     when (rmsgid /= msgid) $
diff --git a/src/Network/MessagePackRpc/Server.hs b/src/Network/MessagePackRpc/Server.hs
--- a/src/Network/MessagePackRpc/Server.hs
+++ b/src/Network/MessagePackRpc/Server.hs
@@ -37,9 +37,12 @@
 import Control.Concurrent
 import Control.DeepSeq
 import Control.Exception as E
+import Data.Enumerator
+import Data.Enumerator.Binary
 import Control.Monad
 import Control.Monad.IO.Class
-import Data.Iteratee.Exception as I
+import Data.Attoparsec.Enumerator
+import qualified Data.ByteString.Lazy as BL
 import Data.Maybe
 import Data.MessagePack
 import Network
@@ -47,6 +50,9 @@
 
 import Prelude hiding (catch)
 
+bufferSize :: Integer
+bufferSize = 4096
+
 type RpcMethod = [Object] -> IO Object
 
 class RpcMethodType f where
@@ -80,24 +86,27 @@
     (h, host, hostport) <- accept sock
     forkIO $
       (processRequests h `finally` hClose h) `catches`
-      [ Handler $ \e -> let _ = (e :: I.EofException) in return ()
-      , Handler $ \e -> hPutStrLn stderr $ host ++ ":" ++ show hostport ++ ": "++ show (e :: SomeException)]
+      [ Handler $ \e ->
+         case e of
+           ParseError ["demandInput"] _ -> return ()
+           _ -> hPutStrLn stderr $ host ++ ":" ++ show hostport ++ ": " ++ show e
+      , Handler $ \e ->
+         hPutStrLn stderr $ host ++ ":" ++ show hostport ++ ": " ++ show (e :: SomeException)]
 
   where
     processRequests h =
-      unpackFromHandleI h $ forever $ processRequest h
+      run_ $ enumHandle bufferSize h $$ forever $ processRequest h
     
     processRequest h = do
-      (rtype, msgid, method, args) <- getI
+      (rtype, msgid, method, args) <- iterParser get
       liftIO $ do
         resp <- try $ getResponse rtype method args
         case resp of
           Left err ->
-            packToHandle' h $
-            put (1 :: Int, msgid :: Int, show (err :: SomeException), ())
+            BL.hPutStr h $ pack (1 :: Int, msgid :: Int, show (err :: SomeException), ())
           Right ret ->
-            packToHandle' h $
-            put (1 :: Int, msgid :: Int, (), ret)
+            BL.hPutStr h $ pack (1 :: Int, msgid :: Int, (), ret)
+        hFlush h
 
     getResponse rtype method args = do
       when (rtype /= (0 :: Int)) $
