diff --git a/Text/Chatty/Channel/Broadcast.hs b/Text/Chatty/Channel/Broadcast.hs
--- a/Text/Chatty/Channel/Broadcast.hs
+++ b/Text/Chatty/Channel/Broadcast.hs
@@ -32,7 +32,7 @@
 
 -- | Typeclass for all channel printers that may broadcast to all channels that fulfill a condition.
 class ChannelPrinter c m => Broadcaster c m where
-    -- | Print the string to all channels that fulfill the current condition.
+  -- | Print the string to all channels that fulfill the current condition.
   bprint :: (c -> m Bool) -> String -> m ()
 
 -- | Typeclass for all broadcaster that may embrace sections
diff --git a/Text/Chatty/Channel/Printer.hs b/Text/Chatty/Channel/Printer.hs
--- a/Text/Chatty/Channel/Printer.hs
+++ b/Text/Chatty/Channel/Printer.hs
@@ -116,6 +116,7 @@
 
 instance (Eq c,MonadPrinter m) => MonadPrinter (FilterT c m) where
   mprint str = Filter $ \(c,c1:cx) -> if c == c1 then mprint str >> return ((),c1:cx) else return ((),c1:cx)
+  mnomask str = Filter $ \(c,c1:cx) -> if c == c1 then mnomask str >> return ((),c1:cx) else return ((),c1:cx)
 
 instance (Eq c,MonadPrinter m) => ChannelPrinter c (FilterT c m) where
   cbracket c m = Filter $ \(cf,cx) -> do
@@ -148,6 +149,7 @@
 
 instance MonadPrinter m => MonadPrinter (JoinerT m) where
   mprint = lift . mprint
+  mnomask = lift . mnomask
 
 instance (Eq c,MonadPrinter m) => ChannelPrinter c (JoinerT m) where
   cstart _ = return ()
diff --git a/Text/Chatty/Extended/ANSI.hs b/Text/Chatty/Extended/ANSI.hs
--- a/Text/Chatty/Extended/ANSI.hs
+++ b/Text/Chatty/Extended/ANSI.hs
@@ -23,10 +23,12 @@
 module Text.Chatty.Extended.ANSI where
 
 import qualified System.Console.ANSI as A
+import Control.Monad
 import Control.Monad.Trans.Class
 import Control.Monad.IO.Class
 import Text.Chatty.Printer
 import Text.Chatty.Extended.Printer
+import Text.Chatty.Expansion
 
 -- | An ExtendedPrinter that uses ANSI colour codes.
 newtype AnsiPrinterT m a = AnsiPrinter { runAnsiPrinterT :: [Colour] -> m (a,[Colour]) }
@@ -48,6 +50,7 @@
   mprint = lift . mprint
   mnoecho = lift . mnoecho
   mflush = lift mflush
+  mnomask = lift . mnomask
 
 instance MonadPrinter m => ExtendedPrinter (AnsiPrinterT m) where
   estart c = AnsiPrinter $ \c1 -> do
@@ -61,6 +64,11 @@
       _ -> do
         mprint $ A.setSGRCode [A.Reset]
         return ((),[])
+
+instance (Functor m,MonadExpand m) => MonadExpand (AnsiPrinterT m) where
+  expand s = AnsiPrinter $ \cx -> do
+    s1 <- (expand =<<) $ liftM (replay.snd) $ runRecorderT $ liftM fst $ flip runAnsiPrinterT cx $ expandClr s
+    return (s1, cx)
 
 -- | Convert Chatty's colour intensity to ansi-terminal's one
 mkColourInt (Dull _) = A.Dull
diff --git a/Text/Chatty/Extended/HTML.hs b/Text/Chatty/Extended/HTML.hs
--- a/Text/Chatty/Extended/HTML.hs
+++ b/Text/Chatty/Extended/HTML.hs
@@ -23,7 +23,9 @@
 module Text.Chatty.Extended.HTML where
 
 import Text.Chatty.Printer
+import Text.Chatty.Expansion
 import Text.Chatty.Extended.Printer
+import Control.Monad
 import Control.Monad.Trans.Class
 import Control.Monad.IO.Class
 
@@ -47,10 +49,14 @@
   mprint = lift . mprint . concatMap maskHtml
   mnoecho = lift . mnoecho . concatMap maskHtml
   mflush = lift mflush
+  mnomask = lift . mnomask
 
 instance MonadPrinter m => ExtendedPrinter (HtmlPrinterT m) where
   estart c =  lift $ mprint $ concat ["<span style=\"color: #", hexColour c, ";\">"]
   efin = lift $ mprint "</span>"
+
+instance (Functor m,MonadExpand m) => MonadExpand (HtmlPrinterT m) where
+  expand = lift . expand <=< liftM (replay.snd) . runRecorderT . runHtmlPrinterT . expandClr
 
 -- | Convert the given character to its HTML representation.
 maskHtml :: Char -> String
diff --git a/Text/Chatty/Extended/Printer.hs b/Text/Chatty/Extended/Printer.hs
--- a/Text/Chatty/Extended/Printer.hs
+++ b/Text/Chatty/Extended/Printer.hs
@@ -20,7 +20,7 @@
 -}
 
 -- | Provides an extended printer class that supports colours.
-module Text.Chatty.Extended.Printer where
+module Text.Chatty.Extended.Printer (ExtendedPrinter(..),Tone(..),Colour(..),expandClr) where
 
 import Text.Chatty.Printer
 
@@ -45,3 +45,32 @@
   -- | Reset colour.
   efin :: m ()
 
+
+takeBrace 0 ('}':ss) = ""
+takeBrace n ('}':ss) = '}' : takeBrace (n-1) ss
+takeBrace n ('{':ss) = '{' : takeBrace (n+1) ss
+takeBrace n (s:ss) = s : takeBrace n ss
+
+splitBrace ss = let nm = takeBrace 0 ss in (nm, drop (length nm + 1) ss)
+
+procClr c ss = let (nm,rm) = splitBrace ss in ebracket c (expandClr nm) >> expandClr rm
+
+expandClr :: ExtendedPrinter m => String -> m ()
+expandClr ('%':'{':'V':'0':';':ss) = procClr (Vivid Black) ss
+expandClr ('%':'{':'V':'1':';':ss) = procClr (Vivid Red) ss
+expandClr ('%':'{':'V':'2':';':ss) = procClr (Vivid Green) ss
+expandClr ('%':'{':'V':'3':';':ss) = procClr (Vivid Yellow) ss
+expandClr ('%':'{':'V':'4':';':ss) = procClr (Vivid Blue) ss
+expandClr ('%':'{':'V':'5':';':ss) = procClr (Vivid Magenta) ss
+expandClr ('%':'{':'V':'6':';':ss) = procClr (Vivid Cyan) ss
+expandClr ('%':'{':'V':'7':';':ss) = procClr (Vivid White) ss
+expandClr ('%':'{':'D':'0':';':ss) = procClr (Dull Black) ss
+expandClr ('%':'{':'D':'1':';':ss) = procClr (Dull Red) ss
+expandClr ('%':'{':'D':'2':';':ss) = procClr (Dull Green) ss
+expandClr ('%':'{':'D':'3':';':ss) = procClr (Dull Yellow) ss
+expandClr ('%':'{':'D':'4':';':ss) = procClr (Dull Blue) ss
+expandClr ('%':'{':'D':'5':';':ss) = procClr (Dull Magenta) ss
+expandClr ('%':'{':'D':'6':';':ss) = procClr (Dull Cyan) ss
+expandClr ('%':'{':'D':'7':';':ss) = procClr (Dull White) ss
+expandClr (s:ss) = mprint [s] >> expandClr ss
+expandClr [] = return ()
diff --git a/Text/Chatty/Interactor.hs b/Text/Chatty/Interactor.hs
--- a/Text/Chatty/Interactor.hs
+++ b/Text/Chatty/Interactor.hs
@@ -51,8 +51,8 @@
 mkInteractor ''QuietT mkPrinter mkExtendedPrinter mkExpander mkExpanderEnv mkHistoryEnv mkSpawn mkRandom mkClock mkDefCP
 mkInteractor ''InRedirT mkPrinter mkExtendedPrinter mkExpander mkExpanderEnv mkHistoryEnv mkSpawn mkRandom mkClock mkDefCP
 mkInteractor ''SpawnOverlayT mkPrinter mkExtendedPrinter mkScanner mkExpander mkExpanderEnv mkHistoryEnv mkFinalizer mkRandom mkClock mkDefCP
-mkInteractor ''HtmlPrinterT mkScanner mkExpander mkExpanderEnv mkHistoryEnv mkFinalizer mkSpawn mkRandom mkClock mkDefCP
-mkInteractor ''AnsiPrinterT mkScanner mkExpander mkExpanderEnv mkHistoryEnv mkFinalizer mkSpawn mkRandom mkClock mkDefCP
+mkInteractor ''HtmlPrinterT mkScanner mkExpanderEnv mkHistoryEnv mkFinalizer mkSpawn mkRandom mkClock mkDefCP
+mkInteractor ''AnsiPrinterT mkScanner mkExpanderEnv mkHistoryEnv mkFinalizer mkSpawn mkRandom mkClock mkDefCP
 mkInteractor ''NullExpanderT mkScanner mkPrinter mkExtendedPrinter mkFinalizer mkSpawn mkRandom mkClock mkDefCP
 mkInteractor ''HistoryT  mkScanner mkPrinter mkExtendedPrinter mkFinalizer mkSpawn mkRandom mkClock mkExpanderEnv mkDefCP
 mkInteractor ''IntArchiverT mkArchiver
diff --git a/Text/Chatty/Interactor/Templates.hs b/Text/Chatty/Interactor/Templates.hs
--- a/Text/Chatty/Interactor/Templates.hs
+++ b/Text/Chatty/Interactor/Templates.hs
@@ -60,6 +60,7 @@
       mprint = lift . mprint
       mnoecho = lift . mnoecho
       mflush = lift mflush
+      mnomask = lift . mnomask
   |]
   where sx = strToType s
 
diff --git a/Text/Chatty/Printer.hs b/Text/Chatty/Printer.hs
--- a/Text/Chatty/Printer.hs
+++ b/Text/Chatty/Printer.hs
@@ -40,6 +40,9 @@
   -- | Flush the buffer.
   mflush :: m ()
   mflush = return ()
+  -- | Alternative to mprint that does not mask any characters (depends on the carrier).
+  mnomask :: String -> m ()
+  mnomask = mprint
 
 instance MonadPrinter IO where
   mprint = putStr
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.5.1.1
+version:             0.5.3.1
 
 -- A short (one-line) description of the package.
 synopsis:            Some monad transformers and typeclasses to simplify I/O on a transformer stack.
