diff --git a/mwc-probability-transition.cabal b/mwc-probability-transition.cabal
--- a/mwc-probability-transition.cabal
+++ b/mwc-probability-transition.cabal
@@ -1,5 +1,5 @@
 name:                mwc-probability-transition
-version:             0.3.0.1
+version:             0.3.0.2
 synopsis:            A Markov stochastic transition operator with logging
 description:
             .
@@ -38,6 +38,7 @@
   hs-source-dirs:      test
   main-is:             LibSpec.hs
   build-depends:       base
+                     , logging-effect
                      , mwc-probability
                      , mwc-probability-transition
                      , hspec
diff --git a/src/System/Random/MWC/Probability/Transition.hs b/src/System/Random/MWC/Probability/Transition.hs
--- a/src/System/Random/MWC/Probability/Transition.hs
+++ b/src/System/Random/MWC/Probability/Transition.hs
@@ -6,8 +6,12 @@
     Transition
   , mkTransition
   , runTransition
+  -- ** Specialized combinators
+  , evalTransition
+  , execTransition
+  -- ** Conditional execution
   , stepConditional
-  -- ** Helper functions
+  -- * Helper functions
   , withSeverity
   -- -- * Re-exported from `logging-effect`
   -- , Handler
@@ -22,8 +26,9 @@
 
 import Control.Monad.Trans.Class (MonadTrans(..), lift)
 import Control.Monad.Trans.State.Strict (StateT(..), evalStateT, execStateT, runStateT)
-import Control.Monad.Log (MonadLog(..), Handler, WithSeverity(..), Severity(..), LoggingT(..), runLoggingT, withFDHandler, defaultBatchingOptions, logMessage)
+-- import Control.Monad.Log (MonadLog(..), Handler, WithSeverity(..), Severity(..), LoggingT(..), runLoggingT, withFDHandler, defaultBatchingOptions, logMessage)
 
+import qualified Control.Monad.Log as L
 import Data.Char
 
 import System.Random.MWC.Probability
@@ -32,7 +37,7 @@
 
 -- | A Markov transition kernel.
 newtype Transition message s m a = Transition (
-  Gen (PrimState m) -> StateT s (LoggingT message m) a
+  Gen (PrimState m) -> StateT s (L.LoggingT message m) a
   ) deriving (Functor)
 
 instance Show (Transition msg s m a) where
@@ -56,22 +61,51 @@
   s <- S.get
   w <- lift . lift $ sample (fm s) gen
   let (a, s') = fs s w
-  lift $ logMessage $ flog a s' 
+  lift $ L.logMessage $ flog a s' 
   S.put s'
   return a
 
 -- | Run a 'Transition' for a number of steps, while logging each iteration.
+--
+-- Returns both the list of outputs and the final state.
 runTransition :: Monad m =>
-         Handler m message        -- ^ Logging handler
+         L.Handler m message        -- ^ Logging handler
       -> Transition message s m a
       -> Int                      -- ^ Number of iterations 
       -> s                        -- ^ Initial state
       -> Gen (PrimState m)        -- ^ PRNG
       -> m ([a], s)               -- ^ (Outputs, Final state)
 runTransition logf (Transition fm) n s0 g =
-  runLoggingT (runStateT (replicateM n (fm g)) s0) logf
+  L.runLoggingT (runStateT (replicateM n (fm g)) s0) logf
 
 
+-- | Run a 'Transition' for a number of steps, while logging each iteration.
+--
+-- Returns the list of outputs.
+evalTransition :: Monad m =>
+                  L.Handler m message
+               -> Transition message s m a
+               -> Int
+               -> s
+               -> Gen (PrimState m)
+               -> m [a]              -- ^ Outputs
+evalTransition logf (Transition fm) n s0 g =
+  L.runLoggingT (evalStateT (replicateM n (fm g)) s0) logf
+
+-- | Run a 'Transition' for a number of steps, while logging each iteration.
+--
+-- Returns the final state.
+execTransition :: Monad m =>
+                  L.Handler m message
+               -> Transition message s m a
+               -> Int
+               -> s
+               -> Gen (PrimState m)
+               -> m s              -- ^ Final state
+execTransition logf (Transition fm) n s0 g =
+  L.runLoggingT (execStateT (replicateM n (fm g)) s0) logf
+
+
 -- | Perform one 'Transition' and check output and updated state against the current state, producing an Either with the result of the comparison.
 --
 -- Can be useful for detecting early divergence or lack of convergence etc.
@@ -79,13 +113,13 @@
                    (a -> s -> s -> Bool)  -- ^ Inputs: Model output, Current state, New state
                 -> (a -> s -> s -> l)     -- ^ "
                 -> (a -> s -> s -> r)     -- ^ "
-                -> Handler m message      
+                -> L.Handler m message      
                 -> Transition message s m a
                 -> s                      -- ^ Current state
                 -> Gen (PrimState m)
                 -> m (Either l r)
 stepConditional q fleft fright logf (Transition fm) s g = do 
-  (a, s') <- runLoggingT (runStateT (fm g) s) logf
+  (a, s') <- L.runLoggingT (runStateT (fm g) s) logf
   if q a s s' then pure (Left $ fleft a s s') else pure (Right $ fright a s s')
 
 
@@ -97,7 +131,7 @@
 bracketsUpp p = unwords ["[", map toUpper (show p), "]"]
 
 -- | Render a logging message along with an annotation of its severity.
-withSeverity :: (t -> String) -> WithSeverity t -> String
-withSeverity k (WithSeverity u a ) = unwords [bracketsUpp u, k a]
+withSeverity :: (t -> String) -> L.WithSeverity t -> String
+withSeverity k (L.WithSeverity u a ) = unwords [bracketsUpp u, k a]
 
 
diff --git a/test/LibSpec.hs b/test/LibSpec.hs
--- a/test/LibSpec.hs
+++ b/test/LibSpec.hs
@@ -3,6 +3,8 @@
 import Test.Hspec
 import Test.Hspec.QuickCheck
 
+import Control.Monad.Log
+
 import System.Random.MWC.Probability
 import System.Random.MWC.Probability.Transition
 
