diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+[0.2.2](https://github.com/guillaume-nargeot/hpc-coveralls/issues?milestone=3&state=closed)
+* Prevent double compilation (issue #11)
+* Concurrently process cabal test stdout and stderr channels (issue #12)
+* Test with GHC 7.8.2
+
 [0.2.1](https://github.com/guillaume-nargeot/hpc-coveralls/issues?milestone=2&state=closed)
 -----
 * Additional CI services support (issue #1)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -11,21 +11,31 @@
 
 ## Travis CI
 
-Commands to add to your project `.travis.yml`:
+Commands to add to your project `.travis.yml` when using GHC 7.8:
 ```yaml
 before_install:
   - cabal install hpc-coveralls
 script:
+  - cabal configure --enable-tests --enable-library-coverage && cabal build && cabal test
+after_script:
+  - hpc-coveralls [options] [test-suite-name]
+```
+
+When using a GHC version prior to 7.8, you have to replace the `cabal test` command by `run-cabal-test`, as in the following example:
+```yaml
+before_install:
+  - cabal install hpc-coveralls
+script:
   - cabal configure --enable-tests --enable-library-coverage && cabal build
   - run-cabal-test [options] [cabal-test-options]
 after_script:
   - hpc-coveralls [options] [test-suite-name]
 ```
 
-Note that the usual `cabal test` command is replaced by `run-cabal-test`.
 The reason for this is explained in the next section.
 
-For an example usage, please refer to [this-project](https://github.com/guillaume-nargeot/project-euler-haskell) `.travis.yml` file ([result on coveralls](https://coveralls.io/r/guillaume-nargeot/project-euler-haskell)).
+For a real world example usage, please refer to [this-project](https://github.com/guillaume-nargeot/project-euler-haskell) `.travis.yml` file ([result on coveralls](https://coveralls.io/r/guillaume-nargeot/project-euler-haskell)).
+You can also refer to the `.travis.yml` file of hpc-coveralls itself, which is configured with [multi-ghc-travis](https://github.com/hvr/multi-ghc-travis).
 
 ## The run-cabal-test command
 
@@ -33,7 +43,7 @@
 
 In order to prevent this from happening, hpc-coveralls provides the `run-cabal-test` command which runs `cabal test` and returns with `0` if the regex `^Test suite .*: FAIL$` never matches any line of the output.
 
-This hpc issue should be fixed in version 0.7 (not yet available on Travis CI).
+As this issue is fixed in the hpc version shipped with GHC 7.8, you don't have to use `run-cabal-test` when testing with GHC 7.8 and can safely use `cabal test`.
 
 ### Options
 
@@ -59,6 +69,12 @@
 
 ```yaml
 hpc-coveralls --exclude-dir=test [test-suite-name]
+```
+
+You can specify multiple excluded folders by using the following example syntax:
+
+```yaml
+hpc-coveralls --exclude-dir=test1 --exclude-dir=test2 [test-suite-name]
 ```
 
 # Limitations
diff --git a/hpc-coveralls.cabal b/hpc-coveralls.cabal
--- a/hpc-coveralls.cabal
+++ b/hpc-coveralls.cabal
@@ -1,5 +1,5 @@
 name:           hpc-coveralls
-version:        0.2.1
+version:        0.2.2
 synopsis:       Coveralls.io support for Haskell.
 description:
   This utility converts and sends Haskell projects hpc code coverage to
@@ -12,8 +12,7 @@
   > before_install:
   >   - cabal install hpc-coveralls
   > script:
-  >   - cabal configure --enable-tests --enable-library-coverage && cabal build
-  >   - run-cabal-test [options] [cabal-test-options]
+  >   - cabal configure --enable-tests --enable-library-coverage && cabal build && cabal test
   > after_script:
   >   - hpc-coveralls [options] [test-suite-name]
   .
@@ -28,7 +27,7 @@
 build-type:     Simple
 stability:      experimental
 cabal-version:  >= 1.8
-tested-with:    GHC == 7.6.3
+tested-with:    GHC == 7.6, GHC == 7.8
 bug-reports:    https://github.com/guillaume-nargeot/hpc-coveralls
 homepage:       https://github.com/guillaume-nargeot/hpc-coveralls/issues
 
@@ -41,7 +40,7 @@
   location: https://github.com/guillaume-nargeot/hpc-coveralls.git
 
 library
-  hs-source-dirs:      src
+  hs-source-dirs: src
   exposed-modules:
     HpcCoverallsCmdLine,
     Trace.Hpc.Coveralls,
@@ -74,6 +73,7 @@
   hs-source-dirs: src
   main-is:        RunCabalTestMain.hs
   build-depends:
+    async >= 2.0.0.0,
     base < 5,
     process,
     regex-posix,
@@ -81,14 +81,11 @@
   ghc-options:    -Wall -fwarn-tabs
 
 test-suite test-all
-  hs-source-dirs: src, test
+  hs-source-dirs: test
   type:           exitcode-stdio-1.0
   main-is:        TestAll.hs
   build-depends:
-    aeson,
     base,
-    bytestring,
-    curl,
-    hpc,
+    hpc-coveralls,
     HUnit
   ghc-options:    -Wall
diff --git a/src/HpcCoverallsCmdLine.hs b/src/HpcCoverallsCmdLine.hs
--- a/src/HpcCoverallsCmdLine.hs
+++ b/src/HpcCoverallsCmdLine.hs
@@ -8,16 +8,16 @@
 import System.Console.CmdArgs
 
 data HpcCoverallsArgs = CmdMain
-    { excludeDirs   :: Maybe [String]
+    { excludeDirs   :: [String]
     , testSuites    :: [String]
     , displayReport :: Bool
     } deriving (Data, Show, Typeable)
 
 hpcCoverallsArgs :: HpcCoverallsArgs
 hpcCoverallsArgs = CmdMain
-    { excludeDirs   = Nothing &= explicit &= typDir &= name "exclude-dir"    &= help "Exclude sources files under the matching directory from the coverage report send to coveralls.io"
-    , displayReport = False   &= explicit           &= name "display-report" &= help "Display the json code coverage report that will be sent to coveralls.io"
-    , testSuites    = []                  &= typ "TEST-SUITE" &= args
+    { excludeDirs   = []    &= explicit &= typDir &= name "exclude-dir"    &= help "Exclude sources files under the matching directory from the coverage report send to coveralls.io"
+    , displayReport = False &= explicit           &= name "display-report" &= help "Display the json code coverage report that will be sent to coveralls.io"
+    , testSuites    = []                &= typ "TEST-SUITE" &= args
     } &= summary ("hpc-coveralls-" ++ versionString version ++ ", (C) Guillaume Nargeot 2014")
       &= program "hpc-coveralls"
     where versionString = intercalate "." . map show . versionBranch
diff --git a/src/HpcCoverallsMain.hs b/src/HpcCoverallsMain.hs
--- a/src/HpcCoverallsMain.hs
+++ b/src/HpcCoverallsMain.hs
@@ -36,10 +36,8 @@
 
 toConfig :: HpcCoverallsArgs -> Maybe Config
 toConfig hca = case testSuites hca of
-    [testSuite] -> case excludeDirs hca of
-        Nothing   -> Just $ Config [testSuite] []
-        Just dirs -> Just $ Config [testSuite] dirs
-    _ -> Nothing
+    [testSuite] -> Just $ Config [testSuite] (excludeDirs hca)
+    _           -> Nothing
 
 main :: IO ()
 main = do
diff --git a/src/RunCabalTestMain.hs b/src/RunCabalTestMain.hs
--- a/src/RunCabalTestMain.hs
+++ b/src/RunCabalTestMain.hs
@@ -1,9 +1,11 @@
 module Main where
 
+import Control.Concurrent.Async (Async, async, waitBoth)
 import Control.Monad
 import Data.List
 import Data.List.Split
 import GHC.IO.Handle
+import System.IO (hPutStrLn, stdout, stderr)
 import System.Exit (exitFailure, exitSuccess)
 import System.Environment (getArgs)
 import System.Process
@@ -15,23 +17,27 @@
 isTestFailure :: String -> Bool
 isTestFailure line = line =~ "^Test suite .*: FAIL$"
 
-readLines :: Handle -> IO [String]
-readLines h = do
-    isEOF <- hIsEOF h
+readLines :: Handle -> Handle -> IO [String]
+readLines hIn hOut = do
+    isEOF <- hIsEOF hIn
     if isEOF
         then return []
         else do
-            x <- hGetLine h
-            putStrLn x
-            xs <- readLines h
+            x <- hGetLine hIn
+            hPutStrLn hOut x
+            xs <- readLines hIn hOut
             return (x : xs)
 
+checkFailure :: Handle -> Handle -> IO (Async Bool)
+checkFailure hIn = async . liftM (not . any isTestFailure) . readLines hIn
+
 runCabalTest :: String -> [String] -> IO Bool
 runCabalTest cabalName args = do
     (_, out, err, _) <- runInteractiveCommand (cabalName ++ " test " ++ unwords args)
-    outResult <- liftM (not . any isTestFailure) (readLines out)
-    _ <- readLines err
-    return outResult
+    aOutResult <- checkFailure out stdout
+    aErrResult <- checkFailure err stderr
+    results <- waitBoth aOutResult aErrResult
+    return $ uncurry (&&) results
 
 getCabalName :: [String] -> Maybe String
 getCabalName [] = Just defaultCabalName
