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
@@ -28,6 +28,7 @@
   A.parseBytes,
   A.parseText,
   A.parseLineBytesConcurrently,
+  A.parseNonEmptyLineBytesConcurrently,
   -- * Concurrency
   N.bufferize,
   N.concurrently,
diff --git a/library/Potoki/Core/Transform/Attoparsec.hs b/library/Potoki/Core/Transform/Attoparsec.hs
--- a/library/Potoki/Core/Transform/Attoparsec.hs
+++ b/library/Potoki/Core/Transform/Attoparsec.hs
@@ -3,6 +3,7 @@
 
 import Potoki.Core.Prelude hiding (take, takeWhile, filter, drop)
 import Potoki.Core.Types
+import Potoki.Core.Transform.Basic
 import Potoki.Core.Transform.Concurrency
 import Potoki.Core.Transform.ByteString
 import qualified Potoki.Core.Fetch as A
@@ -10,6 +11,7 @@
 import qualified Data.Attoparsec.Text as L
 import qualified Data.Attoparsec.Types as M
 import qualified Acquire.Acquire as N
+import qualified Data.ByteString as ByteString
 
 
 {-# INLINE mapWithParseResult #-}
@@ -92,4 +94,14 @@
 parseLineBytesConcurrently :: Int -> K.Parser a -> Transform ByteString (Either Text a)
 parseLineBytesConcurrently concurrency parser =
   extractLines >>> bufferize concurrency >>>
+  concurrently concurrency (arr (mapLeft fromString . K.parseOnly parser))
+
+{-|
+Lift an Attoparsec ByteString parser to a transform,
+which parses the lines concurrently.
+-}
+{-# INLINE parseNonEmptyLineBytesConcurrently #-}
+parseNonEmptyLineBytesConcurrently :: Int -> K.Parser a -> Transform ByteString (Either Text a)
+parseNonEmptyLineBytesConcurrently concurrency parser =
+  extractLinesWithoutTrail >>> filter (not . ByteString.null) >>> bufferize concurrency >>>
   concurrently concurrency (arr (mapLeft fromString . K.parseOnly parser))
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.4
+  2.2.5
 synopsis:
   Low-level components of "potoki"
 description:
