diff --git a/operational-extra.cabal b/operational-extra.cabal
--- a/operational-extra.cabal
+++ b/operational-extra.cabal
@@ -1,5 +1,5 @@
 name:                operational-extra
-version:             0.3
+version:             0.4
 synopsis:            Interpretation functions and simple instruction sets for operational
 description:         Please see README.md
 homepage:            http://github.com/andrewthad/vinyl-ecosystem
@@ -19,6 +19,7 @@
                        Control.Monad.Operational.Exception
                        Control.Monad.Operational.Now
                        Control.Monad.Operational.Console
+                       Control.Monad.Operational.Console.Text
   build-depends:       base >= 4.7 && < 5
                      , operational  >= 0.2.3.2
                      , time         >= 1.4
diff --git a/src/Control/Monad/Operational/Console.hs b/src/Control/Monad/Operational/Console.hs
--- a/src/Control/Monad/Operational/Console.hs
+++ b/src/Control/Monad/Operational/Console.hs
@@ -20,6 +20,17 @@
 put :: content -> ProgramT (ConsoleI content) m ()
 put = singleton . PutI
 
+getRetry :: Monad m => (content -> content) -> (content -> Maybe a) -> ProgramT (ConsoleI content) m a
+getRetry = go 
+  where 
+  go failureMessage parse = do
+    content <- get
+    case parse content of
+      Nothing -> do
+        put (failureMessage content)
+        go failureMessage parse
+      Just a -> return a
+
 interpretConsoleStringIO :: ConsoleI String a -> IO a
 interpretConsoleStringIO instr = case instr of
   PutI content -> putStrLn content
diff --git a/src/Control/Monad/Operational/Console/Text.hs b/src/Control/Monad/Operational/Console/Text.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Operational/Console/Text.hs
@@ -0,0 +1,16 @@
+module Control.Monad.Operational.Console.Text where
+
+import           Control.Monad.Operational (ProgramT)
+import           Control.Monad.Operational.Console (ConsoleI(..))
+import           Data.Text (Text)
+import qualified Control.Monad.Operational.Console as Console
+
+get :: ProgramT (ConsoleI Text) m Text
+get = Console.get
+
+put :: Text -> ProgramT (ConsoleI Text) m ()
+put = Console.put
+
+getRetry :: Monad m => (Text -> Text) -> (Text -> Maybe a) -> ProgramT (ConsoleI Text) m a
+getRetry = Console.getRetry
+
diff --git a/src/Control/Monad/Operational/Interpret.hs b/src/Control/Monad/Operational/Interpret.hs
--- a/src/Control/Monad/Operational/Interpret.hs
+++ b/src/Control/Monad/Operational/Interpret.hs
@@ -5,7 +5,8 @@
 import           Control.Monad.Operational
 import           Control.Monad.Trans.Class
 
-data Around m instr = Around (forall a. instr a -> (m (), a -> m ()))
+data Around     m instr = Around     { getAround :: forall a. instr a -> (m (), a -> m ()) }
+data ApplyInstr m instr = ApplyInstr { getApplyInstr :: forall a. instr a -> m a }
 
 instance Applicative m => Monoid (Around m instr) where
   mempty = Around (\_ -> (pure (), \_ -> pure ()))
diff --git a/src/Control/Monad/Operational/Now.hs b/src/Control/Monad/Operational/Now.hs
--- a/src/Control/Monad/Operational/Now.hs
+++ b/src/Control/Monad/Operational/Now.hs
@@ -1,6 +1,7 @@
 module Control.Monad.Operational.Now where
 
 import           Control.Monad.Operational
+import           Control.Monad.Operational.Interpret
 import           Data.IORef                (IORef, newIORef, readIORef,
                                             writeIORef)
 import           Data.Time                 (NominalDiffTime, UTCTime,
@@ -12,13 +13,13 @@
 interpretNow :: NowI a -> IO a
 interpretNow NowI = getCurrentTime
 
-interpretNowMoving :: UTCTime -> NominalDiffTime -> IO (NowI a -> IO a)
+interpretNowMoving :: UTCTime -> NominalDiffTime -> IO (ApplyInstr IO NowI)
 interpretNowMoving start interval = do
   timeRef <- newIORef start
   return (interpretNowMoving' timeRef interval)
 
-interpretNowMoving' :: IORef UTCTime -> NominalDiffTime -> NowI a -> IO a
-interpretNowMoving' timeRef interval NowI = do
+interpretNowMoving' :: IORef UTCTime -> NominalDiffTime -> ApplyInstr IO NowI
+interpretNowMoving' timeRef interval = ApplyInstr $ \NowI -> do
   time <- readIORef timeRef
   writeIORef timeRef (addUTCTime interval time)
   return time
