diff --git a/Data/Conduit/Extra.hs b/Data/Conduit/Extra.hs
--- a/Data/Conduit/Extra.hs
+++ b/Data/Conduit/Extra.hs
@@ -1,7 +1,54 @@
 module Data.Conduit.Extra
     ( module Data.Conduit.Extra.ZipSink
     , module Data.Conduit.Extra.Resumable
+    , fuseLeftovers
+    , fuseReturnLeftovers
     ) where
 
 import Data.Conduit.Extra.ZipSink
 import Data.Conduit.Extra.Resumable
+import Data.Conduit
+import Data.Conduit.Internal (Pipe (..), ConduitM (..))
+import Control.Monad (liftM)
+import Data.Void (absurd)
+
+fuseLeftovers :: Monad m
+              => ConduitM a b m ()
+              -> ConduitM b c m r
+              -> ConduitM a c m (r, [b])
+fuseLeftovers (ConduitM left0) (ConduitM right0) =
+    ConduitM $ goRight (return ()) [] left0 right0
+  where
+    goRight final bs left right =
+        case right of
+            HaveOutput p c o -> HaveOutput (recurse p) (c >> final) o
+            NeedInput rp rc  ->
+                case bs of
+                    [] -> goLeft rp rc final left
+                    b:bs' -> goRight final bs' left (rp b)
+            Done r2          -> PipeM (final >> return (Done (r2, bs)))
+            PipeM mp         -> PipeM (liftM recurse mp)
+            Leftover p b     -> goRight final (b:bs) left p
+      where
+        recurse = goRight final bs left
+
+    goLeft rp rc final left =
+        case left of
+            HaveOutput left' final' o -> goRight final' [] left' (rp o)
+            NeedInput left' lc        -> NeedInput (recurse . left') (recurse . lc)
+            Done r1                   -> goRight (return ()) [] (Done r1) (rc r1)
+            PipeM mp                  -> PipeM (liftM recurse mp)
+            Leftover left' i          -> Leftover (recurse left') i
+      where
+        recurse = goLeft rp rc final
+
+fuseReturnLeftovers
+    :: Monad m
+    => ([b] -> [a])
+    -> ConduitM a b m ()
+    -> ConduitM b c m r
+    -> ConduitM a c m r
+fuseReturnLeftovers f left right = do
+    (r, bs) <- fuseLeftovers left right
+    mapM_ leftover $ reverse $ f bs
+    return r
diff --git a/Data/Conduit/Extra/ZipSink.hs b/Data/Conduit/Extra/ZipSink.hs
--- a/Data/Conduit/Extra/ZipSink.hs
+++ b/Data/Conduit/Extra/ZipSink.hs
@@ -4,7 +4,7 @@
     , broadcast
     ) where
 
-#if MIN_VERSION_conduit(1, 0, 13)
+#if MIN_VERSION_conduit(1, 0, 13) || FPHC
 import Data.Conduit (ZipSink (..), sequenceSinks, Sink)
 import Data.Traversable (Traversable)
 
diff --git a/conduit-extra.cabal b/conduit-extra.cabal
--- a/conduit-extra.cabal
+++ b/conduit-extra.cabal
@@ -1,5 +1,5 @@
 Name:                conduit-extra
-Version:             0.1.2
+Version:             0.1.3
 Synopsis:            Experimental helper functions for conduit.
 Description:
     This package is meant as a testing ground for new concepts in conduit. The idea is to have a much lower barrier to entry for this library relative to conduit itself. This way, conduit itself will continue to have a best-practices, minimal, stable API, while people are free to try crazy new features.
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -12,6 +12,7 @@
 import qualified Data.Conduit.List as CL
 import qualified Data.Conduit.Extra as CE
 import Data.Conduit (runResourceT)
+import qualified Data.Conduit.ExtraSpec as ES
 
 
 main :: IO ()
@@ -31,4 +32,4 @@
             x <- runResourceT $ CL.sourceList [100,99..1] $$ sink
             x `shouldBe` (505000 :: Integer)
 
-    return ()
+    ES.spec
