diff --git a/HSH/Helpers/Email.hs b/HSH/Helpers/Email.hs
--- a/HSH/Helpers/Email.hs
+++ b/HSH/Helpers/Email.hs
@@ -1,10 +1,7 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
 module HSH.Helpers.Email where
 import HSH
 import HSH.Helpers.Utils
 import Text.StringTemplate.Helpers
-import System.IO.Error
 
 newtype PureInput = PureInput { unpureinput :: String }
   deriving (Read,Show)
@@ -19,19 +16,9 @@
 
   This assumes a unixy environment, 
 -}
---mailxEmail :: String -> String -> String -> IO (Either String ())
+mailxEmail :: String -> String -> [Char] -> IO (Either String ())
 mailxEmail emailBody subject "" = return . Left $ "no email recipient"
-mailxEmail emailBody subject recipient = do
-  etR <- try $ run $ echo emailBody -|- mailxCommand
-  case etR of
-    Left e -> return $ Left $ show e
-    Right okmsg -> return $ Right okmsg
+mailxEmail emailBody subject recipient = tryS $ runIO $ echo emailBody -|- mailxCommand
   where mailxCommand = render1 [("subject",subject),("recipient",recipient)]
                                "mailx -s \"$subject$\" $recipient$"
 
-
-t = do
-  etR <- mailxEmail "meh" "mah" "moo@gmail.com"
-  case etR of
-    Left e -> fail $ "error, e: " ++ e
-    Right () -> return "cool"
diff --git a/HSH/Helpers/FileManip.hs b/HSH/Helpers/FileManip.hs
--- a/HSH/Helpers/FileManip.hs
+++ b/HSH/Helpers/FileManip.hs
@@ -4,7 +4,6 @@
 import System.FilePath (takeDirectory)
 import qualified Data.ByteString.Char8 as B
 import HSH
-import HSH.Helpers.Utils
 import Text.StringTemplate.Helpers
 import HSH.Helpers.UnixUsers
 
@@ -26,7 +25,10 @@
 findDirectories :: FilePath -> IO [FilePath]
 findDirectories d = runStrings $ render1 [("d",d)] "find $d$ -type d"
 
-
+runS :: String -> IO String
+runS = run
+runStrings :: String -> IO [String]
+runStrings = ( return . lines =<< ) . run 
 
 -- I took this out because I don't like the behavior of doesFileExist when it comes to symlinks
 -- If  symlink exists, but it's to a directlry, this test is false
diff --git a/HSH/Helpers/Instances.hs b/HSH/Helpers/Instances.hs
--- a/HSH/Helpers/Instances.hs
+++ b/HSH/Helpers/Instances.hs
@@ -4,7 +4,7 @@
 import HSH
 import System.Exit
 import System.Posix.Process
-
+import System.Posix.Env
 instance RunResult (IO (Either String ()) ) where
     run cmd = checkResults =<< run cmd 
 
@@ -19,3 +19,25 @@
              return $ Left $ cmd ++ ": terminated by signal " ++ show sig
          Stopped sig ->
              return $ Left $ cmd ++ ": stopped by signal " ++ show sig
+
+-- Command where Change Working Directory specified at process level
+data CWDCommand = CWDCommand {cwdDir :: String,
+                              cwdCmd :: String}
+  deriving (Read,Show)
+
+instance ShellCommand CWDCommand where
+    fdInvoke (CWDCommand dir cmdline) ifd ofd closefd forkfunc =
+        do esh <- getEnv "SHELL"
+           let sh = case esh of
+                      Nothing -> "/bin/sh"
+                      Just x -> x
+           fdInvoke (sh, ["-c", "cd " ++ dir ++ "; " ++ cmdline]) ifd ofd closefd forkfunc
+
+-- | runCD dir command
+-- | useful alternative to bracketCD where bracketCD has the wrong behavior due to lazy IO
+-- | note, not a drop in replacement to bracketCD because you specify an actual shell command, not arbitrary IO
+runCD :: FilePath -> String -> IO ()
+runCD dir cmd = run (CWDCommand dir cmd)
+
+t :: IO ()
+t = run (CWDCommand "/tmp" "ls")
diff --git a/HSH/Helpers/Utils.hs b/HSH/Helpers/Utils.hs
--- a/HSH/Helpers/Utils.hs
+++ b/HSH/Helpers/Utils.hs
@@ -31,36 +31,3 @@
   return $ case etRes of
     Left e -> Left $ show e
     Right r -> Right r
-
-{- | Like tryEC in HSH, but doesn't attempt to parse error message, so all errors result in Left result type
-     and nothing gets re-raised via ioError -}
-{-
-tryECPromiscuous :: IO a -> IO (Either ProcessStatus a)
-tryECPromiscuous action =
-    do r <- try action
-       case r of
-         Left ioe ->
-          if isUserError ioe then
-              case (ioeGetErrorString ioe =~~ pat) of
-                Nothing -> ioError ioe -- not ours; re-raise it
-                Just e -> return . Left . proc $ e
-          else ioError ioe      -- not ours; re-raise it
-         Right result -> return (Right result)
-    where pat = ": exited with code [0-9]+$|: terminated by signal ([0-9]+)$|: stopped by signal [0-9]+"
-          proc :: String -> ProcessStatus
-          proc e
-              | e =~ "^: exited" = Exited (ExitFailure (str2ec e))
-              | e =~ "^: terminated by signal" = Terminated (str2ec e)
-              | e =~ "^: stopped by signal" = Stopped (str2ec e)
-              | otherwise = error "Internal error in tryEC"
-          str2ec e =
-              read (e =~ "[0-9]+$")
--}
-
--- | like HSH.runSL, but returns all output, not just the first line.
-runS :: String -> IO String
-runS = run
-
--- | like runS, but returns as list of lines
-runStrings :: String -> IO [String]
-runStrings = ( return . lines =<< ) . run 
diff --git a/HSHHelpers.cabal b/HSHHelpers.cabal
--- a/HSHHelpers.cabal
+++ b/HSHHelpers.cabal
@@ -1,5 +1,5 @@
 Name: HSHHelpers
-Version: 0.19
+Version: 0.20
 License: GPL
 License-file: gpl.txt
 Description: 
@@ -15,7 +15,7 @@
 Copyright: Copyright (c) 2008 Thomas Hartman
 Exposed-Modules: HSH.Helpers, HSH.Helpers.Instances, HSH.Helpers.UnixUsers, HSH.Helpers.FileManip, 
                  HSH.Helpers.Utils, HSH.Helpers.Email
-Build-Depends: base, HSH, unix, HStringTemplateHelpers, MissingH, regex-pcre, directory, bytestring, filepath, mtl,
+Build-Depends: base >= 0.4 && <5, HSH, unix, HStringTemplateHelpers, MissingH, regex-pcre, directory, bytestring, filepath, mtl,
                DebugTraceHelpers
 Category: System
 Build-type: Simple
