diff --git a/Text/Chatty/Printer.hs b/Text/Chatty/Printer.hs
--- a/Text/Chatty/Printer.hs
+++ b/Text/Chatty/Printer.hs
@@ -29,6 +29,7 @@
 import Control.Monad
 import Control.Monad.State
 import Control.Monad.Identity
+import Control.Monad.Writer
 import System.IO
 
 -- | A typeclass for all monads that may output strings.
@@ -50,9 +51,6 @@
   mnoecho _ = return ()
   mflush = hFlush stdout
 
-instance Monad m => ChPrinter (StateT String m) where
-  mprint s = modify (++s)
-
 -- | DeafT discards all output (much like >\/dev\/null in the shell)
 newtype DeafT m a = Deaf { runDeafT :: m a }
 
@@ -78,35 +76,31 @@
 
 -- Definition of OutRedirT + instances
 -- | Redirects all output to a given handle (much like >filename in the shell)
-newtype OutRedirT m a = OutRedir { runOutRedirT' :: Handle -> m (a,Handle) }
+newtype OutRedirT m a = OutRedir { runOutRedirT :: Handle -> m a }
 -- | 'OutRedirT' on a blank 'IO' monad
 type OutRedir = OutRedirT IO
 
 instance Monad m => Monad (OutRedirT m) where
-  return a = OutRedir $ \h -> return (a,h)
-  (OutRedir r) >>= f = OutRedir $ \h -> do (a,h') <- r h; runOutRedirT' (f a) h'
+  return a = OutRedir $ \h -> return a
+  (OutRedir r) >>= f = OutRedir $ \h -> do a <- r h; runOutRedirT (f a) h
 
 instance MonadTrans OutRedirT where
-  lift m = OutRedir $ \h -> do a <- m; return (a,h)
+  lift m = OutRedir $ \h -> m
 
 instance MonadIO m => MonadIO (OutRedirT m) where
   liftIO = lift . liftIO
 
 instance MonadIO m => ChPrinter (OutRedirT m) where
-  mprint s = OutRedir $ \h -> do liftIO $ hPutStr h s; return ((),h)
-  mflush = OutRedir $ \h -> do liftIO $ hFlush h; return ((),h)
+  mprint s = OutRedir $ \h -> do liftIO $ hPutStr h s; return ()
+  mflush = OutRedir $ \h -> do liftIO $ hFlush h; return ()
 
 instance Monad m => Functor (OutRedirT m) where
-  fmap f a = OutRedir $ \h -> do (a',h') <- runOutRedirT' a h; return (f a',h')
+  fmap f a = OutRedir $ \h -> do a' <- runOutRedirT a h; return (f a')
 
 instance Monad m => Applicative (OutRedirT m) where
   pure = return
   (<*>) = ap
 
--- | Run 'OutRedirT' with a 'Handle'
-runOutRedirT :: Functor m => OutRedirT m a -> Handle -> m a
-runOutRedirT m h = fmap fst $ runOutRedirT' m h
-
 -- | Run 'OutRedir' with a 'Handle'
 runOutRedir :: OutRedir a -> Handle -> IO a
 runOutRedir = runOutRedirT
@@ -127,22 +121,25 @@
 
 -- Definition of RecorderT + instances
 -- | Catches all output (much like VAR=$(...) in the shell)
-newtype RecorderT m a = Recorder { runRecorderT' :: [String] -> m (a,[String]) }
+newtype RecorderT m a = Recorder { runRecorderT' :: m (a,[String]) }
 -- | 'RecorderT' on the 'Identity'
 type Recorder = RecorderT Identity
 
 instance Monad m => Monad (RecorderT m) where
-  return a = Recorder $ \s -> return (a,s)
-  (Recorder r) >>= f = Recorder $ \s -> do (a,s') <- r s; runRecorderT' (f a) s'
+  return a = Recorder $ return (a,[])
+  (Recorder r) >>= f = Recorder $ do
+    (a,s) <- r
+    (a',s') <- runRecorderT' (f a)
+    return (a', s'++s)
 
 instance MonadTrans RecorderT where
-  lift m = Recorder $ \s -> do a <- m; return (a,s)
+  lift m = Recorder $ do a <- m; return (a,[])
 
 instance Monad m => ChPrinter (RecorderT m) where
-  mprint s = Recorder $ \s' -> return ((),s:s')
+  mprint s = Recorder $ return ((),[s])
 
 instance Monad m => Functor (RecorderT m) where
-  fmap f a = Recorder $ \s -> do (a',s') <- runRecorderT' a s; return (f a',s')
+  fmap = liftM
 
 instance Monad m => Applicative (RecorderT m) where
   (<*>) = ap
@@ -154,27 +151,20 @@
 -- Helper methods for RecorderT
 -- | The recorder state. Use this together with 'replay', 'replayM' or 'replay_'.
 newtype Replayable = Replayable [String]
-instance Show Replayable where show r = show ((\(Replayable x) -> length x) r) ++ ":" ++ show (replay r)
-
--- | Replay a recorder state inside a 'Monad'.
-replayM :: Monad m => m Replayable -> m String
-replayM r = do (Replayable r') <- r; return (concat $ reverse r')
+instance Show Replayable where
+  show r = show ((\(Replayable x) -> length x) r) ++ ":" ++ show (replay r)
 
 -- | Replay a recorder state in a pure context.
 replay :: Replayable -> String
 replay (Replayable r) = concat $ reverse r
 
--- | Replay the current recorder state without leaving the recorder.
-replay_ :: Monad m => RecorderT m String
-replay_ = Recorder $ \s -> return (concat $ reverse s,s)
-
 -- | Run 'Recorder' and also return its state.
 runRecorder :: Recorder a -> (a,Replayable)
-runRecorder = second Replayable . runIdentity . flip runRecorderT' []
+runRecorder = second Replayable . runIdentity . runRecorderT'
 
 -- | Run 'RecorderT' and also return its state.
 runRecorderT :: (Functor m,Monad m) => RecorderT m a -> m (a,Replayable)
-runRecorderT = fmap (second Replayable) . flip runRecorderT' []
+runRecorderT = fmap (second Replayable) . runRecorderT'
 
 -- | Line-terminating alternative to 'mprint'
 mprintLn :: ChPrinter m => String -> m ()
diff --git a/Text/Chatty/Scanner.hs b/Text/Chatty/Scanner.hs
--- a/Text/Chatty/Scanner.hs
+++ b/Text/Chatty/Scanner.hs
@@ -125,29 +125,29 @@
 
 -- Definition of InRedirT + instances
 -- | InRedirT redirects all input to a given handle (much like <filename in the shell)
-newtype InRedirT m a = InRedir { runInRedirT' :: Handle -> m (a,Handle) }
+newtype InRedirT m a = InRedir { runInRedirT :: Handle -> m a }
 -- | InRedirT on an IO monad
 type InRedir = InRedirT (HandleCloserT IO)
 
 instance Monad m => Monad (InRedirT m) where
-  return a = InRedir $ \h -> return (a,h)
-  (InRedir r) >>= f = InRedir $ \h -> do (a,h') <- r h; runInRedirT' (f a) h'
+  return a = InRedir $ \h -> return a
+  (InRedir r) >>= f = InRedir $ \h -> do a <- r h; runInRedirT (f a) h
 
 instance MonadTrans InRedirT where
-  lift m = InRedir $ \h -> do a <- m; return (a,h)
+  lift m = InRedir $ \h -> do a <- m; return a
 
 instance MonadIO m => MonadIO (InRedirT m) where
   liftIO = lift . liftIO
 
 instance MonadIO m => ChScanner (InRedirT m) where
-  mscan1 = InRedir $ \h -> do c <- liftIO $ hGetChar h; return (c,h)
-  mscanL = InRedir $ \h -> do s <- liftIO $ hGetContents h; return (s,h)
-  mscannable = InRedir $ \h -> do b <- liftIO $ hIsEOF h; return (b,h)
-  mscanh = InRedir $ \h -> return (Just h,h)
-  mready = InRedir $ \h -> do r <- liftIO $ hReady h; return (r,h)
+  mscan1 = InRedir $ \h -> do c <- liftIO $ hGetChar h; return c
+  mscanL = InRedir $ \h -> do s <- liftIO $ hGetContents h; return s
+  mscannable = InRedir $ \h -> do b <- liftIO $ hIsEOF h; return b
+  mscanh = InRedir $ \h -> return (Just h)
+  mready = InRedir $ \h -> do r <- liftIO $ hReady h; return r
 
 instance Monad m => Functor (InRedirT m) where
-  fmap f a = InRedir $ \h -> do (a',h') <- runInRedirT' a h; return (f a',h')
+  fmap f a = InRedir $ \h -> do a' <- runInRedirT a h; return (f a')
 
 instance Monad m => Applicative (InRedirT m) where
   (<*>) = ap
@@ -156,10 +156,6 @@
 instance ChFinalizer m => ChFinalizer (InRedirT m) where
   mqfh = lift . mqfh
   mfin = lift mfin
-
--- | Run InRedirT with handle
-runInRedirT :: Functor m => InRedirT m a -> Handle -> m a
-runInRedirT m h = fmap fst $ runInRedirT' m h
 
 -- | Run InRedir with handle
 runInRedir :: InRedir a -> Handle -> IO a
diff --git a/chatty.cabal b/chatty.cabal
--- a/chatty.cabal
+++ b/chatty.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.6.4.1
+version:             0.7.0.0
 
 -- A short (one-line) description of the package.
 synopsis:            Some monad transformers and typeclasses for abstraction of global dependencies.
@@ -60,7 +60,19 @@
   other-extensions:    ExistentialQuantification, RankNTypes, Rank2Types, FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies, TemplateHaskell, QuasiQuotes, UndecidableInstances
   
   -- Other library packages from which modules are imported.
-  build-depends:       base >=4.7 && <4.9, transformers >=0.3 && <0.5, directory >=1.2 && <1.3, process >=1.1 && <1.3, mtl >=2.1 && <2.3, template-haskell >=2.8 && <2.11, setenv >= 0.1 && <0.2, unix >= 2.6 && < 2.8, random >= 1.0 && < 1.1, time >= 1.4 && < 1.6, ansi-terminal >= 0.6 && <0.8, chatty-utils >= 0.7.1 && <0.8, text >=1.1 && <1.4
+  build-depends:       base >=4.7 && <4.9,
+                       transformers,
+                       directory,
+                       process,
+                       mtl,
+                       template-haskell,
+                       setenv,
+                       unix,
+                       random,
+                       time >= 1.4,
+                       ansi-terminal >= 0.6,
+                       chatty-utils >= 0.7.1,
+                       text
   
   -- Directories containing source files.
   -- hs-source-dirs:      
