diff --git a/monadLib.cabal b/monadLib.cabal
--- a/monadLib.cabal
+++ b/monadLib.cabal
@@ -1,5 +1,5 @@
 Name:           monadLib
-Version:        3.5.2
+Version:        3.6
 License:        BSD3
 License-file:   LICENSE
 Author:         Iavor S. Diatchki
diff --git a/src/MonadLib.hs b/src/MonadLib.hs
--- a/src/MonadLib.hs
+++ b/src/MonadLib.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP, MultiParamTypeClasses, FunctionalDependencies,
+             UndecidableInstances, FlexibleInstances #-}
 {-| This library provides a collection of monad transformers that
     can be combined to produce various monads.
 -}
@@ -28,6 +30,7 @@
   runIdT, runReaderT, runWriterT,
   runStateT, runExceptionT, runContT,
   runChoiceT, findOne, findAll,
+  RunM(..),
 
   -- ** Nested Execution
   -- $Nested_Exec
@@ -181,7 +184,41 @@
 runContT i (C m) = m i
 
 
+-- | Generalized running.
+class Monad m => RunM m a r | m a -> r where
+  runM :: m a -> r
 
+instance RunM Id a a where
+  runM = runId
+
+instance RunM Lift a a where
+  runM = runLift
+
+instance RunM IO a (IO a) where
+  runM = id
+
+instance RunM m a r => RunM (IdT m) a r where
+  runM = runM . runIdT
+
+instance RunM m a r => RunM (ReaderT i m) a (i -> r) where
+  runM m i = runM (runReaderT i m)
+
+instance (Monoid i, RunM m (a,i) r) => RunM (WriterT i m) a r where
+  runM = runM . runWriterT
+
+instance RunM m (a,i) r => RunM (StateT i m) a (i -> r) where
+  runM m i = runM (runStateT i m)
+
+instance RunM m (Either i a) r => RunM (ExceptionT i m) a r where
+  runM = runM . runExceptionT
+
+instance RunM m i r => RunM (ContT i m) a ((a -> m i) -> r) where
+  runM m k = runM (runContT k m)
+
+instance RunM m (Maybe (a,ChoiceT m a)) r => RunM (ChoiceT m) a r where
+  runM = runM . runChoiceT
+
+
 -- $Lifting
 --
 -- The following operations allow us to promote computations
@@ -583,6 +620,9 @@
   local i (S m) = S (local i . m)
 instance (RunReaderM m j) => RunReaderM (ExceptionT i m) j where
   local i (X m) = X (local i m)
+
+instance (RunReaderM m j) => RunReaderM (ContT i m) j where
+  local i (C m) = C (local i . m)
 
 -- | Classifies monads that support collecting the output of
 -- a sub-computation.
diff --git a/src/MonadLib/Derive.hs b/src/MonadLib/Derive.hs
--- a/src/MonadLib/Derive.hs
+++ b/src/MonadLib/Derive.hs
@@ -8,6 +8,7 @@
   derive_local, derive_collect, derive_try,
   derive_mzero, derive_mplus,
   derive_lift, derive_inBase,
+  derive_runM,
 ) where
 
 
@@ -94,3 +95,7 @@
 -- | Derive the implementation of 'inBase' from 'BaseM'.
 derive_inBase :: (BaseM m x) => Iso m n -> x a -> n a
 derive_inBase iso m = close iso (inBase m)
+
+-- | Derive the implementation of the 'runM' function from 'RunM'.
+derive_runM :: (RunM m a r) => Iso m n -> n a -> r
+derive_runM iso m = runM (open iso m)
