diff --git a/Shelly/Background.hs b/Shelly/Background.hs
--- a/Shelly/Background.hs
+++ b/Shelly/Background.hs
@@ -6,7 +6,7 @@
 
 import Shelly
 import Control.Concurrent
-import Control.Exception (finally, catch, throw, SomeException)
+import Control.Exception (finally, catch, throwIO, SomeException)
 import Prelude hiding (catch)
 import qualified Control.Concurrent.MSem as Sem
 
@@ -56,7 +56,7 @@
       result <-
         finally (
             (shelly $ (put state >> proc)) `catch`
-              (\(e::SomeException) -> throwTo mainTid e >> throw e)
+              (\(e::SomeException) -> throwTo mainTid e >> throwIO e)
           )
           (Sem.signal manager >> return ()) -- open a spot back up
       putMVar mvar result
diff --git a/shelly-extra.cabal b/shelly-extra.cabal
--- a/shelly-extra.cabal
+++ b/shelly-extra.cabal
@@ -1,6 +1,6 @@
 Name:       shelly-extra
 
-Version:     0.2.1
+Version:     0.2.2
 Synopsis:    shelly features that require extra dependencies
 
 Description: Please see the shelly package. Shelly provides a single module for convenient
@@ -37,7 +37,7 @@
     hs-source-dirs: ., test
     ghc-options: -Wall
 
-    Build-depends: base, text, shelly, SafeSemaphore
+    Build-depends: base, text, shelly, SafeSemaphore, HUnit
 
 source-repository head
   type:     git
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -5,29 +5,28 @@
 
 import Shelly
 import Shelly.Background
-import Data.Text.Lazy (Text)
+import Data.Text.Lazy (Text, stripEnd)
+import Test.HUnit
 default (Text)
 
--- smoke tests
-main :: IO ()
-main =
-  shelly $
-    -- verbosely $
-    do
-    jobs 2 $ \job -> do
-      _<- background job $ cmd "sleep" "2"
-      echo "immediate"
-      _<- background job $ cmd "sleep" "2"
-      echo "immediate2"
-      _<- background job $ cmd "sleep" "2"
-      echo "blocked by background "
- 
-    echo "blocked by jobs"
+shIOUnit :: ShIO ()
+shIOUnit = do
+  cmd "pwd"
+  chdir ".." $
+    cmd "pwd"
 
+main :: IO ()
+main = do
+  -- stdin
+  shelly $ do
     setStdin "in"
-    setStdin "override stdin"
-    run_ "cat" ["-"]
+    let overStdin = "override stdin"
+    setStdin overStdin
+    over <- run "cat" ["-"]
+    liftIO $ stripEnd over @?= overStdin
 
+  -- various uses of cmd
+  shelly $ do
     recho <- cmd "echo" "cmd"
     _<-cmd "echo" "bar" "baz"
     echo recho
@@ -38,4 +37,19 @@
 
     inspect =<< (cmd "echo" "compose" :: ShIO Text)
     inspect =<< (cmd "pwd")
+
+    -- this somehow forces more evaluation
+    shIOUnit
+
+  -- waiting on background jobs
+  shelly $ do
+    jobs 2 $ \job -> do
+      _<- background job $ cmd "sleep" "2"
+      echo "immediate"
+      _<- background job $ cmd "sleep" "2"
+      echo "immediate2"
+      _<- background job $ cmd "sleep" "2"
+      echo "blocked by background "
+ 
+    echo "blocked by jobs"
 
