diff --git a/hspec-core/src/Test/Hspec/Config.hs b/hspec-core/src/Test/Hspec/Config.hs
--- a/hspec-core/src/Test/Hspec/Config.hs
+++ b/hspec-core/src/Test/Hspec/Config.hs
@@ -16,6 +16,7 @@
 import           Test.Hspec.Options
 import           Test.Hspec.FailureReport
 import           Test.Hspec.Core.QuickCheckUtil (mkGen)
+import           Test.Hspec.Core.Example (Params(..), defaultParams)
 
 -- | Add a filter predicate to config.  If there is already a filter predicate,
 -- then combine them with `||`.
@@ -50,7 +51,7 @@
         maybe id setSeed (configQuickCheckSeed c)
       . maybe id setMaxDiscardRatio (configQuickCheckMaxDiscardRatio c)
       . maybe id setMaxSize (configQuickCheckMaxSize c)
-      . maybe id setMaxSuccess (configQuickCheckMaxSuccess c)) QC.stdArgs
+      . maybe id setMaxSuccess (configQuickCheckMaxSuccess c)) (paramsQuickCheckArgs defaultParams)
 
     setMaxSuccess :: Int -> QC.Args -> QC.Args
     setMaxSuccess n args = args {QC.maxSuccess = n}
diff --git a/hspec-core/src/Test/Hspec/Core.hs b/hspec-core/src/Test/Hspec/Core.hs
deleted file mode 100644
--- a/hspec-core/src/Test/Hspec/Core.hs
+++ /dev/null
@@ -1,18 +0,0 @@
--- | Stability: unstable
-module Test.Hspec.Core (
-  module Test.Hspec.Core.Spec
--- * Deprecated functions
-, describe
-, it
-) where
-
-import           Test.Hspec.Core.Spec hiding (describe, it)
-
-
-{-# DEPRECATED describe "use `specGroup` instead" #-}
-describe :: String -> [SpecTree a] -> SpecTree a
-describe = specGroup
-
-{-# DEPRECATED it "use `specItem` instead" #-}
-it :: Example a => String -> a -> SpecTree (Arg a)
-it = specItem
diff --git a/hspec-core/src/Test/Hspec/Core/Example.hs b/hspec-core/src/Test/Hspec/Core/Example.hs
--- a/hspec-core/src/Test/Hspec/Core/Example.hs
+++ b/hspec-core/src/Test/Hspec/Core/Example.hs
@@ -2,6 +2,7 @@
 module Test.Hspec.Core.Example (
   Example (..)
 , Params (..)
+, defaultParams
 , ActionWith
 , Progress
 , ProgressCallback
@@ -18,7 +19,6 @@
 
 import qualified Test.QuickCheck.State as QC
 import qualified Test.QuickCheck.Property as QCP
-import qualified Test.QuickCheck.IO ()
 
 import           Test.Hspec.Core.QuickCheckUtil
 import           Test.Hspec.Core.Util
@@ -27,6 +27,9 @@
 -- | A type class for examples
 class Example e where
   type Arg e
+#if __GLASGOW_HASKELL__ >= 704
+  type Arg e = ()
+#endif
   evaluateExample :: e -> Params -> (ActionWith (Arg e) -> IO ()) -> ProgressCallback -> IO Result
 
 data Params = Params {
@@ -34,6 +37,12 @@
 , paramsSmallCheckDepth :: Int
 } deriving (Show)
 
+defaultParams :: Params
+defaultParams = Params {
+  paramsQuickCheckArgs = QC.stdArgs
+, paramsSmallCheckDepth = 5
+}
+
 type Progress = (Int, Int)
 type ProgressCallback = Progress -> IO ()
 
@@ -79,6 +88,9 @@
         QC.Failure {QC.output = m}  -> fromMaybe (Fail $ sanitizeFailureMessage r) (parsePending m)
         QC.GaveUp {QC.numTests = n} -> Fail ("Gave up after " ++ pluralize n "test" )
         QC.NoExpectedFailure {}     -> Fail ("No expected failure")
+#if MIN_VERSION_QuickCheck(2,8,0)
+        QC.InsufficientCoverage {}  -> Fail ("Insufficient coverage")
+#endif
     where
       qcProgressCallback = QCP.PostTest QCP.NotCounterexample $
         \st _ -> progressCallback (QC.numSuccessTests st, QC.maxSuccessTests st)
diff --git a/hspec-core/src/Test/Hspec/Core/Formatters.hs b/hspec-core/src/Test/Hspec/Core/Formatters.hs
--- a/hspec-core/src/Test/Hspec/Core/Formatters.hs
+++ b/hspec-core/src/Test/Hspec/Core/Formatters.hs
@@ -158,15 +158,18 @@
 
   failures <- getFailMessages
 
-  forM_ (zip [1..] failures) $ \x -> do
-    formatFailure x
+  unless (null failures) $ do
+    writeLine "Failures:"
     writeLine ""
 
-  when (hasBestEffortLocations failures) $ do
-    withInfoColor $ writeLine "Source locations marked with \"best-effort\" are calculated heuristically and may be incorrect."
-    writeLine ""
+    forM_ (zip [1..] failures) $ \x -> do
+      formatFailure x
+      writeLine ""
 
-  unless (null failures) $ do
+    when (hasBestEffortLocations failures) $ do
+      withInfoColor $ writeLine "Source locations marked with \"best-effort\" are calculated heuristically and may be incorrect."
+      writeLine ""
+
     write "Randomized with seed " >> usedSeed >>= writeLine . show
     writeLine ""
   where
@@ -178,17 +181,16 @@
 
     formatFailure :: (Int, FailureRecord) -> FormatM ()
     formatFailure (n, FailureRecord mLoc path reason) = do
-      write (show n ++ ") ")
-      writeLine (formatRequirement path)
-      withFailColor $ do
-        unless (null err) $ do
-          writeLine err
       forM_ mLoc $ \loc -> do
-        writeLine ""
         withInfoColor $ writeLine (formatLoc loc)
+      write ("  " ++ show n ++ ") ")
+      writeLine (formatRequirement path)
+      withFailColor $ do
+        forM_ (lines err) $ \x -> do
+          writeLine ("       " ++ x)
       where
         err = either (("uncaught exception: " ++) . formatException) id reason
-        formatLoc (Location file line _column accuracy) = "# " ++ file ++ ":" ++ show line ++ bestEffortMarking
+        formatLoc (Location file line _column accuracy) = "  " ++ file ++ ":" ++ show line ++ ":" ++ bestEffortMarking
           where
             bestEffortMarking = case accuracy of
               ExactLocation -> ""
diff --git a/hspec-core/src/Test/Hspec/Core/Hooks.hs b/hspec-core/src/Test/Hspec/Core/Hooks.hs
--- a/hspec-core/src/Test/Hspec/Core/Hooks.hs
+++ b/hspec-core/src/Test/Hspec/Core/Hooks.hs
@@ -1,6 +1,7 @@
 -- | Stability: provisional
 module Test.Hspec.Core.Hooks (
   before
+, before_
 , beforeWith
 , beforeAll
 , after
@@ -22,6 +23,10 @@
 before action = around (action >>=)
 
 -- | Run a custom action before every spec item.
+before_ :: IO () -> SpecWith a -> SpecWith a
+before_ action = around_ (action >>)
+
+-- | Run a custom action before every spec item.
 beforeWith :: (b -> IO a) -> SpecWith a -> SpecWith b
 beforeWith action = aroundWith $ \e x -> action x >>= e
 
@@ -44,8 +49,8 @@
 after action = aroundWith $ \e x -> e x `finally` action x
 
 -- | Run a custom action after every spec item.
-after_ :: IO () -> Spec -> Spec
-after_ action = after $ \() -> action
+after_ :: IO () -> SpecWith a -> SpecWith a
+after_ action = after $ \_ -> action
 
 -- | Run a custom action before and/or after every spec item.
 around :: (ActionWith a -> IO ()) -> SpecWith a -> Spec
@@ -56,12 +61,12 @@
 afterAll action spec = runIO (runSpecM spec) >>= fromSpecList . return . NodeWithCleanup action
 
 -- | Run a custom action after the last spec item.
-afterAll_ :: IO () -> Spec -> Spec
-afterAll_ action = afterAll (\() -> action)
+afterAll_ :: IO () -> SpecWith a -> SpecWith a
+afterAll_ action = afterAll (\_ -> action)
 
 -- | Run a custom action before and/or after every spec item.
-around_ :: (IO () -> IO ()) -> Spec -> Spec
-around_ action = around $ action . ($ ())
+around_ :: (IO () -> IO ()) -> SpecWith a -> SpecWith a
+around_ action = aroundWith $ \e a -> action (e a)
 
 -- | Run a custom action before and/or after every spec item.
 aroundWith :: (ActionWith a -> ActionWith b) -> SpecWith a -> SpecWith b
diff --git a/hspec-core/src/Test/Hspec/Core/Runner.hs b/hspec-core/src/Test/Hspec/Core/Runner.hs
--- a/hspec-core/src/Test/Hspec/Core/Runner.hs
+++ b/hspec-core/src/Test/Hspec/Core/Runner.hs
@@ -47,7 +47,8 @@
 filterSpecs c = go []
   where
     p :: Path -> Bool
-    p = fromMaybe (const True) (configFilterPredicate c)
+    p path = (fromMaybe (const True) (configFilterPredicate c) path) &&
+               not (fromMaybe (const False) (configSkipPredicate c) path)
 
     go :: [String] -> [SpecTree a] -> [SpecTree a]
     go groups = mapMaybe (goSpec groups)
diff --git a/hspec-core/src/Test/Hspec/Options.hs b/hspec-core/src/Test/Hspec/Options.hs
--- a/hspec-core/src/Test/Hspec/Options.hs
+++ b/hspec-core/src/Test/Hspec/Options.hs
@@ -15,6 +15,7 @@
 import           Test.Hspec.Core.Formatters
 import           Test.Hspec.Compat
 import           Test.Hspec.Core.Util
+import           Test.Hspec.Core.Example (Params(..), defaultParams)
 
 data Config = Config {
   configDryRun :: Bool
@@ -26,6 +27,7 @@
 -- that satisfy the predicate are run.
 , configRerun :: Bool
 , configFilterPredicate :: Maybe (Path -> Bool)
+, configSkipPredicate :: Maybe (Path -> Bool)
 , configQuickCheckSeed :: Maybe Integer
 , configQuickCheckMaxSuccess :: Maybe Int
 , configQuickCheckMaxDiscardRatio :: Maybe Int
@@ -44,11 +46,12 @@
 , configFastFail = False
 , configRerun = False
 , configFilterPredicate = Nothing
+, configSkipPredicate = Nothing
 , configQuickCheckSeed = Nothing
 , configQuickCheckMaxSuccess = Nothing
 , configQuickCheckMaxDiscardRatio = Nothing
 , configQuickCheckMaxSize = Nothing
-, configSmallCheckDepth = 5
+, configSmallCheckDepth = paramsSmallCheckDepth defaultParams
 , configColorMode = ColorAuto
 , configFormatter = Nothing
 , configHtmlOutput = False
@@ -63,6 +66,9 @@
 addMatch :: String -> Config -> Config
 addMatch s c = c {configFilterPredicate = Just (filterPredicate s) `filterOr` configFilterPredicate c}
 
+addSkip :: String -> Config -> Config
+addSkip s c = c {configSkipPredicate = Just (filterPredicate s) `filterOr` configSkipPredicate c}
+
 setDepth :: Int -> Config -> Config
 setDepth n c = c {configSmallCheckDepth = n}
 
@@ -117,6 +123,7 @@
 options = [
     Option   []  ["help"]             (NoArg (const $ Left Help))         (h "display this help and exit")
   , mkOption "m"  "match"             (Arg "PATTERN" return addMatch)     (h "only run examples that match given PATTERN")
+  , mkOption []   "skip"              (Arg "PATTERN" return addSkip)      (h "skip examples that match given PATTERN")
   , Option   []  ["color"]            (NoArg setColor)                    (h "colorize the output")
   , Option   []  ["no-color"]         (NoArg setNoColor)                  (h "do not colorize the output")
   , mkOption "f"  "format"            (Arg "FORMATTER" readFormatter setFormatter) formatHelp
diff --git a/hspec-discover/src/Run.hs b/hspec-discover/src/Run.hs
--- a/hspec-discover/src/Run.hs
+++ b/hspec-discover/src/Run.hs
@@ -121,12 +121,21 @@
 fileToSpec :: FilePath -> FilePath -> Maybe Spec
 fileToSpec dir file = case reverse $ splitDirectories file of
   x:xs -> case stripSuffix "Spec.hs" x <|> stripSuffix "Spec.lhs" x of
-    Just name | (not . null) name -> Just . Spec (dir </> file) $ (intercalate "." . reverse) (name : xs)
+    Just name | isValidModuleName name && all isValidModuleName xs ->
+      Just . Spec (dir </> file) $ (intercalate "." . reverse) (name : xs)
     _ -> Nothing
   _ -> Nothing
   where
     stripSuffix :: Eq a => [a] -> [a] -> Maybe [a]
     stripSuffix suffix str = reverse <$> stripPrefix (reverse suffix) (reverse str)
+
+-- See `Cabal.Distribution.ModuleName` (http://git.io/bj34)
+isValidModuleName :: String -> Bool
+isValidModuleName [] = False
+isValidModuleName (c:cs) = isUpper c && all isValidModuleChar cs
+
+isValidModuleChar :: Char -> Bool
+isValidModuleChar c = isAlphaNum c || c == '_' || c == '\''
 
 getFilesRecursive :: FilePath -> IO [FilePath]
 getFilesRecursive baseDir = sort <$> go []
diff --git a/hspec-meta.cabal b/hspec-meta.cabal
--- a/hspec-meta.cabal
+++ b/hspec-meta.cabal
@@ -1,5 +1,5 @@
 name:             hspec-meta
-version:          2.0.0
+version:          2.1.5
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2011-2014 Simon Hengel,
@@ -50,8 +50,9 @@
       Test.Hspec.Formatters
       Test.Hspec.QuickCheck
       Test.Hspec.Discover
-
       Test.Hspec.Core
+      Test.Hspec.HUnit
+
       Test.Hspec.Core.Spec
       Test.Hspec.Core.Hooks
       Test.Hspec.Core.Runner
diff --git a/src/Test/Hspec.hs b/src/Test/Hspec.hs
--- a/src/Test/Hspec.hs
+++ b/src/Test/Hspec.hs
@@ -30,6 +30,7 @@
 -- * Hooks
 , ActionWith
 , before
+, before_
 , beforeWith
 , beforeAll
 , after
diff --git a/src/Test/Hspec/Core.hs b/src/Test/Hspec/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/Test/Hspec/Core.hs
@@ -0,0 +1,18 @@
+-- | Stability: unstable
+module Test.Hspec.Core {-# DEPRECATED "use \"Test.Hspec.Core.Spec\" instead" #-} (
+  module Test.Hspec.Core.Spec
+-- * Deprecated functions
+, describe
+, it
+) where
+
+import           Test.Hspec.Core.Spec hiding (describe, it)
+
+
+{-# DEPRECATED describe "use `specGroup` instead" #-}
+describe :: String -> [SpecTree a] -> SpecTree a
+describe = specGroup
+
+{-# DEPRECATED it "use `specItem` instead" #-}
+it :: Example a => String -> a -> SpecTree (Arg a)
+it = specItem
diff --git a/src/Test/Hspec/Discover.hs b/src/Test/Hspec/Discover.hs
--- a/src/Test/Hspec/Discover.hs
+++ b/src/Test/Hspec/Discover.hs
@@ -8,7 +8,6 @@
 , hspecWithFormatter
 , postProcessSpec
 , describe
-, module Prelude
 ) where
 
 import           Control.Applicative
diff --git a/src/Test/Hspec/HUnit.hs b/src/Test/Hspec/HUnit.hs
new file mode 100644
--- /dev/null
+++ b/src/Test/Hspec/HUnit.hs
@@ -0,0 +1,24 @@
+module Test.Hspec.HUnit {-# DEPRECATED "use \"Test.Hspec.Contrib.HUnit\" from package @hspec-contrib@ instead" #-}
+(
+-- * Interoperability with HUnit
+  fromHUnitTest
+) where
+
+import           Test.Hspec.Core.Spec
+import           Test.HUnit (Test (..))
+
+-- |
+-- Convert a HUnit test suite to a spec.  This can be used to run existing
+-- HUnit tests with Hspec.
+fromHUnitTest :: Test -> Spec
+fromHUnitTest t = case t of
+  TestList xs -> mapM_ go xs
+  x -> go x
+  where
+    go :: Test -> Spec
+    go t_ = case t_ of
+      TestLabel s (TestCase e) -> it s e
+      TestLabel s (TestList xs) -> describe s (mapM_ go xs)
+      TestLabel s x -> describe s (go x)
+      TestList xs -> describe "<unlabeled>" (mapM_ go xs)
+      TestCase e -> it "<unlabeled>" e
