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.3.0.0
+version:             2.3.0.3
 synopsis:            A build tool for ATS
 description:         A collection of scripts to simplify building ATS projects.
 homepage:            https://github.com/vmchale/atspkg#readme
@@ -56,6 +56,7 @@
                      , unix
                      , lens
                      , dhall
+                     , ansi-wl-pprint
                      , shake-ats >= 1.3.0.0
                      , shake-ext >= 2.3.0.0
                      , composition-prelude >= 1.1.0.2
diff --git a/config.dhall b/config.dhall
--- a/config.dhall
+++ b/config.dhall
@@ -1,5 +1,6 @@
 let cfg = 
   { defaultPkgs = "https://raw.githubusercontent.com/vmchale/atspkg/master/pkgs/pkg-set.dhall"
+  , solverIters = 15
   }
 
 in cfg
diff --git a/man/atspkg.1 b/man/atspkg.1
--- a/man/atspkg.1
+++ b/man/atspkg.1
@@ -61,6 +61,11 @@
 Rebuild all binary targets.
 .RS
 .RE
+.TP
+.B \f[B]\-l\f[], \f[B]\-\-no\-lint\f[]
+Disable the shake linter
+.RS
+.RE
 .SH CONFIGURATION
 .PP
 \f[B]atspkg\f[] is configured with Dhall, in an atspkg.dhall file.
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
@@ -53,7 +53,7 @@
 build :: [String] -- ^ Targets
       -> IO ()
 build rs = bool (mkPkgEmpty [buildAll Nothing]) (mkPkgEmpty mempty) =<< check Nothing
-    where mkPkgEmpty ts = mkPkg False False ts rs Nothing 1
+    where mkPkgEmpty ts = mkPkg False False True ts rs Nothing 1
 
 -- TODO clean generated ATS
 mkClean :: Rules ()
@@ -124,11 +124,12 @@
 
 options :: Bool -- ^ Whether to rebuild config
         -> Bool -- ^ Whether to rebuild all targets
+        -> Bool -- ^ Whether to run the linter
         -> [String] -- ^ A list of targets
         -> ShakeOptions
-options rb rba rs = shakeOptions { shakeFiles = ".atspkg"
+options rb rba lint rs = shakeOptions { shakeFiles = ".atspkg"
                           , shakeThreads = 4
-                          , shakeLint = Just LintBasic
+                          , shakeLint = bool Nothing (Just LintBasic) lint
                           , shakeVersion = showVersion version
                           , shakeRebuild = foldMap g [ (rb, [(RebuildNow, ".atspkg/config")])
                                                      , (rba, (RebuildNow ,) <$> rs)
@@ -142,14 +143,15 @@
 
 mkPkg :: Bool -- ^ Whether to ignore cached package config
       -> Bool -- ^ Rebuild all targets
+      -> Bool -- ^ Run linter
       -> [IO ()] -- ^ Setup
       -> [String] -- ^ Targets
       -> Maybe String -- ^ Target triple
       -> Int -- ^ Verbosity
       -> IO ()
-mkPkg rb rba setup rs tgt _ = do
+mkPkg rb rba lint setup rs tgt _ = do
     cfg <- cleanConfig rs
-    let opt = options rb rba $ pkgToTargets cfg rs
+    let opt = options rb rba lint $ pkgToTargets cfg rs
     shake opt $
         mconcat
             [ want rs
diff --git a/src/Language/ATS/Package/Dependency.hs b/src/Language/ATS/Package/Dependency.hs
--- a/src/Language/ATS/Package/Dependency.hs
+++ b/src/Language/ATS/Package/Dependency.hs
@@ -34,11 +34,11 @@
           -> IO ()
 fetchDeps setup' deps cdeps b' =
     unless (null deps && null cdeps && b') $ do
-        deps' <- join <$> setBuildPlan "ats" deps
+        deps' <- join <$> setBuildPlan "ats" deps 15
         putStrLn "Checking ATS dependencies..."
         d <- (<> "lib/") <$> pkgHome
         let libs' = fmap (buildHelper False) deps'
-        cdeps' <- join <$> setBuildPlan "c" cdeps
+        cdeps' <- join <$> setBuildPlan "c" cdeps 4
         let unpacked = fmap (over dirLens (TL.pack d <>)) cdeps'
             clibs = fmap (buildHelper False) unpacked
         parallel_ (setup' ++ libs' ++ clibs)
diff --git a/src/Language/ATS/Package/Error.hs b/src/Language/ATS/Package/Error.hs
--- a/src/Language/ATS/Package/Error.hs
+++ b/src/Language/ATS/Package/Error.hs
@@ -5,6 +5,7 @@
                                   , resolutionFailed
                                   ) where
 
+import           Data.Dependency
 import           System.Exit
 import           Text.PrettyPrint.ANSI.Leijen
 
@@ -13,18 +14,18 @@
 unrecognized :: String -> IO a
 unrecognized = printErr . Unrecognized
 
-resolutionFailed :: IO a
-resolutionFailed = printErr ResolutionFailed
+resolutionFailed :: ResolveError -> IO a
+resolutionFailed = printErr . DepErr
 
 data PackageError = Unrecognized String
-                  | ResolutionFailed
+                  | DepErr ResolveError
 
 (<#>) :: Doc -> Doc -> Doc
 (<#>) a b = a <> line <> b
 
 instance Pretty PackageError where
     pretty (Unrecognized t) = red "Error:" <+> "Unrecognized archive format when unpacking" <#> hang 2 (text t)
-    pretty ResolutionFailed = red "Error:" <+> "Package resolution failed.\n"
+    pretty (DepErr d)       = pretty d
 
 -- TODO monaderror?
 printErr :: PackageError -> IO a
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
@@ -33,6 +33,7 @@
                      , _archTarget :: Maybe String
                      , _rebuildAll :: Bool
                      , _verbosity  :: Int
+                     , _lint       :: Bool
                      }
              | Clean
              | Test { _targets :: [String] }
@@ -87,7 +88,12 @@
         <> short 'r'
         <> help "Force rebuild of all targets")
     <*> (length <$>
-        many (flag' () (short 't' <> long "verbose")))
+        many (flag' () (short 't' <> long "verbose" <> help "Turn up verbosity")))
+    <*> fmap not
+        (switch
+        (long "no-lint"
+        <> short 'l'
+        <> help "Disable the shake linter"))
 
 fetch :: Parser Command
 fetch = Fetch <$>
@@ -101,25 +107,25 @@
     buildHelper True (ATSDependency lib dirName url' undefined mempty)
     ps <- getSubdirs p
     pkgDir <- fromMaybe p <$> findFile (p:ps) "atspkg.dhall"
-    let a = withCurrentDirectory (takeDirectory pkgDir) (mkPkg False False mempty ["install"] Nothing 0)
+    let a = withCurrentDirectory (takeDirectory pkgDir) (mkPkg False False False mempty ["install"] Nothing 0)
     bool (buildAll (Just pkgDir) >> a) a =<< check (Just pkgDir)
 
 exec :: IO ()
 exec = execParser wrapper >>= run
 
-runHelper :: Bool -> Bool -> [String] -> Maybe String -> Int -> IO ()
-runHelper rb rba rs tgt v = bool
-    (mkPkg rb rba [buildAll Nothing] rs tgt v)
-    (mkPkg rb rba mempty rs tgt v)
+runHelper :: Bool -> Bool -> Bool -> [String] -> Maybe String -> Int -> IO ()
+runHelper rb rba lint rs tgt v = bool
+    (mkPkg rb rba lint [buildAll Nothing] rs tgt v)
+    (mkPkg rb rba lint mempty rs tgt v)
     =<< check Nothing
 
 run :: Command -> IO ()
 run Upgrade = upgradeAtsPkg
 run Nuke = cleanAll
 run (Fetch u) = fetchPkg u
-run Clean = mkPkg False False mempty ["clean"] Nothing 0
-run (Build rs rb tgt rba v) = runHelper rb rba rs tgt v
-run c = runHelper False False rs Nothing 0
+run Clean = mkPkg False False False mempty ["clean"] Nothing 0
+run (Build rs rb tgt rba v lint) = runHelper rb rba lint rs tgt v
+run c = runHelper False False False rs Nothing 0
     where rs = g c
           g Install       = ["install"]
           g (Test  ts)    = "test" : ts
diff --git a/src/Language/ATS/Package/PackageSet.hs b/src/Language/ATS/Package/PackageSet.hs
--- a/src/Language/ATS/Package/PackageSet.hs
+++ b/src/Language/ATS/Package/PackageSet.hs
@@ -28,8 +28,9 @@
 
 setBuildPlan :: FilePath -- ^ Filepath for cache inside @.atspkg@
              -> [String] -- ^ Libraries we want
+             -> Int -- ^ Depth of search when resolving dependencies
              -> IO [[ATSDependency]]
-setBuildPlan p deps = do
+setBuildPlan p deps n  = do
     b <- doesFileExist depCache
     bool setBuildPlan' (decode <$> BSL.readFile depCache) b
 
@@ -37,16 +38,19 @@
           setBuildPlan' = do
             putStrLn "Resolving dependencies..."
             pkgSet <- input auto "https://raw.githubusercontent.com/vmchale/atspkg/master/pkgs/pkg-set.dhall"
-            case mkBuildPlan pkgSet deps of
-                Just x  -> createDirectoryIfMissing True ".atspkg" >> BSL.writeFile depCache (encode x) >> pure x
-                Nothing -> resolutionFailed
+            case mkBuildPlan pkgSet n deps of
+                Right x -> createDirectoryIfMissing True ".atspkg" >> BSL.writeFile depCache (encode x) >> pure x
+                Left x  -> resolutionFailed x
 
-mkBuildPlan :: ATSPackageSet -> [String] -> Maybe [[ATSDependency]]
-mkBuildPlan aps@(ATSPackageSet ps) = finalize . resolve . fmap asDep <=< stringBuildPlan
+mkBuildPlan :: ATSPackageSet -> Int -> [String] -> DepM [[ATSDependency]]
+mkBuildPlan aps@(ATSPackageSet ps) n = finalize . resolve . fmap asDep <=< stringBuildPlan
     where finalize = fmap (fmap (fmap (lookupVersions aps)))
-          resolve = resolveDependencies (atsPkgsToPkgs aps)
-          stringBuildPlan names = sequence [ lookup x libs | x <- names ]
+          resolve = resolveDependencies n (atsPkgsToPkgs aps)
+          stringBuildPlan names = sequence [ lookup' x libs | x <- names ]
               where libs = (TL.unpack . libName &&& id) <$> ps
+                    lookup' k vs = case lookup k vs of
+                        Just x  -> Right x
+                        Nothing -> Left (NotPresent k)
 
 asDep :: ATSDependency -> Dependency
 asDep ATSDependency{..} = Dependency (TL.unpack libName) mempty (TL.unpack <$> libDeps) libVersion
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -2,6 +2,7 @@
 resolver: lts-10.4
 packages:
   - '.'
+  - 'dependency'
 extra-deps:
   - shake-ext-2.3.0.0
   - shake-ats-1.3.0.6
@@ -9,7 +10,6 @@
   - language-ats-0.2.0.0
   - cli-setup-0.2.0.1
   - hs2ats-0.2.1.3
-  - dependency-0.1.0.3
   - ats-setup-0.3.0.2
 flags:
   ats-pkg:
