diff --git a/iteratee.cabal b/iteratee.cabal
--- a/iteratee.cabal
+++ b/iteratee.cabal
@@ -1,5 +1,5 @@
 name:          iteratee
-version:       0.8.7.1
+version:       0.8.7.2
 synopsis:      Iteratee-based I/O
 description:
   The Iteratee monad provides strict, safe, and functional I/O. In addition
diff --git a/src/Data/Iteratee/Iteratee.hs b/src/Data/Iteratee/Iteratee.hs
--- a/src/Data/Iteratee/Iteratee.hs
+++ b/src/Data/Iteratee/Iteratee.hs
@@ -272,9 +272,9 @@
 -- > unpacker = mapChunks B.unpack
 -- 
 mapChunks :: (Monad m, NullPoint s) => (s -> s') -> Enumeratee s s' m a
-mapChunks f = eneeCheckIfDone (liftI . step)
+mapChunks f = eneeCheckIfDonePass (icont . step)
  where
-  step k (Chunk xs)     = eneeCheckIfDone (liftI . step) . k . Chunk $ f xs
+  step k (Chunk xs)     = eneeCheckIfDonePass (icont . step) . k . Chunk $ f xs
   step k str@(EOF mErr) = idone (k $ EOF mErr) str
 {-# INLINE mapChunks #-}
 
@@ -283,10 +283,10 @@
   :: (Monad m, NullPoint s, Nullable s)
   => (s -> m s')
   -> Enumeratee s s' m a
-mapChunksM f = eneeCheckIfDone (liftI . step)
+mapChunksM f = eneeCheckIfDonePass (icont . step)
  where
   step k (Chunk xs)     = lift (f xs) >>=
-                          eneeCheckIfDone (liftI . step) . k . Chunk
+                          eneeCheckIfDonePass (icont . step) . k . Chunk
   step k str@(EOF mErr) = idone (k $ EOF mErr) str
 {-# INLINE mapChunksM #-}
 
@@ -301,10 +301,11 @@
  (Monad m, Nullable s) =>
   Iteratee s m s'
   -> Enumeratee s s' m a
-convStream fi = eneeCheckIfDone check
+convStream fi = eneeCheckIfDonePass check
   where
-    check k = isStreamFinished >>= maybe (step k) (idone (liftI k) . EOF . Just)
-    step k = fi >>= eneeCheckIfDone check . k . Chunk
+    check k (Just e) = throwRecoverableErr e (const identity) >> check k Nothing
+    check k _ = isStreamFinished >>= maybe (step k) (idone (liftI k) . EOF . Just)
+    step k = fi >>= eneeCheckIfDonePass check . k . Chunk
 
 -- |The most general stream converter.  Given a function to produce iteratee
 -- transformers and an initial state, convert the stream using iteratees
@@ -314,12 +315,13 @@
   (acc -> Iteratee s m (acc, s'))
   -> acc
   -> Enumeratee s s' m a
-unfoldConvStream f acc0 = eneeCheckIfDone (check acc0)
+unfoldConvStream f acc0 = eneeCheckIfDonePass (check acc0)
   where
-    check acc k = isStreamFinished >>=
+    check acc k (Just e) = throwRecoverableErr e (const identity) >> check acc k Nothing
+    check acc k _ = isStreamFinished >>=
                     maybe (step acc k) (idone (liftI k) . EOF . Just)
     step acc k = f acc >>= \(acc', s') ->
-                    eneeCheckIfDone (check acc') . k . Chunk $ s'
+                    eneeCheckIfDonePass (check acc') . k . Chunk $ s'
 
 unfoldConvStreamCheck
   :: (Monad m, Nullable elo, Monoid elo)
diff --git a/src/Data/Iteratee/ListLike.hs b/src/Data/Iteratee/ListLike.hs
--- a/src/Data/Iteratee/ListLike.hs
+++ b/src/Data/Iteratee/ListLike.hs
@@ -320,13 +320,13 @@
   :: (Monad m, LL.ListLike s el, NullPoint s)
   => (el -> Bool)
   -> Enumeratee s s m a
-breakE cpred = eneeCheckIfDone (liftI . step)
+breakE cpred = eneeCheckIfDonePass (icont . step)
  where
   step k (Chunk s)
       | LL.null s  = liftI (step k)
       | otherwise  = case LL.break cpred s of
         (str', tail')
-          | LL.null tail' -> eneeCheckIfDone (liftI . step) . k $ Chunk str'
+          | LL.null tail' -> eneeCheckIfDonePass (icont . step) . k $ Chunk str'
           | otherwise     -> idone (k $ Chunk str') (Chunk tail')
   step k stream           =  idone (k stream) stream
 {-# INLINE breakE #-}
