diff --git a/cabal-install/Distribution/Client/Sandbox.hs b/cabal-install/Distribution/Client/Sandbox.hs
index 57add3f47ea58ffa7c5c67b240603239625edaff..68b113c17535e4b668b1d93f56f0b5eeec7a6172 100644
--- a/cabal-install/Distribution/Client/Sandbox.hs
+++ b/cabal-install/Distribution/Client/Sandbox.hs
@@ -36,9 +36,9 @@ module Distribution.Client.Sandbox (
   ) where
 
 import Distribution.Client.Setup
-  ( SandboxFlags(..), ConfigFlags(..), GlobalFlags(..), InstallFlags(..)
-  , defaultConfigExFlags, defaultInstallFlags, defaultSandboxLocation
-  , globalRepos )
+  ( SandboxFlags(..), ConfigFlags(..), ConfigExFlags(..), InstallFlags(..)
+  , GlobalFlags(..), defaultConfigExFlags, defaultInstallFlags
+  , defaultSandboxLocation, globalRepos )
 import Distribution.Client.Sandbox.Timestamp  ( maybeAddCompilerTimestampRecord
                                               , withAddTimestamps
                                               , withRemoveTimestamps
@@ -434,21 +434,15 @@ maybeWithSandboxDirOnSearchPath (UseSandbox sandboxDir) act =
 data WereDepsReinstalled = ReinstalledSomeDeps | NoDepsReinstalled
 
 -- | Reinstall those add-source dependencies that have been modified since
--- we've last installed them.
-reinstallAddSourceDeps :: Verbosity -> SavedConfig -> Flag (Maybe Int)
-                          -> FilePath -> GlobalFlags
+-- we've last installed them. Assumes that we're working inside a sandbox.
+reinstallAddSourceDeps :: Verbosity
+                          -> SavedConfig
+                          -> ConfigFlags  -> ConfigExFlags
+                          -> InstallFlags -> GlobalFlags
+                          -> FilePath
                           -> IO WereDepsReinstalled
-reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do
-  let configFlags    = savedConfigureFlags   config
-      configExFlags  = defaultConfigExFlags         `mappend`
-                       savedConfigureExFlags config
-      installFlags'  = defaultInstallFlags          `mappend`
-                       savedInstallFlags     config
-      installFlags   = installFlags' {
-        installNumJobs = installNumJobs installFlags' `mappend` numJobsFlag
-        }
-      globalFlags'   = savedGlobalFlags      config `mappend` globalFlags
-
+reinstallAddSourceDeps verbosity config configFlags configExFlags
+                       installFlags globalFlags sandboxDir = do
   indexFile            <- tryGetIndexFilePath config
   buildTreeRefs        <- Index.listBuildTreeRefs verbosity
                           Index.DontListIgnored indexFile
@@ -469,9 +463,9 @@ reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do
 
         let args :: InstallArgs
             args = ((configPackageDB' configFlags ForceGlobalInstall)
-                   ,(globalRepos globalFlags')
+                   ,(globalRepos globalFlags)
                    ,comp, platform, conf
-                   ,globalFlags', configFlags, configExFlags, installFlags
+                   ,globalFlags, configFlags, configExFlags, installFlags
                    ,mempty)
 
             logMsg message rest = debugNoWrap verbosity message >> rest
@@ -486,7 +480,7 @@ reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do
             makeInstallContext verbosity args targets
 
           toPrune <- resolveUserTargets verbosity
-                     (fromFlag $ globalWorldFile globalFlags')
+                     (fromFlag $ globalWorldFile globalFlags)
                      (packageIndex sourcePkgDb)
                      targetsToPrune
 
@@ -505,7 +499,7 @@ reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do
 -- case.
 maybeReinstallAddSourceDeps :: Verbosity -> Flag (Maybe Int) -> GlobalFlags
                              -> IO (UseSandbox, WereDepsReinstalled)
-maybeReinstallAddSourceDeps verbosity numJobsFlag globalFlags = do
+maybeReinstallAddSourceDeps verbosity numJobsFlag globalFlags' = do
   currentDir <- getCurrentDirectory
   pkgEnvType <- classifyPackageEnvironment currentDir
   case pkgEnvType of
@@ -513,14 +507,29 @@ maybeReinstallAddSourceDeps verbosity numJobsFlag globalFlags = do
     UserPackageEnvironment    -> return (NoSandbox, NoDepsReinstalled)
     SandboxPackageEnvironment -> do
       (useSandbox, config) <- loadConfigOrSandboxConfig verbosity
-                              (globalConfigFile globalFlags) mempty
-      let sandboxDir = case useSandbox of
-            UseSandbox d -> d;
-            _            -> error "Distribution.Client.Sandbox.\
-                                  \maybeInstallAddSourceDeps: can't happen"
-      depsReinstalled <- reinstallAddSourceDeps verbosity config
-                                   numJobsFlag sandboxDir globalFlags
-      return (useSandbox, depsReinstalled)
+                              (globalConfigFile globalFlags') mempty
+      case useSandbox of
+        UseSandbox sandboxDir -> do
+          let configFlags    = savedConfigureFlags config
+              configExFlags  = defaultConfigExFlags
+                               `mappend` savedConfigureExFlags config
+              installFlags'  = defaultInstallFlags
+                               `mappend` savedInstallFlags config
+              installFlags   = installFlags' {
+                installNumJobs  = installNumJobs installFlags'
+                                  `mappend` numJobsFlag
+                }
+              globalFlags    = savedGlobalFlags config
+                               `mappend` globalFlags'
+
+          depsReinstalled <- reinstallAddSourceDeps verbosity config
+                             configFlags configExFlags installFlags globalFlags
+                             sandboxDir
+          return (useSandbox, depsReinstalled)
+
+        NoSandbox -> error $
+                     "Distribution.Client.Sandbox.maybeReinstallAddSourceDeps: "
+                     ++ "can't happen."
 
 -- | Update the 'with-compiler' and 'package-db' fields in the auto-generated
 -- sandbox config file if the user has configured the project with a different
diff --git a/cabal-install/Main.hs b/cabal-install/Main.hs
index 940422d553d532bf1ea9ceffb3ccb3ace088fd02..f1f192f69e37511ee01b4ad9da585026ab5e7973 100644
--- a/cabal-install/Main.hs
+++ b/cabal-install/Main.hs
@@ -50,7 +50,7 @@ import Distribution.Client.SetupWrapper
 import Distribution.Client.Config
          ( SavedConfig(..), loadConfig, defaultConfigFile )
 import Distribution.Client.Targets
-         ( readUserTargets )
+         ( UserTarget(UserTargetLocalDir), readUserTargets )
 import qualified Distribution.Client.List as List
          ( list, info )
 
@@ -81,6 +81,7 @@ import Distribution.Client.Sandbox            (sandboxInit
                                               ,maybeWithSandboxDirOnSearchPath
                                               ,WereDepsReinstalled(..)
                                               ,maybeReinstallAddSourceDeps
+                                              ,reinstallAddSourceDeps
                                               ,maybeUpdateSandboxConfig
                                               ,tryGetIndexFilePath
 
@@ -238,8 +239,8 @@ configureAction (configFlags, configExFlags) extraArgs globalFlags = do
     initPackageDBIfNeeded verbosity configFlags'' comp conf
     maybeUpdateSandboxConfig verbosity config configFlags''
 
-    -- If we've switched to a new compiler, we need to add a timestamp record
-    -- for this compiler to the timestamp file.
+    -- If we've switched to a new compiler, we may need to add a timestamp
+    -- record for this compiler to the timestamp file.
     indexFile     <- tryGetIndexFilePath config
     maybeAddCompilerTimestampRecord verbosity sandboxDir indexFile
       (compilerId comp) platform
@@ -464,8 +465,8 @@ installAction (configFlags, configExFlags, installFlags, haddockFlags)
       globalFlags'   = savedGlobalFlags      config `mappend` globalFlags
   (comp, platform, conf) <- configCompilerAux' configFlags'
 
-  -- If this a sandbox and the user has set the -w option, we may need to create
-  -- a sandbox-local package DB for this compiler.
+  -- If we're working inside a sandbox and the user has set the -w option, we
+  -- may need to create a sandbox-local package DB for this compiler.
   let configFlags'' = case useSandbox of
         NoSandbox               -> configFlags'
         (UseSandbox sandboxDir) -> setPackageDB sandboxDir
@@ -473,6 +474,23 @@ installAction (configFlags, configExFlags, installFlags, haddockFlags)
   when (isUseSandbox useSandbox) $
     initPackageDBIfNeeded verbosity configFlags'' comp conf
 
+  -- If we're working inside a sandbox and "." is among the targets, we should
+  -- reinstall add-source dependencies for this compiler.
+  whenUsingSandbox useSandbox $ \sandboxDir -> do
+    -- If the 'install' command was invoked with '-w', we may need to add a
+    -- timestamp record for this compiler to the timestamp file.
+    indexFile     <- tryGetIndexFilePath config
+    maybeAddCompilerTimestampRecord verbosity sandboxDir indexFile
+      (compilerId comp) platform
+
+    when (null targets || (UserTargetLocalDir ".") `elem` targets) $ do
+      -- 'install .' always runs 'configure', so we don't need to check whether
+      -- we need to reconfigure.
+      _ <- reinstallAddSourceDeps verbosity config configFlags'' configExFlags'
+                                  installFlags' globalFlags'
+                                  sandboxDir
+      return ()
+
   maybeWithSandboxDirOnSearchPath useSandbox $
     install verbosity
             (configPackageDB' configFlags'' (maybeForceGlobalInstall useSandbox))