diff --git a/doctest.cabal b/doctest.cabal
--- a/doctest.cabal
+++ b/doctest.cabal
@@ -1,5 +1,5 @@
 name:             doctest
-version:          0.12.0
+version:          0.13.0
 synopsis:         Test interactive Haskell examples
 description:      The doctest program checks examples in source code comments.
                   It is modeled after doctest for Python
diff --git a/src/Options.hs b/src/Options.hs
--- a/src/Options.hs
+++ b/src/Options.hs
@@ -3,6 +3,9 @@
 module Options (
   Result(..)
 , Run(..)
+, defaultMagic
+, defaultFastMode
+, defaultPreserveIt
 , parseOptions
 #ifdef TEST
 , usage
@@ -25,16 +28,17 @@
 usage :: String
 usage = unlines [
     "Usage:"
-  , "  doctest [ --fast | --no-magic | GHC OPTION | MODULE ]..."
+  , "  doctest [ --fast | --preserve-it | --no-magic | GHC OPTION | MODULE ]..."
   , "  doctest --help"
   , "  doctest --version"
   , "  doctest --info"
   , ""
   , "Options:"
-  , "  --fast     disable :reload between example groups"
-  , "  --help     display this help and exit"
-  , "  --version  output version information and exit"
-  , "  --info     output machine-readable version information and exit"
+  , "  --fast         disable :reload between example groups"
+  , "  --preserve-it  preserve the `it` variable between examples"
+  , "  --help         display this help and exit"
+  , "  --version      output version information and exit"
+  , "  --info         output machine-readable version information and exit"
   ]
 
 version :: String
@@ -67,22 +71,38 @@
 , runOptions :: [String]
 , runMagicMode :: Bool
 , runFastMode :: Bool
+, runPreserveIt :: Bool
 } deriving (Eq, Show)
 
+defaultMagic :: Bool
+defaultMagic = True
+
+defaultFastMode :: Bool
+defaultFastMode = False
+
+defaultPreserveIt :: Bool
+defaultPreserveIt = False
+
 parseOptions :: [String] -> Result Run
 parseOptions args
   | "--help" `elem` args = Output usage
   | "--info" `elem` args = Output info
   | "--version" `elem` args = Output versionInfo
-  | otherwise = case fmap stripOptGhc . stripFast <$> stripNoMagic args of
-      (magicMode, (fastMode, (warning, xs))) ->
-        Result (Run (maybeToList warning) xs magicMode fastMode)
+  | otherwise = case  fmap (fmap stripOptGhc)
+                   .  fmap stripPreserveIt
+                   .  stripFast
+                  <$> stripNoMagic args of
+      (magicMode, (fastMode, (preserveIt, (warning, xs)))) ->
+        Result (Run (maybeToList warning) xs magicMode fastMode preserveIt)
 
 stripNoMagic :: [String] -> (Bool, [String])
-stripNoMagic = stripFlag False "--no-magic"
+stripNoMagic = stripFlag (not defaultMagic) "--no-magic"
 
 stripFast :: [String] -> (Bool, [String])
-stripFast = stripFlag True  "--fast"
+stripFast = stripFlag (not defaultFastMode) "--fast"
+
+stripPreserveIt :: [String] -> (Bool, [String])
+stripPreserveIt = stripFlag (not defaultPreserveIt) "--preserve-it"
 
 stripFlag :: Bool -> String -> [String] -> (Bool, [String])
 stripFlag enableIt flag args = ((flag `elem` args) == enableIt, filter (/= flag) args)
diff --git a/src/Run.hs b/src/Run.hs
--- a/src/Run.hs
+++ b/src/Run.hs
@@ -2,7 +2,7 @@
 module Run (
   doctest
 #ifdef TEST
-, doctestWithFastMode
+, doctestWithOptions
 , Summary
 , expandDirs
 #endif
@@ -43,7 +43,7 @@
 doctest :: [String] -> IO ()
 doctest args0 = case parseOptions args0 of
   Output s -> putStr s
-  Result (Run warnings args_ magicMode fastMode) -> do
+  Result (Run warnings args_ magicMode fastMode preserveIt) -> do
     mapM_ (hPutStrLn stderr) warnings
     hFlush stderr
 
@@ -60,7 +60,7 @@
         addDistArgs <- getAddDistArgs
         return (addDistArgs $ packageDBArgs ++ expandedArgs)
 
-    r <- doctestWithFastMode fastMode args `E.catch` \e -> do
+    r <- doctestWithOptions fastMode preserveIt args `E.catch` \e -> do
       case fromException e of
         Just (UsageError err) -> do
           hPutStrLn stderr ("doctest: " ++ err)
@@ -123,11 +123,11 @@
 isSuccess :: Summary -> Bool
 isSuccess s = sErrors s == 0 && sFailures s == 0
 
-doctestWithFastMode :: Bool -> [String] -> IO Summary
-doctestWithFastMode fastMode args = do
+doctestWithOptions :: Bool -> Bool -> [String] -> IO Summary
+doctestWithOptions fastMode preserveIt args = do
 
   -- get examples from Haddock comments
   modules <- getDocTests args
 
   Interpreter.withInterpreter args $ \repl -> withCP65001 $ do
-    runModules fastMode repl modules
+    runModules fastMode preserveIt repl modules
diff --git a/src/Runner.hs b/src/Runner.hs
--- a/src/Runner.hs
+++ b/src/Runner.hs
@@ -52,11 +52,11 @@
   (Summary x1 x2 x3 x4) `mappend` (Summary y1 y2 y3 y4) = Summary (x1 + y1) (x2 + y2) (x3 + y3) (x4 + y4)
 
 -- | Run all examples from a list of modules.
-runModules :: Bool -> Interpreter -> [Module [Located DocTest]] -> IO Summary
-runModules fastMode repl modules = do
+runModules :: Bool -> Bool -> Interpreter -> [Module [Located DocTest]] -> IO Summary
+runModules fastMode preserveIt repl modules = do
   isInteractive <- hIsTerminalDevice stderr
   ReportState _ _ s <- (`execStateT` ReportState 0 isInteractive mempty {sExamples = c}) $ do
-    forM_ modules $ runModule fastMode repl
+    forM_ modules $ runModule fastMode preserveIt repl
 
     -- report final summary
     gets (show . reportStateSummary) >>= report
@@ -107,20 +107,20 @@
   liftIO (hPutStr stderr str)
 
 -- | Run all examples from given module.
-runModule :: Bool -> Interpreter -> Module [Located DocTest] -> Report ()
-runModule fastMode repl (Module module_ setup examples) = do
+runModule :: Bool -> Bool -> Interpreter -> Module [Located DocTest] -> Report ()
+runModule fastMode preserveIt repl (Module module_ setup examples) = do
 
   Summary _ _ e0 f0 <- gets reportStateSummary
 
   forM_ setup $
-    runTestGroup repl reload
+    runTestGroup preserveIt repl reload
 
   Summary _ _ e1 f1 <- gets reportStateSummary
 
   -- only run tests, if setup does not produce any errors/failures
   when (e0 == e1 && f0 == f1) $
     forM_ examples $
-      runTestGroup repl setup_
+      runTestGroup preserveIt repl setup_
   where
     reload :: IO ()
     reload = do
@@ -131,17 +131,18 @@
         void $ Interpreter.safeEval repl ":reload"
       void $ Interpreter.safeEval repl $ ":m *" ++ module_
 
-      -- Evaluate a dumb expression to populate the 'it' variable NOTE: This is
-      -- one reason why we cannot have safeEval = safeEvalIt: 'it' isn't set in
-      -- a fresh GHCi session.
-      void $ Interpreter.safeEval repl $ "()"
+      when preserveIt $
+        -- Evaluate a dumb expression to populate the 'it' variable NOTE: This is
+        -- one reason why we cannot have safeEval = safeEvalIt: 'it' isn't set in
+        -- a fresh GHCi session.
+        void $ Interpreter.safeEval repl $ "()"
 
     setup_ :: IO ()
     setup_ = do
       reload
       forM_ setup $ \l -> forM_ l $ \(Located _ x) -> case x of
         Property _  -> return ()
-        Example e _ -> void $ Interpreter.safeEvalIt repl e
+        Example e _ -> void $ safeEvalWith preserveIt repl e
 
 reportFailure :: Location -> Expression -> Report ()
 reportFailure loc expression = do
@@ -167,14 +168,14 @@
 --
 -- The interpreter state is zeroed with @:reload@ first.  This means that you
 -- can reuse the same 'Interpreter' for several test groups.
-runTestGroup :: Interpreter -> IO () -> [Located DocTest] -> Report ()
-runTestGroup repl setup tests = do
+runTestGroup :: Bool -> Interpreter -> IO () -> [Located DocTest] -> Report ()
+runTestGroup preserveIt repl setup tests = do
 
   -- report intermediate summary
   gets (show . reportStateSummary) >>= report_
 
   liftIO setup
-  runExampleGroup repl examples
+  runExampleGroup preserveIt repl examples
 
   forM_ properties $ \(loc, expression) -> do
     r <- liftIO $ do
@@ -197,11 +198,11 @@
 -- |
 -- Execute all expressions from given example in given 'Interpreter' and verify
 -- the output.
-runExampleGroup :: Interpreter -> [Located Interaction] -> Report ()
-runExampleGroup repl = go
+runExampleGroup :: Bool -> Interpreter -> [Located Interaction] -> Report ()
+runExampleGroup preserveIt repl = go
   where
     go ((Located loc (expression, expected)) : xs) = do
-      r <- fmap lines <$> liftIO (Interpreter.safeEvalIt repl expression)
+      r <- fmap lines <$> liftIO (safeEvalWith preserveIt repl expression)
       case r of
         Left err -> do
           reportError loc expression err
@@ -213,3 +214,8 @@
             reportSuccess
             go xs
     go [] = return ()
+
+safeEvalWith :: Bool -> Interpreter -> String -> IO (Either String String)
+safeEvalWith preserveIt
+  | preserveIt = Interpreter.safeEvalIt
+  | otherwise  = Interpreter.safeEval
