diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,6 +1,46 @@
 # Changelog
 
 
+## v2.5.1
+
+**Changes since v2.3.3**
+
+Major changes:
+* Add the `snapshot-location-base` yaml configuration option, which allows to
+  override the default location of snapshot configuration files. This option
+  affects how snapshot synonyms (LTS/Nightly) are expanded to URLs by the
+  `pantry` library.
+* `docker-network` configuration key added to override docker `--net` arg
+
+Behavior changes:
+
+* File watching now takes into account specified targets, old behavior could
+  be restored using the new flag `--watch-all`
+  [#5310](https://github.com/commercialhaskell/stack/issues/5310)
+
+Other enhancements:
+
+* `stack ls dependencies json` now includes fields `sha256` and `size` for
+  dependencies of `type` `archive` in `location`.
+  [#5280](https://github.com/commercialhaskell/stack/issues/5280)
+* Build failures now show a hint to scroll up to the corresponding section
+  [#5279](https://github.com/commercialhaskell/stack/issues/5279)
+* Customisable output styles (see `stack --help` and the `--stack-colors`
+  option, and `stack ls stack-colors --help`) now include `info`, `debug`,
+  `other-level`, `secondary` and `highlight`, used with verbose output.
+
+Bug fixes:
+
+* Fix `stack test --coverage` when using Cabal 3
+* `stack new` now generates PascalCase'd module name correctly.
+  [#5376](https://github.com/commercialhaskell/stack/issues/5376)
+* Connection issues to Casa server no longer cause builds to failure. Casa acts
+  only as an optimizing cache layer, not a critical piece of infrastructure.
+* Fix modified time busting caches by always calculating sha256 digest during
+  the build process.
+  [#5125](https://github.com/commercialhaskell/stack/issues/5125)
+
+
 ## v2.3.3
 
 **Changes since v2.3.1**
@@ -95,7 +135,7 @@
   prefixes each build log output line with a timestamp.
 
 * Show warning about `local-programs-path` with spaces on windows
-  when running scripts. See 
+  when running scripts. See
   [#5013](https://github.com/commercialhaskell/stack/pull/5013)
 
 * Add `ls dependencies json` which will print dependencies as JSON.
diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md
--- a/doc/ChangeLog.md
+++ b/doc/ChangeLog.md
@@ -1,6 +1,46 @@
 # Changelog
 
 
+## v2.5.1
+
+**Changes since v2.3.3**
+
+Major changes:
+* Add the `snapshot-location-base` yaml configuration option, which allows to
+  override the default location of snapshot configuration files. This option
+  affects how snapshot synonyms (LTS/Nightly) are expanded to URLs by the
+  `pantry` library.
+* `docker-network` configuration key added to override docker `--net` arg
+
+Behavior changes:
+
+* File watching now takes into account specified targets, old behavior could
+  be restored using the new flag `--watch-all`
+  [#5310](https://github.com/commercialhaskell/stack/issues/5310)
+
+Other enhancements:
+
+* `stack ls dependencies json` now includes fields `sha256` and `size` for
+  dependencies of `type` `archive` in `location`.
+  [#5280](https://github.com/commercialhaskell/stack/issues/5280)
+* Build failures now show a hint to scroll up to the corresponding section
+  [#5279](https://github.com/commercialhaskell/stack/issues/5279)
+* Customisable output styles (see `stack --help` and the `--stack-colors`
+  option, and `stack ls stack-colors --help`) now include `info`, `debug`,
+  `other-level`, `secondary` and `highlight`, used with verbose output.
+
+Bug fixes:
+
+* Fix `stack test --coverage` when using Cabal 3
+* `stack new` now generates PascalCase'd module name correctly.
+  [#5376](https://github.com/commercialhaskell/stack/issues/5376)
+* Connection issues to Casa server no longer cause builds to failure. Casa acts
+  only as an optimizing cache layer, not a critical piece of infrastructure.
+* Fix modified time busting caches by always calculating sha256 digest during
+  the build process.
+  [#5125](https://github.com/commercialhaskell/stack/issues/5125)
+
+
 ## v2.3.3
 
 **Changes since v2.3.1**
@@ -95,7 +135,7 @@
   prefixes each build log output line with a timestamp.
 
 * Show warning about `local-programs-path` with spaces on windows
-  when running scripts. See 
+  when running scripts. See
   [#5013](https://github.com/commercialhaskell/stack/pull/5013)
 
 * Add `ls dependencies json` which will print dependencies as JSON.
diff --git a/doc/GUIDE.md b/doc/GUIDE.md
--- a/doc/GUIDE.md
+++ b/doc/GUIDE.md
@@ -450,7 +450,7 @@
 also known as *snapshots*. We mentioned the LTS resolvers, and you can get quite a bit of
 information about it at [https://www.stackage.org/lts](https://www.stackage.org/lts), including:
 
-* The appropriate resolver value (`resolver: lts-14.27`, as is currently the latest LTS)
+* The appropriate resolver value (`resolver: lts-16.15`, as is currently the latest LTS)
 * The GHC version used
 * A full list of all packages available in this snapshot
 * The ability to perform a Hoogle search on the packages in this snapshot
@@ -467,7 +467,7 @@
 
 ## Resolvers and changing your compiler version
 
-Let's explore package sets a bit further. Instead of lts-14.27, let's change our
+Let's explore package sets a bit further. Instead of lts-16.15, let's change our
 `stack.yaml` file to use [the latest nightly](https://www.stackage.org/nightly). Right now,
 this is currently 2020-03-24 - please see the resolve from the link above to get the latest.
 
@@ -483,8 +483,8 @@
 Continuous Integration (CI) setting, like on Travis. For example:
 
 ```
-michael@d30748af6d3d:~/helloworld$ stack --resolver lts-14.27 build
-Downloaded lts-14.27 build plan.
+michael@d30748af6d3d:~/helloworld$ stack --resolver lts-16.15 build
+Downloaded lts-16.15 build plan.
 # build output ...
 ```
 
@@ -1143,7 +1143,7 @@
 ```
 michael@d30748af6d3d:~$ stack exec --package stm -- echo I installed the stm package via --package stm
 Run from outside a project, using implicit global project config
-Using latest snapshot resolver: lts-14.27
+Using latest snapshot resolver: lts-16.15
 Writing global (non-project-specific) config file to: /home/michael/.stack/global/stack.yaml
 Note: You can change the snapshot via the resolver field there.
 I installed the stm package via --package stm
diff --git a/doc/README.md b/doc/README.md
--- a/doc/README.md
+++ b/doc/README.md
@@ -17,6 +17,9 @@
 
 #### How to install
 
+Stack can be installed on most Unix-like (Un*x) operating systems, including
+macOS, and on Windows.
+
 For most Un*x operating systems, the easiest way to install is to run:
 
     curl -sSL https://get.haskellstack.org/ | sh
diff --git a/doc/build_command.md b/doc/build_command.md
--- a/doc/build_command.md
+++ b/doc/build_command.md
@@ -157,7 +157,10 @@
 worth mentioning here since they compose well with the rest of the build system
 as described:
 
-* `--file-watch` will rebuild your project every time a file changes
+* `--file-watch` will rebuild your project every time a file changes, by default
+  it will take into account all files belonging to the targets you specify,
+  alternatively one could specify `--watch-all` which will make Stack watch
+  any local files (from project packages or from local dependencies)
 * `--exec "cmd [args]"` will run a command after a successful build
 
 To come back to the composable approach described above, consider this final
diff --git a/doc/docker_integration.md b/doc/docker_integration.md
--- a/doc/docker_integration.md
+++ b/doc/docker_integration.md
@@ -199,6 +199,10 @@
       # What to name the Docker container.  Only useful with `detach` or
       # `persist` true.  (default none)
       container-name: "example-name"
+      
+      # Sets the network used by docker. Gets directly passed to dockers `net`
+      # argument (default: host)
+      network: host
 
       # Additional arguments to pass to `docker run`.  (default none)
       run-args: ["--net=bridge"]
diff --git a/doc/install_and_upgrade.md b/doc/install_and_upgrade.md
--- a/doc/install_and_upgrade.md
+++ b/doc/install_and_upgrade.md
@@ -139,12 +139,8 @@
 
 Use the [generic Linux option](#linux).
 
-There is also an
-unofficial
-[Fedora Copr repo](https://copr.fedoraproject.org/coprs/petersen/stack2/) which
-can be enabled with: `sudo dnf copr enable petersen/stack2`. Note that this Stack
-version may lag behind, so we recommend running `stack upgrade` after installing
-it.
+Fedora includes builds of stack, but the version may lag behind,
+so we recommend running `stack upgrade` after installing it.
 
 ## <a name="suse"></a>openSUSE / SUSE Linux Enterprise
 
@@ -254,7 +250,7 @@
 
 * Ensure you have required system dependencies installed.  These include GCC, GNU make, xz, perl, libgmp, libffi, and zlib.  We also recommend Git and GPG.  To install these using your package manager:
     * Debian / Ubuntu: `sudo apt-get install g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg netbase`
-    * Fedora / CentOS: `sudo dnf install perl make automake gcc gmp-devel libffi zlib xz tar git gnupg` (use `yum` instead of `dnf` on CentOS and Fedora <= 21)
+    * Fedora / CentOS: `sudo dnf install perl make automake gcc gmp-devel libffi zlib zlib-devel xz tar git gnupg` (use `yum` instead of `dnf` on CentOS and Fedora <= 21)
         * Fedora 24: In order to use `stack setup` on a 32-bit system, you may
           need to run `sudo dnf install ncurses-compat-libs`. If this package is
           not installed, Stack may not be able to install 32-bit GHC versions.
diff --git a/doc/pantry.md b/doc/pantry.md
--- a/doc/pantry.md
+++ b/doc/pantry.md
@@ -25,8 +25,10 @@
 * Via a _convenience synonym_, which provides a short form for some
   common URLs. These are:
     * Github: `github:user/repo:path` is treated as `https://raw.githubusercontent.com/user/repo/master/path`
-    * LTS Haskell: `lts-X.Y` is treated as `github:commercialhaskell/stackage-snapshots:lts/X/Y.yaml`
-    * Stackage Nightly: `nightly-YYYY-MM-DD` is treated as `github:commercialhaskell/stackage-snapshots:nightly/YYYY/M/D.yaml`
+    * LTS Haskell: `lts-X.Y` is treated by default as `github:commercialhaskell/stackage-snapshots:lts/X/Y.yaml`
+    * Stackage Nightly: `nightly-YYYY-MM-DD` is treated by default as `github:commercialhaskell/stackage-snapshots:nightly/YYYY/M/D.yaml`
+
+By default, LTS Haskell/Stackage Nightly snapshot configurations are retrieved from `commercialhaskell`'s GitHub repository. You can set a custom location in the [snapshot-location-base](yaml_configuration.md#snapshot-location-base) yaml configuration field.
 
 For safer, more reproducible builds, you can optionally specify a URL
 together with a cryptographic hash of its content, e.g.:
diff --git a/doc/yaml_configuration.md b/doc/yaml_configuration.md
--- a/doc/yaml_configuration.md
+++ b/doc/yaml_configuration.md
@@ -614,7 +614,7 @@
 * `integersimple`: Use a GHC bindist that uses
   [integer-simple instead of GMP](https://ghc.haskell.org/trac/ghc/wiki/ReplacingGMPNotes)
 * any other value: Use a custom GHC bindist. You should specify
-  [setup-info](#setup-info) or [setup-info-locations](#setup-info-locations) 
+  [setup-info](#setup-info) or [setup-info-locations](#setup-info-locations)
   so `stack setup` knows where to download it,
   or pass the `stack setup --ghc-bindist` argument on the command-line
 
@@ -1143,11 +1143,12 @@
 terminal theme might wish to set the styles as follows:
 
 ```yaml
-stack-colors: error=31:good=32:shell=35:dir=34:recommendation=32:target=95:module=35:package-component=95
+stack-colors: error=31:good=32:shell=35:dir=34:recommendation=32:target=95:module=35:package-component=95:secondary=92:highlight=32
 ```
 The styles can also be set at the command line using the equivalent `--stack-colors=<STYLES>`
 global option. Styles set at the command line take precedence over those set in
-a yaml configuration file.
+a yaml configuration file. (In respect of styles used in verbose output, some of
+that output occurs before the configuration file is processed.)
 
 (The British English spelling (colour) is also accepted. In yaml configuration
 files, the American spelling is the alternative that has priority.)
@@ -1197,3 +1198,19 @@
 ```
 
 Since 2.3.3
+
+### snapshot-location-base
+Sets the base location of LTS Haskell/Stackage Nightly snapshots. Default is https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/ (as set in the `pantry` library).
+
+For example:
+```yaml
+snapshot-location-base: https://example.com/snapshots/location/
+```
+has the following effect:
+* `lts-X.Y` expands to `https://example.com/snapshots/location/lts/X/Y.yaml`
+* `nightly-YYYY-MM-DD` expands to `https://example.com/snapshots/location/nightly/YYYY/M/D.yaml`
+
+This field is convenient in setups that restrict access to GitHub, for instance closed corporate setups. In this setting, it is common for the development environment to have general access to the internet, but not for testing/building environments. To avoid the firewall, one can run a local snapshots mirror and then use a custom `snapshot-location-base` in the closed environments only.
+
+
+Since 2.5.0
diff --git a/src/Stack/Build.hs b/src/Stack/Build.hs
--- a/src/Stack/Build.hs
+++ b/src/Stack/Build.hs
@@ -68,11 +68,22 @@
 
     checkSubLibraryDependencies (Map.elems $ smProject sourceMap)
 
+    boptsCli <- view $ envConfigL.to envConfigBuildOptsCLI
     -- Set local files, necessary for file watching
     stackYaml <- view stackYamlL
     for_ msetLocalFiles $ \setLocalFiles -> do
-      files <- sequence
-        [lpFiles lp | lp <- allLocals]
+      files <-
+        if boptsCLIWatchAll boptsCli
+        then sequence [lpFiles lp | lp <- allLocals]
+        else forM allLocals $ \lp -> do
+          let pn = packageName (lpPackage lp)
+          case Map.lookup pn (smtTargets $ smTargets sourceMap) of
+            Nothing ->
+              pure Set.empty
+            Just (TargetAll _) ->
+              lpFiles lp
+            Just (TargetComps components) ->
+              lpFilesForComponents components lp
       liftIO $ setLocalFiles $ Set.insert stackYaml $ Set.unions files
 
     checkComponentsBuildable allLocals
@@ -81,7 +92,6 @@
     (installedMap, globalDumpPkgs, snapshotDumpPkgs, localDumpPkgs) <-
         getInstalled installMap
 
-    boptsCli <- view $ envConfigL.to envConfigBuildOptsCLI
     baseConfigOpts <- mkBaseConfigOpts boptsCli
     plan <- constructPlan baseConfigOpts localDumpPkgs loadPackage sourceMap installedMap (boptsCLIInitialBuildSteps boptsCli)
 
diff --git a/src/Stack/Build/Execute.hs b/src/Stack/Build/Execute.hs
--- a/src/Stack/Build/Execute.hs
+++ b/src/Stack/Build/Execute.hs
@@ -59,7 +59,6 @@
 import           Distribution.Types.PackageName (mkPackageName)
 import           Distribution.Types.UnqualComponentName (mkUnqualComponentName)
 import           Distribution.Version (mkVersion)
-import           Foreign.C.Types (CTime)
 import           Path
 import           Path.CheckInstall
 import           Path.Extra (toFilePathNoTrailingSep, rejectMissingFile)
@@ -91,7 +90,6 @@
 import qualified System.FilePath as FP
 import           System.IO.Error (isDoesNotExistError)
 import           System.PosixCompat.Files (createLink, modificationTime, getFileStatus)
-import           System.PosixCompat.Time (epochTime)
 import           RIO.PrettyPrint
 import           RIO.Process
 import           Pantry.Internal.Companion
@@ -1601,11 +1599,10 @@
 
         -- FIXME: only output these if they're in the build plan.
 
-        preBuildTime <- liftIO epochTime
         let postBuildCheck _succeeded = do
                 mlocalWarnings <- case taskType of
                     TTLocalMutable lp -> do
-                        warnings <- checkForUnlistedFiles taskType preBuildTime pkgDir
+                        warnings <- checkForUnlistedFiles taskType pkgDir
                         -- TODO: Perhaps only emit these warnings for non extra-dep?
                         return (Just (lpCabalFile lp, warnings))
                     _ -> return Nothing
@@ -1829,12 +1826,11 @@
         file = T.unpack name
 
 -- | Check if any unlisted files have been found, and add them to the build cache.
-checkForUnlistedFiles :: HasEnvConfig env => TaskType -> CTime -> Path Abs Dir -> RIO env [PackageWarning]
-checkForUnlistedFiles (TTLocalMutable lp) preBuildTime pkgDir = do
+checkForUnlistedFiles :: HasEnvConfig env => TaskType -> Path Abs Dir -> RIO env [PackageWarning]
+checkForUnlistedFiles (TTLocalMutable lp) pkgDir = do
     caches <- runMemoizedWith $ lpNewBuildCaches lp
     (addBuildCache,warnings) <-
         addUnlistedToBuildCache
-            preBuildTime
             (lpPackage lp)
             (lpCabalFile lp)
             (lpComponents lp)
@@ -1844,7 +1840,7 @@
         writeBuildCache pkgDir component $
             Map.unions (cache : newToCache)
     return warnings
-checkForUnlistedFiles TTRemotePackage{} _ _ = return []
+checkForUnlistedFiles TTRemotePackage{} _ = return []
 
 -- | Implements running a package's tests. Also handles producing
 -- coverage reports if coverage is enabled.
diff --git a/src/Stack/Build/Source.hs b/src/Stack/Build/Source.hs
--- a/src/Stack/Build/Source.hs
+++ b/src/Stack/Build/Source.hs
@@ -19,16 +19,13 @@
 
 import              Stack.Prelude
 import qualified    Pantry.SHA256 as SHA256
-import qualified    Data.ByteString as S
 import              Data.ByteString.Builder (toLazyByteString)
 import              Conduit (ZipSink (..), withSourceFile)
-import qualified    Data.Conduit.List as CL
 import qualified    Distribution.PackageDescription as C
 import              Data.List
 import qualified    Data.Map as Map
 import qualified    Data.Map.Strict as M
 import qualified    Data.Set as Set
-import              Foreign.C.Types (CTime)
 import              Stack.Build.Cache
 import              Stack.Build.Haddock (shouldHaddockDeps)
 import              Stack.Build.Target
@@ -41,7 +38,6 @@
 import              Stack.Types.SourceMap
 import              System.FilePath (takeFileName)
 import              System.IO.Error (isDoesNotExistError)
-import              System.PosixCompat.Files (modificationTime, getFileStatus)
 
 -- | loads and returns project packages
 projectLocalPackages :: HasEnvConfig env
@@ -406,46 +402,38 @@
                 -> m (Set FilePath, Map FilePath FileCacheInfo)
 checkBuildCache oldCache files = do
     fileTimes <- liftM Map.fromList $ forM files $ \fp -> do
-        mmodTime <- liftIO (getModTimeMaybe (toFilePath fp))
-        return (toFilePath fp, mmodTime)
+        mdigest <- liftIO (getFileDigestMaybe (toFilePath fp))
+        return (toFilePath fp, mdigest)
     liftM (mconcat . Map.elems) $ sequence $
         Map.mergeWithKey
-            (\fp mmodTime fci -> Just (go fp mmodTime (Just fci)))
-            (Map.mapWithKey (\fp mmodTime -> go fp mmodTime Nothing))
+            (\fp mdigest fci -> Just (go fp mdigest (Just fci)))
+            (Map.mapWithKey (\fp mdigest -> go fp mdigest Nothing))
             (Map.mapWithKey (\fp fci -> go fp Nothing (Just fci)))
             fileTimes
             oldCache
   where
-    go :: FilePath -> Maybe CTime -> Maybe FileCacheInfo -> m (Set FilePath, Map FilePath FileCacheInfo)
+    go :: FilePath -> Maybe SHA256 -> Maybe FileCacheInfo -> m (Set FilePath, Map FilePath FileCacheInfo)
     -- Filter out the cabal_macros file to avoid spurious recompilations
     go fp _ _ | takeFileName fp == "cabal_macros.h" = return (Set.empty, Map.empty)
     -- Common case where it's in the cache and on the filesystem.
-    go fp (Just modTime') (Just fci)
-        | fciModTime fci == modTime' = return (Set.empty, Map.singleton fp fci)
-        | otherwise = do
-            newFci <- calcFci modTime' fp
-            let isDirty =
-                    fciSize fci /= fciSize newFci ||
-                    fciHash fci /= fciHash newFci
-                newDirty = if isDirty then Set.singleton fp else Set.empty
-            return (newDirty, Map.singleton fp newFci)
+    go fp (Just digest') (Just fci)
+        | fciHash fci == digest' = return (Set.empty, Map.singleton fp fci)
+        | otherwise = return (Set.singleton fp, Map.singleton fp $ FileCacheInfo digest')
     -- Missing file. Add it to dirty files, but no FileCacheInfo.
     go fp Nothing _ = return (Set.singleton fp, Map.empty)
     -- Missing cache. Add it to dirty files and compute FileCacheInfo.
-    go fp (Just modTime') Nothing = do
-        newFci <- calcFci modTime' fp
-        return (Set.singleton fp, Map.singleton fp newFci)
+    go fp (Just digest') Nothing =
+        return (Set.singleton fp, Map.singleton fp $ FileCacheInfo digest')
 
 -- | Returns entries to add to the build cache for any newly found unlisted modules
 addUnlistedToBuildCache
     :: HasEnvConfig env
-    => CTime
-    -> Package
+    => Package
     -> Path Abs File
     -> Set NamedComponent
     -> Map NamedComponent (Map FilePath a)
     -> RIO env (Map NamedComponent [Map FilePath FileCacheInfo], [PackageWarning])
-addUnlistedToBuildCache preBuildTime pkg cabalFP nonLibComponents buildCaches = do
+addUnlistedToBuildCache pkg cabalFP nonLibComponents buildCaches = do
     (componentFiles, warnings) <- getPackageFilesForTargets pkg cabalFP nonLibComponents
     results <- forM (M.toList componentFiles) $ \(component, files) -> do
         let buildCache = M.findWithDefault M.empty component buildCaches
@@ -457,13 +445,10 @@
     return (M.fromList (map fst results), concatMap snd results)
   where
     addFileToCache fp = do
-        mmodTime <- getModTimeMaybe fp
-        case mmodTime of
+        mdigest <- getFileDigestMaybe fp
+        case mdigest of
             Nothing -> return Map.empty
-            Just modTime' ->
-                if modTime' < preBuildTime
-                    then Map.singleton fp <$> calcFci modTime' fp
-                    else return Map.empty
+            Just digest' -> return . Map.singleton fp $ FileCacheInfo digest'
 
 -- | Gets list of Paths for files relevant to a set of components in a package.
 --   Note that the library component, if any, is always automatically added to the
@@ -484,34 +469,18 @@
                 M.filterWithKey (\component _ -> component `elem` components) compFiles
     return (componentsFiles, warnings)
 
--- | Get file modification time, if it exists.
-getModTimeMaybe :: MonadIO m => FilePath -> m (Maybe CTime)
-getModTimeMaybe fp =
+-- | Get file digest, if it exists
+getFileDigestMaybe :: MonadIO m => FilePath -> m (Maybe SHA256)
+getFileDigestMaybe fp = do
     liftIO
         (catch
-             (liftM
-                  (Just . modificationTime)
-                  (getFileStatus fp))
+             (liftM Just . withSourceFile fp $ getDigest)
              (\e ->
                    if isDoesNotExistError e
                        then return Nothing
                        else throwM e))
-
--- | Create FileCacheInfo for a file.
-calcFci :: MonadIO m => CTime -> FilePath -> m FileCacheInfo
-calcFci modTime' fp = liftIO $
-    withSourceFile fp $ \src -> do
-        (size, digest) <- runConduit $ src .| getZipSink
-            ((,)
-                <$> ZipSink (CL.fold
-                    (\x y -> x + fromIntegral (S.length y))
-                    0)
-                <*> ZipSink SHA256.sinkHash)
-        return FileCacheInfo
-            { fciModTime = modTime'
-            , fciSize = FileSize size
-            , fciHash = digest
-            }
+  where
+    getDigest src = runConduit $ src .| getZipSink (ZipSink SHA256.sinkHash)
 
 -- | Get 'PackageConfig' for package given its name.
 getPackageConfig
diff --git a/src/Stack/BuildPlan.hs b/src/Stack/BuildPlan.hs
--- a/src/Stack/BuildPlan.hs
+++ b/src/Stack/BuildPlan.hs
@@ -45,7 +45,6 @@
 import           Stack.Types.Version
 import           Stack.Types.Config
 import           Stack.Types.Compiler
-import           Stack.Types.Resolver
 
 data BuildPlanException
     = UnknownPackages
@@ -62,7 +61,7 @@
         , "Non existing resolver: " ++ snapName' ++ "."
         , "For a complete list of available snapshots see https://www.stackage.org/snapshots"
         ]
-        where snapName' = show $ renderSnapName snapName
+        where snapName' = show snapName
     show (UnknownPackages stackYaml unknown shadowed) =
         unlines $ unknown' ++ shadowed'
       where
@@ -387,9 +386,7 @@
     logInfo $ "Selecting the best among "
                <> displayShow (NonEmpty.length snaps)
                <> " snapshots...\n"
-    let resolverStackage (LTS x y) = ltsSnapshotLocation x y
-        resolverStackage (Nightly d) = nightlySnapshotLocation d
-    F.foldr1 go (NonEmpty.map (getResult . resolverStackage) snaps)
+    F.foldr1 go (NonEmpty.map (getResult <=< snapshotLocation) snaps)
     where
         go mold mnew = do
             old@(_snap, _loc, bpc) <- mold
diff --git a/src/Stack/Config.hs b/src/Stack/Config.hs
--- a/src/Stack/Config.hs
+++ b/src/Stack/Config.hs
@@ -30,11 +30,13 @@
   ,defaultConfigYaml
   ,getProjectConfig
   ,withBuildConfig
+  ,withNewLogFunc
   ) where
 
 import           Control.Monad.Extra (firstJustM)
 import           Stack.Prelude
 import           Pantry.Internal.AesonExtended
+import           Data.Array.IArray ((!), (//))
 import qualified Data.ByteString as S
 import           Data.ByteString.Builder (byteString)
 import           Data.Coerce (coerce)
@@ -51,7 +53,7 @@
 import           GHC.Conc (getNumProcessors)
 import           Lens.Micro ((.~))
 import           Network.HTTP.StackClient (httpJSON, parseUrlThrow, getResponseBody)
-import           Options.Applicative (Parser, strOption, long, help)
+import           Options.Applicative (Parser, help, long, metavar, strOption)
 import           Path
 import           Path.Extra (toFilePathNoTrailingSep)
 import           Path.Find (findInParents)
@@ -74,14 +76,18 @@
 import           Stack.Types.Resolver
 import           Stack.Types.SourceMap
 import           Stack.Types.Version
-import           System.Console.ANSI (hSupportsANSIWithoutEmulation)
+import           System.Console.ANSI (hSupportsANSIWithoutEmulation, setSGRCode)
 import           System.Environment
 import           System.Info.ShortPathName (getShortPathName)
 import           System.PosixCompat.Files (fileOwner, getFileStatus)
 import           System.PosixCompat.User (getEffectiveUserID)
 import           RIO.List (unzip)
-import           RIO.PrettyPrint (stylesUpdateL, useColorL)
+import           RIO.PrettyPrint (Style (Highlight, Secondary),
+                   logLevelToStyle, stylesUpdateL, useColorL)
+import           RIO.PrettyPrint.StylesUpdate (StylesUpdate (..))
+import           RIO.PrettyPrint.DefaultStyles (defaultStyles)
 import           RIO.Process
+import           RIO.Time (toGregorian)
 
 -- | If deprecated path exists, use it and print a warning.
 -- Otherwise, return the new path.
@@ -155,18 +161,18 @@
                 iopc <- loadConfigYaml (parseProjectAndConfigMonoid (parent fp)) fp
                 ProjectAndConfigMonoid project _ <- liftIO iopc
                 return $ projectResolver project
-            ARLatestNightly -> nightlySnapshotLocation . snapshotsNightly <$> getSnapshots
+            ARLatestNightly -> RSLSynonym . Nightly . snapshotsNightly <$> getSnapshots
             ARLatestLTSMajor x -> do
                 snapshots <- getSnapshots
                 case IntMap.lookup x $ snapshotsLts snapshots of
                     Nothing -> throwString $ "No LTS release found with major version " ++ show x
-                    Just y -> return $ ltsSnapshotLocation x y
+                    Just y -> return $ RSLSynonym $ LTS x y
             ARLatestLTS -> do
                 snapshots <- getSnapshots
                 if IntMap.null $ snapshotsLts snapshots
                    then throwString "No LTS releases found"
                    else let (x, y) = IntMap.findMax $ snapshotsLts snapshots
-                        in return $ ltsSnapshotLocation x y
+                        in return $ RSLSynonym $ LTS x y
     logInfo $ "Selected resolver: " <> display r
     return r
 
@@ -174,9 +180,9 @@
 getLatestResolver :: HasConfig env => RIO env RawSnapshotLocation
 getLatestResolver = do
     snapshots <- getSnapshots
-    let mlts = uncurry ltsSnapshotLocation <$>
+    let mlts = uncurry LTS <$>
                listToMaybe (reverse (IntMap.toList (snapshotsLts snapshots)))
-    pure $ fromMaybe (nightlySnapshotLocation (snapshotsNightly snapshots)) mlts
+    pure $ RSLSynonym $ fromMaybe (Nightly (snapshotsNightly snapshots)) mlts
 
 -- Interprets ConfigMonoid options.
 configFromConfigMonoid
@@ -353,10 +359,12 @@
                 ColorNever  -> False
                 ColorAlways -> True
                 ColorAuto  -> useAnsi
-         configRunner = configRunner'
-             & processContextL .~ origEnv
-             & stylesUpdateL .~ stylesUpdate'
-             & useColorL .~ fromMaybe useColor' mUseColor
+         useColor'' = fromMaybe useColor' mUseColor
+         configRunner'' = configRunner'
+               & processContextL .~ origEnv
+               & stylesUpdateL .~ stylesUpdate'
+               & useColorL .~ useColor''
+         go = runnerGlobalOpts configRunner'
 
      hsc <-
        case getFirst configMonoidPackageIndices of
@@ -372,19 +380,73 @@
              Just x -> pure x
          Nothing -> pure $ configStackRoot </> relDirPantry
 
+     let snapLoc =
+            case getFirst configMonoidSnapshotLocation of
+                Nothing -> defaultSnapshotLocation
+                Just addr -> customSnapshotLocation
+                                where
+                    customSnapshotLocation (LTS x y) =
+                        mkRSLUrl $ addr'
+                            <> "/lts/" <> display x
+                            <> "/" <> display y <> ".yaml"
+                    customSnapshotLocation (Nightly date) =
+                        let (year, month, day) = toGregorian date
+                        in mkRSLUrl $ addr'
+                            <> "/nightly/"
+                            <> display year
+                            <> "/" <> display month
+                            <> "/" <> display day <> ".yaml"
+                    mkRSLUrl builder = RSLUrl (utf8BuilderToText builder) Nothing
+                    addr' = display $ T.dropWhileEnd (=='/') addr
+
      let configStackDeveloperMode = fromFirst stackDeveloperModeDefault configMonoidStackDeveloperMode
 
-     withPantryConfig
-       pantryRoot
-       hsc
-       (maybe HpackBundled HpackCommand $ getFirst configMonoidOverrideHpack)
-       clConnectionCount
-       (fromFirst defaultCasaRepoPrefix configMonoidCasaRepoPrefix)
-       defaultCasaMaxPerRequest
-       (\configPantryConfig -> initUserStorage
-         (configStackRoot </> relFileStorage)
-         (\configUserStorage -> inner Config {..}))
+     withNewLogFunc go useColor'' stylesUpdate' $ \logFunc -> do
+       let configRunner = configRunner'' & logFuncL .~ logFunc
+       withLocalLogFunc logFunc $ withPantryConfig
+         pantryRoot
+         hsc
+         (maybe HpackBundled HpackCommand $ getFirst configMonoidOverrideHpack)
+         clConnectionCount
+         (fromFirst defaultCasaRepoPrefix configMonoidCasaRepoPrefix)
+         defaultCasaMaxPerRequest
+         snapLoc
+         (\configPantryConfig -> initUserStorage
+           (configStackRoot </> relFileStorage)
+           (\configUserStorage -> inner Config {..}))
 
+-- | Runs the provided action with the given 'LogFunc' in the environment
+withLocalLogFunc :: HasLogFunc env => LogFunc -> RIO env a -> RIO env a
+withLocalLogFunc logFunc = local (set logFuncL logFunc)
+
+-- | Runs the provided action with a new 'LogFunc', given a 'StylesUpdate'.
+withNewLogFunc :: MonadUnliftIO m
+               => GlobalOpts
+               -> Bool  -- ^ Use color
+               -> StylesUpdate
+               -> (LogFunc -> m a)
+               -> m a
+withNewLogFunc go useColor (StylesUpdate update) inner = do
+  logOptions0 <- logOptionsHandle stderr False
+  let logOptions
+        = setLogUseColor useColor
+        $ setLogLevelColors logLevelColors
+        $ setLogSecondaryColor secondaryColor
+        $ setLogAccentColors (const highlightColor)
+        $ setLogUseTime (globalTimeInLog go)
+        $ setLogMinLevel (globalLogLevel go)
+        $ setLogVerboseFormat (globalLogLevel go <= LevelDebug)
+        $ setLogTerminal (globalTerminal go)
+          logOptions0
+  withLogFunc logOptions inner
+ where
+  styles = defaultStyles // update
+  logLevelColors :: LogLevel -> Utf8Builder
+  logLevelColors level =
+    fromString $ setSGRCode $ snd $ styles ! logLevelToStyle level
+  secondaryColor = fromString $ setSGRCode $ snd $ styles ! Secondary
+  highlightColor = fromString $ setSGRCode $ snd $ styles ! Highlight
+
 -- | Get the default location of the local programs directory.
 getDefaultLocalProgramsBase :: MonadThrow m
                             => Path Abs Dir
@@ -886,7 +948,10 @@
     return path
 
 packagesParser :: Parser [String]
-packagesParser = many (strOption (long "package" <> help "Additional packages that must be installed"))
+packagesParser = many (strOption
+                   (long "package" <>
+                     metavar "PACKAGE(S)" <>
+                     help "Additional package(s) that must be installed"))
 
 defaultConfigYaml :: IsString s => s
 defaultConfigYaml =
diff --git a/src/Stack/Config/Docker.hs b/src/Stack/Config/Docker.hs
--- a/src/Stack/Config/Docker.hs
+++ b/src/Stack/Config/Docker.hs
@@ -8,7 +8,6 @@
 import           Stack.Prelude
 import           Data.List (find)
 import qualified Data.Text as T
-import           Data.Text.Read (decimal)
 import           Distribution.Version (simplifyVersionRange)
 import           Stack.Types.Version
 import           Stack.Types.Config
@@ -24,22 +23,14 @@
   -> m String
 addDefaultTag base mproject maresolver = do
   let exc = throwM $ ResolverNotSupportedException mproject maresolver
-      onUrl url = maybe exc pure $ do
-        (x, y) <- parseLtsName url
-        Just $ concat
-          [ base
-          , ":lts-"
-          , show x
-          , "."
-          , show y
-          ]
-  case maresolver of
-    Just (ARResolver (RSLUrl url _)) -> onUrl url
+  lts <- case maresolver of
+    Just (ARResolver (RSLSynonym lts@(LTS _ _))) -> return lts
     Just _aresolver -> exc
     Nothing ->
       case projectResolver <$> mproject of
-        Just (RSLUrl url _) -> onUrl url
+        Just (RSLSynonym lts@(LTS _ _)) -> return lts
         _ -> exc
+  return $ base ++ ":" ++ show lts
 
 -- | Interprets DockerOptsMonoid options.
 dockerOptsFromMonoid
@@ -70,6 +61,7 @@
         dockerDetach = fromFirstFalse dockerMonoidDetach
         dockerPersist = fromFirstFalse dockerMonoidPersist
         dockerContainerName = emptyToNothing (getFirst dockerMonoidContainerName)
+        dockerNetwork = emptyToNothing (getFirst dockerMonoidNetwork)
         dockerRunArgs = dockerMonoidRunArgs
         dockerMount = dockerMonoidMount
         dockerMountMode = emptyToNothing (getFirst dockerMonoidMountMode)
@@ -105,14 +97,3 @@
             , "\nUse an LTS resolver, or set the '"
             , T.unpack dockerImageArgName
             , "' explicitly, in your configuration file."]
-
--- | Parse an LTS major and minor number from a snapshot URL.
---
--- This might make more sense in pantry instead.
-parseLtsName :: Text -> Maybe (Int, Int)
-parseLtsName t0 = do
-  t1 <- T.stripPrefix "https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/" t0
-  Right (x, t2) <- Just $ decimal t1
-  t3 <- T.stripPrefix "/" t2
-  Right (y, ".yaml") <- Just $ decimal t3
-  Just (x, y)
diff --git a/src/Stack/Coverage.hs b/src/Stack/Coverage.hs
--- a/src/Stack/Coverage.hs
+++ b/src/Stack/Coverage.hs
@@ -379,7 +379,7 @@
                 encodeUtf8Builder (pathToHtml outputDir) <>
                 "\".</b>"
             else
-                "<table class=\"dashboard\" width=\"100%\" boder=\"1\"><tbody>" <>
+                "<table class=\"dashboard\" width=\"100%\" border=\"1\"><tbody>" <>
                 "<p><b>NOTE: This is merely a listing of the html files found in the coverage reports directory.  Some of these reports may be old.</b></p>" <>
                 "<tr><th>Package</th><th>TestSuite</th><th>Modification Time</th></tr>" <>
                 foldMap encodeUtf8Builder rows <>
@@ -434,7 +434,7 @@
         extractField path = do
             contents <- readFileUtf8 (toFilePath path)
             case asum (map (T.stripPrefix (field <> ": ")) (T.lines contents)) of
-                Just result -> return $ Right result
+                Just result -> return $ Right $ T.strip result
                 Nothing -> notFoundErr
     cabalVer <- view cabalVersionL
     if cabalVer < mkVersion [1, 24]
diff --git a/src/Stack/Docker.hs b/src/Stack/Docker.hs
--- a/src/Stack/Docker.hs
+++ b/src/Stack/Docker.hs
@@ -253,7 +253,6 @@
      containerID <- withWorkingDir (toFilePath projectRoot) $ trim . decodeUtf8 <$> readDockerProcess
        (concat
          [["create"
-          ,"--net=host"
           ,"-e",inContainerEnvVar ++ "=1"
           ,"-e",stackRootEnvVar ++ "=" ++ toFilePathNoTrailingSep stackRoot
           ,"-e",platformVariantEnvVar ++ "=dk" ++ platformVariant
@@ -265,6 +264,9 @@
           ,"-v",toFilePathNoTrailingSep projectRoot ++ ":" ++ toFilePathNoTrailingSep projectRoot ++ mountSuffix
           ,"-v",toFilePathNoTrailingSep sandboxHomeDir ++ ":" ++ toFilePathNoTrailingSep sandboxHomeDir ++ mountSuffix
           ,"-w",toFilePathNoTrailingSep pwd]
+         ,case dockerNetwork docker of
+            Nothing -> ["--net=host"]
+            Just name -> ["--net=" ++ name]
          ,case muserEnv of
             Nothing -> []
             Just userEnv -> ["-e","USER=" ++ userEnv]
diff --git a/src/Stack/Dot.hs b/src/Stack/Dot.hs
--- a/src/Stack/Dot.hs
+++ b/src/Stack/Dot.hs
@@ -188,7 +188,9 @@
                                                                 ALUrl u -> u
                                                                 ALFilePath (ResolvedPath _ path) -> Text.pack $ "file://" ++ Path.toFilePath path
                                                     in object [ "type" .= ("archive" :: Text)
-                                                              , "url" .= url ]
+                                                              , "url" .= url
+                                                              , "sha256" .= archiveHash archive
+                                                              , "size" .= archiveSize archive ]
 pkgLocToJSON (PLImmutable (PLIRepo repo _)) = object [ "type" .= case repoType repo of
                                                                    RepoGit -> "git" :: Text
                                                                    RepoHg -> "hg" :: Text
diff --git a/src/Stack/Ghci.hs b/src/Stack/Ghci.hs
--- a/src/Stack/Ghci.hs
+++ b/src/Stack/Ghci.hs
@@ -823,9 +823,11 @@
 checkForDuplicateModules pkgs = do
     unless (null duplicates) $ do
         borderedWarning $ do
-            prettyError $ "Multiple files use the same module name:" <>
+            prettyWarn $ "Multiple files use the same module name:" <>
               line <> bulletedList (map prettyDuplicate duplicates)
-        throwM LoadingDuplicateModules
+        -- MSS 2020-10-13 Disabling, may remove entirely in the future
+        -- See: https://github.com/commercialhaskell/stack/issues/5407#issuecomment-707339928
+        -- throwM LoadingDuplicateModules
   where
     duplicates :: [(ModuleName, Map (Path Abs File) (Set (PackageName, NamedComponent)))]
     duplicates =
diff --git a/src/Stack/Ls.hs b/src/Stack/Ls.hs
--- a/src/Stack/Ls.hs
+++ b/src/Stack/Ls.hs
@@ -12,7 +12,7 @@
 import Control.Exception (throw)
 import Data.Aeson
 import Data.Array.IArray ((//), elems)
-import Stack.Prelude hiding (Snapshot (..))
+import Stack.Prelude hiding (Snapshot (..), SnapName (..))
 import qualified Data.Aeson.Types as A
 import qualified Data.List as L
 import Data.Text hiding (pack, intercalate)
diff --git a/src/Stack/New.hs b/src/Stack/New.hs
--- a/src/Stack/New.hs
+++ b/src/Stack/New.hs
@@ -199,7 +199,7 @@
     let context = M.unions [nonceParams, nameParams, configParams, yearParam]
           where
             nameAsVarId = T.replace "-" "_" $ T.pack $ packageNameString project
-            nameAsModule = T.filter (/= '-') $ T.toTitle $ T.pack $ packageNameString project
+            nameAsModule = T.filter (/= ' ') $ T.toTitle $ T.replace "-" " " $ T.pack $ packageNameString project
             nameParams = M.fromList [ ("name", T.pack $ packageNameString project)
                                     , ("name-as-varid", nameAsVarId)
                                     , ("name-as-module", nameAsModule) ]
diff --git a/src/Stack/Options/BuildParser.hs b/src/Stack/Options/BuildParser.hs
--- a/src/Stack/Options/BuildParser.hs
+++ b/src/Stack/Options/BuildParser.hs
@@ -71,10 +71,13 @@
           help
               "Like --file-watch, but polling the filesystem instead of using events") <|>
      pure NoFileWatch) <*>
+    switch
+        (long "watch-all" <>
+         help "Watch all local files not taking targets into account") <*>
     many (cmdOption
              (long "exec" <>
-              metavar "CMD [ARGS]" <>
-              help "Command and arguments to run after a successful build")) <*>
+              metavar "COMMAND [ARGUMENT(S)]" <>
+              help "Command and argument(s) to run after a successful build")) <*>
     switch
         (long "only-configure" <>
          help
diff --git a/src/Stack/Options/ConfigParser.hs b/src/Stack/Options/ConfigParser.hs
--- a/src/Stack/Options/ConfigParser.hs
+++ b/src/Stack/Options/ConfigParser.hs
@@ -22,7 +22,7 @@
     (\stackRoot workDir buildOpts dockerOpts nixOpts systemGHC installGHC arch
         ghcVariant ghcBuild jobs includes libs overrideGccPath overrideHpack
         skipGHCCheck skipMsys localBin setupInfoLocations modifyCodePage
-        allowDifferentUser dumpLogs colorWhen -> mempty
+        allowDifferentUser dumpLogs colorWhen snapLoc -> mempty
             { configMonoidStackRoot = stackRoot
             , configMonoidWorkDir = workDir
             , configMonoidBuildOpts = buildOpts
@@ -46,6 +46,7 @@
             , configMonoidAllowDifferentUser = allowDifferentUser
             , configMonoidDumpLogs = dumpLogs
             , configMonoidColorWhen = colorWhen
+            , configMonoidSnapshotLocation = snapLoc
             })
     <$> optionalFirst (absDirOption
             ( long stackRootOptionName
@@ -161,6 +162,11 @@
                     \support color codes"
             <> hide
              ))
+    <*> optionalFirst (strOption
+            ( long "snapshot-location-base"
+           <> help "The base location of LTS/Nightly snapshots"
+           <> metavar "URL"
+            ))
   where
     hide = hideMods (hide0 /= OuterGlobalOpts)
     toDumpLogs (First (Just True)) = First (Just DumpAllLogs)
diff --git a/src/Stack/Options/DockerParser.hs b/src/Stack/Options/DockerParser.hs
--- a/src/Stack/Options/DockerParser.hs
+++ b/src/Stack/Options/DockerParser.hs
@@ -59,6 +59,10 @@
                         hide <>
                         metavar "NAME" <>
                         help "Docker container name")
+    <*> firstStrOption (long (dockerOptName dockerNetworkArgName) <>
+                        hide <>
+                        metavar "NETWORK" <>
+                        help "Docker network")
     <*> argsOption (long (dockerOptName dockerRunArgsArgName) <>
                     hide <>
                     value [] <>
diff --git a/src/Stack/Options/ExecParser.hs b/src/Stack/Options/ExecParser.hs
--- a/src/Stack/Options/ExecParser.hs
+++ b/src/Stack/Options/ExecParser.hs
@@ -16,16 +16,16 @@
         <*> eoArgsParser
         <*> execOptsExtraParser
   where
-    eoCmdParser = ExecCmd <$> strArgument (metavar "CMD" <> completer projectExeCompleter)
+    eoCmdParser = ExecCmd <$> strArgument (metavar "COMMAND" <> completer projectExeCompleter)
     eoArgsParser = many (strArgument (metavar txt))
       where
         txt = case mcmd of
             Nothing -> normalTxt
             Just ExecCmd{} -> normalTxt
-            Just ExecRun -> "-- ARGS (e.g. stack run -- file.txt)"
-            Just ExecGhc -> "-- ARGS (e.g. stack runghc -- X.hs -o x)"
-            Just ExecRunGhc -> "-- ARGS (e.g. stack runghc -- X.hs)"
-        normalTxt = "-- ARGS (e.g. stack exec -- ghc-pkg describe base)"
+            Just ExecRun -> "-- ARGUMENT(S) (e.g. stack run -- file.txt)"
+            Just ExecGhc -> "-- ARGUMENT(S) (e.g. stack runghc -- X.hs -o x)"
+            Just ExecRunGhc -> "-- ARGUMENT(S) (e.g. stack runghc -- X.hs)"
+        normalTxt = "-- ARGUMENT(S) (e.g. stack exec ghc-pkg -- describe base)"
 
 evalOptsParser :: String -- ^ metavar
                -> Parser EvalOpts
@@ -59,7 +59,10 @@
         <*> pure True
 
     eoPackagesParser :: Parser [String]
-    eoPackagesParser = many (strOption (long "package" <> help "Additional packages that must be installed"))
+    eoPackagesParser = many
+                       (strOption (long "package"
+                                  <> help "Additional package(s) that must be installed"
+                                  <> metavar "PACKAGE(S)"))
 
     eoRtsOptionsParser :: Parser [String]
     eoRtsOptionsParser = concat <$> many (argsOption
diff --git a/src/Stack/Options/ScriptParser.hs b/src/Stack/Options/ScriptParser.hs
--- a/src/Stack/Options/ScriptParser.hs
+++ b/src/Stack/Options/ScriptParser.hs
@@ -24,9 +24,12 @@
 
 scriptOptsParser :: Parser ScriptOpts
 scriptOptsParser = ScriptOpts
-    <$> many (strOption (long "package" <> help "Additional packages that must be installed"))
+    <$> many (strOption
+          (long "package" <>
+            metavar "PACKAGE(S)" <>
+            help "Additional package(s) that must be installed"))
     <*> strArgument (metavar "FILE" <> completer (fileExtCompleter [".hs", ".lhs"]))
-    <*> many (strArgument (metavar "-- ARGS (e.g. stack script X.hs -- args to program)"))
+    <*> many (strArgument (metavar "-- ARGUMENT(S) (e.g. stack script X.hs -- argument(s) to program)"))
     <*> (flag' SECompile
             ( long "compile"
            <> help "Compile the script without optimization and run the executable"
diff --git a/src/Stack/Package.hs b/src/Stack/Package.hs
--- a/src/Stack/Package.hs
+++ b/src/Stack/Package.hs
@@ -82,6 +82,7 @@
 data Ctx = Ctx { ctxFile :: !(Path Abs File)
                , ctxDistDir :: !(Path Abs Dir)
                , ctxBuildConfig :: !BuildConfig
+               , ctxCabalVer :: !Version
                }
 
 instance HasPlatform Ctx
@@ -219,9 +220,10 @@
              let pkgDir = parent cabalfp
              distDir <- distDirFromDir pkgDir
              bc <- view buildConfigL
+             cabalVer <- view cabalVersionL
              (componentModules,componentFiles,dataFiles',warnings) <-
                  runRIO
-                     (Ctx cabalfp distDir bc)
+                     (Ctx cabalfp distDir bc cabalVer)
                      (packageDescModulesAndFiles pkg)
              setupFiles <-
                  if buildType pkg == Custom
@@ -795,13 +797,21 @@
 resolveComponentFiles component build names = do
     dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
     dir <- asks (parent . ctxFile)
+    agdirs <- autogenDirs
     (modules,files,warnings) <-
         resolveFilesAndDeps
             component
-            (if null dirs then [dir] else dirs)
+            ((if null dirs then [dir] else dirs) ++ agdirs)
             names
     cfiles <- buildOtherSources build
     return (modules, files <> cfiles, warnings)
+  where
+    autogenDirs = do
+      cabalVer <- asks ctxCabalVer
+      distDir <- asks ctxDistDir
+      let compDir = componentAutogenDir cabalVer component distDir
+          pkgDir = maybeToList $ packageAutogenDir cabalVer distDir
+      filterM doesDirExist $ compDir : pkgDir
 
 -- | Get all C sources and extra source files in a build.
 buildOtherSources :: BuildInfo -> RIO Ctx [DotCabalPath]
diff --git a/src/Stack/Runners.hs b/src/Stack/Runners.hs
--- a/src/Stack/Runners.hs
+++ b/src/Stack/Runners.hs
@@ -148,15 +148,8 @@
                                     <$> getTerminalWidth)
                                    pure (globalTermWidth go)
   menv <- mkDefaultProcessContext
-  logOptions0 <- logOptionsHandle stderr False
-  let logOptions
-        = setLogUseColor useColor
-        $ setLogUseTime (globalTimeInLog go)
-        $ setLogMinLevel (globalLogLevel go)
-        $ setLogVerboseFormat (globalLogLevel go <= LevelDebug)
-        $ setLogTerminal (globalTerminal go)
-          logOptions0
-  withLogFunc logOptions $ \logFunc -> runRIO Runner
+  let update = globalStylesUpdate go
+  withNewLogFunc go useColor update $ \logFunc -> runRIO Runner
     { runnerGlobalOpts = go
     , runnerUseColor = useColor
     , runnerLogFunc = logFunc
diff --git a/src/Stack/Types/Build.hs b/src/Stack/Types/Build.hs
--- a/src/Stack/Types/Build.hs
+++ b/src/Stack/Types/Build.hs
@@ -348,7 +348,7 @@
        (True, Nothing) -> "simple Setup.hs"
        (True, Just taskProvides') -> "custom Setup.hs for package " ++ dropQuotes (packageIdentifierString taskProvides')
      ) ++
-     " using:\n      " ++ fullCmd ++ "\n" ++
+     " (scroll up to its section to see the error) using:\n      " ++ fullCmd ++ "\n" ++
      "    Process exited with code: " ++ show exitCode ++
      (if exitCode == ExitFailure (-9)
           then " (THIS MAY INDICATE OUT OF MEMORY)"
diff --git a/src/Stack/Types/Config.hs b/src/Stack/Types/Config.hs
--- a/src/Stack/Types/Config.hs
+++ b/src/Stack/Types/Config.hs
@@ -863,6 +863,8 @@
     , configMonoidRecommendUpgrade   :: !FirstTrue
     -- ^ See 'configRecommendUpgrade'
     , configMonoidCasaRepoPrefix     :: !(First CasaRepoPrefix)
+    , configMonoidSnapshotLocation :: !(First Text)
+    -- ^ Custom location of LTS/Nightly snapshots
     , configMonoidStackDeveloperMode :: !(First Bool)
     -- ^ See 'configStackDeveloperMode'
     }
@@ -988,6 +990,7 @@
     configMonoidRecommendUpgrade <- FirstTrue <$> obj ..:? configMonoidRecommendUpgradeName
 
     configMonoidCasaRepoPrefix <- First <$> obj ..:? configMonoidCasaRepoPrefixName
+    configMonoidSnapshotLocation <- First <$> obj ..:? configMonoidSnapshotLocationName
 
     configMonoidStackDeveloperMode <- First <$> obj ..:? configMonoidStackDeveloperModeName
 
@@ -1156,6 +1159,9 @@
 configMonoidCasaRepoPrefixName :: Text
 configMonoidCasaRepoPrefixName = "casa-repo-prefix"
 
+configMonoidSnapshotLocationName :: Text
+configMonoidSnapshotLocationName = "snapshot-location-base"
+
 configMonoidStackDeveloperModeName :: Text
 configMonoidStackDeveloperModeName = "stack-developer-mode"
 
@@ -1223,7 +1229,7 @@
     show (NoMatchingSnapshot names) = concat
         [ "None of the following snapshots provides a compiler matching "
         , "your package(s):\n"
-        , unlines $ map (\name -> "    - " <> T.unpack (renderSnapName name))
+        , unlines $ map (\name -> "    - " <> show name)
                         (NonEmpty.toList names)
         , resolveOptions
         ]
diff --git a/src/Stack/Types/Config/Build.hs b/src/Stack/Types/Config/Build.hs
--- a/src/Stack/Types/Config/Build.hs
+++ b/src/Stack/Types/Config/Build.hs
@@ -133,6 +133,7 @@
     , boptsCLIGhcOptions = []
     , boptsCLIBuildSubset = BSAll
     , boptsCLIFileWatch = NoFileWatch
+    , boptsCLIWatchAll = False
     , boptsCLIExec = []
     , boptsCLIOnlyConfigure = False
     , boptsCLICommand = Build
@@ -166,6 +167,7 @@
     , boptsCLIFlags :: !(Map ApplyCLIFlag (Map FlagName Bool))
     , boptsCLIBuildSubset :: !BuildSubset
     , boptsCLIFileWatch :: !FileWatchOpts
+    , boptsCLIWatchAll :: !Bool
     , boptsCLIExec :: ![(String, [String])]
     , boptsCLIOnlyConfigure :: !Bool
     , boptsCLICommand :: !BuildCommand
diff --git a/src/Stack/Types/Docker.hs b/src/Stack/Types/Docker.hs
--- a/src/Stack/Types/Docker.hs
+++ b/src/Stack/Types/Docker.hs
@@ -43,6 +43,8 @@
   ,dockerContainerName :: !(Maybe String)
     -- ^ Container name to use, only makes sense from command-line with `dockerPersist`
     -- or `dockerDetach`.
+  ,dockerNetwork :: !(Maybe String)
+   -- ^ The network docker uses.
   ,dockerRunArgs :: ![String]
     -- ^ Arguments to pass directly to @docker run@.
   ,dockerMount :: ![Mount]
@@ -85,6 +87,8 @@
   ,dockerMonoidContainerName :: !(First String)
     -- ^ Container name to use, only makes sense from command-line with `dockerPersist`
     -- or `dockerDetach`.
+  ,dockerMonoidNetwork :: !(First String)
+    -- ^ See: 'dockerNetwork'
   ,dockerMonoidRunArgs :: ![String]
     -- ^ Arguments to pass directly to @docker run@
   ,dockerMonoidMount :: ![Mount]
@@ -118,6 +122,7 @@
               dockerMonoidDetach           <- FirstFalse <$> o ..:? dockerDetachArgName
               dockerMonoidPersist          <- FirstFalse <$> o ..:? dockerPersistArgName
               dockerMonoidContainerName    <- First <$> o ..:? dockerContainerNameArgName
+              dockerMonoidNetwork          <- First <$> o ..:? dockerNetworkArgName
               dockerMonoidRunArgs          <- o ..:? dockerRunArgsArgName ..!= []
               dockerMonoidMount            <- o ..:? dockerMountArgName ..!= []
               dockerMonoidMountMode        <- First <$> o ..:? dockerMountModeArgName
@@ -391,6 +396,10 @@
 -- | Docker container name argument name.
 dockerContainerNameArgName :: Text
 dockerContainerNameArgName = "container-name"
+--
+-- | Docker container name argument name.
+dockerNetworkArgName :: Text
+dockerNetworkArgName = "network"
 
 -- | Docker persist argument name.
 dockerPersistArgName :: Text
diff --git a/src/Stack/Types/Package.hs b/src/Stack/Types/Package.hs
--- a/src/Stack/Types/Package.hs
+++ b/src/Stack/Types/Package.hs
@@ -11,7 +11,6 @@
 module Stack.Types.Package where
 
 import           Stack.Prelude
-import           Foreign.C.Types (CTime)
 import qualified RIO.Text as T
 import           Data.Aeson (ToJSON (..), FromJSON (..), (.=), (.:), object, withObject)
 import qualified Data.Map as M
@@ -320,6 +319,14 @@
 lpFiles :: HasEnvConfig env => LocalPackage -> RIO env (Set.Set (Path Abs File))
 lpFiles = runMemoizedWith . fmap (Set.unions . M.elems) . lpComponentFiles
 
+lpFilesForComponents :: HasEnvConfig env
+                     => Set NamedComponent
+                     -> LocalPackage
+                     -> RIO env (Set.Set (Path Abs File))
+lpFilesForComponents components lp = runMemoizedWith $ do
+  componentFiles <- lpComponentFiles lp
+  pure $ mconcat (M.elems (M.restrictKeys componentFiles components))
+
 -- | A location to install a package into, either snapshot or local
 data InstallLocation = Snap | Local
     deriving (Show, Eq)
@@ -334,10 +341,8 @@
 data InstalledPackageLocation = InstalledTo InstallLocation | ExtraGlobal
     deriving (Show, Eq)
 
-data FileCacheInfo = FileCacheInfo
-    { fciModTime :: !CTime
-    , fciSize :: !FileSize
-    , fciHash :: !SHA256
+newtype FileCacheInfo = FileCacheInfo
+    { fciHash :: SHA256
     }
     deriving (Generic, Show, Eq, Typeable)
 instance NFData FileCacheInfo
@@ -345,16 +350,12 @@
 -- Provided for storing the BuildCache values in a file. But maybe
 -- JSON/YAML isn't the right choice here, worth considering.
 instance ToJSON FileCacheInfo where
-  toJSON (FileCacheInfo time size hash') = object
-    [ "modtime" .= time
-    , "size" .= size
-    , "hash" .= hash'
+  toJSON (FileCacheInfo hash') = object
+    [ "hash" .= hash'
     ]
 instance FromJSON FileCacheInfo where
   parseJSON = withObject "FileCacheInfo" $ \o -> FileCacheInfo
-    <$> o .: "modtime"
-    <*> o .: "size"
-    <*> o .: "hash"
+    <$> o .: "hash"
 
 -- | A descriptor from a .cabal file indicating one of the following:
 --
diff --git a/src/Stack/Types/Resolver.hs b/src/Stack/Types/Resolver.hs
--- a/src/Stack/Types/Resolver.hs
+++ b/src/Stack/Types/Resolver.hs
@@ -1,7 +1,6 @@
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -14,10 +13,7 @@
 module Stack.Types.Resolver
   (AbstractResolver(..)
   ,readAbstractResolver
-  ,SnapName(..)
   ,Snapshots (..)
-  ,renderSnapName
-  ,parseSnapName
   ) where
 
 import           Pantry.Internal.AesonExtended
@@ -62,23 +58,12 @@
             pure $ pure $ ARLatestLTSMajor x'
         _ -> pure $ ARResolver <$> parseRawSnapshotLocation (T.pack s)
 
--- | The name of an LTS Haskell or Stackage Nightly snapshot.
-data SnapName
-    = LTS !Int !Int
-    | Nightly !Day
-    deriving (Generic, Typeable, Show, Data, Eq)
-instance NFData SnapName
-instance Display SnapName where
-  display = display . renderSnapName
-
 data BuildPlanTypesException
-    = ParseSnapNameException !Text
-    | ParseResolverException !Text
+    = ParseResolverException !Text
     | FilepathInDownloadedSnapshot !Text
     deriving Typeable
 instance Exception BuildPlanTypesException
 instance Show BuildPlanTypesException where
-    show (ParseSnapNameException t) = "Invalid snapshot name: " ++ T.unpack t
     show (ParseResolverException t) = concat
         [ "Invalid resolver value: "
         , T.unpack t
@@ -90,29 +75,6 @@
         , "field, but filepaths are not allowed in downloaded snapshots.\n"
         , "Filepath specified: " ++ T.unpack url
         ]
-
--- | Convert a 'SnapName' into its short representation, e.g. @lts-2.8@,
--- @nightly-2015-03-05@.
-renderSnapName :: SnapName -> Text
-renderSnapName (LTS x y) = T.pack $ concat ["lts-", show x, ".", show y]
-renderSnapName (Nightly d) = T.pack $ "nightly-" ++ show d
-
--- | Parse the short representation of a 'SnapName'.
-parseSnapName :: MonadThrow m => Text -> m SnapName
-parseSnapName t0 =
-    case lts <|> nightly of
-        Nothing -> throwM $ ParseSnapNameException t0
-        Just sn -> return sn
-  where
-    lts = do
-        t1 <- T.stripPrefix "lts-" t0
-        Right (x, t2) <- Just $ decimal t1
-        t3 <- T.stripPrefix "." t2
-        Right (y, "") <- Just $ decimal t3
-        return $ LTS x y
-    nightly = do
-        t1 <- T.stripPrefix "nightly-" t0
-        Nightly <$> readMaybe (T.unpack t1)
 
 -- | Most recent Nightly and newest LTS version per major release.
 data Snapshots = Snapshots
diff --git a/src/main/Main.hs b/src/main/Main.hs
--- a/src/main/Main.hs
+++ b/src/main/Main.hs
@@ -277,11 +277,12 @@
                     execCmd
                     (execOptsParser $ Just ExecGhc)
         addCommand' "hoogle"
-                    ("Run hoogle, the Haskell API search engine. Use 'stack exec' syntax " ++
-                     "to pass Hoogle arguments, e.g. stack hoogle -- --count=20 or " ++
-                     "stack hoogle -- server --local")
+                    ("Run hoogle, the Haskell API search engine. Use the '-- ARGUMENT(S)' syntax " ++
+                     "to pass Hoogle arguments, e.g. stack hoogle -- --count=20, or " ++
+                     "stack hoogle -- server --local.")
                     hoogleCmd
-                    ((,,,) <$> many (strArgument (metavar "ARG"))
+                    ((,,,) <$> many (strArgument
+                                 (metavar "-- ARGUMENT(S) (e.g. stack hoogle -- server --local)"))
                           <*> boolFlags
                                   True
                                   "setup"
@@ -297,7 +298,7 @@
 
       -- These are the only commands allowed in interpreter mode as well
       addCommand' "exec"
-                  "Execute a command"
+                  "Execute a command. If the command is absent, the first of any arguments is taken as the command."
                   execCmd
                   (execOptsParser Nothing)
       addCommand' "run"
diff --git a/src/test/Stack/Config/DockerSpec.hs b/src/test/Stack/Config/DockerSpec.hs
--- a/src/test/Stack/Config/DockerSpec.hs
+++ b/src/test/Stack/Config/DockerSpec.hs
@@ -1,37 +1,26 @@
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ViewPatterns #-}
 module Stack.Config.DockerSpec (spec) where
 
 import Test.Hspec
-import Test.Hspec.QuickCheck
 import Stack.Prelude
 import Stack.Types.Resolver
 import RIO.Time (fromGregorian)
-import Stack.Config.Docker (parseLtsName, addDefaultTag)
+import Stack.Config.Docker (addDefaultTag)
 
 spec :: Spec
 spec = do
-  prop "parseLtsName" $ \(abs -> x) (abs -> y) -> do
-    case ltsSnapshotLocation x y of
-      RSLUrl url _ ->
-        case parseLtsName url of
-          Just (x', y') -> do
-            x `shouldBe` x'
-            y `shouldBe` y'
-          Nothing -> error "parseLtsName failed"
-      loc -> error $ show loc
   describe "addDefaultTag" $ do
     it "succeeds fails no resolver" $ addDefaultTag "foo/bar" Nothing Nothing `shouldBe` Nothing
     it "succeeds on LTS" $
       addDefaultTag
         "foo/bar"
         Nothing
-        (Just $ ARResolver $ ltsSnapshotLocation 1 2)
+        (Just $ ARResolver $ RSLSynonym $ LTS 1 2)
       `shouldBe` Just "foo/bar:lts-1.2"
     it "fails on nightly" $
       addDefaultTag
         "foo/bar"
         Nothing
-        (Just $ ARResolver $ nightlySnapshotLocation $ fromGregorian 2018 1 1)
+        (Just $ ARResolver $ RSLSynonym $ Nightly $ fromGregorian 2018 1 1)
       `shouldBe` Nothing
diff --git a/src/test/Stack/ConfigSpec.hs b/src/test/Stack/ConfigSpec.hs
--- a/src/test/Stack/ConfigSpec.hs
+++ b/src/test/Stack/ConfigSpec.hs
@@ -121,11 +121,11 @@
 
     it "parses snapshot using 'resolver'" $ inTempDir $ do
       loadProject resolverConfig $ \Project{..} ->
-        projectResolver `shouldBe` ltsSnapshotLocation 2 10
+        projectResolver `shouldBe` RSLSynonym (LTS 2 10)
 
     it "parses snapshot using 'snapshot'" $ inTempDir $ do
       loadProject snapshotConfig $ \Project{..} ->
-        projectResolver `shouldBe` ltsSnapshotLocation 2 10
+        projectResolver `shouldBe` RSLSynonym (LTS 2 10)
 
     it "throws if both 'resolver' and 'snapshot' are present" $ inTempDir $ do
       loadProject resolverSnapshotConfig (const (return ()))
diff --git a/stack.cabal b/stack.cabal
--- a/stack.cabal
+++ b/stack.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.0
 name:               stack
-version:            2.3.3
+version:            2.5.1
 license:            BSD3
 license-file:       LICENSE
 maintainer:         manny@fpcomplete.com
@@ -276,7 +276,7 @@
         network-uri >=2.6.2.0,
         open-browser >=0.2.1.0,
         optparse-applicative >=0.14.3.0,
-        pantry ==0.4.*,
+        pantry >=0.5.1.3,
         path >=0.6.1,
         path-io >=1.4.2,
         persistent >=2.9.2,
@@ -288,8 +288,8 @@
         project-template >=0.2.0.1,
         regex-applicative-text >=0.1.0.1,
         retry >=0.8.1.0,
-        rio >=0.1.14.0,
-        rio-prettyprint >=0.1.0.0,
+        rio >=0.1.18.0,
+        rio-prettyprint >=0.1.1.0,
         semigroups >=0.18.5,
         split >=0.2.3.3,
         stm >=2.5.0.0,
@@ -403,7 +403,7 @@
         network-uri >=2.6.2.0,
         open-browser >=0.2.1.0,
         optparse-applicative >=0.14.3.0,
-        pantry ==0.4.*,
+        pantry >=0.5.1.3,
         path >=0.6.1,
         path-io >=1.4.2,
         persistent >=2.9.2,
@@ -415,8 +415,8 @@
         project-template >=0.2.0.1,
         regex-applicative-text >=0.1.0.1,
         retry >=0.8.1.0,
-        rio >=0.1.14.0,
-        rio-prettyprint >=0.1.0.0,
+        rio >=0.1.18.0,
+        rio-prettyprint >=0.1.1.0,
         semigroups >=0.18.5,
         split >=0.2.3.3,
         stack -any,
@@ -534,7 +534,7 @@
         open-browser >=0.2.1.0,
         optparse-applicative >=0.14.3.0,
         optparse-generic >=1.3.1,
-        pantry ==0.4.*,
+        pantry >=0.5.1.3,
         path >=0.6.1,
         path-io >=1.4.2,
         persistent >=2.9.2,
@@ -546,8 +546,8 @@
         project-template >=0.2.0.1,
         regex-applicative-text >=0.1.0.1,
         retry >=0.8.1.0,
-        rio >=0.1.14.0,
-        rio-prettyprint >=0.1.0.0,
+        rio >=0.1.18.0,
+        rio-prettyprint >=0.1.1.0,
         semigroups >=0.18.5,
         split >=0.2.3.3,
         stm >=2.5.0.0,
@@ -669,7 +669,7 @@
         network-uri >=2.6.2.0,
         open-browser >=0.2.1.0,
         optparse-applicative >=0.14.3.0,
-        pantry ==0.4.*,
+        pantry >=0.5.1.3,
         path >=0.6.1,
         path-io >=1.4.2,
         persistent >=2.9.2,
@@ -682,8 +682,8 @@
         raw-strings-qq >=1.1,
         regex-applicative-text >=0.1.0.1,
         retry >=0.8.1.0,
-        rio >=0.1.14.0,
-        rio-prettyprint >=0.1.0.0,
+        rio >=0.1.18.0,
+        rio-prettyprint >=0.1.1.0,
         semigroups >=0.18.5,
         smallcheck >=1.1.5,
         split >=0.2.3.3,
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -28,9 +28,11 @@
 - hpack-0.33.0@rev:0
 - http-download-0.2.0.0@rev:0
 - filelock-0.1.1.5@rev:0
-- pantry-0.4.0.1@rev:0
+- rio-0.1.19.0@rev:0
+- rio-prettyprint-0.1.1.0@rev:0
 - casa-client-0.0.1@rev:0
 - casa-types-0.0.1@rev:0
+- pantry-0.5.1.3@rev:0
 
 drop-packages:
 # See https://github.com/commercialhaskell/stack/pull/4712
