diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,11 @@
+0.2.5
+-----
+* Added `deconstruct`, `tagDone` and `finishWith`
+
+0.2.4
+-----
+* Added `asPats`, `sinkPart_`, `autoM`, and `fitM`
+
 0.2.1
 -----
 * Fixed the `Mealy` Monad
diff --git a/machines.cabal b/machines.cabal
--- a/machines.cabal
+++ b/machines.cabal
@@ -1,6 +1,6 @@
 name:          machines
 category:      Control, Enumerator
-version:       0.2.4
+version:       0.2.5
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
diff --git a/src/Data/Machine/Type.hs b/src/Data/Machine/Type.hs
--- a/src/Data/Machine/Type.hs
+++ b/src/Data/Machine/Type.hs
@@ -30,6 +30,11 @@
   , before
 --  , sink
 
+  -- ** Deconstructing machines back into plans
+  , deconstruct
+  , tagDone
+  , finishWith
+
   -- * Reshaping machines
   , fit
   , fitM
@@ -225,6 +230,43 @@
 -- | This is a stopped 'Machine'
 stopped :: Machine k b
 stopped = encased Stop
+
+--------------------------------------------------------------------------------
+-- Deconstruction
+--------------------------------------------------------------------------------
+
+--- | Convert a 'Machine' back into a 'Plan'. The first value the
+--- machine yields that is tagged with the 'Left' data constructor is
+--- used as the return value of the resultant 'Plan'. Machine-yielded
+--- values tagged with 'Right' are yielded -- sans tag -- by the
+--- result 'Plan'. This may be used when monadic binding of results is
+--- required.
+deconstruct :: Monad m => MachineT m k (Either a o) -> PlanT k o m a
+deconstruct m = PlanT $ \r y a f -> 
+  let aux k = runPlanT (deconstruct k) r y a f
+  in runMachineT m >>= \v -> case v of
+       Stop -> f
+       Yield (Left o) _ -> r o
+       Yield (Right o) k -> y o (aux k)
+       Await g fk h -> a (aux . g) fk (aux h)
+
+-- | Use a predicate to mark a yielded value as the terminal value of
+-- this 'Machine'. This is useful in combination with 'deconstruct' to
+-- combine 'Plan's.
+tagDone :: Monad m => (o -> Bool) -> MachineT m k o -> MachineT m k (Either o o)
+tagDone f = fmap aux
+  where aux x = if f x then Left x else Right x
+
+-- | Use a function to produce and mark a yielded value as the
+-- terminal value of a 'Machine'. All yielded values for which the
+-- given function returns 'Nothing' are yielded down the pipeline, but
+-- the first value for which the function returns a 'Just' value will
+-- be returned by a 'Plan' created via 'deconstruct'.
+finishWith :: Monad m
+           => (o -> Maybe r) -> MachineT m k o -> MachineT m k (Either r o)
+finishWith f = fmap aux
+  where aux x = maybe (Right x) Left $ f x
+
 
 -------------------------------------------------------------------------------
 -- Sink
