diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,13 @@
 Changes
 =======
 
+Version 1.2.2
+-------------
+
+* Expose timed and getTime
+* Add parseOptions
+* Allow to disable ANSI tricks with --ansi-tricks=false
+
 Version 1.2.1
 -------------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -756,10 +756,10 @@
 
 ## FAQ
 
-1.  When my tests write to stdout/stderr, the output is garbled. Why is that and
+1.  **Q**: When my tests write to stdout/stderr, the output is garbled. Why is that and
     what do I do?
 
-    It is not recommended that you print anything to the console when using the
+    **A**: It is not recommended that you print anything to the console when using the
     console test reporter (which is the default one).
     See [#103](https://github.com/feuerbach/tasty/issues/103) for the
     discussion.
@@ -769,6 +769,15 @@
     * Use [testCaseSteps](https://hackage.haskell.org/package/tasty-hunit/docs/Test-Tasty-HUnit.html#v:testCaseSteps) (for tasty-hunit only).
     * Use a test reporter that does not print to the console (like tasty-ant-xml).
     * Write your output to files instead.
+
+2.  **Q**: Why doesn't the `--hide-successes` option work properly? The test headings
+    show up and/or the output appears garbled.
+
+    **A**: This can happen sometimes when the terminal is narrower than the
+    output. A workaround is to disable ANSI tricks: pass `--ansi-tricks=false`
+    on the command line or set `TASTY_ANSI_TRICKS=false` in the environment.
+
+    See [issue #152](https://github.com/feuerbach/tasty/issues/152).
 
 ## Press
 
diff --git a/Test/Tasty/CmdLine.hs b/Test/Tasty/CmdLine.hs
--- a/Test/Tasty/CmdLine.hs
+++ b/Test/Tasty/CmdLine.hs
@@ -3,6 +3,7 @@
   ( optionParser
   , suiteOptions
   , suiteOptionParser
+  , parseOptions
   , defaultMainWithIngredients
   ) where
 
@@ -25,7 +26,6 @@
 import Test.Tasty.Options.Env
 import Test.Tasty.Runners.Reducers
 
-
 -- | Generate a command line parser from a list of option descriptions
 optionParser :: [OptionDescription] -> Parser OptionSet
 optionParser = getApp . foldMap toSet where
@@ -37,6 +37,25 @@
 suiteOptionParser :: [Ingredient] -> TestTree -> Parser OptionSet
 suiteOptionParser ins tree = optionParser $ suiteOptions ins tree
 
+-- | Parse the command-line and environment options passed to tasty.
+--
+-- Useful if you need to get the options before 'defaultMain' is called.
+--
+-- Once within the test tree, 'askOption' should be used instead.
+--
+-- The arguments to this function should be the same as for
+-- 'defaultMainWithIngredients'. If you don't use any custom ingredients,
+-- pass 'defaultIngredients'.
+parseOptions :: [Ingredient] -> TestTree -> IO OptionSet
+parseOptions ins tree = do
+  cmdlineOpts <- execParser $
+    info (helper <*> suiteOptionParser ins tree)
+    ( fullDesc <>
+      header "Mmm... tasty test suite"
+    )
+  envOpts <- suiteEnvOptions ins tree
+  return $ envOpts <> cmdlineOpts
+
 -- | Parse the command line arguments and run the tests using the provided
 -- ingredient list.
 --
@@ -46,15 +65,7 @@
 defaultMainWithIngredients :: [Ingredient] -> TestTree -> IO ()
 defaultMainWithIngredients ins testTree = do
   installSignalHandlers
-  cmdlineOpts <- execParser $
-    info (helper <*> suiteOptionParser ins testTree)
-    ( fullDesc <>
-      header "Mmm... tasty test suite"
-    )
-
-  envOpts <- suiteEnvOptions ins testTree
-
-  let opts = envOpts <> cmdlineOpts
+  opts <- parseOptions ins testTree
 
   case tryIngredients ins opts testTree of
     Nothing -> do
diff --git a/Test/Tasty/Ingredients/ConsoleReporter.hs b/Test/Tasty/Ingredients/ConsoleReporter.hs
--- a/Test/Tasty/Ingredients/ConsoleReporter.hs
+++ b/Test/Tasty/Ingredients/ConsoleReporter.hs
@@ -5,6 +5,7 @@
   ( consoleTestReporter
   , Quiet(..)
   , HideSuccesses(..)
+  , AnsiTricks(..)
   -- * Internals
   -- | The following functions and datatypes are internals that are exposed to
   -- simplify the task of rolling your own custom console reporter UI.
@@ -381,6 +382,7 @@
     [ Option (Proxy :: Proxy Quiet)
     , Option (Proxy :: Proxy HideSuccesses)
     , Option (Proxy :: Proxy UseColor)
+    , Option (Proxy :: Proxy AnsiTricks)
     ] $
   \opts tree -> Just $ \smap -> do
 
@@ -389,6 +391,7 @@
     Quiet quiet = lookupOption opts
     HideSuccesses hideSuccesses = lookupOption opts
     NumThreads numThreads = lookupOption opts
+    AnsiTricks ansiTricks = lookupOption opts
 
   if quiet
     then do
@@ -413,9 +416,9 @@
             toutput = buildTestOutput opts tree
 
           case () of { _
-            | hideSuccesses && isTerm ->
+            | hideSuccesses && isTerm && ansiTricks ->
                 consoleOutputHidingSuccesses toutput smap
-            | hideSuccesses && not isTerm ->
+            | hideSuccesses ->
                 streamOutputHidingSuccesses toutput smap
             | otherwise -> consoleOutput toutput smap
           }
@@ -461,6 +464,32 @@
   optionName = return "color"
   optionHelp = return "When to use colored output (default: 'auto')"
   optionCLParser = mkOptionCLParser $ metavar "never|always|auto"
+
+-- | By default, when the option @--hide-successes@ is given and the output
+-- goes to an ANSI-capable terminal, we employ some ANSI terminal tricks to
+-- display the name of the currently running test and then erase it if it
+-- succeeds.
+--
+-- These tricks sometimes fail, however—in particular, when the test names
+-- happen to be longer than the width of the terminal window. See
+--
+-- * <https://github.com/feuerbach/tasty/issues/152>
+--
+-- * <https://github.com/feuerbach/tasty/issues/250>
+--
+-- When that happens, this option can be used to disable the tricks. In
+-- that case, the test name will be printed only once the test fails.
+newtype AnsiTricks = AnsiTricks Bool
+  deriving Typeable
+
+instance IsOption AnsiTricks where
+  defaultValue = AnsiTricks True
+  parseValue = fmap AnsiTricks . safeReadBool
+  optionName = return "ansi-tricks"
+  optionHelp = return $
+    -- Multiline literals don't work because of -XCPP.
+    "Enable various ANSI terminal tricks. " ++
+    "Can be set to 'true' (default) or 'false'."
 
 -- | @useColor when isTerm@ decides if colors should be used,
 --   where @isTerm@ indicates whether @stdout@ is a terminal device.
diff --git a/Test/Tasty/Run.hs b/Test/Tasty/Run.hs
--- a/Test/Tasty/Run.hs
+++ b/Test/Tasty/Run.hs
@@ -14,9 +14,6 @@
 import Data.Maybe
 import Data.Graph (SCC(..), stronglyConnComp)
 import Data.Typeable
-#ifndef VERSION_clock
-import Data.Time.Clock.POSIX (getPOSIXTime)
-#endif
 import Control.Monad.State
 import Control.Monad.Writer
 import Control.Monad.Reader
@@ -29,9 +26,6 @@
 import Control.Arrow
 import GHC.Conc (labelThread)
 import Prelude  -- Silence AMP and FTP import warnings
-#ifdef VERSION_clock
-import qualified System.Clock as Clock
-#endif
 
 import Test.Tasty.Core
 import Test.Tasty.Parallel
@@ -40,6 +34,7 @@
 import Test.Tasty.Options
 import Test.Tasty.Options.Core
 import Test.Tasty.Runners.Reducers
+import Test.Tasty.Runners.Utils (timed)
 
 -- | Current status of a test
 data Status
@@ -465,32 +460,3 @@
     r <- restore a `onException` sequel restore
     _ <- sequel restore
     return r
-
--- | Measure the time taken by an 'IO' action to run
-timed :: IO a -> IO (Time, a)
-timed t = do
-  start <- getTime
-  !r    <- t
-  end   <- getTime
-  return (end-start, r)
-
-#ifdef VERSION_clock
--- | Get monotonic time
---
--- Warning: This is not the system time, but a monotonically increasing time
--- that facilitates reliable measurement of time differences.
-getTime :: IO Time
-getTime = do
-  t <- Clock.getTime Clock.Monotonic
-  let ns = realToFrac $
-#if MIN_VERSION_clock(0,7,1)
-        Clock.toNanoSecs t
-#else
-        Clock.timeSpecAsNanoSecs t
-#endif
-  return $ ns / 10 ^ (9 :: Int)
-#else
--- | Get system time
-getTime :: IO Time
-getTime = realToFrac <$> getPOSIXTime
-#endif
diff --git a/Test/Tasty/Runners.hs b/Test/Tasty/Runners.hs
--- a/Test/Tasty/Runners.hs
+++ b/Test/Tasty/Runners.hs
@@ -26,6 +26,7 @@
   , ListTests(..)
   , testsNames
     -- * Command line handling
+  , parseOptions
   , optionParser
   , suiteOptionParser
   , defaultMainWithIngredients
diff --git a/Test/Tasty/Runners/Utils.hs b/Test/Tasty/Runners/Utils.hs
--- a/Test/Tasty/Runners/Utils.hs
+++ b/Test/Tasty/Runners/Utils.hs
@@ -1,13 +1,23 @@
+{-# LANGUAGE BangPatterns #-}
+
 -- | Note: this module is re-exported as a whole from "Test.Tasty.Runners"
 module Test.Tasty.Runners.Utils where
 
 import Control.Exception
 import Control.Applicative
+#ifndef VERSION_clock
+import Data.Time.Clock.POSIX (getPOSIXTime)
+#endif
 import Data.Typeable (Typeable)
 import Prelude  -- Silence AMP import warnings
 import Text.Printf
 import Foreign.C (CInt)
+#ifdef VERSION_clock
+import qualified System.Clock as Clock
+#endif
 
+import Test.Tasty.Core (Time)
+
 -- We install handlers only on UNIX (obviously) and on GHC >= 7.6.
 -- GHC 7.4 lacks mkWeakThreadId (see #181), and this is not important
 -- enough to look for an alternative implementation, so we just disable it
@@ -83,3 +93,32 @@
 newtype SignalException = SignalException CInt
   deriving (Show, Typeable)
 instance Exception SignalException
+
+-- | Measure the time taken by an 'IO' action to run
+timed :: IO a -> IO (Time, a)
+timed t = do
+  start <- getTime
+  !r    <- t
+  end   <- getTime
+  return (end-start, r)
+
+#ifdef VERSION_clock
+-- | Get monotonic time
+--
+-- Warning: This is not the system time, but a monotonically increasing time
+-- that facilitates reliable measurement of time differences.
+getTime :: IO Time
+getTime = do
+  t <- Clock.getTime Clock.Monotonic
+  let ns = realToFrac $
+#if MIN_VERSION_clock(0,7,1)
+        Clock.toNanoSecs t
+#else
+        Clock.timeSpecAsNanoSecs t
+#endif
+  return $ ns / 10 ^ (9 :: Int)
+#else
+-- | Get system time
+getTime :: IO Time
+getTime = realToFrac <$> getPOSIXTime
+#endif
diff --git a/tasty.cabal b/tasty.cabal
--- a/tasty.cabal
+++ b/tasty.cabal
@@ -2,7 +2,7 @@
 --  see http://haskell.org/cabal/users-guide/
 
 name:                tasty
-version:             1.2.1
+version:             1.2.2
 synopsis:            Modern and extensible testing framework
 description:         Tasty is a modern testing framework for Haskell.
                      It lets you combine your unit tests, golden
