diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,11 @@
+## 1.2.8
+
+* Implement
+  [the reskinning idea](http://www.snoyman.com/blog/2016/09/proposed-conduit-reskin):
+    * `.|`
+    * `runConduitPure`
+    * `runConduitRes`
+
 ## 1.2.7
 
 * Expose yieldM for ConduitM [#270](https://github.com/snoyberg/conduit/pull/270)
diff --git a/Data/Conduit.hs b/Data/Conduit.hs
--- a/Data/Conduit.hs
+++ b/Data/Conduit.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE Safe #-}
 -- | If this is your first time with conduit, you should probably start with
 -- the tutorial:
@@ -12,6 +13,7 @@
     , Sink
     , ConduitM
       -- ** Connect/fuse operators
+    , (.|)
     , ($$)
     , ($=)
     , (=$)
@@ -30,6 +32,8 @@
     , yieldM
     , leftover
     , runConduit
+    , runConduitPure
+    , runConduitRes
 
       -- ** Finalization
     , bracketP
@@ -97,6 +101,10 @@
     ) where
 
 import Data.Conduit.Internal.Conduit
+import Data.Void (Void)
+import Data.Functor.Identity (Identity, runIdentity)
+import Control.Monad.Trans.Resource (ResourceT, runResourceT)
+import Control.Monad.Trans.Control (MonadBaseControl)
 
 -- | Named function synonym for '$$'.
 --
@@ -109,3 +117,39 @@
 -- Since 1.2.3
 fuse :: Monad m => Conduit a m b -> ConduitM b c m r -> ConduitM a c m r
 fuse = (=$=)
+
+infixr 2 .|
+-- | Combine two @Conduit@s together into a new @Conduit@ (aka 'fuse').
+--
+-- Output from the upstream (left) conduit will be fed into the
+-- downstream (right) conduit. Processing will terminate when
+-- downstream (right) returns. Leftover data returned from the right
+-- @Conduit@ will be discarded.
+--
+-- @since 1.2.8
+(.|) :: Monad m
+     => ConduitM a b m () -- ^ upstream
+     -> ConduitM b c m r -- ^ downstream
+     -> ConduitM a c m r
+(.|) = fuse
+{-# INLINE (.|) #-}
+
+-- | Run a pure pipeline until processing completes, i.e. a pipeline
+-- with @Identity@ as the base monad. This is equivalient to
+-- @runIdentity . runConduit@.
+--
+-- @since 1.2.8
+runConduitPure :: ConduitM () Void Identity r -> r
+runConduitPure = runIdentity . runConduit
+{-# INLINE runConduitPure #-}
+
+-- | Run a pipeline which acquires resources with @ResourceT@, and
+-- then run the @ResourceT@ transformer. This is equivalent to
+-- @runResourceT . runConduit@.
+--
+-- @since 1.2.8
+runConduitRes :: MonadBaseControl IO m
+              => ConduitM () Void (ResourceT m) r
+              -> m r
+runConduitRes = runResourceT . runConduit
+{-# INLINE runConduitRes #-}
diff --git a/conduit.cabal b/conduit.cabal
--- a/conduit.cabal
+++ b/conduit.cabal
@@ -1,5 +1,5 @@
 Name:                conduit
-Version:             1.2.7
+Version:             1.2.8
 Synopsis:            Streaming data processing library.
 description:
     Hackage documentation generation is not reliable. For up to date documentation, please see: <http://www.stackage.org/package/conduit>.
@@ -35,6 +35,7 @@
                      , transformers             >= 0.2.2
                      , mtl
                      , mmorph
+                     , monad-control
   if !impl(ghc>=7.9)
     build-depends:   void                     >= 0.5.5
   ghc-options:         -Wall
