diff --git a/quiver.cabal b/quiver.cabal
--- a/quiver.cabal
+++ b/quiver.cabal
@@ -1,5 +1,5 @@
 name:           quiver
-version:        0.0.0.8
+version:        0.0.0.9
 synopsis:       Quiver finite stream processing library
 homepage:       https://github.com/zadarnowski/quiver
 category:       Control
@@ -35,7 +35,7 @@
 source-repository this
   type:         git
   location:     https://github.com/zadarnowski/quiver.git
-  tag:          0.0.0.8
+  tag:          0.0.0.9
 
 library
   hs-source-dirs:   src
diff --git a/src/Control/Quiver/SP.lhs b/src/Control/Quiver/SP.lhs
--- a/src/Control/Quiver/SP.lhs
+++ b/src/Control/Quiver/SP.lhs
@@ -19,7 +19,7 @@
 >   pattern SPComplete,
 >   pattern SPFailed,
 >   pattern SPIncomplete,
->   spfetch, spemit, (>:>),
+>   spfetch, spemit, (>:>), (>>!),
 >   sppure, spid, spconcat,
 >   spfold, spfold', spfoldl, spfoldl', spfoldr, spfoldr',
 > ) where
@@ -27,6 +27,7 @@
 > import Control.Quiver
 
 > infixr 5 >:>
+> infixl 1 >>!
 
 > -- | A /simple processor step/ with a unit request type and an unspecified
 > --   response type:
@@ -79,6 +80,15 @@
 
 > (>:>) :: b -> SP a b f e -> SP a b f e
 > y >:> p = produce y (const p) (deliver SPIncomplete)
+
+> -- | @p >>! k@ is equivalent to @p@, with any failures in @p@
+> --   supplied to the continuation processor @k@. Note that
+> --   @k@ is not executed if @p@ completes successfully with
+> --   'SPComplete' or is interrupted by the downstream processor,
+> --   deliverying 'SPIncomplete'.
+
+> (>>!) :: Monad f => SP a b f e -> (e -> SP a b f e') -> SP a b f e'
+> p >>! k = p >>= maybe (deliver SPIncomplete) (maybe (deliver SPComplete) k)
 
 > -- | @sppure f@ produces an infinite consumer/producer that
 > --   uses a pure function @f@ to convert every input value into
