diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+2014-07-30 Rodrigo Setti <rodrigosetti@gmail.com>
+
+	* Parse request on demand (instead of waiting for the entire data)
+
 2014-07-25 Rodrigo Setti <rodrigosetti@gmail.com>
 
 	* Initial version.
diff --git a/Network/MessagePack.hs b/Network/MessagePack.hs
--- a/Network/MessagePack.hs
+++ b/Network/MessagePack.hs
@@ -14,9 +14,10 @@
 import Control.Applicative
 import Control.Monad
 import Data.MessagePack
+import Data.Maybe
+import Data.Serialize.Get
 import Network.Simple.TCP
 import qualified Data.ByteString as BS
-import qualified Data.ByteString.Lazy as LBS
 import qualified Data.Map as M
 import qualified Data.Serialize as S
 import qualified Data.Text as T
@@ -44,21 +45,24 @@
     serve host service rpcServer
   where
     rpcServer (socket, _) =
-        do bs <- LBS.fromChunks <$> fetchData
-           send socket =<< LBS.toStrict <$> executeRPC methods bs
+        do reqMsg  <- getRequestMessage
+           respMsg <- either (return . errorResponse errorMsgId) (executeRPC methods) reqMsg
+           send socket $ S.encode respMsg
       where
-        chunkSize = 1024
-        fetchData = do maybeData <- recv socket chunkSize
-                       case maybeData of
-                        Nothing -> return []
-                        Just s  -> do let len = BS.length s
-                                      if len < chunkSize
-                                        then return [s]
-                                        else do rest <- fetchData
-                                                return $ s : rest
+        getRequestMessage =
+            do result <- go $ runGetPartial S.get
+               return $ case result of
+                            Fail err _ -> Left err
+                            Done r   _ -> Right r
+                            Partial  _ -> Left "unexpected end of RPC message"
+          where
+            go partial = do bs <- fromMaybe BS.empty <$> recv socket 1024
+                            case partial bs of
+                                Partial partial' -> go partial'
+                                x                -> return x
 
-executeRPC :: M.Map T.Text Method -> LBS.ByteString -> IO LBS.ByteString
-executeRPC methods input = 
+executeRPC :: M.Map T.Text Method -> Object -> IO Object
+executeRPC methods obj = 
    case getRPCData of
     Left err -> return $ errorResponse errorMsgId err
     Right (method, msgid, params) -> do result <- method params
@@ -67,7 +71,6 @@
    getRPCData =
     do let m .: k = maybe (Left $ "missing key: " ++ show k) Right $ M.lookup (ObjectString k) m
            getMethod ms name = maybe (Left $ "unsupported method: " ++ show name) Right $ M.lookup name ms
-       obj <- S.decodeLazy input
        case obj of
         (ObjectMap m) -> do ObjectInt type_ <- m .: "type"
                             when (type_ /= reqMessage) $ Left $ "invalid RPC type: " ++ show type_
@@ -80,16 +83,16 @@
                             return (method, msgid, params)
         _              -> Left "invalid msgpack RPC request"
 
-errorResponse :: MsgId -> String -> LBS.ByteString
+errorResponse :: MsgId -> String -> Object
 errorResponse msgid err = response msgid (ObjectString $ T.pack err) ObjectNil
 
-resultResponse :: MsgId -> Object -> LBS.ByteString
+resultResponse :: MsgId -> Object -> Object
 resultResponse msgid = response msgid ObjectNil
 
-response :: MsgId -> Object -> Object -> LBS.ByteString
+response :: MsgId -> Object -> Object -> Object
 response msgid errObj resObj =
-    S.encodeLazy $ ObjectMap $ M.fromList [ (ObjectString "type"  , ObjectInt resMessage)
-                                          , (ObjectString "msgid" , ObjectInt msgid)
-                                          , (ObjectString "error" , errObj)
-                                          , (ObjectString "result", resObj) ]
+    ObjectMap $ M.fromList [ (ObjectString "type"  , ObjectInt resMessage)
+                           , (ObjectString "msgid" , ObjectInt msgid)
+                           , (ObjectString "error" , errObj)
+                           , (ObjectString "result", resObj) ]
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
 # messagepack-rpc
 
+[![Build Status](https://travis-ci.org/rodrigosetti/messagepack-rpc.svg?branch=master)](https://travis-ci.org/rodrigosetti/messagepack-rpc)
+
 [Message Pack](http://msgpack.org) RPC over TCP.
 
diff --git a/messagepack-rpc.cabal b/messagepack-rpc.cabal
--- a/messagepack-rpc.cabal
+++ b/messagepack-rpc.cabal
@@ -1,5 +1,5 @@
 name               : messagepack-rpc
-version            : 0.1.0.0
+version            : 0.1.0.1
 synopsis           : Message Pack RPC over TCP
 description        : Message Pack RPC over TCP
 homepage           : http://github.com/rodrigosetti/messagepack-rpc
@@ -18,7 +18,7 @@
 
 source-repository head
   type     : git
-  location : git@github.com:rodrigosetti/messagepack.git
+  location : git@github.com:rodrigosetti/messagepack-rpc.git
 
 library
   exposed-modules  : Network.MessagePack
