diff --git a/ats-pkg.cabal b/ats-pkg.cabal
--- a/ats-pkg.cabal
+++ b/ats-pkg.cabal
@@ -1,5 +1,5 @@
 name:                ats-pkg
-version:             2.0.0.10
+version:             2.0.0.11
 synopsis:            Package manager for ATS
 description:         A collection of scripts to make building ATS projects easy.
 homepage:            https://github.com/vmchale/ats-pkg#readme
diff --git a/src/Language/ATS/Package/Build.hs b/src/Language/ATS/Package/Build.hs
--- a/src/Language/ATS/Package/Build.hs
+++ b/src/Language/ATS/Package/Build.hs
@@ -47,7 +47,7 @@
 -- | Build a set of targets
 build :: [String] -- ^ Targets
       -> IO ()
-build rs = bool (mkPkg [buildAll Nothing] rs) (mkPkg mempty rs) =<< check Nothing
+build rs = bool (mkPkg False [buildAll Nothing] rs) (mkPkg False mempty rs) =<< check Nothing
 
 -- TODO clean generated ATS
 mkClean :: Rules ()
@@ -108,22 +108,23 @@
         need tests
         mapM_ cmd_ tests
 
-options :: ShakeOptions
-options = shakeOptions { shakeFiles = ".atspkg"
-                       , shakeThreads = 4
-                       , shakeProgress = progressSimple
-                       , shakeLint = Just LintBasic
-                       , shakeColor = True
-                       , shakeVersion = showVersion version
-                       }
+options :: Bool -> ShakeOptions
+options rb = shakeOptions { shakeFiles = ".atspkg"
+                          , shakeThreads = 4
+                          , shakeProgress = progressSimple
+                          , shakeLint = Just LintBasic
+                          , shakeColor = True
+                          , shakeVersion = showVersion version
+                          , shakeRebuild = bool mempty [(RebuildNow, ".atspkg/config")] rb
+                          }
 
 cleanConfig :: (MonadIO m) => [String] -> m Pkg
 cleanConfig ["clean"] = pure undefined
 cleanConfig _         = getConfig Nothing
 
 -- TODO verbosity & coloring?
-mkPkg :: [IO ()] -> [String] -> IO ()
-mkPkg setup rs = shake options $
+mkPkg :: Bool -> [IO ()] -> [String] -> IO ()
+mkPkg rb setup rs = shake (options rb) $
     want rs >>
     mkClean >>
     (pkgToAction setup rs =<< cleanConfig rs)
diff --git a/src/Language/ATS/Package/Exec.hs b/src/Language/ATS/Package/Exec.hs
--- a/src/Language/ATS/Package/Exec.hs
+++ b/src/Language/ATS/Package/Exec.hs
@@ -54,6 +54,7 @@
         <> help "Targets to build"))
     <*> switch
         (long "no-cache"
+        <> short 'c'
         <> help "Turn off configuration caching")
 
 fetch :: Parser Command
@@ -75,7 +76,7 @@
     fetchDeps True mempty [Dependency lib dirName url' undefined] [] True
     ps <- getSubdirs p
     pkgDir <- fromMaybe p <$> findFile (p:ps) "atspkg.dhall"
-    let a = withCurrentDirectory (takeDirectory pkgDir) (mkPkg mempty ["install"])
+    let a = withCurrentDirectory (takeDirectory pkgDir) (mkPkg False mempty ["install"])
     bool (buildAll (Just pkgDir) >> a) a =<< check (Just pkgDir)
 
 exec :: IO ()
@@ -84,10 +85,13 @@
 run :: Command -> IO ()
 run Nuke = cleanAll
 run (Fetch u) = fetchPkg u
-run Clean = mkPkg mempty ["clean"]
-run c = bool (mkPkg [buildAll Nothing] rs) (mkPkg mempty rs) =<< check Nothing
+run Clean = mkPkg False mempty ["clean"]
+run c = bool (mkPkg rb [buildAll Nothing] rs) (mkPkg rb mempty rs) =<< check Nothing
     where rs = g c
           g Install      = ["install"]
           g (Build ts _) = ts
           g Test         = ["test"]
           g _            = undefined
+          rb = h c
+          h (Build _ True) = True
+          h _              = False
