diff --git a/Debug/Vampire.hs b/Debug/Vampire.hs
--- a/Debug/Vampire.hs
+++ b/Debug/Vampire.hs
@@ -1,5 +1,5 @@
-module Debug.Vampire (structFor, toGraph, viewExpr, rewriteFile) where
+module Debug.Vampire (structFor, valueFor, toGraph, viewExpr, rewriteFile, wrapExp) where
 
-import Debug.Vampire.Visualize
+import Debug.Vampire.Analyze
 import Debug.Vampire.Rewrite
 
diff --git a/Debug/Vampire/Analyze.hs b/Debug/Vampire/Analyze.hs
new file mode 100644
--- /dev/null
+++ b/Debug/Vampire/Analyze.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE ImplicitParams, RankNTypes #-}
+
+module Debug.Vampire.Analyze (structFor, valueFor, toGraph, viewExpr) where
+
+import Debug.Vampire.Data
+import Debug.Vampire.Trace
+import Control.DeepSeq
+import Data.IORef
+import Data.Graph.Inductive
+import Data.GraphViz hiding (parse)
+
+-- imports for copypasted func
+import Data.DList (singleton, fromList, toList)
+import Control.Arrow
+import Control.Monad.RWS
+
+instance Labellable () where
+  toLabelValue = const (toLabelValue "")
+
+structFor :: (Show a, NFData a) => ((?vCtx::IORef ExprStruct') => () -> a) -> IO ExprStruct
+structFor d = do
+  let struct' = (let ?vCtx = vNewExprStruct "toplevel" in d () `deepseq` ?vCtx)
+  struct <- readIORef struct' >>= resolve
+  return $ case children struct of
+    full:_ -> full
+    []     -> ExprStruct "" Nothing []
+
+valueFor :: (Show a, NFData a) => ((?vCtx::IORef ExprStruct') => () -> a) -> a
+valueFor d = let ?vCtx = vNewExprStruct "toplevel" in d ()
+
+labelFor :: ExprStruct -> String
+labelFor (ExprStruct expr (Just val) _) = expr ++ " = " ++ val
+labelFor (ExprStruct expr Nothing _) = expr ++ " = Unevaluated"
+
+-- copypasted from SO, credit: http://stackoverflow.com/a/14621912
+toGraph :: ExprStruct -> Gr String ()
+toGraph t = uncurry mkGraph . (toList *** toList) . snd $ evalRWS (go t) () [1..]
+  where go e@(ExprStruct _ _ ns) = do
+          i <- state $ head &&& tail
+          es <- forM ns $ go >=> \j -> return (i, j, ())
+          tell (singleton (i, labelFor e), fromList es)
+          return i
+
+viewExpr :: (Show a, NFData a) => ((?vCtx::IORef ExprStruct') => () -> a) -> IO ()
+viewExpr = structFor >=> preview . toGraph
+
diff --git a/Debug/Vampire/Data.hs b/Debug/Vampire/Data.hs
--- a/Debug/Vampire/Data.hs
+++ b/Debug/Vampire/Data.hs
@@ -4,13 +4,13 @@
 import Data.Functor
 
 data ExprStruct =
-  ExprStruct {expr' :: String,
-              value' :: Maybe String,
-              children' :: [ExprStruct]} deriving Show
-data ExprStruct' =
-  ExprStruct' {expr :: String,
+  ExprStruct {expr :: String,
               value :: Maybe String,
-              children :: [IORef ExprStruct']}
+              children :: [ExprStruct]} deriving Show
+data ExprStruct' =
+  ExprStruct' {expr' :: String,
+              value' :: Maybe String,
+              children' :: [IORef ExprStruct']}
 
 resolve :: ExprStruct' -> IO ExprStruct
 resolve (ExprStruct' expr value children) =
diff --git a/Debug/Vampire/Rewrite.hs b/Debug/Vampire/Rewrite.hs
--- a/Debug/Vampire/Rewrite.hs
+++ b/Debug/Vampire/Rewrite.hs
@@ -1,4 +1,4 @@
-module Debug.Vampire.Rewrite (rewriteFile) where
+module Debug.Vampire.Rewrite (rewriteFile, wrapExp) where
 
 import Language.Haskell.Exts
 import Data.Generics.Uniplate.Data (descend, descendBi)
@@ -25,4 +25,12 @@
       result = (let ?ctx = resultStruct in [splice expr in])
   in (log ?ctx result resultStruct) `seq` result
 -}
+
+wrapExp' :: String -> Exp -> Exp
+wrapExp' wrapper exp = App (Var (UnQual (Ident wrapper))) (Paren (Lambda (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 11}) [PWildCard] exp))
+
+wrapExp :: String -> String -> Maybe String
+wrapExp wrapper code = case parseExp code of
+  ParseOk exp -> Just $ prettyPrint $ wrapExp' wrapper exp
+  _           -> Nothing
 
diff --git a/Debug/Vampire/Trace.hs b/Debug/Vampire/Trace.hs
--- a/Debug/Vampire/Trace.hs
+++ b/Debug/Vampire/Trace.hs
@@ -9,14 +9,14 @@
 
 vNewExprStruct :: String -> IORef ExprStruct'
 vNewExprStruct expr =
-  unsafePerformIO $ newIORef ExprStruct' {expr = expr, value = Nothing, children = []}
+  unsafePerformIO $ newIORef ExprStruct' {expr' = expr, value' = Nothing, children' = []}
 
 {-# NOINLINE vNewExprStruct #-}
 
 vLog :: Show a => IORef ExprStruct' -> a -> IORef ExprStruct' -> a
 vLog parent result current = unsafePerformIO $ do
-  modifyIORef' current $ \s -> s {value = Just (show result)}
-  modifyIORef' parent  $ \s@ExprStruct' {children = c} -> s {children = current:c}
+  modifyIORef' current $ \s -> s {value' = Just (show result)}
+  modifyIORef' parent  $ \s@ExprStruct' {children' = c} -> s {children' = current:c}
   return result
 
 {-# NOINLINE vLog #-}
diff --git a/Debug/Vampire/Visualize.hs b/Debug/Vampire/Visualize.hs
deleted file mode 100644
--- a/Debug/Vampire/Visualize.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-{-# LANGUAGE ImplicitParams, RankNTypes #-}
-
-module Debug.Vampire.Visualize (structFor, toGraph, viewExpr) where
-
-import Debug.Vampire.Data
-import Debug.Vampire.Trace
-import Control.DeepSeq
-import Data.IORef
-import Data.Graph.Inductive
-import Data.GraphViz hiding (parse)
-
--- imports for copypasted func
-import Data.DList (singleton, fromList, toList)
-import Control.Arrow
-import Control.Monad.RWS
-
-instance Labellable () where
-  toLabelValue = const (toLabelValue "")
-
-structFor :: (Show a, NFData a) => ((?vCtx::IORef ExprStruct') => () -> a) -> IO ExprStruct
-structFor d = do
-  let struct = (let ?vCtx = vNewExprStruct "toplevel" in d () `deepseq` ?vCtx)
-  struct' <- readIORef struct >>= resolve
-  return $ case children' struct' of
-    full:_ -> full
-    []     -> ExprStruct "" Nothing []
-
-labelFor :: ExprStruct -> String
-labelFor (ExprStruct expr (Just val) _) = expr ++ " = " ++ val
-labelFor (ExprStruct expr Nothing _) = expr ++ " = Unevaluated"
-
--- copypasted from SO, credit: http://stackoverflow.com/a/14621912
-toGraph :: ExprStruct -> Gr String ()
-toGraph t = uncurry mkGraph . (toList *** toList) . snd $ evalRWS (go t) () [1..]
-  where go e@(ExprStruct _ _ ns) = do
-          i <- state $ head &&& tail
-          es <- forM ns $ go >=> \j -> return (i, j, ())
-          tell (singleton (i, labelFor e), fromList es)
-          return i
-
-viewExpr :: (Show a, NFData a) => ((?vCtx::IORef ExprStruct') => () -> a) -> IO ()
-viewExpr = structFor >=> preview . toGraph
-
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -4,7 +4,11 @@
 import Options.Applicative
 import Control.Applicative
 import Control.Monad
+import System.Directory
+import System.IO
+import System.Process
 import System.Exit
+import Paths_vampire
 
 readFrom "-"  = getContents
 readFrom file = readFile file
@@ -18,6 +22,18 @@
     Just newCode -> writeTo dest newCode
     Nothing      -> putStrLn "could not parse input" >> exitFailure
 
+doREPL :: String -> IO ()
+doREPL mod = do
+  script <- getDataFileName "vampire-repl"
+  () <$ rawSystem "ghci" [mod, "-ghci-script", script]
+
+doRewriteREPL :: String -> IO ()
+doRewriteREPL src = do
+  (dest, h) <- getTemporaryDirectory >>= flip openTempFile "Drained.hs"
+  hClose h
+  doRewrite src dest
+  doREPL dest
+
 -- parsers!
 
 rewrite =
@@ -25,9 +41,21 @@
     (argument str $ metavar "SOURCE")
     (argument str $ metavar "DEST" <> value "-" <> showDefault)
 rewriteDesc = "Rewrite a Haskell source file to add Vampire tracing."
+repl =
+  fmap doREPL
+    (argument str $ metavar "MODULE")
+replDesc = "Open a GHCi with a few custom commands onto a rewritten module."
+reREPL =
+  fmap doRewriteREPL
+    (argument str $ metavar "SOURCE")
+reREPLDesc =
+  "Rewrite a Haskell source file to add Vampire tracing, then " ++
+  "open a GHCi with a few custom commands onto the rewritten module."
  
 vampire = subparser $
-  (command "rewrite" $ info rewrite $ progDesc rewriteDesc)
+  (command "rewrite" $ info rewrite $ progDesc rewriteDesc) <>
+  (command "repl"    $ info repl    $ progDesc replDesc)    <>
+  (command "rerepl"  $ info reREPL  $ progDesc reREPLDesc)
 
 main = join $ execParser $
   info (helper <*> vampire)
diff --git a/data/vampire-repl b/data/vampire-repl
new file mode 100644
--- /dev/null
+++ b/data/vampire-repl
@@ -0,0 +1,4 @@
+import Debug.Vampire
+:def vview maybe (putStrLn "could not parse input" >> return "") return . wrapExp "viewExpr"
+:def veval maybe (putStrLn "could not parse input" >> return "") return . wrapExp "valueFor"
+
diff --git a/vampire.cabal b/vampire.cabal
--- a/vampire.cabal
+++ b/vampire.cabal
@@ -1,22 +1,22 @@
--- Initial vampire.cabal generated by cabal init.  For further 
+-- Initial vampire.cabal generated by cabal init.  For further
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 -- The name of the package.
 name:                vampire
 
--- The package version.  See the Haskell package versioning policy (PVP) 
+-- The package version.  See the Haskell package versioning policy (PVP)
 -- for standards guiding when and how versions should be incremented.
 -- http://www.haskell.org/haskellwiki/Package_versioning_policy
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.1.1.0
+version:             0.1.2.0
 
 -- A short (one-line) description of the package.
 synopsis:            Analyze and visualize expression trees.
 
 -- A longer description of the package.
--- description:         
+-- description:
 
 -- URL for the project homepage or repository.
 homepage:            https://github.com/benzrf/vampire
@@ -30,24 +30,27 @@
 -- The package author(s).
 author:              benzrf
 
--- An email address to which users can send suggestions, bug reports, and 
+-- An email address to which users can send suggestions, bug reports, and
 -- patches.
 maintainer:          benzrf@benzrf.com
 
 -- A copyright notice.
--- copyright:           
+-- copyright:
 
 category:            Development
 
 build-type:          Simple
 
--- Extra files to be distributed with the package, such as examples or a 
+-- Extra files to be distributed with the package, such as examples or a
 -- README.
--- extra-source-files:  
+-- extra-source-files:
 
 -- Constraint on the version of Cabal needed to build this package.
 cabal-version:       >=1.10
 
+data-dir:            data
+data-files:          vampire-repl
+
 library
   exposed-modules:
     Debug.Vampire
@@ -56,7 +59,7 @@
   other-modules:
     Debug.Vampire.Data
     Debug.Vampire.Rewrite
-    Debug.Vampire.Visualize
+    Debug.Vampire.Analyze
 
   build-depends:
     base >=4.6 && <4.7,
@@ -66,21 +69,20 @@
     fgl,
     mtl,
     dlist,
-    graphviz,
-    optparse-applicative
+    graphviz
 
   default-language:    Haskell2010
 
 executable vampire
   -- .hs or .lhs file containing the Main module.
   main-is:             Main.hs
-  
+
   -- Modules included in this executable, other than Main.
-  -- other-modules:       
-  
+  -- other-modules:
+
   -- LANGUAGE extensions used by modules in this package.
-  -- other-extensions:    
-  
+  -- other-extensions:
+
   -- Other library packages from which modules are imported.
   build-depends:
     base >=4.6 && <4.7,
@@ -91,11 +93,13 @@
     mtl,
     dlist,
     graphviz,
+    directory,
+    process,
     optparse-applicative
-  
+
   -- Directories containing source files.
-  -- hs-source-dirs:      
-  
+  -- hs-source-dirs:
+
   -- Base language which the package is written in.
   default-language:    Haskell2010
 
