diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # binary-io
 
+## 0.6.0
+
+* Respect chunking from the underlying PutM when writing resulting ByteStrings
+
 ## 0.5.0
 
 * Let runPut and company return the result of the PutM operation
diff --git a/binary-io.cabal b/binary-io.cabal
--- a/binary-io.cabal
+++ b/binary-io.cabal
@@ -5,7 +5,7 @@
   binary-io
 
 version:
-  0.5.0
+  0.6.0
 
 category:
   Data, Parsing, IO
diff --git a/lib/Data/Binary/IO/Lifted.hs b/lib/Data/Binary/IO/Lifted.hs
--- a/lib/Data/Binary/IO/Lifted.hs
+++ b/lib/Data/Binary/IO/Lifted.hs
@@ -58,7 +58,8 @@
 import qualified Data.Binary.Put as Put
 import           Data.ByteString (ByteString)
 import qualified Data.ByteString as ByteString
-import           Data.ByteString.Lazy (toStrict)
+import           Data.ByteString.Lazy (toChunks, toStrict)
+import           Data.Foldable (traverse_)
 import           Data.IORef (atomicModifyIORef', mkWeakIORef, newIORef)
 import qualified Deque.Strict as Deque
 import           System.IO (Handle, hSetBinaryMode)
@@ -241,12 +242,14 @@
 --
 -- @since 0.4.0
 newWriterWith
-  :: Functor m
+  :: Applicative m
   => (ByteString -> m ()) -- ^ Chunk writer
   -> Writer m
 newWriterWith write = Writer $ \put -> do
   let (result, body) = Put.runPutM put
-  result <$ write (toStrict body)
+  result <$
+    -- Instead of allocating a single big
+    traverse_ write (toChunks body)
 
 -- | Create a writer.
 --
