diff --git a/network-attoparsec.cabal b/network-attoparsec.cabal
--- a/network-attoparsec.cabal
+++ b/network-attoparsec.cabal
@@ -1,6 +1,6 @@
 name: network-attoparsec
 category: Network, Parsing
-version: 0.11.2
+version: 0.12.1
 license: MIT
 license-file: LICENSE
 copyright: (c) 2015 Leon Mergen
diff --git a/src/Network/Attoparsec.hs b/src/Network/Attoparsec.hs
--- a/src/Network/Attoparsec.hs
+++ b/src/Network/Attoparsec.hs
@@ -54,7 +54,7 @@
           -> ParseC a          -- ^ Continuation parser state
           -> m (ParseC a, [a]) -- ^ Next parser state with parsed values
 parseMany s p0 pCur = do
-  buf <- readAvailable s
+  buf <- readAvailable s Nothing
   (p1, xs) <- parseBuffer p0 Many buf pCur
   return (p1, xs)
 
@@ -62,10 +62,11 @@
 --   single succesful parse on the socket, and guarantees that exactly one item
 --   will be parsed.
 --
---   __Warning:__ this function will /not/ work correctly when input data is
---   pipelined. The parser might consume more data than required from the socket,
---   or a partial second object is parsed, and the parser state and buffer will
---   be discarded.
+--   __Warning:__ In order to make this function work stable with pipelined data,
+--                we read in data one byte at a time, which causes many context
+--                switches and kernel syscalls, and furthermore causes a lot of
+--                separate calls to attoparsec. So only use if performance is not
+--                a consideration.
 --
 --  The is typically used as follows:
 --
@@ -77,7 +78,7 @@
          -> ParseC a  -- ^ Initial parser state
          -> m a       -- ^ Parsed value
 parseOne s p0 = do
-  buf <- readAvailable s
+  buf <- readAvailable s (Just 1)
   (p1, value) <- parseBuffer p0 Single buf p0
 
   case value of
@@ -99,6 +100,7 @@
             -> m (ParseC a, [a]) -- ^ Next parser state with parsed values
 parseBuffer p0 mode =
 
+
   let next bCur pCur =
         case pCur bCur of
          -- On error, throw error through MonadError
@@ -129,13 +131,15 @@
 readAvailable :: ( MonadIO m
                  , MonadMask m)
               => NS.Socket
+              -> Maybe Int
               -> m BS.ByteString
-readAvailable s =
+readAvailable s Nothing = readAvailable s (Just 2048)
+readAvailable s (Just bytes) =
   let  buf :: IO (Maybe BS.ByteString)
        buf    = do
         -- For some reason, Windows seems to be generating an exception sometimes
         -- when the remote has closed the connection
-        result <- tryAny $ NSB.recv s 2048
+        result <- tryAny $ NSB.recv s bytes
 
         case result of
          Left _  -> return Nothing
diff --git a/test/Network/AttoparsecSpec.hs b/test/Network/AttoparsecSpec.hs
--- a/test/Network/AttoparsecSpec.hs
+++ b/test/Network/AttoparsecSpec.hs
@@ -103,11 +103,11 @@
           endOfLine
           return num
 
-    it "should return error when using single object parser" $
+    it "should return not error when using single object parser" $
       let writeSocket s = NS.send s "1234\n5678\n"
           readSocket s  = Atto.parseOne s (Atto.parse numberParser)
 
-      in (pairSockets writeSocket readSocket) `shouldThrow` isUserError
+      in (pairSockets writeSocket readSocket) `shouldReturn` 1234
 
     it "should return multiple objects when using multi object parser" $
       let writeSocket s = NS.send s "1234\n5678\n"
