diff --git a/Network/Connection.hs b/Network/Connection.hs
--- a/Network/Connection.hs
+++ b/Network/Connection.hs
@@ -28,6 +28,7 @@
     -- * Sending and receiving data
     , connectionGet
     , connectionGetChunk
+    , connectionGetChunk'
     , connectionPut
 
     -- * TLS related operation
@@ -130,25 +131,27 @@
 -- however the call will returns as soon as there's data, even if there's less
 -- data than expected.
 connectionGet :: Connection -> Int -> IO ByteString
-connectionGet con size = withBuffer getData con
-    where getData buf
-                | B.null buf           = do chunk <- withBackend getMoreData con
-                                            let (ret, remain) = B.splitAt size chunk
-                                            return (remain, ret)
-                | B.length buf >= size = let (ret, remain) = B.splitAt size buf
-                                          in return (remain, ret)
-                | otherwise            = return (B.empty, buf)
-          getMoreData (ConnectionTLS tlsctx) = TLS.recvData tlsctx
-          getMoreData (ConnectionStream h)   = hWaitForInput h (-1) >> B.hGetNonBlocking h (16 * 1024)
+connectionGet conn size = connectionGetChunk' conn $ B.splitAt size
 
 -- | Get the next block of data from the connection.
 connectionGetChunk :: Connection -> IO ByteString
-connectionGetChunk con = withBuffer getData con
-    where getData buf
-                | B.null buf = withBackend getMoreData con >>= \chunk -> return (B.empty, chunk)
-                | otherwise  = return (B.empty, buf)
-          getMoreData (ConnectionTLS tlsctx) = TLS.recvData tlsctx
-          getMoreData (ConnectionStream h)   = hWaitForInput h (-1) >> B.hGetNonBlocking h (16 * 1024)
+connectionGetChunk conn = connectionGetChunk' conn $ \s -> (s, B.empty)
+
+-- | Like 'connectionGetChunk', but return the unused portion to the buffer,
+-- where it will be the next chunk read.
+connectionGetChunk' :: Connection -> (ByteString -> (a, ByteString)) -> IO a
+connectionGetChunk' conn f = withBuffer getData conn
+  where getData buf
+          | B.null buf = do
+              chunk <- withBackend getMoreData conn
+              return $ swap $ f chunk
+          | otherwise =
+              return $ swap $ f buf
+
+        getMoreData (ConnectionTLS tlsctx) = TLS.recvData tlsctx
+        getMoreData (ConnectionStream h)   = B.hGetSome h (16 * 1024)
+
+        swap (a, b) = (b, a)
 
 -- | Close a connection.
 connectionClose :: Connection -> IO ()
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@
         ctx <- initConnectionContext
         con <- connectTo ctx $ ConnectionParams
                                   { connectionHostname  = "www.example.com"
-                                  , connectionPort      = fromIntegral 4567
+                                  , connectionPort      = 4567
                                   , connectionUseSecure = Nothing
                                   , connectionUseSocks  = Nothing
                                   }
@@ -38,16 +38,16 @@
 
     con <- connectTo ctx $ ConnectionParams
                            { connectionHostname  = "www.example.com"
-                           , connectionPort      = fromIntegral 4567
+                           , connectionPort      = 4567
                            , connectionUseSecure = Nothing
-                           , connectionUseSocks  = Just $ SockSettingsSimple "localhost" (fromIntegral 1080)
+                           , connectionUseSocks  = Just $ SockSettingsSimple "localhost" 1080
                            }
 
 Connecting to a SSL style socket is equally easy, and need to set the UseSecure fields in ConnectionParams:
 
     con <- connectTo ctx $ ConnectionParams
                            { connectionHostname  = "www.example.com"
-                           , connectionPort      = fromIntegral 4567
+                           , connectionPort      = 4567
                            , connectionUseSecure = Just def
                            , connectionUseSocks  = Nothing
                            }
@@ -65,7 +65,7 @@
         ctx <- initConnectionContext
         con <- connectTo ctx $ ConnectionParams
                                   { connectionHostname  = "www.example.com"
-                                  , connectionPort      = fromIntegral 4567
+                                  , connectionPort      = 4567
                                   , connectionUseSecure = Nothing
                                   , connectionUseSocks  = Nothing
                                   }
diff --git a/connection.cabal b/connection.cabal
--- a/connection.cabal
+++ b/connection.cabal
@@ -1,9 +1,9 @@
 Name:                connection
-Version:             0.1.0
+Version:             0.1.1
 Description:
     Simple network library for all your connection need.
     .
-    Features: Really simple to use, SSL/TLS, SOCKS
+    Features: Really simple to use, SSL/TLS, SOCKS.
     .
     This library provides a very simple api to create sockets
     to a destination with the choice of SSL/TLS, and SOCKS.
