diff --git a/library/Potoki/Core/Fetch.hs b/library/Potoki/Core/Fetch.hs
--- a/library/Potoki/Core/Fetch.hs
+++ b/library/Potoki/Core/Fetch.hs
@@ -22,6 +22,7 @@
   finiteMVar,
   vector,
   handlingElements,
+  lazyByteStringRef,
 )
 where
 
@@ -30,7 +31,8 @@
 import qualified Data.Vector as C
 import qualified Data.ByteString as D
 import qualified Data.Text.IO as A
-
+import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString.Lazy.Internal as B
 
 deriving instance Functor Fetch
 
@@ -280,4 +282,14 @@
     case mbElement of
       Just element -> xRay element $> mbElement
       Nothing -> return Nothing
-    
+
+{-# INLINE lazyByteStringRef #-}
+lazyByteStringRef :: IORef B.ByteString -> Fetch ByteString
+lazyByteStringRef ref =
+  Fetch $ do
+    lazyByteString <- readIORef ref
+    case lazyByteString of
+      B.Chunk chunk remainders -> do
+        writeIORef ref remainders
+        return (Just chunk)
+      B.Empty -> return Nothing
diff --git a/library/Potoki/Core/Produce.hs b/library/Potoki/Core/Produce.hs
--- a/library/Potoki/Core/Produce.hs
+++ b/library/Potoki/Core/Produce.hs
@@ -12,6 +12,7 @@
   directoryContents,
   finiteMVar,
   infiniteMVar,
+  lazyByteString,
 )
 where
 
@@ -22,6 +23,7 @@
 import qualified Data.Vector as C
 import qualified System.Directory as G
 import qualified Acquire.Acquire as M
+import qualified Data.ByteString.Lazy as D
 
 
 deriving instance Functor Produce
@@ -208,3 +210,10 @@
 infiniteMVar :: MVar element -> Produce element
 infiniteMVar var =
   Produce $ M.Acquire (return (A.infiniteMVar var, return ()))
+
+{-# INLINE lazyByteString #-}
+lazyByteString :: D.ByteString -> Produce ByteString
+lazyByteString lbs =
+  Produce $ M.Acquire $ do
+    ref <- newIORef lbs
+    return (A.lazyByteStringRef ref, return ())
diff --git a/potoki-core.cabal b/potoki-core.cabal
--- a/potoki-core.cabal
+++ b/potoki-core.cabal
@@ -1,7 +1,7 @@
 name:
   potoki-core
 version:
-  2.2
+  2.2.1
 synopsis:
   Low-level components of "potoki"
 description:
