diff --git .gn .gn
index ec3d38717a85..fbf80cae5500 100644
--- .gn
+++ .gn
@@ -248,6 +248,8 @@ exec_script_whitelist =
       # in the Chromium repo outside of //build.
       "//build_overrides/build.gni",
 
+      "//cef/BUILD.gn",
+
       # TODO(dgn): Layer violation but breaks the build otherwise, see
       # https://crbug.com/474506.
       "//clank/java/BUILD.gn",
diff --git BUILD.gn BUILD.gn
index 9d067467e5d2..b40fb00c35a9 100644
--- BUILD.gn
+++ BUILD.gn
@@ -186,6 +186,7 @@ group("gn_all") {
 
   if (!is_ios && !is_fuchsia) {
     deps += [
+      "//cef",
       "//chrome/test:telemetry_perf_unittests",
       "//chrome/test:unit_tests",
       "//components:components_browsertests",
diff --git build/config/win/visual_studio_version.gni build/config/win/visual_studio_version.gni
index 982fbe8d3f0d..e757be4688f1 100644
--- build/config/win/visual_studio_version.gni
+++ build/config/win/visual_studio_version.gni
@@ -12,9 +12,8 @@ declare_args() {
   # Currently always "2015".
   visual_studio_version = ""
 
-  # Directory of the Windows driver kit. If visual_studio_path is empty, this
-  # will be auto-filled.
-  wdk_path = ""
+  # Path to Visual Studio runtime libraries.
+  visual_studio_runtime_dirs = ""
 
   # Full path to the Windows SDK, not including a backslash at the end.
   # This value is the default location, override if you have a different
@@ -28,12 +27,11 @@ if (visual_studio_path == "") {
   visual_studio_path = toolchain_data.vs_path
   windows_sdk_path = toolchain_data.sdk_path
   visual_studio_version = toolchain_data.vs_version
-  wdk_path = toolchain_data.wdk_dir
   visual_studio_runtime_dirs = toolchain_data.runtime_dirs
 } else {
   assert(visual_studio_version != "",
          "You must set the visual_studio_version if you set the path")
-  assert(wdk_path != "",
-         "You must set the wdk_path if you set the visual studio path")
-  visual_studio_runtime_dirs = []
+  assert(visual_studio_runtime_dirs != "",
+         "You must set the visual_studio_runtime_dirs if you set the visual " +
+         "studio path")
 }
diff --git build/toolchain/win/BUILD.gn build/toolchain/win/BUILD.gn
index eb3e2b2b377d..343b039f3a50 100644
--- build/toolchain/win/BUILD.gn
+++ build/toolchain/win/BUILD.gn
@@ -6,6 +6,7 @@ import("//build/config/clang/clang.gni")
 import("//build/config/compiler/compiler.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/win/visual_studio_version.gni")
+import("//build/toolchain/cc_wrapper.gni")
 import("//build/toolchain/clang_static_analyzer.gni")
 import("//build/toolchain/goma.gni")
 import("//build/toolchain/toolchain.gni")
@@ -28,6 +29,8 @@ if (use_goma) {
   } else {
     goma_prefix = "$goma_dir/gomacc "
   }
+} else if (cc_wrapper != "") {
+  goma_prefix = "$cc_wrapper "
 } else {
   goma_prefix = ""
 }
@@ -108,7 +111,7 @@ template("msvc_toolchain") {
 
       # lld-link includes a replacement for lib.exe that can produce thin
       # archives and understands bitcode (for lto builds).
-      lib = "$prefix/$lld_link /lib /llvmlibthin"
+      lib = "$prefix/$lld_link /lib"
       link = "$prefix/$lld_link"
       if (host_os != "win") {
         # See comment adding --rsp-quoting to $cl above for more information.
diff --git build/toolchain/win/setup_toolchain.py build/toolchain/win/setup_toolchain.py
index 1ba5533c3efb..abfd55a2c703 100644
--- build/toolchain/win/setup_toolchain.py
+++ build/toolchain/win/setup_toolchain.py
@@ -134,25 +134,28 @@ def _LoadToolchainEnv(cpu, sdk_dir, target_store):
       # variable.
       if 'VSINSTALLDIR' in os.environ:
         del os.environ['VSINSTALLDIR']
-      other_path = os.path.normpath(os.path.join(
-                                        os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                        'VC/Auxiliary/Build/vcvarsall.bat'))
-      if not os.path.exists(other_path):
-        raise Exception('%s is missing - make sure VC++ tools are installed.' %
-                        script_path)
-      script_path = other_path
-    cpu_arg = "amd64"
-    if (cpu != 'x64'):
-      # x64 is default target CPU thus any other CPU requires a target set
-      cpu_arg += '_' + cpu
-    args = [script_path, cpu_arg]
-    # Store target must come before any SDK version declaration
-    if (target_store):
-      args.append(['store'])
-    # Chromium requires the 10.0.17134.0 SDK - previous versions don't have
-    # all of the required declarations.
-    args.append('10.0.17134.0')
-    variables = _LoadEnvFromBat(args)
+      script_path = os.path.normpath(os.path.join(
+                                         os.environ['GYP_MSVS_OVERRIDE_PATH'],
+                                         'VC/Auxiliary/Build/vcvarsall.bat'))
+    if os.path.exists(script_path):
+      cpu_arg = "amd64"
+      if (cpu != 'x64'):
+        # x64 is default target CPU thus any other CPU requires a target set
+        cpu_arg += '_' + cpu
+      args = [script_path, cpu_arg]
+      # Store target must come before any SDK version declaration
+      if (target_store):
+        args.append(['store'])
+      # Chromium requires the 10.0.17134.0 SDK - previous versions don't have
+      # all of the required declarations.
+      args.append('10.0.17134.0')
+      variables = _LoadEnvFromBat(args)
+    else:
+      variables = []
+      for k in sorted(os.environ.keys()):
+        variables.append('%s=%s' % (str(k), str(os.environ[k])))
+      variables = '\n'.join(variables)
+
   return _ExtractImportantEnvironment(variables)
 
 
diff --git build/vs_toolchain.py build/vs_toolchain.py
index 83847f456676..bf6254a0ebb6 100755
--- build/vs_toolchain.py
+++ build/vs_toolchain.py
@@ -68,11 +68,18 @@ def SetEnvironmentAndGetRuntimeDllDirs():
     runtime_path = os.path.pathsep.join(vs_runtime_dll_dirs)
     os.environ['PATH'] = runtime_path + os.path.pathsep + os.environ['PATH']
   elif sys.platform == 'win32' and not depot_tools_win_toolchain:
+    has_override_path = True
     if not 'GYP_MSVS_OVERRIDE_PATH' in os.environ:
+      has_override_path = False
       os.environ['GYP_MSVS_OVERRIDE_PATH'] = DetectVisualStudioPath()
     if not 'GYP_MSVS_VERSION' in os.environ:
       os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion()
 
+    if has_override_path:
+      # Don't attempt to copy DLLs when using a custom toolchain.
+      # The DLLs should already be discoverable via the PATH env variable.
+      return None
+
     # When using an installed toolchain these files aren't needed in the output
     # directory in order to run binaries locally, but they are needed in order
     # to create isolates or the mini_installer. Copying them to the output
diff --git chrome/chrome_paks.gni chrome/chrome_paks.gni
index eca08ff7bc76..908257ebd5ec 100644
--- chrome/chrome_paks.gni
+++ chrome/chrome_paks.gni
@@ -257,7 +257,7 @@ template("chrome_paks") {
     }
 
     input_locales = locales
-    output_dir = "${invoker.output_dir}/locales"
+    output_dir = "${invoker.output_dir}/chrome/locales"
 
     if (is_mac) {
       output_locales = locales_as_mac_outputs
diff --git chrome/installer/mini_installer/BUILD.gn chrome/installer/mini_installer/BUILD.gn
index 7189a44f5c31..1a83b3ea6325 100644
--- chrome/installer/mini_installer/BUILD.gn
+++ chrome/installer/mini_installer/BUILD.gn
@@ -133,7 +133,7 @@ template("generate_mini_installer") {
     inputs = [
       "$chrome_dll_file",
       "$root_out_dir/chrome.exe",
-      "$root_out_dir/locales/en-US.pak",
+      "$root_out_dir/chrome/locales/en-US.pak",
       "$root_out_dir/setup.exe",
       "//chrome/tools/build/win/makecab.py",
       release_file,