diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,15 @@
 # Revision history for executor
 
+## 0.0.4  -- 2017-08-27
+
+* Add better unit test
+* Deprecate `execSync` and `execListSync` in favor of `exec` and `execSequenceSync`
+* Return IO (String) to display the result of the commands triggered
+
+## 0.0.3  -- 2017-08-20
+
+* Reducing unecessary code
+
 ## 0.0.2  -- 2017-08-20
 
 * Make the code a bit cleaner and consistent
diff --git a/Executor.hs b/Executor.hs
deleted file mode 100644
--- a/Executor.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module Executor (execSync, execListSync) where
-
-import System.Process (callCommand)
-import Control.Concurrent.Async (async, wait)
-
--- | Execute a single shell command
--- Not much different from callCommand though
--- for example:
--- main = do
---  execSync "ls"
-
-execSync :: String -> IO()
-
-execSync c = do
-  task <- async (callCommand c)
-  wait task
-
--- | Execute a list of shell commands in sequence synchronously
--- for example:
--- main = do
---  execListSync ["ls", "whoami"]
-
-execListSync :: [String] -> IO()
-
-execListSync commands = do mapM_ execSync commands
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -6,32 +6,34 @@
 
 # API
 
-## execSync
+## exec
 
-Execute a single shell command
+Execute a single shell command returning its output
 
 ```hs
-import Executor (execSync)
+import Executor (exec)
 
 main = do
   -- execute a simple `ls` in the current folder
-  execSync "ls"
+  res <- exec "echo hi"
+  -- hi\n
 ```
 
-## execListSync
+## execSequenceSync
 
-Execute a list of shell commands in sequence synchronously
+Execute a list of shell commands in sequence synchronously returning their results in a list
 
 ```hs
-import Executor (execListSync)
+import Executor (execSequenceSync)
 
 main = do
   -- execute synchronously the following commands
-  execListSync [
-      "ls",
-      "whoami",
-      "echo hello"
+  res <- execSequenceSync [
+      "echo hi",
+      "sleep 1",
+      "echo goodbye"
     ]
+  -- ["hi\n", "", "goodbye\n"]
 ```
 
 [travis-image]:https://img.shields.io/travis/GianlucaGuarini/executor.svg?style=flat-square
diff --git a/executor.cabal b/executor.cabal
--- a/executor.cabal
+++ b/executor.cabal
@@ -1,5 +1,5 @@
 name:                executor
-version:0.0.3
+version:0.0.4
 description:         Haskell module to execute single or multiple shell commands
 synopsis:            Shell helpers
 homepage:            https://github.com/GianlucaGuarini/executor
@@ -17,15 +17,20 @@
   type:              git
   location:          https://github.com/GianlucaGuarini/executor
 
-Test-Suite test-executor
+Test-Suite spec
   type:              exitcode-stdio-1.0
-  main-is:           test.hs
-  build-depends:     base >=4.9 && <4.10, process >=1.4 && <1.5, async >=2.1 && <2.2
   default-language:  Haskell2010
+  main-is:           test/Spec.hs
+  build-depends:     executor, base >=4.9 && <4.10, process >=1.4 && <1.5, async >=2.1 && <2.2, hspec >= 2.2
 
+Test-Suite doctest
+  type:              exitcode-stdio-1.0
+  default-language:  Haskell2010
+  main-is:           test/doctests.hs
+  build-depends:     executor, base, doctest >= 0.8.0
+
 library
   exposed-modules:   Executor
-  build-depends:     base >=4.9 && <4.10, process >=1.4 && <1.5, async >=2.1 && <2.2
-  hs-source-dirs:    ./
   default-language:  Haskell2010
-
+  build-depends:     base >=4.9 && <4.10, process >=1.4 && <1.5, async >=2.1 && <2.2
+  hs-source-dirs:    src
diff --git a/src/Executor.hs b/src/Executor.hs
new file mode 100644
--- /dev/null
+++ b/src/Executor.hs
@@ -0,0 +1,44 @@
+module Executor (execSync, exec, execSequenceSync, execListSync) where
+
+import System.Process (readProcess)
+
+-- | Simple split a string using a delimiter
+-- for example:
+-- split "foo bar" " " will return ["foo", "bar"]
+split' :: String -> Char -> [String]
+split' [] _ = [""]
+split' (c:cs) delimiter
+   | c == delimiter = "" : rest
+   | otherwise = (c : head rest) : tail rest
+   where
+       rest = split' cs delimiter
+
+
+-- | Alias for exec
+execSync :: String -> IO String
+execSync = exec
+-- | Alias for execSequenceSync
+execListSync :: [String] -> IO [String]
+execListSync = execSequenceSync
+
+-- | Execute a single shell command returning its output
+-- for example:
+--
+-- >>> execSync "echo hi"
+-- "hi\n"
+--
+exec :: String -> IO String
+exec c =  readProcess command arguments []
+            where
+              commandList = split' c ' '
+              command = head commandList
+              arguments = tail commandList
+
+-- | Execute a list of shell commands in sequence synchronously
+-- for example:
+--
+-- >>> execSequenceSync ["echo hi", "sleep 1", "echo goodbye"]
+-- ["hi\n","","goodbye\n"]
+--
+execSequenceSync :: [String] -> IO [String]
+execSequenceSync = mapM execSync
diff --git a/test.hs b/test.hs
deleted file mode 100644
--- a/test.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module Main where
-import Executor
-import System.Exit (exitSuccess)
-
-main = do
-  execSync "ls"
-  execListSync [
-      "echo hello",
-      "sleep 1",
-      "echo world"
-    ]
-  exitSuccess
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,13 @@
+module Main (main) where
+import Executor
+import Test.Hspec
+
+main :: IO ()
+main = hspec $ do
+  describe "Executor.execSync" $
+    it "It can execute a simple echo" $
+      exec "echo hi" `shouldReturn` "hi\n"
+
+  describe "Executor.execSequenceSync" $
+    it "It can execute a command sequence" $
+      execSequenceSync ["echo hi", "sleep 1", "echo goodbye"] `shouldReturn` ["hi\n", "", "goodbye\n"]
diff --git a/test/doctests.hs b/test/doctests.hs
new file mode 100644
--- /dev/null
+++ b/test/doctests.hs
@@ -0,0 +1,6 @@
+module Main where
+
+import Test.DocTest
+
+main :: IO ()
+main = doctest ["src/Executor.hs"]
