diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2013 Simon Hengel <sol@typeful.net>
+Copyright (c) 2011-2014 Simon Hengel <sol@typeful.net>
 Copyright (c) 2011-2012 Trystan Spangler <trystan.s@comcast.net>
 Copyright (c) 2011-2011 Greg Weber <greg@gregweber.info>
 
diff --git a/hspec-discover/example/Spec.hs b/hspec-discover/example/Spec.hs
deleted file mode 100644
--- a/hspec-discover/example/Spec.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/hspec-discover/integration-test/empty/Spec.hs b/hspec-discover/integration-test/empty/Spec.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/empty/Spec.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/hspec-discover/integration-test/with-formatter-empty/Spec.hs b/hspec-discover/integration-test/with-formatter-empty/Spec.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/with-formatter-empty/Spec.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover -optF --formatter=Test.Hspec.Formatters.progress #-}
diff --git a/hspec-discover/integration-test/with-formatter/FooSpec.hs b/hspec-discover/integration-test/with-formatter/FooSpec.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/with-formatter/FooSpec.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module FooSpec (main, spec) where
-
-import           Test.Hspec
-
-main :: IO ()
-main = hspec spec
-
-spec :: Spec
-spec = do
-  describe "reverse" $ do
-    it "reverses a list" $ do
-      reverse [1 :: Int, 2, 3] `shouldBe` [3, 2, 1]
diff --git a/hspec-discover/integration-test/with-formatter/Spec.hs b/hspec-discover/integration-test/with-formatter/Spec.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/with-formatter/Spec.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover -optF --formatter=Test.Hspec.Formatters.progress #-}
diff --git a/hspec-discover/integration-test/with-io-formatter/FooSpec.hs b/hspec-discover/integration-test/with-io-formatter/FooSpec.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/with-io-formatter/FooSpec.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module FooSpec (main, spec) where
-
-import           Test.Hspec
-
-main :: IO ()
-main = hspec spec
-
-spec :: Spec
-spec = do
-  describe "reverse" $ do
-    it "reverses a list" $ do
-      reverse [1 :: Int, 2, 3] `shouldBe` [3, 2, 1]
diff --git a/hspec-discover/integration-test/with-io-formatter/Formatter.hs b/hspec-discover/integration-test/with-io-formatter/Formatter.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/with-io-formatter/Formatter.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Formatter (count) where
-
-import           Data.IORef
-import           Control.Monad.IO.Class
-import           Test.Hspec.Formatters
-
-count :: IO Formatter
-count = do
-  ref <- newIORef (0 :: Int)
-  return silent {
-      exampleSucceeded = \_ -> liftIO (modifyIORef ref succ)
-    , footerFormatter = liftIO (readIORef ref) >>= writeLine . show
-    }
diff --git a/hspec-discover/integration-test/with-io-formatter/Spec.hs b/hspec-discover/integration-test/with-io-formatter/Spec.hs
deleted file mode 100644
--- a/hspec-discover/integration-test/with-io-formatter/Spec.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover -optF --formatter=Formatter.count #-}
diff --git a/hspec-discover/src/Config.hs b/hspec-discover/src/Config.hs
--- a/hspec-discover/src/Config.hs
+++ b/hspec-discover/src/Config.hs
@@ -5,28 +5,38 @@
 , usage
 ) where
 
+import           Data.Maybe
 import           System.Console.GetOpt
 
 data Config = Config {
   configNested :: Bool
 , configFormatter :: Maybe String
+, configNoMain :: Bool
 } deriving (Eq, Show)
 
 defaultConfig :: Config
-defaultConfig = Config False Nothing
+defaultConfig = Config False Nothing False
 
 options :: [OptDescr (Config -> Config)]
 options = [
     Option [] ["nested"]    (NoArg  $ \c -> c   {configNested = True}) ""
   , Option [] ["formatter"] (ReqArg (\s c -> c {configFormatter = Just s}) "FORMATTER") ""
+  , Option [] ["no-main"]   (NoArg  $ \c -> c   {configNoMain = True}) ""
   ]
 
 usage :: String -> String
-usage prog = "\nUsage: " ++ prog ++ " SRC CUR DST [--formatter=FORMATTER]\n"
+usage prog = "\nUsage: " ++ prog ++ " SRC CUR DST [--formatter=FORMATTER] [--no-main]\n"
 
 parseConfig :: String -> [String] -> Either String Config
 parseConfig prog args = case getOpt Permute options args of
-    (opts, [], []) -> Right (foldl (flip id) defaultConfig opts)
+    (opts, [], []) -> let
+        c = (foldl (flip id) defaultConfig opts)
+      in
+        if (configNoMain c && isJust (configFormatter c))
+           then
+             formatError "option `--formatter=<fmt>' does not make sense with `--no-main'\n"
+           else
+             Right c
     (_, _, err:_)  -> formatError err
     (_, arg:_, _)  -> formatError ("unexpected argument `" ++ arg ++ "'\n")
   where
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
@@ -15,6 +15,7 @@
 import           Control.Monad
 import           Control.Applicative
 import           Data.List
+import           Data.Char
 import           Data.Maybe
 import           Data.String
 import           System.Environment
@@ -49,7 +50,7 @@
 mkSpecModule :: FilePath -> Config -> [Spec] -> String
 mkSpecModule src c nodes =
   ( "{-# LINE 1 " . shows src . " #-}"
-  . showString "module Main where\n"
+  . showString ("module " ++ module_ ++" where\n")
   . importList nodes
   . maybe driver (driverWithFormatter (null nodes)) (configFormatter c)
   . formatSpecs nodes
@@ -57,8 +58,20 @@
   where
     driver =
         showString "import Test.Hspec\n"
-      . showString "main :: IO ()\n"
-      . showString "main = hspec $ "
+      . case configNoMain c of
+          False ->
+              showString "main :: IO ()\n"
+            . showString "main = hspec $ "
+          True ->
+              showString "spec :: Spec\n"
+            . showString "spec = "
+    module_ = if configNoMain c then pathToModule src else "Main"
+    pathToModule f = let
+        fileName = last $ splitDirectories f
+        m:ms = takeWhile (/='.') fileName
+     in
+        toUpper m:ms
+
 
 driverWithFormatter :: Bool -> String -> ShowS
 driverWithFormatter isEmpty f =
diff --git a/hspec-discover/test/ConfigSpec.hs b/hspec-discover/test/ConfigSpec.hs
--- a/hspec-discover/test/ConfigSpec.hs
+++ b/hspec-discover/test/ConfigSpec.hs
@@ -18,18 +18,28 @@
     it "recognizes --formatter" $ do
       parse ["--formatter", "someFormatter"] `shouldBe` Right (defaultConfig {configFormatter = Just "someFormatter"})
 
+    it "recognizes --no-main" $ do
+      parse ["--no-main"] `shouldBe` Right (defaultConfig {configNoMain = True})
+
     it "returns error message on unrecognized option" $ do
       parse ["--foo"] `shouldBe` (Left . unlines) [
           "hspec-discover: unrecognized option `--foo'"
         , ""
-        , "Usage: hspec-discover SRC CUR DST [--formatter=FORMATTER]"
+        , "Usage: hspec-discover SRC CUR DST [--formatter=FORMATTER] [--no-main]"
         ]
 
     it "returns error message on unexpected argument" $ do
       parse ["foo"]   `shouldBe` (Left . unlines) [
           "hspec-discover: unexpected argument `foo'"
         , ""
-        , "Usage: hspec-discover SRC CUR DST [--formatter=FORMATTER]"
+        , "Usage: hspec-discover SRC CUR DST [--formatter=FORMATTER] [--no-main]"
+        ]
+
+    it "returns error message on --formatter=<fmt> with --no-main" $ do
+      parse ["--no-main", "--formatter=foo"] `shouldBe` (Left . unlines) [
+          "hspec-discover: option `--formatter=<fmt>' does not make sense with `--no-main'"
+        , ""
+        , "Usage: hspec-discover SRC CUR DST [--formatter=FORMATTER] [--no-main]"
         ]
 
     context "when option is given multiple times" $ do
diff --git a/hspec.cabal b/hspec.cabal
--- a/hspec.cabal
+++ b/hspec.cabal
@@ -1,8 +1,8 @@
 name:             hspec
-version:          1.8.1.1
+version:          1.8.2
 license:          MIT
 license-file:     LICENSE
-copyright:        (c) 2011-2013 Simon Hengel,
+copyright:        (c) 2011-2014 Simon Hengel,
                   (c) 2011-2012 Trystan Spangler,
                   (c) 2011 Greg Weber
 maintainer:       Simon Hengel <sol@typeful.net>
@@ -172,80 +172,3 @@
     , filepath
     , directory
     , hspec-meta
-
-test-suite hspec-discover-example
-  buildable: False
-  type:
-      exitcode-stdio-1.0
-  ghc-options:
-      -Wall -Werror
-  hs-source-dirs:
-      hspec-discover/example
-  main-is:
-      Spec.hs
-  build-depends:
-      base    == 4.*
-    , hspec
-    , QuickCheck
-
-test-suite hspec-discover-integration-test-empty
-  buildable: False
-  type:
-      exitcode-stdio-1.0
-  ghc-options:
-      -Wall -Werror
-  hs-source-dirs:
-      hspec-discover/integration-test/empty
-  main-is:
-      Spec.hs
-  build-depends:
-      base    == 4.*
-    , hspec
-
-test-suite hspec-discover-integration-test-with-formatter
-  buildable: False
-  type:
-      exitcode-stdio-1.0
-  ghc-options:
-      -Wall -Werror
-  hs-source-dirs:
-      hspec-discover/integration-test/with-formatter
-  main-is:
-      Spec.hs
-  other-modules:
-      FooSpec
-  build-depends:
-      base    == 4.*
-    , hspec
-
-test-suite hspec-discover-integration-test-with-io-formatter
-  buildable: False
-  type:
-      exitcode-stdio-1.0
-  ghc-options:
-      -Wall -Werror
-  hs-source-dirs:
-      hspec-discover/integration-test/with-io-formatter
-  main-is:
-      Spec.hs
-  other-modules:
-      FooSpec
-      Formatter
-  build-depends:
-      base    == 4.*
-    , hspec
-    , transformers
-
-test-suite hspec-discover-integration-test-with-formatter-empty
-  buildable: False
-  type:
-      exitcode-stdio-1.0
-  ghc-options:
-      -Wall -Werror
-  hs-source-dirs:
-      hspec-discover/integration-test/with-formatter-empty
-  main-is:
-      Spec.hs
-  build-depends:
-      base    == 4.*
-    , hspec
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,8 @@
 , hspec
 ) where
 
+import           Control.Exception (finally)
+
 import           Test.Hspec.Core.Type hiding (describe, it)
 import           Test.Hspec.Runner
 import           Test.Hspec.HUnit ()
@@ -84,7 +86,7 @@
 
 -- | Run a custom action after every spec item.
 after :: IO () -> Spec -> Spec
-after action = around (>> action)
+after action = around (`finally` action)
 
 -- | Run a custom action before and/or after every spec item.
 around :: (IO () -> IO ()) -> Spec -> Spec
diff --git a/test/Test/HspecSpec.hs b/test/Test/HspecSpec.hs
--- a/test/Test/HspecSpec.hs
+++ b/test/Test/HspecSpec.hs
@@ -119,6 +119,13 @@
           mockCounter mock `shouldReturn` 1
       mockCounter mock `shouldReturn` 2
 
+    it "guarantees that action is run" $ do
+      mock <- newMock
+      silence . ignoreExitCode $ H.hspec $ H.after (mockAction mock) $ do
+        H.it "foo" $ do
+          ioError $ userError "foo" :: IO ()
+      mockCounter mock `shouldReturn` 1
+
   describe "around" $ do
     it "wraps each spec item with an action" $ do
       ref <- newIORef (0 :: Int)
