diff --git a/mole.cabal b/mole.cabal
--- a/mole.cabal
+++ b/mole.cabal
@@ -1,5 +1,5 @@
 name:                mole
-version:             0.0.6
+version:             0.0.7
 
 synopsis:            A glorified string replacement tool
 description:
@@ -49,7 +49,7 @@
      , Data.Mole.Watcher
 
     build-depends:
-       base >=4.6 && <4.11
+       base >=4.9 && <4.15
      , containers
      , bytestring
      , base64-bytestring
@@ -83,7 +83,7 @@
     type:                exitcode-stdio-1.0
 
     build-depends:
-       base >=4.6 && <4.11
+       base >=4.9 && <4.15
      , hspec
      , smallcheck
      , hspec-smallcheck
diff --git a/src/Data/Mole/Builder/Html.hs b/src/Data/Mole/Builder/Html.hs
--- a/src/Data/Mole/Builder/Html.hs
+++ b/src/Data/Mole/Builder/Html.hs
@@ -54,7 +54,7 @@
 
 extractStylesheetAssets :: Text -> [AssetId]
 extractStylesheetAssets v =
-    let Right tokens = tokenize v
+    let tokens = tokenize v
     in catMaybes $ (flip map) tokens $ \t ->
             case t of
                 (Url x) -> Just $ urlAssetId x
@@ -62,7 +62,7 @@
 
 renderStylesheetAssets :: Map AssetId PublicIdentifier -> Text -> Either Error Text
 renderStylesheetAssets m v = do
-    let Right tokens = tokenize v
+    let tokens = tokenize v
     newTokens <- forM tokens $ \t -> case t of
         (Url x) -> case M.lookup (urlAssetId x) m of
             Nothing -> Left (UndeclaredDependency (AssetId x))
diff --git a/src/Data/Mole/Builder/Internal/Template.hs b/src/Data/Mole/Builder/Internal/Template.hs
--- a/src/Data/Mole/Builder/Internal/Template.hs
+++ b/src/Data/Mole/Builder/Internal/Template.hs
@@ -11,7 +11,6 @@
 import qualified Data.Attoparsec.Text as AP
 
 import           Data.Maybe
-import           Data.Monoid
 import           Data.Mole.Types
 
 
diff --git a/src/Data/Mole/Builder/JavaScript.hs b/src/Data/Mole/Builder/JavaScript.hs
--- a/src/Data/Mole/Builder/JavaScript.hs
+++ b/src/Data/Mole/Builder/JavaScript.hs
@@ -8,7 +8,6 @@
 import           Data.Map (Map)
 
 import           Data.Maybe
-import           Data.Monoid
 
 import qualified Data.Text.IO       as T
 import qualified Data.Text.Encoding as T
diff --git a/src/Data/Mole/Builder/Stylesheet.hs b/src/Data/Mole/Builder/Stylesheet.hs
--- a/src/Data/Mole/Builder/Stylesheet.hs
+++ b/src/Data/Mole/Builder/Stylesheet.hs
@@ -45,7 +45,7 @@
 stylesheetBuilder src _ _ = do
     body <- T.readFile src
 
-    let Right tokens = tokenize body
+    let tokens = tokenize body
 
     return $ Builder
         { assetSources      = S.singleton src
diff --git a/src/Data/Mole/Core.hs b/src/Data/Mole/Core.hs
--- a/src/Data/Mole/Core.hs
+++ b/src/Data/Mole/Core.hs
@@ -16,7 +16,6 @@
 import qualified Data.Text as T
 
 import           Data.Maybe
-import           Data.Monoid
 import           Data.Time
 
 import           Data.Mole.Types
diff --git a/src/Data/Mole/Server.hs b/src/Data/Mole/Server.hs
--- a/src/Data/Mole/Server.hs
+++ b/src/Data/Mole/Server.hs
@@ -10,7 +10,6 @@
 import qualified Data.Text          as T
 import qualified Data.Text.Encoding as T
 
-import           Data.Monoid
 import           Data.Maybe
 import           Data.List (find)
 
diff --git a/src/Data/Mole/Watcher.hs b/src/Data/Mole/Watcher.hs
--- a/src/Data/Mole/Watcher.hs
+++ b/src/Data/Mole/Watcher.hs
@@ -55,6 +55,6 @@
 reverseDependencies h cwd p = do
     s <- atomically $ readTVar (state h)
     return $ catMaybes $ (flip map) (M.toList $ assets s) $ \(aId, ars) ->
-        if (S.member p $ S.map (\x -> cwd </> x) (arsSources ars))
+        if (S.member p $ S.map (\x -> normalise (cwd </> x)) (arsSources ars))
             then Just aId
             else Nothing
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -18,7 +18,6 @@
 import           Data.Text (Text)
 import qualified Data.Text as T
 
-import           Data.Monoid
 import           Data.List hiding (stripPrefix)
 
 import           Network.URI
@@ -69,11 +68,16 @@
     config <- mkConfig opt outputDir
     h <- newHandle config
 
-
     forM_ (entryPoints config) $ \aId ->
         markDirty h aId
 
     _ <- require h (S.fromList $ entryPoints config)
+
+    aids <- atomically $ do
+        s <- readTVar (state h)
+        let assetIds = M.keys $ M.filter (\ars -> case arsState ars of Completed _ -> True; Failed _ -> True; _ -> False) (M.restrictKeys (assets s) (S.fromList $ entryPoints config))
+        if length assetIds /= (length (entryPoints config)) then retry else pure assetIds
+
     atomically $ do
         e <- isEmptyTQueue (messages h)
         unless e retry
@@ -227,7 +231,7 @@
     v <- askText
     case T.splitOn "=" v of
         [aId, p] -> return $ ad aId $ PublicIdentifier p
-        _ -> fail "ASSET=DEFINITION"
+        _ -> lift $ throwE $ ErrorMsg "ASSET=DEFINITION"
 
   where
     ad aId p = case at of
@@ -260,7 +264,7 @@
         v <- askText
         case map T.unpack $ T.splitOn ":" v of
             (x:xs) -> return $ x:xs
-            _ -> fail "SEARCH:PATH:DIRS:..."
+            _ ->  lift $ throwE $ ErrorMsg "SEARCH:PATH:DIRS:..."
 
 
 withInfo :: Parser a -> String -> ParserInfo a
