diff --git a/library/Potoki/Core/Transform.hs b/library/Potoki/Core/Transform.hs
--- a/library/Potoki/Core/Transform.hs
+++ b/library/Potoki/Core/Transform.hs
@@ -37,6 +37,7 @@
   N.concurrently,
   N.unsafeConcurrently,
   N.async,
+  N.concurrentlyWithBatching,
   -- * File IO
   deleteFile,
   appendBytesToFile,
diff --git a/library/Potoki/Core/Transform/Concurrency.hs b/library/Potoki/Core/Transform/Concurrency.hs
--- a/library/Potoki/Core/Transform/Concurrency.hs
+++ b/library/Potoki/Core/Transform/Concurrency.hs
@@ -3,6 +3,7 @@
 
 import Potoki.Core.Prelude hiding (take, takeWhile, filter)
 import Potoki.Core.Transform.Instances ()
+import Potoki.Core.Transform.Basic
 import Potoki.Core.Types
 import qualified Potoki.Core.Fetch as A
 import qualified Acquire.Acquire as M
@@ -150,3 +151,9 @@
           then empty
           else return Nothing
       in atomically (readChan <|> terminate)
+
+concurrentlyWithBatching :: Int -> Int -> Transform a b -> Transform a b
+concurrentlyWithBatching batching concurrency transform =
+  chunk batching >>> bufferize concurrency >>>
+  unsafeConcurrently concurrency (vector >>> transform >>> chunk batching) >>>
+  vector
diff --git a/potoki-core.cabal b/potoki-core.cabal
--- a/potoki-core.cabal
+++ b/potoki-core.cabal
@@ -1,5 +1,5 @@
 name: potoki-core
-version: 2.2.11
+version: 2.2.12
 synopsis: Low-level components of "potoki"
 description:
   Provides everything required for building custom instances of
diff --git a/test/Transform.hs b/test/Transform.hs
--- a/test/Transform.hs
+++ b/test/Transform.hs
@@ -25,7 +25,6 @@
       gen = do
         list <- listOf (choose (0, 1000 :: Int))
         chunkSize <- frequency [(1000, choose (1, 3)), (100, choose (4, 100)), (1, pure 0)]
-        traceShowM (list, chunkSize)
         return (list, chunkSize)
       in forAll gen $ \ (list, chunkSize) -> let
         listChunks = if chunkSize < 1 then [] else SplitList.chunksOf chunkSize list
