diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..21e4302b9
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,149 @@
+# editorconfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Default settings:
+# A newline ending every file
+# Use 4 spaces as indentation
+[*]
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+
+[project.json]
+indent_size = 2
+
+# C# files
+[*.cs]
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_within_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# avoid this. unless absolutely necessary
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# only use var when it's obvious what the variable type is
+csharp_style_var_for_built_in_types = false:none
+csharp_style_var_when_type_is_apparent = false:none
+csharp_style_var_elsewhere = false:suggestion
+
+# use language keywords instead of BCL types
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# name all constant fields using PascalCase
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols  = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style    = pascal_case_style
+
+dotnet_naming_symbols.constant_fields.applicable_kinds   = field
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# internal and private fields should be _camelCase
+dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
+dotnet_naming_rule.camel_case_for_private_internal_fields.symbols  = private_internal_fields
+dotnet_naming_rule.camel_case_for_private_internal_fields.style    = camel_case_underscore_style
+
+dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
+dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
+
+dotnet_naming_style.camel_case_underscore_style.required_prefix = _
+dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case 
+
+# Code style defaults
+dotnet_sort_system_directives_first = true
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = false
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = false:none
+csharp_style_expression_bodied_constructors = false:none
+csharp_style_expression_bodied_operators = false:none
+csharp_style_expression_bodied_properties = true:none
+csharp_style_expression_bodied_indexers = true:none
+csharp_style_expression_bodied_accessors = true:none
+
+# Pattern matching
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+# Null checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = do_not_ignore
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# C++ Files
+[*.{cpp,h,in}]
+curly_bracket_next_line = true
+indent_brace_style = Allman
+
+# Xml project files
+[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
+indent_size = 2
+
+# Xml build files
+[*.builds]
+indent_size = 2
+
+# Xml files
+[*.{xml,stylecop,resx,ruleset}]
+indent_size = 2
+
+# Xml config files
+[*.{props,targets,config,nuspec}]
+indent_size = 2
+
+# Shell scripts
+[*.sh]
+end_of_line = lf
+[*.{cmd, bat}]
+end_of_line = crlf
diff --git a/.gitattributes b/.gitattributes
index 50950c656..4422d1501 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -51,4 +51,5 @@
 *.vbproj text=auto
 *.fsproj text=auto
 *.dbproj text=auto
+*.xlf text=auto
 *.sln text=auto eol=crlf
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 19e5af704..847693d1d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -99,6 +99,7 @@ dlldata.c
 # DNX
 project.lock.json
 artifacts/
+bin/
 
 *_i.c
 *_p.c
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 000000000..97a615453
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,70 @@
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+<!--
+Projects which don't import dir.props:
+
+build\RestoreDependency.proj
+build\Signing.proj
+build\package\Installer.DEB.proj
+build\sdks\sdks.csproj
+build\templates\templates.csproj
+build\test\RunTest.proj
+build_projects\Microsoft.DotNet.Cli.Build.SelfTest\InvokeWithStage2.proj
+build_projects\update-dependencies\update-dependencies.csproj
+tools\TestAssetsDependencies\TestAssetsDependencies.csproj
+
+-->
+
+  <PropertyGroup>
+    <RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
+
+    <NuGetPackagesDir>$(NUGET_PACKAGES)</NuGetPackagesDir>
+    <NuGetPackagesDir Condition=" '$(NuGetPackagesDir)' == '' ">$(RepoRoot)/.nuget/packages</NuGetPackagesDir>
+
+    <RelativeCLIBuildBinaries>build_projects/dotnet-cli-build/bin</RelativeCLIBuildBinaries>
+    <RelativeCLIBuildDllName>dotnet-cli-build.dll</RelativeCLIBuildDllName>
+    <CLIBuildDll>$(RepoRoot)/$(RelativeCLIBuildBinaries)/$(RelativeCLIBuildDllName)</CLIBuildDll>
+    <BuildTasksFeedDll>$(RepoRoot)/build_projects/dotnet-cli-build/bin/Microsoft.DotNet.Build.Tasks.Feed.dll</BuildTasksFeedDll>
+
+    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
+    <DisableImplicitPackageTargetFallback>true</DisableImplicitPackageTargetFallback>
+
+    <CliTargetFramework>netcoreapp2.1</CliTargetFramework>
+  </PropertyGroup>
+
+  <Import Project="build/InitRepo.props" />
+  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(GitCommitInfoProps)" />
+  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(HostInfoProps)" />
+  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(BuildInfoProps)" />
+
+  <Import Project="build/BranchInfo.props" />
+  <Import Project="build/AzureInfo.props" />
+
+  <Import Project="build/DependencyVersions.props" />
+  <Import Project="build/Version.props" />
+  <Import Project="build/DerivedHostMachineInfo.props" />
+  <Import Project="build/Branding.props" />
+
+  <Import Project="build/FileExtensions.props" />
+  <Import Project="build/InputDirectories.props" />
+  <Import Project="build/MSBuildExtensions.props" />
+  <Import Project="build/SetupPreviousStage.props" />
+  <Import Project="build/OutputDirectories.props" />
+
+  <ImportGroup Condition=" '$(BuildingSigningProject)' != 'true' ">
+    <!-- These imports aren't required for signing, and some of them have syntax which isn't supported in MSBuild 14,
+         which is what the signing build uses -->
+    <Import Project="build/BundledTools.props" />
+    <Import Project="build/BundledSdks.props" />
+    <Import Project="build/BundledTemplates.props" />
+
+    <Import Project="build/BuildDefaults.props" />
+    <Import Project="build/BundledRuntimes.props" />
+    <Import Project="build/CrossGen.props" />
+    <Import Project="build/BackwardsCompatibilityRuntimes.props" />
+
+    <Import Project="build/InstallerInfo.props" />
+    <Import Project="build/GenerateResxSource.targets" />
+  </ImportGroup>
+  
+</Project>
diff --git a/Documentation/README.md b/Documentation/README.md
index 94edbb417..9d211c0a2 100644
--- a/Documentation/README.md
+++ b/Documentation/README.md
@@ -16,7 +16,7 @@ Documents Index
 
 ## Troubleshooting and issues reporting
 
-- [CLI Known Issues](https://github.com/dotnet/core/blob/master/cli/known-issues.md)
+- [CLI Known Issues](https://github.com/dotnet/core/blob/master/release-notes/2.0/2.0.0-known-issues.md)
 - [Filing migration issues](migration-issues.md)
 
 ## Specifications
diff --git a/Documentation/general/intro-to-cli.md b/Documentation/general/intro-to-cli.md
index 0fca2016f..3540d6f54 100644
--- a/Documentation/general/intro-to-cli.md
+++ b/Documentation/general/intro-to-cli.md
@@ -45,7 +45,7 @@ The way the `dotnet` driver finds the command it is instructed to run using `dot
 Adding a new command to the .NET Core CLI 
 =========================================
 
-If you want to contribute to the actual .NET Core CLI by adding a new command that you think would be useful, please refer to the [developer guide](developer-guide.md) in this directory. It contains all of the guidance on both the process as well as the infrastructure that you need to adhere to when adding a new command to the CLI toolchain. 
+If you want to contribute to the actual .NET Core CLI by adding a new command that you think would be useful, please refer to the [developer guide](../project-docs/developer-guide.md) in this directory. It contains all of the guidance on both the process as well as the infrastructure that you need to adhere to when adding a new command to the CLI toolchain. 
 
 After you familiarize yourself with the process of working with the source code in the repo, please consult the [CLI UX guidelines](cli-ux-guidelines.md) to get to know the user experience tenants the CLI has. 
 
diff --git a/Documentation/general/tab-completion.md b/Documentation/general/tab-completion.md
index bf6fefaa3..4687e897e 100644
--- a/Documentation/general/tab-completion.md
+++ b/Documentation/general/tab-completion.md
@@ -1,6 +1,6 @@
 # .NET CLI Tab Completion
 
-In version 2.0 of the .NET Core CLI, we have added support for providing suggestions when you press `tab`. While it's not yet enabled by default, you can try it out today by installing a [preview build](https://github.com/dotnet/cli#installers-and-binaries) from the master branch or by building from source. 
+In version 2.0 of the .NET Core CLI, we have added support for providing suggestions when you press `tab`. While it's not yet enabled by default, you can try it out in PowerShell, bash, or zsh by following the instructions below. 
 
 Here are some examples of what it provides:
 
@@ -26,17 +26,18 @@ If you just installed `dotnet` you may see the first-run output:
 ```
 Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
 
 Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.
 Decompressing 100% 4936 ms
 Expanding 100% 17195 ms
 ```
@@ -68,4 +69,4 @@ To enable tab completion in zsh, edit your `.zshrc` file to add the contents of
 
 ## How it works
 
-Each of these scripts provides a hook for completions for its respective shell. The logic that determines which suggestions to provide is in the CLI itself, configured using [our new parser](https://github.com/dotnet/CliCommandLineParser). You can see a code example [here](https://github.com/dotnet/cli/blob/master/src/dotnet/commands/dotnet-add/dotnet-add-package/AddPackageParser.cs#L23). 
+Each of these scripts provides a hook for completions for its respective shell. The logic that determines which suggestions to provide is in the CLI itself, configured using [our new parser](https://github.com/dotnet/CliCommandLineParser). You can see a code example [here](https://github.com/dotnet/cli/blob/master/src/dotnet/commands/dotnet-add/dotnet-add-package/AddPackageParser.cs). 
diff --git a/Documentation/project-docs/developer-guide.md b/Documentation/project-docs/developer-guide.md
index 0391adefa..7e8e76055 100644
--- a/Documentation/project-docs/developer-guide.md
+++ b/Documentation/project-docs/developer-guide.md
@@ -27,8 +27,7 @@ In order to build .NET Command Line Interface, you need the following installed
 ## Building/Running
 
 1. Run `build.cmd` or `build.sh` from the root depending on your OS. If you don't want to execute tests, run `build.cmd /t:Compile` or `./build.sh /t:Compile`. 
-  - To build the CLI in macOS Sierra, you need to set the DOTNET_RUNTIME_ID environment variable by running `export DOTNET_RUNTIME_ID=osx.10.11-x64`.
-2. Use `artifacts/{RID}/stage2/dotnet` to try out the `dotnet` command. You can also add `artifacts/{os}-{arch}/stage2` to the PATH if you want to use the build output when invoking `dotnet` from the current console.
+2. The CLI that is built (we call it stage 2) will be laid out in the `bin\2\{RID}\dotnet` folder.  You can run `dotnet.exe` or `dotnet` from that folder to try out the `dotnet` command.
 
 ## A simple test
 Using the `dotnet` built in the previous step:
@@ -40,8 +39,12 @@ Using the `dotnet` built in the previous step:
 
 ## Running tests
 
-1. To run all tests invoke `build.cmd` or `build.sh` which will build the product and run the tests.
-2. To run a specific test, cd into that test's directory and execute `dotnet test`. If using this approach, make sure to add `artifacts/{RID}/stage2` to your `PATH` and set the `NUGET_PACKAGES` environment variable to point to the repo's `.nuget/packages` directory.
+1. To run all tests, invoke `build.cmd` or `build.sh` which will build the product and run the tests.
+2. To run a specific test project:
+    - Run `scripts\cli-test-env.bat` on Windows, or [source](https://en.wikipedia.org/wiki/Source_(command)) `scripts/cli-test-env.sh` on Linux or OS X.  This will add the stage 2 `dotnet` folder to your path and set up other environment variables which are used for running tests.
+    - `cd` into the test's directory
+    - Run `dotnet test`
+    - Refer to the command-line help for `dotnet test` if you want to run a specific test in the test project
 
 ## Adding a Command
 
diff --git a/Documentation/specs/cli-installation-scenarios.md b/Documentation/specs/cli-installation-scenarios.md
index 16182c234..654ae0e66 100644
--- a/Documentation/specs/cli-installation-scenarios.md
+++ b/Documentation/specs/cli-installation-scenarios.md
@@ -17,6 +17,8 @@ Obtaining .NET CLI
 * [Acquisition modes](#acquisition-modes)
   * [Native installers](#native-installers)
   * [Installation script](#installation-script)
+    * [Windows one-liner](#windows-command)
+    * [OSX/Linux one-liner](#osxlinux-shell-command)
   * [Complete manual installation](#complete-manual-installation)
   * [Docker](#docker)
   * [NuGet Packages](#nuget-packages)
@@ -256,6 +258,18 @@ OSX/Linux:
 ./dotnet-install.sh --channel 2.0
 ```
 
+#### Windows obtain one-liner example
+
+```
+@powershell -NoProfile -ExecutionPolicy unrestricted -Command "&([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) <additional installation-script args>"
+```
+
+#### OSX/Linux obtain one-liner
+
+```
+curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin <additional installation-script args>
+```
+
 ### Docker 
 [Docker](https://docs.docker.com/) has become a pretty good way to use developer tools, from trying them out in an interactive image use to using it for deployment. We have Docker images on DockerHub already. 
 
diff --git a/Documentation/specs/runtime-configuration-file.md b/Documentation/specs/runtime-configuration-file.md
index fbf6e2c4c..b021f9358 100644
--- a/Documentation/specs/runtime-configuration-file.md
+++ b/Documentation/specs/runtime-configuration-file.md
@@ -9,8 +9,8 @@ The runtime configuration files store the dependencies of an application (former
 There are two runtime configuration files for a particular application. Given a project named `MyApp`, the compilation process produces the following files (on Windows, other platforms are similar):
 
 * `MyApp.dll` - The managed assembly for `MyApp`, including an ECMA-compliant entry point token.
-* `MyApp.exe` - A copy of the `corehost.exe` executable.
-* `MyApp.runtimeconfig.json` - An **optional** configuration file containing runtime configuration settings.
+* `MyApp.exe` - A copy of the `corehost.exe` executable. Only present when the application is a self-contained application.
+* `MyApp.runtimeconfig.json` - An **optional** configuration file containing runtime configuration settings. This file is required for portable applications, but not for self-contained apps.
 * `MyApp.deps.json` - A list of dependencies, as well as compilation context data and compilation dependencies. Not technically required, but required to use the servicing or package cache/shared package install features.
 
 The `MyApp.runtimeconfig.json` is designed to be user-editable (in the case of an app consumer wanting to change various CLR runtime options for an app, much like the `MyApp.exe.config` XML file works in .NET 4.x today). However, the `MyApp.deps.json` file is designed to be processed by automated tools and should not be user-edited. Having the files as separate makes this clearer. We could use a different format for the deps file, but if we're already integrating a JSON parser into the host, it seems most appropriate to re-use that here. Also, there are diagnostic benefits to being able to read the `.deps.json` file in a simple text editor.
diff --git a/Microsoft.DotNet.Cli.sln b/Microsoft.DotNet.Cli.sln
index 271579431..0748db81a 100644
--- a/Microsoft.DotNet.Cli.sln
+++ b/Microsoft.DotNet.Cli.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26510.0
+VisualStudioVersion = 15.0.27130.2020
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{ED2FE3E2-F7E7-4389-8231-B65123F2076F}"
 EndProject
@@ -13,8 +13,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{0722D325-24C8-4E83-B5AF-0A083E7F0749}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build_projects", "build_projects", "{88278B81-7649-45DC-8A6A-D3A645C5AFC3}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestAssets", "TestAssets", "{ADA7052B-884B-4776-8B8D-D04191D0AA70}"
@@ -38,6 +36,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{89905EC4
 		build\Compile.targets = build\Compile.targets
 		build\CrossGen.props = build\CrossGen.props
 		build\DependencyVersions.props = build\DependencyVersions.props
+		build\DerivedHostMachineInfo.props = build\DerivedHostMachineInfo.props
 		build\FileExtensions.props = build\FileExtensions.props
 		build\GitCommitInfo.targets = build\GitCommitInfo.targets
 		build\HostInfo.targets = build\HostInfo.targets
@@ -54,12 +53,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{89905EC4
 		build\Publish.targets = build\Publish.targets
 		build\RestoreDependency.proj = build\RestoreDependency.proj
 		build\sdks\sdks.csproj = build\sdks\sdks.csproj
+		build\SetupPreviousStage.props = build\SetupPreviousStage.props
 		build\Signing.proj = build\Signing.proj
-		build\Stage0.props = build\Stage0.props
 		build\Test.targets = build\Test.targets
 		build\Version.props = build\Version.props
-		build\VersionBadge.props = build\VersionBadge.props
-		build\DerivedHostMachineInfo.props = build\DerivedHostMachineInfo.props
 	EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "package", "package", "{FD7D515A-D10F-4F49-B8AE-21CF7ED071AE}"
@@ -131,8 +128,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageWithFakeNativeDep",
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ToolWithOutputName", "TestAssets\TestPackages\ToolWithOutputName\ToolWithOutputName.csproj", "{8FB83810-5A4C-4097-9A79-8E687E4981CB}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-archive", "src\dotnet-archive\dotnet-archive.csproj", "{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet", "src\dotnet\dotnet.csproj", "{203F0362-DAFC-4679-A01E-7FBC331D8647}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Archive", "src\Microsoft.DotNet.Archive\Microsoft.DotNet.Archive.csproj", "{F8C66E8A-FC59-40B3-AC0F-58CA22526F76}"
@@ -143,16 +138,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Configurer
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.InternalAbstractions", "src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj", "{570950AD-A080-4F32-980C-F50E312910DF}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.TestFramework", "src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj", "{6592A22C-2386-4E83-A4D3-FC08075C723A}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "redist", "src\redist\redist.csproj", "{098D9321-1201-4974-A75E-F58EBCD98ACF}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tool_msbuild", "src\tool_msbuild\tool_msbuild.csproj", "{D82A3246-9831-4024-A9B2-1932EEF3D56F}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tool_nuget", "src\tool_nuget\tool_nuget.csproj", "{BE4C655A-DC54-4408-B739-743456D34111}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Archiver", "tools\Archiver\Archiver.csproj", "{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArgumentForwardingTests", "test\ArgumentForwardingTests\ArgumentForwardingTests.csproj", "{3E28672F-F4E4-44D5-AEFB-1F425DECC57E}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArgumentsReflector", "test\ArgumentsReflector\ArgumentsReflector.csproj", "{A5CA696F-585E-40AB-912C-6316BC330C5E}"
@@ -197,8 +188,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Tools.Test
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "msbuild.IntegrationTests", "test\msbuild.IntegrationTests\msbuild.IntegrationTests.csproj", "{23EE9BBB-3B33-4CF2-8D1A-29A8DB12E878}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Performance", "test\Performance\Performance.csproj", "{F5E27BA5-063B-4770-A6E8-87252E9AB22C}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Cli.Build.Framework", "build_projects\Microsoft.DotNet.Cli.Build.Framework\Microsoft.DotNet.Cli.Build.Framework.csproj", "{AA744891-5209-4335-8457-37EC347DF833}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "shared-build-targets-utils", "build_projects\shared-build-targets-utils\shared-build-targets-utils.csproj", "{DA3595A8-35DE-42B9-97A4-4A2461BAD554}"
@@ -231,6 +220,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-add-package.Tests",
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tool_fsc", "src\tool_fsharp\tool_fsc.csproj", "{602976C5-2477-4B4C-AD9A-1EAFB250529A}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.MSBuildSdkResolver", "src\Microsoft.DotNet.MSBuildSdkResolver\Microsoft.DotNet.MSBuildSdkResolver.csproj", "{FCDFAF40-CC16-4D49-96C0-E49F195E7142}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-restore.Tests", "test\dotnet-restore.Tests\dotnet-restore.Tests.csproj", "{B4EE3671-C103-4A37-8DEB-C74E0134104E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.TestFramework", "test\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj", "{44759218-B558-4AF0-8991-515F1100DCF5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Msbuild.Tests.Utilities", "test\Msbuild.Tests.Utilities\Msbuild.Tests.Utilities.csproj", "{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.ShellShim.Tests", "test\Microsoft.DotNet.ShellShim.Tests\Microsoft.DotNet.ShellShim.Tests.csproj", "{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.ToolPackage.Tests", "test\Microsoft.DotNet.ToolPackage.Tests\Microsoft.DotNet.ToolPackage.Tests.csproj", "{91BFE800-1624-4A58-A1CE-339705A8FFD0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tool_launcher", "src\tool_launcher\tool_launcher.csproj", "{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -511,30 +514,6 @@ Global
 		{8FB83810-5A4C-4097-9A79-8E687E4981CB}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
 		{8FB83810-5A4C-4097-9A79-8E687E4981CB}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
 		{8FB83810-5A4C-4097-9A79-8E687E4981CB}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Debug|x64.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Debug|x64.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Debug|x86.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Debug|x86.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.MinSizeRel|x64.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.MinSizeRel|x64.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.MinSizeRel|x86.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Release|x64.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Release|x64.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Release|x86.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.Release|x86.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
 		{203F0362-DAFC-4679-A01E-7FBC331D8647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{203F0362-DAFC-4679-A01E-7FBC331D8647}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{203F0362-DAFC-4679-A01E-7FBC331D8647}.Debug|x64.ActiveCfg = Release|Any CPU
@@ -655,30 +634,6 @@ Global
 		{570950AD-A080-4F32-980C-F50E312910DF}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
 		{570950AD-A080-4F32-980C-F50E312910DF}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
 		{570950AD-A080-4F32-980C-F50E312910DF}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Debug|x64.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Debug|x64.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Debug|x86.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Debug|x86.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.MinSizeRel|x64.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.MinSizeRel|x64.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.MinSizeRel|x86.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Release|x64.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Release|x64.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Release|x86.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.Release|x86.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
-		{6592A22C-2386-4E83-A4D3-FC08075C723A}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
 		{098D9321-1201-4974-A75E-F58EBCD98ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{098D9321-1201-4974-A75E-F58EBCD98ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{098D9321-1201-4974-A75E-F58EBCD98ACF}.Debug|x64.ActiveCfg = Release|Any CPU
@@ -751,30 +706,6 @@ Global
 		{BE4C655A-DC54-4408-B739-743456D34111}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
 		{BE4C655A-DC54-4408-B739-743456D34111}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
 		{BE4C655A-DC54-4408-B739-743456D34111}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Debug|x64.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Debug|x64.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Debug|x86.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Debug|x86.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.MinSizeRel|x64.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.MinSizeRel|x64.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.MinSizeRel|x86.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Release|x64.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Release|x64.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Release|x86.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.Release|x86.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
 		{3E28672F-F4E4-44D5-AEFB-1F425DECC57E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{3E28672F-F4E4-44D5-AEFB-1F425DECC57E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3E28672F-F4E4-44D5-AEFB-1F425DECC57E}.Debug|x64.ActiveCfg = Release|Any CPU
@@ -1303,30 +1234,6 @@ Global
 		{23EE9BBB-3B33-4CF2-8D1A-29A8DB12E878}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
 		{23EE9BBB-3B33-4CF2-8D1A-29A8DB12E878}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
 		{23EE9BBB-3B33-4CF2-8D1A-29A8DB12E878}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Debug|x64.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Debug|x64.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Debug|x86.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Debug|x86.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.MinSizeRel|x64.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.MinSizeRel|x64.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.MinSizeRel|x86.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Release|x64.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Release|x64.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Release|x86.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.Release|x86.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
 		{AA744891-5209-4335-8457-37EC347DF833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{AA744891-5209-4335-8457-37EC347DF833}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{AA744891-5209-4335-8457-37EC347DF833}.Debug|x64.ActiveCfg = Release|Any CPU
@@ -1567,6 +1474,198 @@ Global
 		{08A40B6A-F695-4EA9-AC8D-CF88FADEA796}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
 		{08A40B6A-F695-4EA9-AC8D-CF88FADEA796}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
 		{08A40B6A-F695-4EA9-AC8D-CF88FADEA796}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Debug|x64.Build.0 = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Debug|x86.Build.0 = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.MinSizeRel|x64.Build.0 = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.MinSizeRel|x86.Build.0 = Debug|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Release|x64.ActiveCfg = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Release|x64.Build.0 = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Release|x86.ActiveCfg = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.Release|x86.Build.0 = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Debug|x64.Build.0 = Debug|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Debug|x86.Build.0 = Debug|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.MinSizeRel|x64.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.MinSizeRel|x64.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.MinSizeRel|x86.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Release|x64.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Release|x64.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Release|x86.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.Release|x86.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|x64.Build.0 = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|x86.Build.0 = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.MinSizeRel|x64.Build.0 = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.MinSizeRel|x86.Build.0 = Debug|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Release|x64.ActiveCfg = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Release|x64.Build.0 = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Release|x86.ActiveCfg = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Release|x86.Build.0 = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Debug|x64.Build.0 = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Debug|x86.Build.0 = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.MinSizeRel|x64.Build.0 = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.MinSizeRel|x86.Build.0 = Debug|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Release|x64.ActiveCfg = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Release|x64.Build.0 = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Release|x86.ActiveCfg = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.Release|x86.Build.0 = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{44759218-B558-4AF0-8991-515F1100DCF5}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Debug|x64.Build.0 = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Debug|x86.Build.0 = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.MinSizeRel|x64.Build.0 = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.MinSizeRel|x86.Build.0 = Debug|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Release|x64.ActiveCfg = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Release|x64.Build.0 = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Release|x86.ActiveCfg = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.Release|x86.Build.0 = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Debug|x64.Build.0 = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Debug|x86.Build.0 = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.MinSizeRel|x64.Build.0 = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.MinSizeRel|x86.Build.0 = Debug|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Release|x64.ActiveCfg = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Release|x64.Build.0 = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Release|x86.ActiveCfg = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.Release|x86.Build.0 = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Debug|x64.Build.0 = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Debug|x86.Build.0 = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.MinSizeRel|x64.Build.0 = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.MinSizeRel|x86.Build.0 = Debug|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Release|x64.ActiveCfg = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Release|x64.Build.0 = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Release|x86.ActiveCfg = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.Release|x86.Build.0 = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Debug|x64.Build.0 = Debug|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Debug|x86.Build.0 = Debug|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.MinSizeRel|x64.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.MinSizeRel|x64.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.MinSizeRel|x86.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Release|x64.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Release|x64.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Release|x86.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.Release|x86.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -1591,23 +1690,21 @@ Global
 		{736BF068-7389-41B9-BF63-D4E49B9BC833} = {1AB5B24B-B317-4142-A5D1-A6E84F15BA34}
 		{48408A19-CCC5-4C85-990B-0A9F827BF29A} = {1AB5B24B-B317-4142-A5D1-A6E84F15BA34}
 		{8FB83810-5A4C-4097-9A79-8E687E4981CB} = {1AB5B24B-B317-4142-A5D1-A6E84F15BA34}
-		{F0CB08B6-2809-4D37-B1DD-A9B7F1B0D95D} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{203F0362-DAFC-4679-A01E-7FBC331D8647} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{F8C66E8A-FC59-40B3-AC0F-58CA22526F76} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{73ACEB34-D22C-43EA-87BE-EFC0E83D0126} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{ABB81DAE-0D26-483C-BE3B-0F9ACD812A62} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{570950AD-A080-4F32-980C-F50E312910DF} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
-		{6592A22C-2386-4E83-A4D3-FC08075C723A} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{098D9321-1201-4974-A75E-F58EBCD98ACF} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{D82A3246-9831-4024-A9B2-1932EEF3D56F} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
 		{BE4C655A-DC54-4408-B739-743456D34111} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
-		{2DFCC95F-75F7-46E1-8F56-256DB4CA98B2} = {0722D325-24C8-4E83-B5AF-0A083E7F0749}
 		{3E28672F-F4E4-44D5-AEFB-1F425DECC57E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{A5CA696F-585E-40AB-912C-6316BC330C5E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{4EF497BF-D717-4E03-90B1-932C7F51B918} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{18B43540-346F-4AFF-8868-A82CF098FAFD} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{C3845C85-1F59-4552-BE52-32F513CE795F} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{BBB5A4C8-CD2D-4A6A-9159-0FEAF84B745E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{8AA88E83-6A98-4AD6-86EB-2ED4F6EDA17F} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{726D2CB9-80E5-4496-9C86-910AC452C45E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{EF745C56-0350-4C42-AA22-86D592E1D8D5} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{87063BA1-454D-4433-ADF9-89C667275D62} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
@@ -1623,7 +1720,6 @@ Global
 		{F228580D-9373-4A60-AB88-76DF58D11580} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{48E260F4-6F3F-4387-B61F-D15BABD06D9A} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{23EE9BBB-3B33-4CF2-8D1A-29A8DB12E878} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
-		{F5E27BA5-063B-4770-A6E8-87252E9AB22C} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{AA744891-5209-4335-8457-37EC347DF833} = {88278B81-7649-45DC-8A6A-D3A645C5AFC3}
 		{DA3595A8-35DE-42B9-97A4-4A2461BAD554} = {88278B81-7649-45DC-8A6A-D3A645C5AFC3}
 		{F2D1A7DA-B3EB-4CA7-BAA9-A18CEC398853} = {88278B81-7649-45DC-8A6A-D3A645C5AFC3}
@@ -1636,5 +1732,16 @@ Global
 		{3F7D56A3-A280-467E-8916-C18659C243BA} = {1AB5B24B-B317-4142-A5D1-A6E84F15BA34}
 		{B1AEC227-5115-44BC-92D2-B1B3545E1DDE} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
 		{08A40B6A-F695-4EA9-AC8D-CF88FADEA796} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{602976C5-2477-4B4C-AD9A-1EAFB250529A} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
+		{FCDFAF40-CC16-4D49-96C0-E49F195E7142} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
+		{B4EE3671-C103-4A37-8DEB-C74E0134104E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{44759218-B558-4AF0-8991-515F1100DCF5} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{E7C72EF2-8480-48B4-AAE8-A596F1A6048E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{E84C08C9-70D7-48B0-9507-ADB8B9A2694C} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{91BFE800-1624-4A58-A1CE-339705A8FFD0} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+		{EDF19BE6-F20F-4AD0-8E3B-E837030726A5} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {B526D2CE-EE2D-4AD4-93EF-1867D90FF1F5}
 	EndGlobalSection
 EndGlobal
diff --git a/README.md b/README.md
index 745659e0c..b82995678 100644
--- a/README.md
+++ b/README.md
@@ -7,14 +7,14 @@ This repo contains the source code for cross-platform [.NET Core](http://github.
 Looking for V1 of the .NET Core tooling?
 ----------------------------------------
 
-If you are looking for the v1.0.1 release of the .NET Core tools (CLI, MSBuild and the new csproj), see https://dot.net/core.
+If you are looking for the v2.0 release of the .NET Core tools (CLI, MSBuild and the new csproj), head over to https://dot.net/core and download!
 
-> **Note:** the release/2.1.2xx branch of the CLI repo is based on an upcoming update of the SDK and is considered pre-release. For production-level usage, please use the
+> **Note:** the release/2.1.3xx branch of the CLI repo is based on an upcoming update of the SDK and is considered pre-release. For production-level usage, please use the
 > released version of the tools available at https://dot.net/core
 
 Found an issue?
 ---------------
-You can consult the [Documents Index](Documentation/README.md) to find out the current issues and to see the workarounds.  
+You can consult the [Documents Index](Documentation/README.md) to find out the current issues and to see the workarounds.
 
 If you don't find your issue, please file one! However, given that this is a very high-frequency repo, we've setup some [basic guidelines](Documentation/project-docs/issue-filing-guide.md) to help you. Please consult those first.
 
@@ -23,36 +23,30 @@ This project has adopted the code of conduct defined by the [Contributor Covenan
 Build Status
 ------------
 
-|Windows x64 |Windows x86 |Mac OS X |Linux x64 |Ubuntu 14.04 / Linux Mint 17 |Ubuntu 16.04 |Ubuntu 16.10 |Debian 8 |RHEL 7.2 |
-|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|
-|[![][win-x64-build-badge]][win-x64-build]|[![][win-x86-build-badge]][win-x86-build]|[![][osx-build-badge]][osx-build]|[![][linux-build-badge]][linux-build]|[![][ubuntu-14.04-build-badge]][ubuntu-14.04-build]|[![][ubuntu-16.04-build-badge]][ubuntu-16.04-build]|[![][ubuntu-16.10-build-badge]][ubuntu-16.10-build]|[![][debian-8-build-badge]][debian-8-build]|[![][rhel-build-badge]][rhel-build]|
+|Windows x64|Windows x86|macOS|Linux x64 Archive|Linux Native Installers|RHEL 6 Archive|Alpine 3.6 Archive|
+|:------:|:------:|:------:|:------:|:------:|:------:|:------:|
+|[![][win-x64-build-badge]][win-x64-build]|[![][win-x86-build-badge]][win-x86-build]|[![][osx-build-badge]][osx-build]|[![][linux-build-badge]][linux-build]|[![][linuxnative-build-badge]][linuxnative-build]|[![][rhel6-build-badge]][rhel6-build]|[![][alpine3.6-build-badge]][alpine3.6-build]|
 
-[win-x64-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6786/badge
-[win-x64-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6786
+[win-x64-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6902/badge
+[win-x64-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6902
 
-[win-x86-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6787/badge
-[win-x86-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6787
+[win-x86-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6901/badge
+[win-x86-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6901
 
-[osx-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6781/badge
-[osx-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6781
+[osx-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6900/badge
+[osx-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6900
 
-[linux-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6780/badge
-[linux-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6780
+[linux-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6899/badge
+[linux-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6899
 
-[ubuntu-14.04-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6783/badge
-[ubuntu-14.04-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6783
+[linuxnative-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/7254/badge
+[linuxnative-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=7254
 
-[ubuntu-16.04-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6784/badge
-[ubuntu-16.04-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6784
+[rhel6-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/7392/badge
+[rhel6-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=7392
 
-[ubuntu-16.10-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6785/badge
-[ubuntu-16.10-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6785
-
-[debian-8-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6778/badge
-[debian-8-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6778
-
-[rhel-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6782/badge
-[rhel-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=6782
+[alpine3.6-build-badge]: https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/8168/badge
+[alpine3.6-build]: https://devdiv.visualstudio.com/DevDiv/_build?_a=completed&definitionId=8168
 
 Installers and Binaries
 -----------------------
@@ -63,24 +57,19 @@ To download the .NET Core runtime **without** the SDK, visit https://github.com/
 
 > **Note:** Be aware that the following installers are the **latest bits**. If you
 > want to install the latest released versions, check out the [preceding section](#looking-for-v1-of-the-net-core-tooling).
+> In order to be able to restore these pre-release packages, you may need to add a NuGet feed pointing to https://dotnet.myget.org/F/dotnet-core/api/v3/index.json. Other feeds may also be necessary depending on what kind of project you are working with.
 
-| Platform | Latest Daily Build<br>*release/2.1.2xx*<br>[![][version-badge]][version] |
+| Platform | Latest Daily Build<br>*release/2.1.3xx*<br>[![][version-badge]][version] |
 | -------- | :-------------------------------------: |
 | **Windows x64** | [Installer][win-x64-installer] - [Checksum][win-x64-installer-checksum]<br>[zip][win-x64-zip] - [Checksum][win-x64-zip-checksum] |
 | **Windows x86** | [Installer][win-x86-installer] - [Checksum][win-x86-installer-checksum]<br>[zip][win-x86-zip] - [Checksum][win-x86-zip-checksum] |
-| **Mac OS X** | [Installer][osx-installer] - [Checksum][osx-installer-checksum]<br>[tar.gz][osx-targz] - [Checksum][osx-targz-checksum] |
-| **Linux x64** | [tar.gz][linux-targz] - [Checksum][linux-targz-checksum] |
-| **Ubuntu 14.04 / Linux Mint 17** | [Installer][ubuntu-14.04-installer] - [Checksum][ubuntu-14.04-installer-checksum]<br>_see installer note below_<sup>1</sup><br>tar.gz - See **Linux x64** |
-| **Ubuntu 16.04** | [Installer][ubuntu-16.04-installer] - [Checksum][ubuntu-16.04-installer-checksum]<br>_see installer note below_<sup>1</sup><br>tar.gz - See **Linux x64** |
-| **Ubuntu 16.10** | [Installer][ubuntu-16.10-installer] - [Checksum][ubuntu-16.10-installer-checksum]<br>_see installer note below_<sup>1</sup><br>tar.gz - See **Linux x64** |
-| **Debian 8**  | [Installer][debian-8-installer] - [Checksum][debian-8-installer-checksum]<br>_see installer note below_<sup>1</sup><br>tar.gz - See **Linux x64** |
-| **RHEL 7.2** | [Installer][rhel-7-installer] - [Checksum][rhel-7-installer-checksum]<br>_see installer note below_<sup>1</sup><br>tar.gz - See **Linux x64** |
-| **CentOS 7.1 / Oracle Linux 7** | tar.gz - See **Linux x64** |
-| **Fedora 24** | tar.gz - See **Linux x64** |
-| **OpenSUSE 42.1** | tar.gz - See **Linux x64** |
+| **macOS** | [Installer][osx-installer] - [Checksum][osx-installer-checksum]<br>[tar.gz][osx-targz] - [Checksum][osx-targz-checksum] |
+| **Linux x64** | [DEB Installer][linux-DEB-installer] - [Checksum][linux-DEB-installer-checksum]<br>_see installer note below_<sup>1</sup><br>[tar.gz][linux-targz] - [Checksum][linux-targz-checksum] |
+| **RHEL 7.2** | [Installer][rhel-7-installer] - [Checksum][rhel-7-installer-checksum]<br>[tar.gz][linux-targz] - [Checksum][linux-targz-checksum] |
+| **RHEL 6** | [tar.gz][rhel-6-targz] - [Checksum][rhel-6-targz-checksum] |
+| **Alpine 3.6** | [tar.gz][alpine-3.6-targz] - [Checksum][alpine-3.6-targz-checksum] |
 
-
-| Latest Coherent Build<sup>2</sup><br>*release/2.1.2xx* |
+| Latest Coherent Build<sup>2</sup><br>*release/2.1.3xx* |
 |:------:|
 | [![][coherent-version-badge]][coherent-version] |
 
@@ -88,44 +77,42 @@ Reference notes:
 > **1**: *Our Debian packages are put together slightly differently than the other OS specific installers. Instead of combining everything, we have separate component packages that depend on each other. If you're installing these directly from the .deb files (via dpkg or similar), then you'll need to install the [corresponding Host, Host FX Resolver, and Shared Framework packages](https://github.com/dotnet/core-setup#daily-builds) before installing the Sdk package.*
 > <br><br>**2**: *A 'coherent' build is defined as a build where the Runtime version matches between the CLI and Asp.NET.*
 
+[version]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/latest.version
+[coherent-version]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/latest.coherent.version
 [comment]: # (The latest versions are always the same across all platforms. Just need one to show, so picking win-x64's svg.)
-[version]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/latest.version
-[version-badge]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/win_x64_Release_version_badge.svg
-[coherent-version]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/latest.coherent.version
-[coherent-version-badge]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/win_x86_Release_coherent_badge.svg
 
-[win-x64-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x64.exe
-[win-x64-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x64.exe.sha
-[win-x64-zip]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x64.zip
-[win-x64-zip-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x64.zip.sha
+[version-badge]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/win_x64_Release_version_badge.svg
+[coherent-version-badge]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/win_x64_Release_coherent_badge.svg
 
-[win-x86-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x86.exe
-[win-x86-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x86.exe.sha
-[win-x86-zip]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x86.zip
-[win-x86-zip-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-win-x86.zip.sha
+[win-x64-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x64.exe
+[win-x64-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x64.exe.sha
+[win-x64-zip]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x64.zip
+[win-x64-zip-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x64.zip.sha
 
-[osx-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-osx-x64.pkg
-[osx-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-osx-x64.pkg.sha
-[osx-targz]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-osx-x64.tar.gz
-[osx-targz-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-osx-x64.tar.gz.sha
+[win-x86-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x86.exe
+[win-x86-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x86.exe.sha
+[win-x86-zip]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x86.zip
+[win-x86-zip-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-win-x86.zip.sha
 
-[linux-targz]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-linux-x64.tar.gz
-[linux-targz-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-linux-x64.tar.gz.sha
+[osx-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-osx-x64.pkg
+[osx-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-osx-x64.pkg.sha
+[osx-targz]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-osx-x64.tar.gz
+[osx-targz-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-osx-x64.tar.gz.sha
 
-[ubuntu-14.04-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-ubuntu-x64.deb
-[ubuntu-14.04-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-ubuntu-x64.deb.sha
+[linux-targz]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-linux-x64.tar.gz
+[linux-targz-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-linux-x64.tar.gz.sha
 
-[ubuntu-16.04-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-ubuntu.16.04-x64.deb
-[ubuntu-16.04-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-ubuntu.16.04-x64.deb.sha
+[linux-DEB-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-x64.deb
+[linux-DEB-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-x64.deb.sha
 
-[ubuntu-16.10-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-ubuntu.16.10-x64.deb
-[ubuntu-16.10-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-ubuntu.16.10-x64.deb.sha
+[rhel-7-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-rhel-x64.rpm
+[rhel-7-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-rhel-x64.rpm.sha
 
-[debian-8-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-debian-x64.deb
-[debian-8-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-debian-x64.deb.sha
+[rhel-6-targz]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-rhel.6-x64.tar.gz
+[rhel-6-targz-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-rhel.6-x64.tar.gz.sha
 
-[rhel-7-installer]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-rhel-x64.rpm
-[rhel-7-installer-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.2xx/dotnet-sdk-latest-rhel-x64.rpm.sha
+[alpine-3.6-targz]: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-alpine.3.6-x64.tar.gz
+[alpine-3.6-targz-checksum]: https://dotnetclichecksums.blob.core.windows.net/dotnet/Sdk/release/2.1.3xx/dotnet-sdk-latest-alpine.3.6-x64.tar.gz.sha
 
 # Debian daily feed
 
@@ -152,15 +139,6 @@ sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
 sudo apt-get update
 ```
 
-Ubuntu 16.10
-```
-sudo sh -c 'echo "deb [arch=amd64] http://apt-mo.trafficmanager.net/repos/dotnet/ yakkety main" > /etc/apt/sources.list.d/dotnetdev.list'
-
-sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
-
-sudo apt-get update
-```
-
 Debian 8
 ```
 sudo sh -c 'echo "deb [arch=amd64] http://apt-mo.trafficmanager.net/repos/dotnet/ jessie main" > /etc/apt/sources.list.d/dotnetdev.list'
diff --git a/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/App.csproj b/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/App.csproj
index f72d85fc6..331a6e75f 100644
--- a/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/App.csproj
+++ b/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/App.csproj
@@ -2,10 +2,11 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFrameworks>netcoreapp2.0;net451</TargetFrameworks>
+    <TargetFrameworks>netcoreapp2.1;net451</TargetFrameworks>
     <OutputType>Exe</OutputType>
-    <AssetTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">$(AssetTargetFallback);portable-net45+win8;dnxcore50</AssetTargetFallback>
+    <AssetTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">$(AssetTargetFallback);portable-net45+win8;dnxcore50</AssetTargetFallback>
     <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.10-x64;osx.10.11-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7.2-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/NuGet.Config b/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/DesktopTestProjects/AppWithProjTool2Fx/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsAndConfig/AppWithRedirectsAndConfig.csproj b/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsAndConfig/AppWithRedirectsAndConfig.csproj
index 82a5ad25d..287b089bb 100644
--- a/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsAndConfig/AppWithRedirectsAndConfig.csproj
+++ b/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsAndConfig/AppWithRedirectsAndConfig.csproj
@@ -4,6 +4,7 @@
     <AssemblyName>AppWithRedirectsAndConfig</AssemblyName>
     <OutputType>Exe</OutputType>
     <RuntimeIdentifiers>win7-x64;win7-x86</RuntimeIdentifiers>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsNoConfig/AppWithRedirectsNoConfig.csproj b/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsNoConfig/AppWithRedirectsNoConfig.csproj
index 94b99d56b..8e5fc172e 100644
--- a/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsNoConfig/AppWithRedirectsNoConfig.csproj
+++ b/TestAssets/DesktopTestProjects/BindingRedirectSample/AppWithRedirectsNoConfig/AppWithRedirectsNoConfig.csproj
@@ -4,6 +4,7 @@
     <AssemblyName>AppWithRedirectsNoConfig</AssemblyName>
     <OutputType>Exe</OutputType>
     <RuntimeIdentifiers>win7-x64;win7-x86</RuntimeIdentifiers>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/DesktopTestProjects/BindingRedirectSample/NuGet.Config b/TestAssets/DesktopTestProjects/BindingRedirectSample/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/DesktopTestProjects/BindingRedirectSample/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/Lib.csproj b/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/Lib.csproj
index d57f09629..81bd8b767 100644
--- a/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/Lib.csproj
+++ b/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/Lib.csproj
@@ -2,7 +2,8 @@
   <PropertyGroup>
     <TargetFrameworks>netstandard1.6;net451</TargetFrameworks>
     <OutputType>Library</OutputType>
-    <AssetTargetFallback Condition=" '$(TargetFramework)' == 'netstandard1.6' ">$(AssetTargetFallback);portable-net45+win8;dnxcore50;netcoreapp2.0</AssetTargetFallback>
+    <AssetTargetFallback Condition=" '$(TargetFramework)' == 'netstandard1.6' ">$(AssetTargetFallback);portable-net45+win8;dnxcore50;netcoreapp2.1</AssetTargetFallback>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/NuGet.Config b/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/DesktopTestProjects/LibWithProjTool2Fx/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj b/TestAssets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj
index 7c813de92..70844e9e1 100644
--- a/TestAssets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj
+++ b/TestAssets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net461;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj b/TestAssets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj
index cc54ec8ae..465f0e78a 100644
--- a/TestAssets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj
+++ b/TestAssets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
+    <TargetFrameworks>netcoreapp2.1;net461</TargetFrameworks>
   </PropertyGroup>
 
     <ItemGroup>
diff --git a/TestAssets/Directory.Build.props b/TestAssets/Directory.Build.props
new file mode 100644
index 000000000..905549edc
--- /dev/null
+++ b/TestAssets/Directory.Build.props
@@ -0,0 +1,3 @@
+<Project>
+  <!-- Empty Directory.Build.props file to prevent test asset projects from picking up the repo's Directory.Build.props' -->
+</Project>
diff --git a/TestAssets/NonRestoredTestProjects/AppThrowingException/AppDependingOnOtherAsTool/AppDependingOnOtherAsTool.csproj b/TestAssets/NonRestoredTestProjects/AppThrowingException/AppDependingOnOtherAsTool/AppDependingOnOtherAsTool.csproj
index 30c6823e7..72070fa83 100644
--- a/TestAssets/NonRestoredTestProjects/AppThrowingException/AppDependingOnOtherAsTool/AppDependingOnOtherAsTool.csproj
+++ b/TestAssets/NonRestoredTestProjects/AppThrowingException/AppDependingOnOtherAsTool/AppDependingOnOtherAsTool.csproj
@@ -3,7 +3,7 @@
   
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/AppWithNonExistingToolDependency/AppWithNonExistingToolDependency.csproj b/TestAssets/NonRestoredTestProjects/AppWithNonExistingToolDependency/AppWithNonExistingToolDependency.csproj
index db9d6f117..6edffa788 100644
--- a/TestAssets/NonRestoredTestProjects/AppWithNonExistingToolDependency/AppWithNonExistingToolDependency.csproj
+++ b/TestAssets/NonRestoredTestProjects/AppWithNonExistingToolDependency/AppWithNonExistingToolDependency.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Broken/Broken.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Broken/Broken.csproj
index 1a79fa49d..75167a0cf 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Broken/Broken.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Broken/Broken.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFrameworks>net451;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net451;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Empty/README b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Empty/README
new file mode 100644
index 000000000..439cfe9c7
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Empty/README
@@ -0,0 +1,2 @@
+This directory is intentionally empty.
+
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/EmptyItemGroup/EmptyItemGroup.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/EmptyItemGroup/EmptyItemGroup.csproj
index 9932034ad..e08691280 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/EmptyItemGroup/EmptyItemGroup.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/EmptyItemGroup/EmptyItemGroup.csproj
@@ -3,10 +3,10 @@
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFrameworks>net451;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net451;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Lib/Lib.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Lib/Lib.csproj
index 46c045fe4..0aa576bba 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Lib/Lib.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Lib/Lib.csproj
@@ -3,10 +3,10 @@
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFrameworks>net451;netcoreapp2.0;netstandard1.4</TargetFrameworks>
+    <TargetFrameworks>net451;netcoreapp2.1;netstandard1.4</TargetFrameworks>
   </PropertyGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/a.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/a.csproj
index f648c3487..dc2b7cd91 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/a.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/a.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFrameworks>netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/b.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/b.csproj
index f648c3487..dc2b7cd91 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/b.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/MoreThanOne/b.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFrameworks>netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Net452AndNetCoreApp10Lib/Net452AndNetCoreApp10Lib.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Net452AndNetCoreApp10Lib/Net452AndNetCoreApp10Lib.csproj
index d52699c56..6a4e27f14 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Net452AndNetCoreApp10Lib/Net452AndNetCoreApp10Lib.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/Net452AndNetCoreApp10Lib/Net452AndNetCoreApp10Lib.csproj
@@ -3,9 +3,10 @@
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFrameworks>net452;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net452;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/ValidRef/ValidRef.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/ValidRef/ValidRef.csproj
index e6cf81456..d0f7ca172 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/ValidRef/ValidRef.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/ValidRef/ValidRef.csproj
@@ -5,7 +5,8 @@
     <OutputType>Library</OutputType>
     <TargetFrameworks>net451;netcoreapp1.0;netstandard1.4</TargetFrameworks>
   </PropertyGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithDoubledRef/WithDoubledRef.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithDoubledRef/WithDoubledRef.csproj
index f0e2e3daa..d97b42cc9 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithDoubledRef/WithDoubledRef.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithDoubledRef/WithDoubledRef.csproj
@@ -5,7 +5,8 @@
     <OutputType>Library</OutputType>
     <TargetFrameworks>net451;netcoreapp1.0</TargetFrameworks>
   </PropertyGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondOnItem/WithExistingRefCondOnItem.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondOnItem/WithExistingRefCondOnItem.csproj
index 3df93bb2f..0f2fd72d6 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondOnItem/WithExistingRefCondOnItem.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondOnItem/WithExistingRefCondOnItem.csproj
@@ -5,7 +5,8 @@
     <OutputType>Library</OutputType>
     <TargetFrameworks>net451;netcoreapp1.0</TargetFrameworks>
   </PropertyGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondWhitespaces/WithExistingRefCondWhitespaces.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondWhitespaces/WithExistingRefCondWhitespaces.csproj
index e4daa90a6..38e94922d 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondWhitespaces/WithExistingRefCondWhitespaces.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithExistingRefCondWhitespaces/WithExistingRefCondWhitespaces.csproj
@@ -5,9 +5,11 @@
     <OutputType>Library</OutputType>
     <TargetFrameworks>net451;netcoreapp1.0</TargetFrameworks>
   </PropertyGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
+  
   <ItemGroup Condition="       '$(TargetFramework)' == 'net451'" >
     <ProjectReference Include="..\Lib\Lib.csproj" />
   </ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithRefNoCondNonUniform/WithRefNoCondNonUniform.csproj b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithRefNoCondNonUniform/WithRefNoCondNonUniform.csproj
index 6a07adae0..02d8643fd 100644
--- a/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithRefNoCondNonUniform/WithRefNoCondNonUniform.csproj
+++ b/TestAssets/NonRestoredTestProjects/DotnetAddP2PProjects/WithRefNoCondNonUniform/WithRefNoCondNonUniform.csproj
@@ -5,7 +5,8 @@
     <OutputType>Library</OutputType>
     <TargetFrameworks>net451;netcoreapp1.0</TargetFrameworks>
   </PropertyGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/NonRestoredTestProjects/PJHalfMigrated/src/ProjectA/ProjectA.csproj b/TestAssets/NonRestoredTestProjects/PJHalfMigrated/src/ProjectA/ProjectA.csproj
index 915cb3e07..165e565c0 100755
--- a/TestAssets/NonRestoredTestProjects/PJHalfMigrated/src/ProjectA/ProjectA.csproj
+++ b/TestAssets/NonRestoredTestProjects/PJHalfMigrated/src/ProjectA/ProjectA.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <DebugType>portable</DebugType>
     <AssemblyName>ProjectA</AssemblyName>
     <OutputType>Exe</OutputType>
diff --git a/TestAssets/NonRestoredTestProjects/TestProjectWithUnresolvedPlatformDependency/TestProjectWithUnresolvedPlatformDependency.csproj b/TestAssets/NonRestoredTestProjects/TestProjectWithUnresolvedPlatformDependency/TestProjectWithUnresolvedPlatformDependency.csproj
index 261918eb3..b93e3b384 100755
--- a/TestAssets/NonRestoredTestProjects/TestProjectWithUnresolvedPlatformDependency/TestProjectWithUnresolvedPlatformDependency.csproj
+++ b/TestAssets/NonRestoredTestProjects/TestProjectWithUnresolvedPlatformDependency/TestProjectWithUnresolvedPlatformDependency.csproj
@@ -1,8 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
-    <AssetTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">$(AssetTargetFallback);dnxcore50</AssetTargetFallback>
+    <AssetTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">$(AssetTargetFallback);dnxcore50</AssetTargetFallback>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/AppWithDepOnTool/AppWithDepOnTool.csproj b/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/AppWithDepOnTool/AppWithDepOnTool.csproj
index f5ab2f51a..366b7f409 100644
--- a/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/AppWithDepOnTool/AppWithDepOnTool.csproj
+++ b/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/AppWithDepOnTool/AppWithDepOnTool.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <GeneratedPackageId>random-name</GeneratedPackageId>
   </PropertyGroup>
 
diff --git a/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/ToolWithRandomPackageName/ToolWithRandomPackageName.csproj b/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/ToolWithRandomPackageName/ToolWithRandomPackageName.csproj
index 9184414e8..145d47d10 100644
--- a/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/ToolWithRandomPackageName/ToolWithRandomPackageName.csproj
+++ b/TestAssets/NonRestoredTestProjects/ToolWithRandomPackageName/ToolWithRandomPackageName/ToolWithRandomPackageName.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <GeneratedPackageId>random-name</GeneratedPackageId>
     <PackageId>$(GeneratedPackageId)</PackageId>
     <AssemblyName>dotnet-randompackage</AssemblyName>
diff --git a/TestAssets/TestPackages/NuGet.Config b/TestAssets/TestPackages/NuGet.Config
deleted file mode 100644
index 0750578cb..000000000
--- a/TestAssets/TestPackages/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="testpackages" value="../../artifacts/testpackages/packages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestPackages/ToolWithOutputName/ToolWithOutputName.csproj b/TestAssets/TestPackages/ToolWithOutputName/ToolWithOutputName.csproj
index 6c57ebe5d..c237cd483 100644
--- a/TestAssets/TestPackages/ToolWithOutputName/ToolWithOutputName.csproj
+++ b/TestAssets/TestPackages/ToolWithOutputName/ToolWithOutputName.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <AssemblyName>dotnet-tool-with-output-name</AssemblyName>
     <PackageId>ToolWithOutputName</PackageId>
     <OutputType>Exe</OutputType>
diff --git a/TestAssets/TestPackages/dotnet-dependency-context-test/dotnet-dependency-context-test.csproj b/TestAssets/TestPackages/dotnet-dependency-context-test/dotnet-dependency-context-test.csproj
index 82c3d38ea..5af4b20b4 100644
--- a/TestAssets/TestPackages/dotnet-dependency-context-test/dotnet-dependency-context-test.csproj
+++ b/TestAssets/TestPackages/dotnet-dependency-context-test/dotnet-dependency-context-test.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <VersionPrefix>1.0.0-rc</VersionPrefix>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
   </PropertyGroup>
 
diff --git a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/dotnet-dependency-tool-invoker.csproj b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/dotnet-dependency-tool-invoker.csproj
index 474b54070..f625dcbe6 100644
--- a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/dotnet-dependency-tool-invoker.csproj
+++ b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/dotnet-dependency-tool-invoker.csproj
@@ -6,7 +6,7 @@
 
   <PropertyGroup>
     <VersionPrefix>1.0.0-rc</VersionPrefix>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
     <VersionSuffix></VersionSuffix>
     <DisableImplicitFrameworkReferences>false</DisableImplicitFrameworkReferences>
diff --git a/TestAssets/TestPackages/dotnet-desktop-binding-redirects/dotnet-desktop-binding-redirects.csproj b/TestAssets/TestPackages/dotnet-desktop-binding-redirects/dotnet-desktop-binding-redirects.csproj
index 4505fc5a0..f77a56e08 100644
--- a/TestAssets/TestPackages/dotnet-desktop-binding-redirects/dotnet-desktop-binding-redirects.csproj
+++ b/TestAssets/TestPackages/dotnet-desktop-binding-redirects/dotnet-desktop-binding-redirects.csproj
@@ -9,7 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Newtonsoft.Json" Version="5.0.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="5.0.1" />
   </ItemGroup>
 
   <ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
diff --git a/TestAssets/TestPackages/dotnet-fallbackfoldertool/dotnet-fallbackfoldertool.csproj b/TestAssets/TestPackages/dotnet-fallbackfoldertool/dotnet-fallbackfoldertool.csproj
index 35e92a2bb..9e29a16a7 100644
--- a/TestAssets/TestPackages/dotnet-fallbackfoldertool/dotnet-fallbackfoldertool.csproj
+++ b/TestAssets/TestPackages/dotnet-fallbackfoldertool/dotnet-fallbackfoldertool.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <AssemblyName>dotnet-fallbackfoldertool</AssemblyName>
     <OutputType>Exe</OutputType>
     <VersionSuffix></VersionSuffix>
diff --git a/TestAssets/TestPackages/dotnet-hello/v1/dotnet-hello/dotnet-hello.csproj b/TestAssets/TestPackages/dotnet-hello/v1/dotnet-hello/dotnet-hello.csproj
index fd5621f08..4ff2b8d00 100644
--- a/TestAssets/TestPackages/dotnet-hello/v1/dotnet-hello/dotnet-hello.csproj
+++ b/TestAssets/TestPackages/dotnet-hello/v1/dotnet-hello/dotnet-hello.csproj
@@ -5,7 +5,7 @@
     <Version>1.0.0</Version>
     <!--Workaround for https://github.com/NuGet/Home/issues/4583-->
     <VersionSuffix></VersionSuffix>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <AssemblyName>dotnet-hello</AssemblyName>
     <OutputType>Exe</OutputType>
     <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.10-x64;osx.10.11-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7.2-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
diff --git a/TestAssets/TestPackages/dotnet-hello/v2/dotnet-hello/dotnet-hello.csproj b/TestAssets/TestPackages/dotnet-hello/v2/dotnet-hello/dotnet-hello.csproj
index 2391dfc1b..7e4bc54d0 100644
--- a/TestAssets/TestPackages/dotnet-hello/v2/dotnet-hello/dotnet-hello.csproj
+++ b/TestAssets/TestPackages/dotnet-hello/v2/dotnet-hello/dotnet-hello.csproj
@@ -5,7 +5,7 @@
     <Version>2.0.0</Version>
     <!--Workaround for https://github.com/NuGet/Home/issues/4583-->
     <VersionSuffix></VersionSuffix>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <AssemblyName>dotnet-hello</AssemblyName>
     <OutputType>Exe</OutputType>
     <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.10-x64;osx.10.11-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7.2-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
diff --git a/TestAssets/TestPackages/dotnet-portable/dotnet-portable.csproj b/TestAssets/TestPackages/dotnet-portable/dotnet-portable.csproj
index bc2925f73..70f8b0dde 100644
--- a/TestAssets/TestPackages/dotnet-portable/dotnet-portable.csproj
+++ b/TestAssets/TestPackages/dotnet-portable/dotnet-portable.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
   </PropertyGroup>
 
diff --git a/TestAssets/TestPackages/dotnet-prefercliruntime/dotnet-prefercliruntime.csproj b/TestAssets/TestPackages/dotnet-prefercliruntime/dotnet-prefercliruntime.csproj
index e024fb2ba..5275ba5fc 100644
--- a/TestAssets/TestPackages/dotnet-prefercliruntime/dotnet-prefercliruntime.csproj
+++ b/TestAssets/TestPackages/dotnet-prefercliruntime/dotnet-prefercliruntime.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
     <VersionSuffix></VersionSuffix>
   </PropertyGroup>
diff --git a/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/11TestAppWith10CLIToolReferences.csproj b/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/11TestAppWith10CLIToolReferences.csproj
index 6dd25f7f6..c15ae1a16 100644
--- a/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/11TestAppWith10CLIToolReferences.csproj
+++ b/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/11TestAppWith10CLIToolReferences.csproj
@@ -4,6 +4,7 @@
   <PropertyGroup>
     <OutputType>Exe</OutputType>
     <TargetFramework>netcoreapp1.1</TargetFramework>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/NuGet.Config b/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/11TestAppWith10CLIToolReferences/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithCorruptedLaunchSettings/AppWithCorruptedLaunchSettings.csproj b/TestAssets/TestProjects/AppWithCorruptedLaunchSettings/AppWithCorruptedLaunchSettings.csproj
index 45a048433..9434c36c9 100644
--- a/TestAssets/TestProjects/AppWithCorruptedLaunchSettings/AppWithCorruptedLaunchSettings.csproj
+++ b/TestAssets/TestProjects/AppWithCorruptedLaunchSettings/AppWithCorruptedLaunchSettings.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;rhel.6-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64;alpine.3.6-x64</RuntimeIdentifiers>
   </PropertyGroup>
 </Project>
diff --git a/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/AppWithDepOnToolWithOutputName.csproj b/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/AppWithDepOnToolWithOutputName.csproj
index 9adf4c6fc..4ea5be23c 100755
--- a/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/AppWithDepOnToolWithOutputName.csproj
+++ b/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/AppWithDepOnToolWithOutputName.csproj
@@ -2,8 +2,9 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/NuGet.Config b/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/AppWithDepOnToolWithOutputName/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithDirectAndToolDep/AppWithDirectAndToolDep.csproj b/TestAssets/TestProjects/AppWithDirectAndToolDep/AppWithDirectAndToolDep.csproj
index df284421b..afcfb340e 100755
--- a/TestAssets/TestProjects/AppWithDirectAndToolDep/AppWithDirectAndToolDep.csproj
+++ b/TestAssets/TestProjects/AppWithDirectAndToolDep/AppWithDirectAndToolDep.csproj
@@ -2,8 +2,9 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/AppWithDirectAndToolDep/NuGet.Config b/TestAssets/TestProjects/AppWithDirectAndToolDep/NuGet.Config
deleted file mode 100644
index dd7ccd7af..000000000
--- a/TestAssets/TestProjects/AppWithDirectAndToolDep/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages/packages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithDirectDep/AppWithDirectDep.csproj b/TestAssets/TestProjects/AppWithDirectDep/AppWithDirectDep.csproj
index 6995199ee..5b5c0f757 100755
--- a/TestAssets/TestProjects/AppWithDirectDep/AppWithDirectDep.csproj
+++ b/TestAssets/TestProjects/AppWithDirectDep/AppWithDirectDep.csproj
@@ -3,10 +3,11 @@
 
   <PropertyGroup>
     <VersionPrefix>1.0.0</VersionPrefix>
-    <TargetFrameworks>netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>
     <AssemblyName>AppWithDirectDep</AssemblyName>
     <OutputType>Exe</OutputType>
     <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/AppWithDirectDep/NuGet.Config b/TestAssets/TestProjects/AppWithDirectDep/NuGet.Config
deleted file mode 100644
index dd7ccd7af..000000000
--- a/TestAssets/TestProjects/AppWithDirectDep/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages/packages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithDirectDepWithOutputName/AppWithDirectDepWithOutputName.csproj b/TestAssets/TestProjects/AppWithDirectDepWithOutputName/AppWithDirectDepWithOutputName.csproj
index 5afb24921..4eef16036 100755
--- a/TestAssets/TestProjects/AppWithDirectDepWithOutputName/AppWithDirectDepWithOutputName.csproj
+++ b/TestAssets/TestProjects/AppWithDirectDepWithOutputName/AppWithDirectDepWithOutputName.csproj
@@ -2,8 +2,9 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/AppWithDirectDepWithOutputName/NuGet.Config b/TestAssets/TestProjects/AppWithDirectDepWithOutputName/NuGet.Config
deleted file mode 100644
index 4da396ac8..000000000
--- a/TestAssets/TestProjects/AppWithDirectDepWithOutputName/NuGet.Config
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
-    <clear />
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/AppWithFallbackFolderToolDependency.csproj b/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/AppWithFallbackFolderToolDependency.csproj
index 705cf2077..76195b1ca 100755
--- a/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/AppWithFallbackFolderToolDependency.csproj
+++ b/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/AppWithFallbackFolderToolDependency.csproj
@@ -2,8 +2,9 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/NuGet.Config b/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/AppWithFallbackFolderToolDependency/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithLaunchSettings/AppWithLaunchSettings.csproj b/TestAssets/TestProjects/AppWithLaunchSettings/AppWithLaunchSettings.csproj
index 45a048433..9434c36c9 100644
--- a/TestAssets/TestProjects/AppWithLaunchSettings/AppWithLaunchSettings.csproj
+++ b/TestAssets/TestProjects/AppWithLaunchSettings/AppWithLaunchSettings.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;rhel.6-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64;alpine.3.6-x64</RuntimeIdentifiers>
   </PropertyGroup>
 </Project>
diff --git a/TestAssets/TestProjects/AppWithLaunchSettingsNoDefault/AppWithLaunchSettingsNoDefault.csproj b/TestAssets/TestProjects/AppWithLaunchSettingsNoDefault/AppWithLaunchSettingsNoDefault.csproj
index 45a048433..9434c36c9 100644
--- a/TestAssets/TestProjects/AppWithLaunchSettingsNoDefault/AppWithLaunchSettingsNoDefault.csproj
+++ b/TestAssets/TestProjects/AppWithLaunchSettingsNoDefault/AppWithLaunchSettingsNoDefault.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;rhel.6-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64;alpine.3.6-x64</RuntimeIdentifiers>
   </PropertyGroup>
 </Project>
diff --git a/TestAssets/TestProjects/AppWithMultipleFxAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj b/TestAssets/TestProjects/AppWithMultipleFxAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj
index 965ca32df..4aeb0de85 100644
--- a/TestAssets/TestProjects/AppWithMultipleFxAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj
+++ b/TestAssets/TestProjects/AppWithMultipleFxAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj
@@ -3,13 +3,15 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFrameworks>net451;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net451;netcoreapp2.1</TargetFrameworks>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
     <PackageReference Include="dotnet-desktop-and-portable" Version="1.0.0-*" />
   </ItemGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/TestProjects/AppWithMultipleFxAndTools/NuGet.Config b/TestAssets/TestProjects/AppWithMultipleFxAndTools/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/AppWithMultipleFxAndTools/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/AppWithToolDependency/AppWithToolDependency.csproj b/TestAssets/TestProjects/AppWithToolDependency/AppWithToolDependency.csproj
index 7f9c16848..a18ee9852 100755
--- a/TestAssets/TestProjects/AppWithToolDependency/AppWithToolDependency.csproj
+++ b/TestAssets/TestProjects/AppWithToolDependency/AppWithToolDependency.csproj
@@ -2,8 +2,9 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/AppWithToolDependency/NuGet.Config b/TestAssets/TestProjects/AppWithToolDependency/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/AppWithToolDependency/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/DependencyContextFromTool/DependencyContextFromTool.csproj b/TestAssets/TestProjects/DependencyContextFromTool/DependencyContextFromTool.csproj
index 9c5447b05..2de1535e2 100755
--- a/TestAssets/TestProjects/DependencyContextFromTool/DependencyContextFromTool.csproj
+++ b/TestAssets/TestProjects/DependencyContextFromTool/DependencyContextFromTool.csproj
@@ -3,11 +3,12 @@
 
   <PropertyGroup>
     <VersionPrefix>1.0.0</VersionPrefix>
-    <TargetFrameworks>netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>
     <AssemblyName>DependencyContextFromTool</AssemblyName>
     <OutputType>Exe</OutputType>
     <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
     <AssetTargetFallback>$(AssetTargetFallback);dnxcore50;portable-net45+win8</AssetTargetFallback>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/DependencyContextFromTool/NuGet.Config b/TestAssets/TestProjects/DependencyContextFromTool/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/DependencyContextFromTool/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/FSharpTestAppSimple/TestAppSimple.fsproj b/TestAssets/TestProjects/FSharpTestAppSimple/TestAppSimple.fsproj
index 1af08f3b6..7c81fcb9c 100644
--- a/TestAssets/TestProjects/FSharpTestAppSimple/TestAppSimple.fsproj
+++ b/TestAssets/TestProjects/FSharpTestAppSimple/TestAppSimple.fsproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
     <!-- Issue: https://github.com/dotnet/sdk/issues/1150 -->
     <DisableImplicitAssetTargetFallback>true</DisableImplicitAssetTargetFallback>
diff --git a/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworks/MSBuildAppWithMultipleFrameworks.csproj b/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworks/MSBuildAppWithMultipleFrameworks.csproj
index 89aae6c65..4ef98259b 100644
--- a/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworks/MSBuildAppWithMultipleFrameworks.csproj
+++ b/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworks/MSBuildAppWithMultipleFrameworks.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFrameworks>net451;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net451;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
 </Project>
\ No newline at end of file
diff --git a/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworksAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj b/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworksAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj
index 0efe63453..276e1c618 100644
--- a/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworksAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj
+++ b/TestAssets/TestProjects/MSBuildAppWithMultipleFrameworksAndTools/MSBuildAppWithMultipleFrameworksAndTools.csproj
@@ -3,13 +3,14 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFrameworks>net451;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net451;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
   <ItemGroup>
     <PackageReference Include="dotnet-desktop-and-portable" Version="1.0.0-*" />
   </ItemGroup>
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
+
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/TestProjects/MSBuildTestApp/MSBuildTestApp.csproj b/TestAssets/TestProjects/MSBuildTestApp/MSBuildTestApp.csproj
index 79bceb82d..852eafe13 100644
--- a/TestAssets/TestProjects/MSBuildTestApp/MSBuildTestApp.csproj
+++ b/TestAssets/TestProjects/MSBuildTestApp/MSBuildTestApp.csproj
@@ -3,8 +3,9 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64</RuntimeIdentifiers>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RuntimeIdentifiers>win7-x64;win7-x86;osx.10.12-x64;ubuntu.14.04-x64;ubuntu.16.04-x64;ubuntu.16.10-x64;rhel.6-x64;centos.7-x64;rhel.7-x64;debian.8-x64;fedora.24-x64;opensuse.42.1-x64;alpine.3.6-x64</RuntimeIdentifiers>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/MSBuildTestApp/NuGet.Config b/TestAssets/TestProjects/MSBuildTestApp/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/MSBuildTestApp/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/MultiDependentProject/MultiDependentProject.csproj b/TestAssets/TestProjects/MultiDependentProject/MultiDependentProject.csproj
index 8437d1b6d..9d52a2484 100644
--- a/TestAssets/TestProjects/MultiDependentProject/MultiDependentProject.csproj
+++ b/TestAssets/TestProjects/MultiDependentProject/MultiDependentProject.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/NewtonSoftDependentProject/NewtonSoftDependentProject.csproj b/TestAssets/TestProjects/NewtonSoftDependentProject/NewtonSoftDependentProject.csproj
index 48bba3bea..cff7d9c45 100644
--- a/TestAssets/TestProjects/NewtonSoftDependentProject/NewtonSoftDependentProject.csproj
+++ b/TestAssets/TestProjects/NewtonSoftDependentProject/NewtonSoftDependentProject.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/NuGet.Config b/TestAssets/TestProjects/NuGet.Config
deleted file mode 100644
index b03d4d16c..000000000
--- a/TestAssets/TestProjects/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="Local" value="Packages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/NuGetConfigDependentProject/NuGetConfigDependentProject.csproj b/TestAssets/TestProjects/NuGetConfigDependentProject/NuGetConfigDependentProject.csproj
index fd76d5489..340e58180 100644
--- a/TestAssets/TestProjects/NuGetConfigDependentProject/NuGetConfigDependentProject.csproj
+++ b/TestAssets/TestProjects/NuGetConfigDependentProject/NuGetConfigDependentProject.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppSimple/Program.cs b/TestAssets/TestProjects/TestAppSimple/Program.cs
index 2130cd0a7..d431e919c 100644
--- a/TestAssets/TestProjects/TestAppSimple/Program.cs
+++ b/TestAssets/TestProjects/TestAppSimple/Program.cs
@@ -10,6 +10,14 @@ namespace ConsoleApplication
         public static void Main(string[] args)
         {
             Console.WriteLine("Hello World!");
+
+            if (args.Length > 0)
+            {
+                for (int i = 0; i < args.Length; i++)
+                {
+                    Console.WriteLine($"{i} = {args[i]}");
+                }
+            }
         }
     }
 }
diff --git a/TestAssets/TestProjects/TestAppSimple/TestAppSimple.csproj b/TestAssets/TestProjects/TestAppSimple/TestAppSimple.csproj
index e9f02f323..f99d38872 100755
--- a/TestAssets/TestProjects/TestAppSimple/TestAppSimple.csproj
+++ b/TestAssets/TestProjects/TestAppSimple/TestAppSimple.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
     <OutputType>Exe</OutputType>
     <!-- Issue: https://github.com/dotnet/sdk/issues/1150 -->
     <DisableImplicitAssetTargetFallback>true</DisableImplicitAssetTargetFallback>
diff --git a/TestAssets/TestProjects/TestAppWithEmptySln/App/App.csproj b/TestAssets/TestProjects/TestAppWithEmptySln/App/App.csproj
index a314f6f81..cefcb0402 100644
--- a/TestAssets/TestProjects/TestAppWithEmptySln/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithEmptySln/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithMultipleSlnFiles/App/App.csproj b/TestAssets/TestProjects/TestAppWithMultipleSlnFiles/App/App.csproj
index c8ab8e530..d466f76c6 100644
--- a/TestAssets/TestProjects/TestAppWithMultipleSlnFiles/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithMultipleSlnFiles/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithProjDepTool/NuGet.Config b/TestAssets/TestProjects/TestAppWithProjDepTool/NuGet.Config
deleted file mode 100644
index b8e876fcb..000000000
--- a/TestAssets/TestProjects/TestAppWithProjDepTool/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/TestAssets/TestProjects/TestAppWithProjDepTool/TestAppWithProjDepTool.csproj b/TestAssets/TestProjects/TestAppWithProjDepTool/TestAppWithProjDepTool.csproj
index 3f8176791..b4e6c9844 100644
--- a/TestAssets/TestProjects/TestAppWithProjDepTool/TestAppWithProjDepTool.csproj
+++ b/TestAssets/TestProjects/TestAppWithProjDepTool/TestAppWithProjDepTool.csproj
@@ -3,7 +3,8 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCaseSensitiveSolutionFolders/src/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCaseSensitiveSolutionFolders/src/App/App.csproj
index 64870d559..264eddb85 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndCaseSensitiveSolutionFolders/src/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCaseSensitiveSolutionFolders/src/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/App/App.csproj
index a314f6f81..cefcb0402 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Empty/README b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Empty/README
new file mode 100644
index 000000000..439cfe9c7
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Empty/README
@@ -0,0 +1,2 @@
+This directory is intentionally empty.
+
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Multiple/First.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Multiple/First.csproj
new file mode 100644
index 000000000..9f5c4f4ab
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Multiple/First.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Multiple/Second.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Multiple/Second.csproj
new file mode 100644
index 000000000..9f5c4f4ab
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojFiles/Multiple/Second.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDir/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDir/App.csproj
index a3f261628..d02e1c64b 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDir/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDir/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDirToRemove/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDirToRemove/App.csproj
index 0fd2b18ad..653032148 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDirToRemove/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojInSubDirToRemove/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojProjectGuidFiles/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojProjectGuidFiles/App/App.csproj
index a314f6f81..cefcb0402 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndCsprojProjectGuidFiles/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojProjectGuidFiles/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/App/App.csproj
index c8ab8e530..d466f76c6 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Empty/README b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Empty/README
new file mode 100644
index 000000000..439cfe9c7
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Empty/README
@@ -0,0 +1,2 @@
+This directory is intentionally empty.
+
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Multiple/First.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Multiple/First.csproj
new file mode 100644
index 000000000..9f5c4f4ab
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Multiple/First.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Multiple/Second.csproj b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Multiple/Second.csproj
new file mode 100644
index 000000000..9f5c4f4ab
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndCsprojToRemove/Multiple/Second.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndDuplicateProjectReferences/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndDuplicateProjectReferences/App/App.csproj
index a314f6f81..cefcb0402 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndDuplicateProjectReferences/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndDuplicateProjectReferences/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferences/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferences/App/App.csproj
index 6b530243e..867909f5d 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferences/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferences/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferencesWithEscapedDirSep/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferencesWithEscapedDirSep/App/App.csproj
index 6b530243e..867909f5d 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferencesWithEscapedDirSep/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndExistingCsprojReferencesWithEscapedDirSep/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndLastCsprojInSubDirToRemove/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndLastCsprojInSubDirToRemove/App.csproj
index 0fd2b18ad..653032148 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndLastCsprojInSubDirToRemove/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndLastCsprojInSubDirToRemove/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/App.sln b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/App.sln
new file mode 100644
index 000000000..acf657a65
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/App.sln
@@ -0,0 +1,21 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26006.2
+MinimumVisualStudioVersion = 10.0.40219.1
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		Foo Bar|Any CPU = Foo Bar|Any CPU
+		Foo Bar|x64 = Foo Bar|x64
+		Foo Bar|x86 = Foo Bar|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithAdditionalConfigs/Library.cs b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithAdditionalConfigs/Library.cs
new file mode 100644
index 000000000..786c0221c
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithAdditionalConfigs/Library.cs
@@ -0,0 +1,15 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+
+namespace ProjectWithAdditionalConfigs
+{
+    public static class Library
+    {
+        public static string GetMessage()
+        {
+            return "Hello World!";
+        }
+    }
+}
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithAdditionalConfigs/ProjectWithAdditionalConfigs.csproj b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithAdditionalConfigs/ProjectWithAdditionalConfigs.csproj
new file mode 100644
index 000000000..9b87758e9
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithAdditionalConfigs/ProjectWithAdditionalConfigs.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <ProjectGuid>{A302325B-D680-4C0E-8680-7AE283981624}</ProjectGuid>
+    <Platforms>AnyCPU;x64;x86;AdditionalPlatform</Platforms>
+    <Configurations>Debug;Release;FooBar;AdditionalConfiguration</Configurations>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithMatchingConfigs/Library.cs b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithMatchingConfigs/Library.cs
new file mode 100644
index 000000000..c0d7436b3
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithMatchingConfigs/Library.cs
@@ -0,0 +1,15 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+
+namespace ProjectWithMatchingConfigs
+{
+    public static class Library
+    {
+        public static string GetMessage()
+        {
+            return "Hello World!";
+        }
+    }
+}
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithMatchingConfigs/ProjectWithMatchingConfigs.csproj b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithMatchingConfigs/ProjectWithMatchingConfigs.csproj
new file mode 100644
index 000000000..7c789108f
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithMatchingConfigs/ProjectWithMatchingConfigs.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <ProjectGuid>{C9601CA2-DB64-4FB6-B463-368C7764BF0D}</ProjectGuid>
+    <Platforms>AnyCPU;x64;x86</Platforms>
+    <Configurations>Debug;Release;FooBar</Configurations>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithoutMatchingConfigs/Library.cs b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithoutMatchingConfigs/Library.cs
new file mode 100644
index 000000000..fb9a17c27
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithoutMatchingConfigs/Library.cs
@@ -0,0 +1,15 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+
+namespace ProjectWithoutMatchingConfigs
+{
+    public static class Library
+    {
+        public static string GetMessage()
+        {
+            return "Hello World!";
+        }
+    }
+}
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithoutMatchingConfigs/ProjectWithoutMatchingConfigs.csproj b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithoutMatchingConfigs/ProjectWithoutMatchingConfigs.csproj
new file mode 100644
index 000000000..4bc811fa1
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnAndProjectConfigs/ProjectWithoutMatchingConfigs/ProjectWithoutMatchingConfigs.csproj
@@ -0,0 +1,8 @@
+<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <ProjectGuid>{C49B64DE-4401-4825-8A88-10DCB5950E57}</ProjectGuid>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnAndSolutionFolders/src/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnAndSolutionFolders/src/App/App.csproj
index 64870d559..264eddb85 100644
--- a/TestAssets/TestProjects/TestAppWithSlnAndSolutionFolders/src/App/App.csproj
+++ b/TestAssets/TestProjects/TestAppWithSlnAndSolutionFolders/src/App/App.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App.sln b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App.sln
new file mode 100644
index 000000000..97c495544
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App.sln
@@ -0,0 +1,44 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27110.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "App\App.csproj", "{BB02B949-F6BD-4872-95CB-96A05B1FE026}"
+	ProjectSection(ProjectDependencies) = postProject
+		{4E952B56-841D-461D-89A9-7977DDCC0625} = {4E952B56-841D-461D-89A9-7977DDCC0625}
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6} = {D53E177A-8ECF-43D5-A01E-98B884D53CA6}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "First", "First\First.csproj", "{D53E177A-8ECF-43D5-A01E-98B884D53CA6}"
+	ProjectSection(ProjectDependencies) = postProject
+		{4E952B56-841D-461D-89A9-7977DDCC0625} = {4E952B56-841D-461D-89A9-7977DDCC0625}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Second", "Second\Second.csproj", "{4E952B56-841D-461D-89A9-7977DDCC0625}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4E952B56-841D-461D-89A9-7977DDCC0625}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4E952B56-841D-461D-89A9-7977DDCC0625}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4E952B56-841D-461D-89A9-7977DDCC0625}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4E952B56-841D-461D-89A9-7977DDCC0625}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {F6D9A973-1CFD-41C9-84F2-1471C0FE67DF}
+	EndGlobalSection
+EndGlobal
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App/App.csproj b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App/App.csproj
new file mode 100644
index 000000000..ce1697ae8
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App/App.csproj
@@ -0,0 +1,8 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App/Program.cs b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App/Program.cs
new file mode 100644
index 000000000..be4278310
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/App/Program.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace App
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Console.WriteLine("Hello World!");
+        }
+    }
+}
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/First/Class1.cs b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/First/Class1.cs
new file mode 100644
index 000000000..3a358f6f2
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/First/Class1.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace First
+{
+    public class Class1
+    {
+    }
+}
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/First/First.csproj b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/First/First.csproj
new file mode 100644
index 000000000..9f5c4f4ab
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/First/First.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/Second/Class1.cs b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/Second/Class1.cs
new file mode 100644
index 000000000..a39ee63c8
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/Second/Class1.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace Second
+{
+    public class Class1
+    {
+    }
+}
diff --git a/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/Second/Second.csproj b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/Second/Second.csproj
new file mode 100644
index 000000000..9f5c4f4ab
--- /dev/null
+++ b/TestAssets/TestProjects/TestAppWithSlnProjectDependencyToRemove/Second/Second.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/TestAssets/TestProjects/VBTestApp/VBTestApp.vbproj b/TestAssets/TestProjects/VBTestApp/VBTestApp.vbproj
index ce1697ae8..23df6047f 100644
--- a/TestAssets/TestProjects/VBTestApp/VBTestApp.vbproj
+++ b/TestAssets/TestProjects/VBTestApp/VBTestApp.vbproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
 </Project>
diff --git a/TestAssets/TestProjects/VSTestCore/VSTestCore.csproj b/TestAssets/TestProjects/VSTestCore/VSTestCore.csproj
index c69bc4462..26592bc1d 100644
--- a/TestAssets/TestProjects/VSTestCore/VSTestCore.csproj
+++ b/TestAssets/TestProjects/VSTestCore/VSTestCore.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/VSTestMulti/VSTestDesktopAndNetCore.csproj b/TestAssets/TestProjects/VSTestMulti/VSTestDesktopAndNetCore.csproj
index 80517174a..2b2cc7769 100644
--- a/TestAssets/TestProjects/VSTestMulti/VSTestDesktopAndNetCore.csproj
+++ b/TestAssets/TestProjects/VSTestMulti/VSTestDesktopAndNetCore.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFrameworks>net46;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net46;netcoreapp2.1</TargetFrameworks>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(TargetFramework)' == 'net46'">
diff --git a/TestAssets/TestProjects/XunitCore/XunitCore.csproj b/TestAssets/TestProjects/XunitCore/XunitCore.csproj
index 277e9d3d7..84a3da759 100644
--- a/TestAssets/TestProjects/XunitCore/XunitCore.csproj
+++ b/TestAssets/TestProjects/XunitCore/XunitCore.csproj
@@ -3,7 +3,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/TestAssets/TestProjects/XunitMulti/VSTestXunitDesktopAndNetCore.csproj b/TestAssets/TestProjects/XunitMulti/VSTestXunitDesktopAndNetCore.csproj
index c74d87941..4534df62b 100644
--- a/TestAssets/TestProjects/XunitMulti/VSTestXunitDesktopAndNetCore.csproj
+++ b/TestAssets/TestProjects/XunitMulti/VSTestXunitDesktopAndNetCore.csproj
@@ -2,7 +2,7 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), testAsset.props))\testAsset.props" />
 
   <PropertyGroup>
-    <TargetFrameworks>net46;netcoreapp2.0</TargetFrameworks>
+    <TargetFrameworks>net46;netcoreapp2.1</TargetFrameworks>
     <RuntimeIdentifiers>win7-x86</RuntimeIdentifiers>
     <RuntimeIdentifier Condition=" '$(TargetFramework)' == 'net46' ">win7-x86</RuntimeIdentifier>
   </PropertyGroup>
@@ -11,7 +11,7 @@
     <DefineConstants>DESKTOP;$(DefineConstants)</DefineConstants>
   </PropertyGroup>
 
-  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.0'">
+  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.1'">
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
   </ItemGroup>
 
diff --git a/TestAssets/TestProjects/global.json b/TestAssets/TestProjects/global.json
deleted file mode 100644
index 09f20328d..000000000
--- a/TestAssets/TestProjects/global.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "projects": [ ".", "../../src" ]
-}
\ No newline at end of file
diff --git a/build.proj b/build.proj
index 060afe7d3..fb895d191 100644
--- a/build.proj
+++ b/build.proj
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="14.0" DefaultTargets="BuildTheWholeCli" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <Import Project="Directory.Build.props" />
 
   <ItemGroup>
     <DotnetCliBuildFrameworkInputs Include="build_projects/**/*.cs" Exclude="build_projects/**/obj/**/*.cs" />
@@ -20,7 +20,7 @@
           DependsOnTargets="MSBuildWorkaroundTarget;
                             RestoreDotnetCliBuildFramework">
 
-    <Exec Command="$(DotnetStage0) publish --no-restore -o $(DotnetCliBuildDirectory)/bin --framework netcoreapp2.0 /p:GeneratePropsFile=$(GeneratePropsFile)" 
+    <Exec Command="$(PreviousStageDotnet) publish --no-restore -o $(DotnetCliBuildDirectory)/bin --framework $(CliTargetFramework) /p:GeneratePropsFile=$(GeneratePropsFile)" 
           WorkingDirectory="$(DotnetCliBuildDirectory)"/>
   </Target>
   
@@ -40,7 +40,7 @@
       <ExtraRestoreArgs Condition="'$(OS)' != 'Windows_NT'">$(ExtraRestoreArgs) --disable-parallel</ExtraRestoreArgs>
     </PropertyGroup>
 
-    <Exec Command="$(DotnetStage0) restore $(ExtraRestoreArgs)" 
+    <Exec Command="$(PreviousStageDotnet) restore $(ExtraRestoreArgs)" 
           WorkingDirectory="$(DotnetCliBuildDirectory)"/>
   </Target>
 
@@ -53,6 +53,7 @@
   <Import Project="build/DownloadPackageVersions.targets" />
   <Import Project="build/Prepare.targets" />
   <Import Project="build/Compile.targets" />
+  <Import Project="build/BuildAndPublishAllLinuxDistrosNativeInstallers.targets" />
   <Import Project="build/Package.targets" />
   <Import Project="build/Test.targets" />
   <Import Project="build/Publish.targets" />
diff --git a/build.sh b/build.sh
index 2177e91b7..99a136aa7 100755
--- a/build.sh
+++ b/build.sh
@@ -24,7 +24,7 @@ if [ -z "$HOME" ]; then
     mkdir -p $HOME
 fi
 
-args=( "$@" )
+args=
 
 while [[ $# > 0 ]]; do
     lowerI="$(echo $1 | awk '{print tolower($0)}')"
@@ -32,23 +32,15 @@ while [[ $# > 0 ]]; do
         --docker)
             export BUILD_IN_DOCKER=1
             export DOCKER_IMAGENAME=$2
-            # remove docker args
-            args=( "${args[@]/$1}" )
-            args=( "${args[@]/$2}" )
             shift
             ;;
         *)
+            args="$args $1"
+            ;;
     esac
     shift
 done
 
-# $args array may have empty elements in it.
-# The easiest way to remove them is to cast to string and back to array.
-# This will actually break quoted arguments, arguments like 
-# -test "hello world" will be broken into three arguments instead of two, as it should.
-temp="${args[@]}"
-args=($temp)
-
 dockerbuild()
 {
     BUILD_COMMAND=/opt/code/run-build.sh $DIR/scripts/dockerrun.sh --non-interactive "$@"
@@ -56,7 +48,7 @@ dockerbuild()
 
 # Check if we need to build in docker
 if [ ! -z "$BUILD_IN_DOCKER" ]; then
-    dockerbuild "${args[@]}"
+    dockerbuild $args
 else
-    $DIR/run-build.sh "${args[@]}"
+    $DIR/run-build.sh $args
 fi
diff --git a/build/AzureInfo.props b/build/AzureInfo.props
index 490ea909e..6e1739c62 100644
--- a/build/AzureInfo.props
+++ b/build/AzureInfo.props
@@ -1,25 +1,43 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <Product>Sdk</Product>
-    <CoreSetupBlobRootUrl Condition="'$(PB_AssetRootUrl)' != ''">$(PB_AssetRootUrl)</CoreSetupBlobRootUrl>
-    <CoreSetupBlobRootUrl Condition="'$(CoreSetupBlobRootUrl)' == ''">https://dotnetcli.azureedge.net/dotnet/</CoreSetupBlobRootUrl>
+    <IsNotOrchestratedPublish>true</IsNotOrchestratedPublish>
+    <IsNotOrchestratedPublish Condition="'$(PB_PublishBlobFeedUrl)' != ''">false</IsNotOrchestratedPublish>
+    <BlobStoragePartialRelativePath>$(Product)</BlobStoragePartialRelativePath>
+    <BlobStoragePartialRelativePath Condition="'$(IsNotOrchestratedPublish)' == 'false'">assets/$(Product)</BlobStoragePartialRelativePath>
+    
+    <!-- Values related to the download of assets from blob storage -->
+    <DefaultCoreSetupBlobRootUrl>https://dotnetcli.azureedge.net/dotnet/</DefaultCoreSetupBlobRootUrl>
+    <CoreSetupBlobRootUrl>$(PB_AssetRootUrl)</CoreSetupBlobRootUrl>
+    <CoreSetupBlobRootUrl Condition="'$(CoreSetupBlobRootUrl)' == ''">$(DefaultCoreSetupBlobRootUrl)</CoreSetupBlobRootUrl>
+    <BackwardsCompatibilityCoreSetupBlobRootUrl>$(DefaultCoreSetupBlobRootUrl)</BackwardsCompatibilityCoreSetupBlobRootUrl>
     <CoreSetupBlobAccessToken Condition="'$(PB_AssetRootAccessTokenSuffix)' != ''">$(PB_AssetRootAccessTokenSuffix)</CoreSetupBlobAccessToken>
     <CoreSetupBlobAccessTokenParam Condition=" '$(CoreSetupBlobAccessToken)' != '' ">?$(CoreSetupBlobAccessToken)</CoreSetupBlobAccessTokenParam>
-    <ArtifactContainerName>$(ARTIFACT_STORAGE_CONTAINER)</ArtifactContainerName>
-    <ArtifactContainerName Condition="'$(ArtifactContainerName)' == ''">dotnet</ArtifactContainerName>
-    <ArtifactCloudDropAccessToken>$(ARTIFACT_STORAGE_KEY)</ArtifactCloudDropAccessToken>
+
+    <!-- Values related to the upload of assets to blob storage -->
     <ArtifactCloudDropAccountName>$(ARTIFACT_STORAGE_ACCOUNT)</ArtifactCloudDropAccountName>
     <ArtifactCloudDropAccountName Condition="'$(ArtifactCloudDropAccountName)' == ''">dotnetcli</ArtifactCloudDropAccountName>
-    <DotnetBlobRootUrl>https://$(ArtifactCloudDropAccountName).blob.core.windows.net/$(ArtifactContainerName)</DotnetBlobRootUrl>
-    <ChecksumContainerName>$(CHECKSUM_STORAGE_CONTAINER)</ChecksumContainerName>
-    <ChecksumContainerName Condition="'$(ChecksumContainerName)' == ''">dotnet</ChecksumContainerName>
-    <ChecksumCloudDropAccessToken>$(CHECKSUM_STORAGE_KEY)</ChecksumCloudDropAccessToken>
+    <ArtifactContainerName>$(ARTIFACT_STORAGE_CONTAINER)</ArtifactContainerName>
+    <ArtifactContainerName Condition="'$(ArtifactContainerName)' == ''">dotnet</ArtifactContainerName>
+    <ArtifactCloudDropAccessToken>$(PB_PublishBlobFeedKey)</ArtifactCloudDropAccessToken>
+    <ArtifactCloudDropAccessToken Condition="'$(ArtifactCloudDropAccessToken)' == ''">$(ARTIFACT_STORAGE_KEY)</ArtifactCloudDropAccessToken>
+    <ArtifactCloudDropURL>$(PB_PublishBlobFeedUrl)</ArtifactCloudDropURL>
+    <ArtifactCloudDropURL Condition="'$(ArtifactCloudDropURL)' == ''">https://$(ArtifactCloudDropAccountName).blob.core.windows.net/$(ArtifactContainerName)/index.json</ArtifactCloudDropURL>
+
+    <!-- Values related to the upload of checksums to blob storage -->
     <ChecksumCloudDropAccountName>$(CHECKSUM_STORAGE_ACCOUNT)</ChecksumCloudDropAccountName>
     <ChecksumCloudDropAccountName Condition="'$(ChecksumCloudDropAccountName)' == ''">dotnetclichecksums</ChecksumCloudDropAccountName>
-    <BlobFeedContainerName>$(BLOBFEED_STORAGE_CONTAINER)</BlobFeedContainerName>
-    <BlobFeedContainerName Condition="'$(BlobFeedContainerName)' == ''">dotnet-core</BlobFeedContainerName>
-    <BlobFeedExpectedURL>$(BLOBFEED_EXPECTED_URL)</BlobFeedExpectedURL>
-    <BlobFeedExpectedURL Condition="'$(BlobFeedExpectedURL)' == ''">https://dotnetfeed.blob.core.windows.net/$(BlobFeedContainerName)/index.json</BlobFeedExpectedURL>
-    <BlobFeedCloudDropAccessToken>$(BLOBFEED_STORAGE_KEY)</BlobFeedCloudDropAccessToken>
+    <ChecksumContainerName>$(CHECKSUM_STORAGE_CONTAINER)</ChecksumContainerName>
+    <ChecksumContainerName Condition="'$(ChecksumContainerName)' == ''">dotnet</ChecksumContainerName>
+    <ChecksumCloudDropAccessToken>$(PB_PublishBlobFeedKey)</ChecksumCloudDropAccessToken>
+    <ChecksumCloudDropAccessToken Condition="'$(ChecksumCloudDropAccessToken)' == ''">$(CHECKSUM_STORAGE_KEY)</ChecksumCloudDropAccessToken>
+    <ChecksumCloudDropURL>$(PB_PublishBlobFeedUrl)</ChecksumCloudDropURL>
+    <ChecksumCloudDropURL Condition="'$(ChecksumCloudDropURL)' == ''">https://$(ChecksumCloudDropAccountName).blob.core.windows.net/$(ChecksumContainerName)/index.json</ChecksumCloudDropURL>
+
+    <!-- Values related to the upload of NuPkgs to the blob feed -->
+    <BlobFeedExpectedURL>$(PB_PublishBlobFeedUrl)</BlobFeedExpectedURL>
+    <BlobFeedExpectedURL Condition="'$(BlobFeedExpectedURL)' == ''">https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json</BlobFeedExpectedURL>
+    <BlobFeedCloudDropAccessToken>$(PB_PublishBlobFeedKey)</BlobFeedCloudDropAccessToken>
+    <BlobFeedCloudDropAccessToken Condition="'$(BlobFeedCloudDropAccessToken)' == ''">$(BLOBFEED_STORAGE_KEY)</BlobFeedCloudDropAccessToken>
   </PropertyGroup>
 </Project>
diff --git a/build/BackwardsCompatibilityRuntimes.props b/build/BackwardsCompatibilityRuntimes.props
index 85303240f..789b0a2cd 100644
--- a/build/BackwardsCompatibilityRuntimes.props
+++ b/build/BackwardsCompatibilityRuntimes.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup Condition=" '$(IncludeSharedFrameworksForBackwardsCompatibilityTests)' == 'true' ">
     <BackwardsCompatibility110CoreSetupChannel>release/1.1.0</BackwardsCompatibility110CoreSetupChannel>
     <BackwardsCompatibility110SharedFrameworkVersion>1.1.2</BackwardsCompatibility110SharedFrameworkVersion>
@@ -16,7 +16,7 @@
 
     <BackwardsCompatibility110CombinedFrameworkHostCompressedFileName>dotnet-$(HostMonikerRid).$(BackwardsCompatibility110SharedFrameworkVersion)$(ArchiveExtension)</BackwardsCompatibility110CombinedFrameworkHostCompressedFileName>
 
-    <BackwardsCompatibility110CoreSetupBlobRootUrlWithChannel>$(CoreSetupBlobRootUrl)$(BackwardsCompatibility110CoreSetupChannel)</BackwardsCompatibility110CoreSetupBlobRootUrlWithChannel>
+    <BackwardsCompatibility110CoreSetupBlobRootUrlWithChannel>$(BackwardsCompatibilityCoreSetupBlobRootUrl)$(BackwardsCompatibility110CoreSetupChannel)</BackwardsCompatibility110CoreSetupBlobRootUrlWithChannel>
     <BackwardsCompatibility110SharedFrameworkArchiveBlobRootUrl>$(BackwardsCompatibility110CoreSetupBlobRootUrlWithChannel)/Binaries/$(BackwardsCompatibility110SharedFrameworkVersion)</BackwardsCompatibility110SharedFrameworkArchiveBlobRootUrl>
     <BackwardsCompatibility110CoreSetupInstallerBlobRootUrl>$(BackwardsCompatibility110CoreSetupBlobRootUrlWithChannel)/Installers</BackwardsCompatibility110CoreSetupInstallerBlobRootUrl>
     <BackwardsCompatibility110CoreSetupDownloadDirectory>$(IntermediateDirectory)/coreSetupDownload/$(BackwardsCompatibility110SharedFrameworkVersion)</BackwardsCompatibility110CoreSetupDownloadDirectory>
diff --git a/build/BranchInfo.props b/build/BranchInfo.props
index a19112b26..0879a9028 100644
--- a/build/BranchInfo.props
+++ b/build/BranchInfo.props
@@ -1,6 +1,6 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <Channel>release/2.1.2xx</Channel>
-    <BranchName>release/2.1.2xx</BranchName>
+    <Channel>release/2.1</Channel>
+    <BranchName>release/2.1.3xx</BranchName>
   </PropertyGroup>
 </Project>
diff --git a/build/Branding.props b/build/Branding.props
index e1ea0a1a6..eadbd0927 100644
--- a/build/Branding.props
+++ b/build/Branding.props
@@ -1,25 +1,31 @@
-<Project ToolsVersion="14.0">
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <SdkBrandName>Microsoft .NET Core SDK - 2.1.100</SdkBrandName>
+    <BuildName>cli</BuildName>
+    <SdkBrandName>Microsoft .NET Core SDK 2.1.300 - Preview</SdkBrandName>
     <MSBuildExtensionsBrandName>.NET Standard Support for Visual Studio 2015</MSBuildExtensionsBrandName>
-    <SharedFrameworkBrandName>Microsoft .NET Core Runtime - 2.0.5</SharedFrameworkBrandName>
-    <SharedHostBrandName>Microsoft .NET Core Host - 2.0.1</SharedHostBrandName>
-    <HostFxrBrandName>Microsoft .NET Core Host FX Resolver - 2.0.0</HostFxrBrandName>
+    <SharedFrameworkBrandName>Microsoft .NET Core Runtime 2.1.0 - Preview</SharedFrameworkBrandName>
+    <SharedHostBrandName>Microsoft .NET Core Host 2.1.0 - Preview</SharedHostBrandName>
+    <HostFxrBrandName>Microsoft .NET Core Host FX Resolver 2.1.0 - Preview</HostFxrBrandName>
 
     <SharedFrameworkName>Microsoft.NETCore.App</SharedFrameworkName>
     <SharedFrameworkNugetName>$(SharedFrameworkName)</SharedFrameworkNugetName>
 
     <ProductMonikerRid Condition=" '$(Rid)' == 'ubuntu.16.04-x64' OR
-                                   '$(Rid)' == 'ubuntu.16.10-x64' OR
                                    '$(Rid)' == 'fedora.24-x64' OR
+                                   '$(Rid)' == 'rhel.6-x64' OR
+                                   '$(Rid)' == 'alpine.3.6-x64' OR
                                    '$(Rid)' == 'opensuse.42.1-x64' ">$(Rid)</ProductMonikerRid>
     <ProductMonikerRid Condition=" '$(ProductMonikerRid)' == '' ">$(OSName)-$(Architecture)</ProductMonikerRid>
-    <HostMonikerRid Condition=" '$(HostRid)' == 'ubuntu.16.04-x64' OR
-        '$(HostRid)' == 'ubuntu.16.10-x64' OR
-        '$(HostRid)' == 'fedora.24-x64' OR
-        '$(HostRid)' == 'opensuse.42.1-x64' ">$(HostRid)</HostMonikerRid>
-    <HostMonikerRid Condition=" '$(HostMonikerRid)' == '' ">$(HostOSName)-$(Architecture)</HostMonikerRid>
 
+    <HostMonikerRid Condition=" '$(HostRid)' == 'ubuntu.16.04-x64' OR
+                                '$(HostRid)' == 'fedora.24-x64' OR
+                                '$(HostRid)' == 'rhel.6-x64' OR
+                                '$(HostRid)' == 'alpine.3.6-x64' OR
+                                '$(HostRid)' == 'opensuse.42.1-x64' ">$(HostRid)</HostMonikerRid>
+    <HostMonikerRid Condition=" '$(HostMonikerRid)' == '' ">$(HostOSName)-$(Architecture)</HostMonikerRid>
+    <HostMonikerRidForFileName>$(HostMonikerRid)</HostMonikerRidForFileName>
+    <HostMonikerRidForFileName Condition=" '$(IsDebianBaseDistro)' == 'true' ">$(Architecture)</HostMonikerRidForFileName>
+    
     <ArtifactNameSdk>dotnet-sdk-internal</ArtifactNameSdk>
     <ArtifactNameSdkSymbols>dotnet-sdk-symbols</ArtifactNameSdkSymbols>
     <ArtifactNameCombinedHostHostFxrFrameworkSdk>dotnet-sdk</ArtifactNameCombinedHostHostFxrFrameworkSdk>
@@ -31,6 +37,7 @@
     <ArtifactNameWithVersionSdkSymbols>$(ArtifactNameSdkSymbols)-$(SdkVersion)-$(ProductMonikerRid)</ArtifactNameWithVersionSdkSymbols>
     <ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(SdkVersion)-$(ProductMonikerRid)</ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>
     <ArtifactNameWithVersionSdkLanguagePack>$(ArtifactNameSdkLanguagePack)-$(SdkVersion)-$(ProductMonikerRid)</ArtifactNameWithVersionSdkLanguagePack>
-    <DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(SdkVersion)-$(HostMonikerRid)</DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>
+    <DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdkWithoutHostMonikerRid>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(SdkVersion)-</DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdkWithoutHostMonikerRid>
+    <DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdkWithoutHostMonikerRid)$(HostMonikerRidForFileName)</DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>
   </PropertyGroup>
 </Project>
diff --git a/build/BuildAndPublishAllLinuxDistrosNativeInstallers.targets b/build/BuildAndPublishAllLinuxDistrosNativeInstallers.targets
new file mode 100644
index 000000000..af2faa465
--- /dev/null
+++ b/build/BuildAndPublishAllLinuxDistrosNativeInstallers.targets
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Layout" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildThisFileDirectory)/LinuxDistrosNativeInstaller.props" />
+
+  <Target Name="BuildAndPublishAllLinuxDistrosNativeInstallers" DependsOnTargets="Prepare;Compile;SetBuildingAndPublishingProps;RunAllSandBoxAndPackage;MultiPublish" />
+
+
+  <Target Name="RunAllSandBoxAndPackage" >
+      <MSBuild Projects="$(MSBuildThisFileDirectory)/SandBoxAndPackageInParallel.proj"
+      Targets="RunInSandBoxAndPackage"
+            Properties="RepoRoot=$(RepoRoot);
+            BuildConfiguration=$(BuildConfiguration);
+            InstallerOutputDirectory=$(InstallerOutputDirectory);
+            " />
+  </Target>
+
+  <Target Name="MultiPublish" DependsOnTargets="AddAllGeneratedInstaller;PublishWithoutPackage" />
+
+  <Target Name="AddAllGeneratedInstaller">
+    <ItemGroup>
+      <GeneratedInstallers Include="$(InstallerOutputDirectory)/$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdkWithoutHostMonikerRid)%(LinuxDistrosNeedNativeInstaller.DistroNameInInstaller).%(LinuxDistrosNeedNativeInstaller.InstallerExtension)" />
+    </ItemGroup>
+  </Target>
+
+  <Target Name="SetBuildingAndPublishingProps">
+    <PropertyGroup>
+      <IsBuildingAndPublishingAllLinuxDistrosNativeInstallers>true</IsBuildingAndPublishingAllLinuxDistrosNativeInstallers>
+    </PropertyGroup>
+  </Target>
+</Project>
\ No newline at end of file
diff --git a/build/BuildDefaults.props b/build/BuildDefaults.props
index 64eddcfd4..6f3109c4f 100644
--- a/build/BuildDefaults.props
+++ b/build/BuildDefaults.props
@@ -1,11 +1,21 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <CLITargets Condition=" '$(CLITargets)' == '' ">Prepare;Compile;Test;Package;Publish</CLITargets>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <IncludeNuGetPackageArchive Condition=" '$(IncludeNuGetPackageArchive)' == '' ">true</IncludeNuGetPackageArchive>
+    <SkipBuildingInstallers Condition=" '$(SkipBuildingInstallers)' == '' AND ($(Rid.StartsWith('rhel.6')) OR $(Rid.StartsWith('alpine.3.6')))">true</SkipBuildingInstallers>
     <SkipBuildingInstallers Condition=" '$(SkipBuildingInstallers)' == '' ">false</SkipBuildingInstallers>
-    <UsePortableLinuxSharedFramework Condition=" '$(UsePortableLinuxSharedFramework)' == '' AND '$(OSPlatform)' == 'linux' ">true</UsePortableLinuxSharedFramework>
-    <IncludeSharedFrameworksForBackwardsCompatibilityTests Condition=" $(IncludeSharedFrameworksForBackwardsCompatibilityTests) == '' AND '$(Rid)' != 'linux-x64' ">true</IncludeSharedFrameworksForBackwardsCompatibilityTests>
+    <UsePortableLinuxSharedFramework Condition=" '$(UsePortableLinuxSharedFramework)' == '' AND '$(OSPlatform)' == 'linux' AND '$(Rid)' != 'rhel.6-x64' AND '$(Rid)' != 'alpine.3.6-x64' ">true</UsePortableLinuxSharedFramework>
+    <IncludeSharedFrameworksForBackwardsCompatibilityTests Condition=" $(IncludeSharedFrameworksForBackwardsCompatibilityTests) == '' AND '$(Rid)' != 'linux-x64' AND '$(Rid)' != 'rhel.6-x64' AND '$(Rid)' != 'alpine.3.6-x64'">true</IncludeSharedFrameworksForBackwardsCompatibilityTests>
     <HighEntropyVA>true</HighEntropyVA>
+
+    <!-- Only use asset target fallback that we set (not implicit one to net461). -->
+    <DisableImplicitAssetTargetFallback>true</DisableImplicitAssetTargetFallback>
+
+    <!-- Disable asset target fallback warning globally since it does not work transitively on NoWarn of individual packages -->
+    <!-- Since we disabled the implict fallback to net461, this will only kick in when we have an explicit fallback and we don't need to be warned about it doing what we asked it to do. -->
+    <NoWarn>NU1701</NoWarn>
+
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 </Project>
diff --git a/build/BuildInfo.targets b/build/BuildInfo.targets
index df28e1980..6abd51fa9 100644
--- a/build/BuildInfo.targets
+++ b/build/BuildInfo.targets
@@ -21,7 +21,7 @@
       <OSPlatform Condition=" '$(OSPlatform)' == '' AND '$(IsLinux)' == 'True' ">linux</OSPlatform>
 
       <BuildInfoPropsContent>
-&lt;Project ToolsVersion=&quot;14.0&quot; xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;
+&lt;Project ToolsVersion=&quot;15.0&quot; xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;
     &lt;PropertyGroup&gt;
         &lt;Rid&gt;$(Rid)&lt;/Rid&gt;
         &lt;Architecture&gt;$(Architecture)&lt;/Architecture&gt;
diff --git a/build/BundledRuntimes.props b/build/BundledRuntimes.props
index 82f47ecca..aeeaf373d 100644
--- a/build/BundledRuntimes.props
+++ b/build/BundledRuntimes.props
@@ -1,67 +1,84 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <CoreSetupRid>$(HostRid)</CoreSetupRid>
     <CoreSetupRid Condition=" '$(HostOSName)' == 'win' or '$(HostOSName)' == 'osx' ">$(HostMonikerRid)</CoreSetupRid>
 
     <!-- only the runtime OSX .pkgs have a `-internal` suffix -->
     <InstallerStartSuffix Condition="'$(HostOSName)' == 'osx'">-internal</InstallerStartSuffix>
-    
+
     <!-- Downloaded Installers + Archives -->
-    <DownloadedSharedHostInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-host$(InstallerStartSuffix)-$(SharedHostVersion)-$(CoreSetupRid)$(InstallerExtension)</DownloadedSharedHostInstallerFileName>
+    <DownloadedRuntimeDepsInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-runtime-deps-$(SharedHostVersion)-$(CoreSetupRid)$(InstallerExtension)</DownloadedRuntimeDepsInstallerFileName>
+    <DownloadedRuntimeDepsInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedRuntimeDepsInstallerFileName)</DownloadedRuntimeDepsInstallerFile>
+
+    <!-- Use the "x64" Rid when downloading Linux shared framework 'DEB' installer files. -->
+    <SharedFrameworkInstallerFileRid>$(CoreSetupRid)</SharedFrameworkInstallerFileRid>
+    <SharedFrameworkInstallerFileRid Condition=" '$(IsDebianBaseDistro)' == 'true' ">x64</SharedFrameworkInstallerFileRid>
+
+    <DownloadedSharedHostInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-host$(InstallerStartSuffix)-$(SharedHostVersion)-$(SharedFrameworkInstallerFileRid)$(InstallerExtension)</DownloadedSharedHostInstallerFileName>
     <DownloadedSharedHostInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedSharedHostInstallerFileName)</DownloadedSharedHostInstallerFile>
 
-    <DownloadedHostFxrInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-hostfxr$(InstallerStartSuffix)-$(HostFxrVersion)-$(CoreSetupRid)$(InstallerExtension)</DownloadedHostFxrInstallerFileName>
+    <DownloadedHostFxrInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-hostfxr$(InstallerStartSuffix)-$(HostFxrVersion)-$(SharedFrameworkInstallerFileRid)$(InstallerExtension)</DownloadedHostFxrInstallerFileName>
     <DownloadedHostFxrInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedHostFxrInstallerFileName)</DownloadedHostFxrInstallerFile>
 
-    <DownloadedSharedFrameworkInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-runtime$(InstallerStartSuffix)-$(SharedFrameworkVersion)-$(CoreSetupRid)$(InstallerExtension)</DownloadedSharedFrameworkInstallerFileName>
+    <DownloadedSharedFrameworkInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-runtime$(InstallerStartSuffix)-$(MicrosoftNETCoreAppPackageVersion)-$(SharedFrameworkInstallerFileRid)$(InstallerExtension)</DownloadedSharedFrameworkInstallerFileName>
     <DownloadedSharedFrameworkInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedSharedFrameworkInstallerFileName)</DownloadedSharedFrameworkInstallerFile>
 
-    <!-- Use the portable linux-x64 Rid when downloading the shared framework compressed file.
-         NOTE: There isn't a 'linux-x64' version of the installers or the additional shared framweork. -->
+    <!-- Use the portable "linux-x64" Rid when downloading Linux shared framework compressed file. -->
     <SharedFrameworkRid>$(CoreSetupRid)</SharedFrameworkRid>
     <SharedFrameworkRid Condition=" '$(UsePortableLinuxSharedFramework)' == 'true' ">linux-x64</SharedFrameworkRid>
-    <CombinedFrameworkHostCompressedFileName>dotnet-runtime-$(SharedFrameworkVersion)-$(SharedFrameworkRid)$(ArchiveExtension)</CombinedFrameworkHostCompressedFileName>
+    <CombinedFrameworkHostCompressedFileName>dotnet-runtime-$(MicrosoftNETCoreAppPackageVersion)-$(SharedFrameworkRid)$(ArchiveExtension)</CombinedFrameworkHostCompressedFileName>
 
-    <IsSharedFrameworkPreReleaseVersion>$([System.Text.RegularExpressions.Regex]::IsMatch($(SharedFrameworkVersion), '\d*\.\d*\.\d*-'))</IsSharedFrameworkPreReleaseVersion>
-    <SharedFrameworkStableVersion>$([System.Text.RegularExpressions.Regex]::Match($(SharedFrameworkVersion), '\d*\.\d*\.\d*').get_Groups().get_Item(0).ToString())</SharedFrameworkStableVersion>
+    <AspNetCoreSharedFxInstallerRid>$(SharedFrameworkRid)</AspNetCoreSharedFxInstallerRid>
+    <AspNetCoreSharedFxInstallerRid Condition="'$(SharedFrameworkRid)' == 'alpine.3.6-x64'">linux-x64</AspNetCoreSharedFxInstallerRid>
+    <AspNetCoreSharedFxInstallerRid Condition="'$(SharedFrameworkRid)' == 'rhel.6-x64'">linux-x64</AspNetCoreSharedFxInstallerRid>
+    <AspNetCoreSharedFxArchiveRid>$(AspNetCoreSharedFxInstallerRid)</AspNetCoreSharedFxArchiveRid>
+    <AspNetCoreSharedFxInstallerRid Condition="'$(InstallerExtension)' == '.deb' OR '$(InstallerExtension)' == '.rpm'">x64</AspNetCoreSharedFxInstallerRid>
+
+    <DownloadedAspNetCoreSharedFxInstallerFileName Condition=" '$(InstallerExtension)' != '' AND '$(HostOSName)' != 'osx' ">aspnetcore-runtime-$(AspNetCoreVersion)-$(AspNetCoreSharedFxInstallerRid)$(InstallerExtension)</DownloadedAspNetCoreSharedFxInstallerFileName>
+    <!-- Note: we use the "-internal" archives and installers that contain only the aspnetcore shared framework, and shouldn't overlap with Microsoft.NETCore.App. -->
+    <DownloadedAspNetCoreSharedFxInstallerFileName Condition=" '$(InstallerExtension)' == '.msi' ">aspnetcore-runtime-internal-$(AspNetCoreVersion)-$(AspNetCoreSharedFxInstallerRid).wixlib</DownloadedAspNetCoreSharedFxInstallerFileName>
+    <DownloadedAspNetCoreSharedFxInstallerFile Condition=" '$(InstallerExtension)' != '' AND '$(DownloadedAspNetCoreSharedFxInstallerFileName)' != '' ">$(PackagesDirectory)/$(DownloadedAspNetCoreSharedFxInstallerFileName)</DownloadedAspNetCoreSharedFxInstallerFile>
+
+    <AspNetCoreSharedFxArchiveFileName>aspnetcore-runtime-internal-$(AspNetCoreVersion)-$(AspNetCoreSharedFxArchiveRid)$(ArchiveExtension)</AspNetCoreSharedFxArchiveFileName>
+    <AspNetCoreSharedFxArchiveFile>$(PackagesDirectory)/$(AspNetCoreSharedFxArchiveFileName)</AspNetCoreSharedFxArchiveFile>
+
+    <!-- Used to detect if ASP.NET Core is built against the same version of Microsoft.NETCore.App. -->
+    <AspNetCoreSharedFxBaseRuntimeVersionFileName>aspnetcore_base_runtime.version</AspNetCoreSharedFxBaseRuntimeVersionFileName>
+    <AspNetCoreSharedFxBaseRuntimeVersionFile Condition=" '$(AspNetCoreSharedFxBaseRuntimeVersionFileName)' != '' ">$(PackagesDirectory)/$(AspNetCoreSharedFxBaseRuntimeVersionFileName)</AspNetCoreSharedFxBaseRuntimeVersionFile>
   </PropertyGroup>
 
   <PropertyGroup>
     <CoreSetupRootUrl>$(CoreSetupBlobRootUrl)Runtime/</CoreSetupRootUrl>
-    <CoreSetupDownloadDirectory>$(IntermediateDirectory)/coreSetupDownload/$(SharedFrameworkVersion)</CoreSetupDownloadDirectory>
+    <AspNetCoreSharedFxRootUrl>$(CoreSetupBlobRootUrl)aspnetcore/Runtime/</AspNetCoreSharedFxRootUrl>
+    <CoreSetupDownloadDirectory>$(IntermediateDirectory)/coreSetupDownload/$(MicrosoftNETCoreAppPackageVersion)</CoreSetupDownloadDirectory>
     <CombinedSharedHostAndFrameworkArchive>$(CoreSetupDownloadDirectory)/combinedSharedHostAndFrameworkArchive$(ArchiveExtension)</CombinedSharedHostAndFrameworkArchive>
   </PropertyGroup>
 
-  <PropertyGroup>
-    <AspNetCoreRuntimeInstallerBlobRootUrl>$(CoreSetupBlobRootUrl)aspnetcore/store/$(AspNetCoreRuntimeAzureblobStoresSubfolderName)</AspNetCoreRuntimeInstallerBlobRootUrl>
-    <AspNetCoreSharedRuntimeVersionFileName>runtime.version</AspNetCoreSharedRuntimeVersionFileName>
-    <AspNetCoreSharedRuntimeVersionFile Condition=" '$(AspNetCoreSharedRuntimeVersionFileName)' != '' ">$(PackagesDirectory)/$(AspNetCoreSharedRuntimeVersionFileName)</AspNetCoreSharedRuntimeVersionFile>
-    
-    <!-- Examples:    Build.RS.linux.zip    Build.RS.winx86.zip    AspNetCorePackageStoreLibx64.wixlib   -->
-    <AspNetCoreRuntimeInstallerArchiveFileNameOSToken Condition=" '$(HostOSName)' == 'win' ">$(HostOSName)$(Architecture)</AspNetCoreRuntimeInstallerArchiveFileNameOSToken>
-    <AspNetCoreRuntimeInstallerArchiveFileNameOSToken Condition=" '$(HostOSName)' == 'osx' ">$(HostOSName)</AspNetCoreRuntimeInstallerArchiveFileNameOSToken>
-    <AspNetCoreRuntimeInstallerArchiveFileNameOSToken Condition=" '$(AspNetCoreRuntimeInstallerArchiveFileNameOSToken)' == '' ">linux</AspNetCoreRuntimeInstallerArchiveFileNameOSToken>
-
-    <AspNetCoreRuntimeStoreSuffix Condition="'$(AspNetCoreRuntimePackageFlavor)' != 'notimestamp'">-$(AspNetCoreRuntimePackageTimestamp)</AspNetCoreRuntimeStoreSuffix>
-    <AspNetCoreRuntimeInstallerArchiveSuffix Condition="'$(AspNetCoreRuntimeStoreSuffix)' != ''">-$(AspNetCoreRelease)$(AspNetCoreRuntimeStoreSuffix)</AspNetCoreRuntimeInstallerArchiveSuffix>
-    <AspNetCoreRuntimeInstallerArchiveFileName>Build.RS.$(AspNetCoreRuntimeInstallerArchiveFileNameOSToken)$(AspNetCoreRuntimeInstallerArchiveSuffix)$(ArchiveExtension)</AspNetCoreRuntimeInstallerArchiveFileName>
-    <AspNetCoreRuntimeInstallerArchiveFile>$(PackagesDirectory)/$(AspNetCoreRuntimeInstallerArchiveFileName)</AspNetCoreRuntimeInstallerArchiveFile>
-
-    <AspNetCoreRuntimeInstallerWixLibFileName Condition=" '$(HostOSName)' == 'win' ">AspNetCorePackageStoreLib$(Architecture)$(AspNetCoreRuntimeStoreSuffix).wixlib</AspNetCoreRuntimeInstallerWixLibFileName>
-    <AspNetCoreRuntimeInstallerWixLibFile Condition=" '$(AspNetCoreRuntimeInstallerWixLibFileName)' != '' ">$(PackagesDirectory)/$(AspNetCoreRuntimeInstallerWixLibFileName)</AspNetCoreRuntimeInstallerWixLibFile>
-  </PropertyGroup>
-
   <ItemGroup>
+    <_DownloadAndExtractItem Include="AspNetCoreSharedFxArchiveFile"
+                             Condition="!Exists('$(AspNetCoreSharedFxArchiveFile)')">
+      <Url>$(AspNetCoreSharedFxRootUrl)$(AspNetCoreVersion)/$(AspNetCoreSharedFxArchiveFileName)$(CoreSetupBlobAccessTokenParam)</Url>
+      <DownloadFileName>$(AspNetCoreSharedFxArchiveFile)</DownloadFileName>
+      <ExtractDestination>$(AspNetCoreSharedFxPublishDirectory)</ExtractDestination>
+    </_DownloadAndExtractItem>
+
     <_DownloadAndExtractItem Include="CombinedSharedHostAndFrameworkArchive"
                              Condition="!Exists('$(CombinedSharedHostAndFrameworkArchive)')">
-      <Url>$(CoreSetupRootUrl)$(SharedFrameworkVersion)/$(CombinedFrameworkHostCompressedFileName)$(CoreSetupBlobAccessTokenParam)</Url>
+      <Url>$(CoreSetupRootUrl)$(MicrosoftNETCoreAppPackageVersion)/$(CombinedFrameworkHostCompressedFileName)$(CoreSetupBlobAccessTokenParam)</Url>
       <DownloadFileName>$(CombinedSharedHostAndFrameworkArchive)</DownloadFileName>
       <ExtractDestination>$(SharedFrameworkPublishDirectory)</ExtractDestination>
     </_DownloadAndExtractItem>
 
+    <_DownloadAndExtractItem Include="DownloadedRuntimeDepsInstallerFile"
+                         Condition="'$(IsDebianBaseDistro)' == 'true' And '$(SkipBuildingInstallers)' != 'true' And !Exists('$(DownloadedRuntimeDepsInstallerFile)') And '$(InstallerExtension)' != ''">
+      <Url>$(CoreSetupRootUrl)$(MicrosoftNETCoreAppPackageVersion)/$(DownloadedRuntimeDepsInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
+      <DownloadFileName>$(DownloadedRuntimeDepsInstallerFile)</DownloadFileName>
+      <ExtractDestination></ExtractDestination>
+    </_DownloadAndExtractItem>
+
     <_DownloadAndExtractItem Include="DownloadedSharedFrameworkInstallerFile"
                              Condition="'$(SkipBuildingInstallers)' != 'true' And !Exists('$(DownloadedSharedFrameworkInstallerFile)') And '$(InstallerExtension)' != ''">
-      <Url>$(CoreSetupRootUrl)$(SharedFrameworkVersion)/$(DownloadedSharedFrameworkInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
+      <Url>$(CoreSetupRootUrl)$(MicrosoftNETCoreAppPackageVersion)/$(DownloadedSharedFrameworkInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
       <DownloadFileName>$(DownloadedSharedFrameworkInstallerFile)</DownloadFileName>
       <ExtractDestination></ExtractDestination>
     </_DownloadAndExtractItem>
@@ -80,24 +97,17 @@
       <ExtractDestination></ExtractDestination>
     </_DownloadAndExtractItem>
 
-  <_DownloadAndExtractItem Include="AspNetCoreRuntimeInstallerWixLibFile"
-                           Condition=" '$(AspNetCoreRuntimeInstallerWixLibFile)' != '' And !Exists('$(AspNetCoreRuntimeInstallerWixLibFile)')">
-      <Url>$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeInstallerWixLibFileName)$(CoreSetupBlobAccessTokenParam)</Url>
-      <DownloadFileName>$(AspNetCoreRuntimeInstallerWixLibFile)</DownloadFileName>
+    <_DownloadAndExtractItem Include="DownloadedAspNetCoreSharedFxInstallerFile"
+                            Condition="'$(SkipBuildingInstallers)' != 'true' AND '$(DownloadedAspNetCoreSharedFxInstallerFile)' != '' AND !Exists($(DownloadedAspNetCoreSharedFxInstallerFile)) And '$(InstallerExtension)' != ''">
+      <Url>$(AspNetCoreSharedFxRootUrl)$(AspNetCoreVersion)/$(DownloadedAspNetCoreSharedFxInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
+      <DownloadFileName>$(DownloadedAspNetCoreSharedFxInstallerFile)</DownloadFileName>
       <ExtractDestination></ExtractDestination>
-  </_DownloadAndExtractItem>
+    </_DownloadAndExtractItem>
 
-  <_DownloadAndExtractItem Include="AspNetCoreRuntimeInstallerArchiveFile"
-                           Condition="!Exists('$(AspNetCoreRuntimeInstallerArchiveFile)')">
-      <Url>$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeInstallerArchiveFileName)$(CoreSetupBlobAccessTokenParam)</Url>
-      <DownloadFileName>$(AspNetCoreRuntimeInstallerArchiveFile)</DownloadFileName>
-      <ExtractDestination>$(AspNetRuntimePackageStorePublishDirectory)</ExtractDestination>
-  </_DownloadAndExtractItem>
-
-  <_DownloadAndExtractItem Include="AspNetCoreSharedRuntimeVersionFile"
-                           Condition="!Exists('$(AspNetCoreSharedRuntimeVersionFile)')">
-      <Url>$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreSharedRuntimeVersionFileName)$(CoreSetupBlobAccessTokenParam)</Url>
-      <DownloadFileName>$(AspNetCoreSharedRuntimeVersionFile)</DownloadFileName>
+    <_DownloadAndExtractItem Include="AspNetCoreSharedFxBaseRuntimeVersionFile"
+                           Condition="!Exists('$(AspNetCoreSharedFxBaseRuntimeVersionFile)')">
+      <Url>$(AspNetCoreSharedFxRootUrl)$(AspNetCoreVersion)/$(AspNetCoreSharedFxBaseRuntimeVersionFileName)$(CoreSetupBlobAccessTokenParam)</Url>
+      <DownloadFileName>$(AspNetCoreSharedFxBaseRuntimeVersionFile)</DownloadFileName>
       <ExtractDestination></ExtractDestination>
     </_DownloadAndExtractItem>
 
diff --git a/build/BundledSdks.props b/build/BundledSdks.props
index d5b90bba9..d665ef7f3 100644
--- a/build/BundledSdks.props
+++ b/build/BundledSdks.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <BundledSdk Include="NuGet.Build.Tasks.Pack" Version="$(NuGetBuildTasksPackPackageVersion)" />
     <BundledSdk Include="Microsoft.NET.Sdk" Version="$(MicrosoftNETSdkPackageVersion)" />
diff --git a/build/BundledTemplates.proj b/build/BundledTemplates.proj
index 014f5bc92..dfc66e111 100644
--- a/build/BundledTemplates.proj
+++ b/build/BundledTemplates.proj
@@ -23,7 +23,7 @@
 
   <Target Name="EnsureTemplateRestored"
           Condition="!Exists('$(TemplateNuPkgPath)/$(TemplatePackageName.ToLower()).nuspec')">
-    <DotNetRestore ToolPath="$(Stage0Directory)"
+    <DotNetRestore ToolPath="$(PreviousStageDirectory)"
                    ProjectPath="$(MSBuildThisFileDirectory)/templates/templates.csproj"
                    AdditionalParameters="/p:TemplatePackageName=$(TemplatePackageName) /p:TemplatePackageVersion=$(TemplatePackageVersion)" />
   </Target>
diff --git a/build/BundledTemplates.props b/build/BundledTemplates.props
index 23d0a8573..1a77f6043 100644
--- a/build/BundledTemplates.props
+++ b/build/BundledTemplates.props
@@ -1,11 +1,11 @@
-<Project ToolsVersion="15.0">
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <BundledTemplate Include="Microsoft.DotNet.Common.ItemTemplates" Version="$(MicrosoftDotNetCommonItemTemplatesPackageVersion)" />
-    <BundledTemplate Include="Microsoft.DotNet.Common.ProjectTemplates.2.0" Version="$(MicrosoftDotNetCommonProjectTemplates20PackageVersion)" />
-    <BundledTemplate Include="Microsoft.DotNet.Test.ProjectTemplates.2.0" Version="$(MicrosoftDotNetTestProjectTemplates20PackageVersion)" />
+    <BundledTemplate Include="Microsoft.DotNet.Common.ProjectTemplates.2.1" Version="$(MicrosoftDotNetCommonProjectTemplates20PackageVersion)" />
+    <BundledTemplate Include="Microsoft.DotNet.Test.ProjectTemplates.2.1" Version="$(MicrosoftDotNetTestProjectTemplates20PackageVersion)" />
 
-    <BundledTemplate Include="Microsoft.DotNet.Web.ItemTemplates" Version="$(AspNetCoreTemplatePackageVersion)" />
-    <BundledTemplate Include="Microsoft.DotNet.Web.ProjectTemplates.2.0" Version="$(AspNetCoreTemplatePackageVersion)" />
-    <BundledTemplate Include="Microsoft.DotNet.Web.Spa.ProjectTemplates" Version="$(AspNetCoreTemplatePackageVersion)" />
+    <BundledTemplate Include="Microsoft.DotNet.Web.ItemTemplates" Version="$(AspNetCoreVersion)" />
+    <BundledTemplate Include="Microsoft.DotNet.Web.ProjectTemplates.2.1" Version="$(AspNetCoreVersion)" />
+    <BundledTemplate Include="Microsoft.DotNet.Web.Spa.ProjectTemplates" Version="$(AspNetCoreVersion)" />
   </ItemGroup>
 </Project>
diff --git a/build/BundledTools.props b/build/BundledTools.props
index b57577824..947148dd5 100644
--- a/build/BundledTools.props
+++ b/build/BundledTools.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <BundledTools Include="MSBuild;
                            NuGet.CommandLine.XPlat;
diff --git a/build/CrossGen.props b/build/CrossGen.props
index a07ed8ba5..6a5907629 100644
--- a/build/CrossGen.props
+++ b/build/CrossGen.props
@@ -1,8 +1,8 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <RuntimeNETCoreAppPackageName>runtime.$(SharedFrameworkRid).microsoft.netcore.app</RuntimeNETCoreAppPackageName>
     <CrossgenPath>$(NuGetPackagesDir)/$(RuntimeNETCoreAppPackageName)/$(MicrosoftNETCoreAppPackageVersion)/tools/crossgen$(ExeExtension)</CrossgenPath>
     <LibCLRJitPath>$(NuGetPackagesDir)/$(RuntimeNETCoreAppPackageName)/$(MicrosoftNETCoreAppPackageVersion)/runtimes/$(SharedFrameworkRid)/native/$(DynamicLibPrefix)clrjit$(DynamicLibExtension)</LibCLRJitPath>
-    <SharedFrameworkNameVersionPath>$(OutputDirectory)/shared/$(SharedFrameworkName)/$(SharedFrameworkVersion)</SharedFrameworkNameVersionPath>
+    <SharedFrameworkNameVersionPath>$(OutputDirectory)/shared/$(SharedFrameworkName)/$(MicrosoftNETCoreAppPackageVersion)</SharedFrameworkNameVersionPath>
   </PropertyGroup>
 </Project>
diff --git a/build/DependencyVersions.props b/build/DependencyVersions.props
index 2914ee98a..4216b5003 100644
--- a/build/DependencyVersions.props
+++ b/build/DependencyVersions.props
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <MicrosoftNETCoreAppPackageVersion>2.0.5</MicrosoftNETCoreAppPackageVersion>
+    <MicrosoftAspNetCoreAppPackageVersion>2.1.0-preview1-28275</MicrosoftAspNetCoreAppPackageVersion>
+    <MicrosoftNETCoreAppPackageVersion>2.1.0-preview1-26116-04</MicrosoftNETCoreAppPackageVersion>
     <MicrosoftNETCoreDotNetHostResolverPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</MicrosoftNETCoreDotNetHostResolverPackageVersion>
     <MicrosoftBuildPackageVersion>15.6.82</MicrosoftBuildPackageVersion>
     <MicrosoftBuildFrameworkPackageVersion>$(MicrosoftBuildPackageVersion)</MicrosoftBuildFrameworkPackageVersion>
@@ -12,26 +13,29 @@
     <MicrosoftCodeAnalysisCSharpPackageVersion>2.7.0-beta3-62612-07</MicrosoftCodeAnalysisCSharpPackageVersion>
     <MicrosoftCodeAnalysisBuildTasksPackageVersion>$(MicrosoftCodeAnalysisCSharpPackageVersion)</MicrosoftCodeAnalysisBuildTasksPackageVersion>
     <MicrosoftNETCoreCompilersPackageVersion>$(MicrosoftCodeAnalysisCSharpPackageVersion)</MicrosoftNETCoreCompilersPackageVersion>
-    <MicrosoftNETSdkPackageVersion>15.5.0-preview-62518-04</MicrosoftNETSdkPackageVersion>
+    <MicrosoftCodeAnalysisBuildTasksPackageVersion>$(MicrosoftCodeAnalysisCSharpPackageVersion)</MicrosoftCodeAnalysisBuildTasksPackageVersion>
+    <MicrosoftNetCompilersNetcorePackageVersion>$(MicrosoftCodeAnalysisCSharpPackageVersion)</MicrosoftNetCompilersNetcorePackageVersion>
+    <MicrosoftNETSdkPackageVersion>2.1.300-preview1-62608-07</MicrosoftNETSdkPackageVersion>
     <MicrosoftNETBuildExtensionsPackageVersion>$(MicrosoftNETSdkPackageVersion)</MicrosoftNETBuildExtensionsPackageVersion>
-    <MicrosoftNETSdkWebPackageVersion>2.0.0-rel-20171110-671</MicrosoftNETSdkWebPackageVersion>
+    <MicrosoftNETSdkWebPackageVersion>2.1.0-release21-20180126-1326543</MicrosoftNETSdkWebPackageVersion>
     <MicrosoftNETSdkPublishPackageVersion>$(MicrosoftNETSdkWebPackageVersion)</MicrosoftNETSdkPublishPackageVersion>
     <MicrosoftNETSdkWebProjectSystemPackageVersion>$(MicrosoftNETSdkWebPackageVersion)</MicrosoftNETSdkWebProjectSystemPackageVersion>
-    <MicrosoftDotNetCommonItemTemplatesPackageVersion>1.0.0-beta3-20171110-312</MicrosoftDotNetCommonItemTemplatesPackageVersion>
-    <MicrosoftDotNetCommonProjectTemplates20PackageVersion>$(MicrosoftDotNetCommonItemTemplatesPackageVersion)</MicrosoftDotNetCommonProjectTemplates20PackageVersion>
-    <MicrosoftDotNetTestProjectTemplates20PackageVersion>$(MicrosoftDotNetCommonItemTemplatesPackageVersion)</MicrosoftDotNetTestProjectTemplates20PackageVersion>
-    <MicrosoftTemplateEngineAbstractionsPackageVersion>1.0.0-beta3-20171117-314</MicrosoftTemplateEngineAbstractionsPackageVersion>
-    <MicrosoftTemplateEngineCliPackageVersion>$(MicrosoftTemplateEngineAbstractionsPackageVersion)</MicrosoftTemplateEngineCliPackageVersion>
-    <MicrosoftTemplateEngineCliLocalizationPackageVersion>$(MicrosoftTemplateEngineAbstractionsPackageVersion)</MicrosoftTemplateEngineCliLocalizationPackageVersion>
-    <MicrosoftTemplateEngineOrchestratorRunnableProjectsPackageVersion>$(MicrosoftTemplateEngineAbstractionsPackageVersion)</MicrosoftTemplateEngineOrchestratorRunnableProjectsPackageVersion>
-    <MicrosoftTemplateEngineUtilsPackageVersion>$(MicrosoftTemplateEngineAbstractionsPackageVersion)</MicrosoftTemplateEngineUtilsPackageVersion>
-    <MicrosoftDotNetPlatformAbstractionsPackageVersion>2.0.0</MicrosoftDotNetPlatformAbstractionsPackageVersion>
-    <MicrosoftExtensionsDependencyModelPackageVersion>2.0.0</MicrosoftExtensionsDependencyModelPackageVersion>
-    <MicrosoftDotNetCliCommandLinePackageVersion>0.1.1-alpha-167</MicrosoftDotNetCliCommandLinePackageVersion>
+    <MicrosoftDotNetCommonItemTemplatesPackageVersion>1.0.1-beta3-20180104-1263555</MicrosoftDotNetCommonItemTemplatesPackageVersion>
+    <MicrosoftDotNetCommonProjectTemplates20PackageVersion>1.0.1-beta3-20180104-1263555</MicrosoftDotNetCommonProjectTemplates20PackageVersion>
+    <MicrosoftDotNetTestProjectTemplates20PackageVersion>$(MicrosoftDotNetCommonProjectTemplates20PackageVersion)</MicrosoftDotNetTestProjectTemplates20PackageVersion>
+    <MicrosoftTemplateEngineCliPackageVersion>1.0.0-beta3-20171204-315</MicrosoftTemplateEngineCliPackageVersion>
+    <MicrosoftTemplateEngineAbstractionsPackageVersion>$(MicrosoftTemplateEngineCliPackageVersion)</MicrosoftTemplateEngineAbstractionsPackageVersion>
+    <MicrosoftTemplateEngineCliLocalizationPackageVersion>$(MicrosoftTemplateEngineCliPackageVersion)</MicrosoftTemplateEngineCliLocalizationPackageVersion>
+    <MicrosoftTemplateEngineOrchestratorRunnableProjectsPackageVersion>$(MicrosoftTemplateEngineCliPackageVersion)</MicrosoftTemplateEngineOrchestratorRunnableProjectsPackageVersion>
+    <MicrosoftTemplateEngineUtilsPackageVersion>$(MicrosoftTemplateEngineCliPackageVersion)</MicrosoftTemplateEngineUtilsPackageVersion>
+    <MicrosoftDotNetPlatformAbstractionsPackageVersion>2.1.0-preview1-26116-04</MicrosoftDotNetPlatformAbstractionsPackageVersion>
+    <MicrosoftExtensionsDependencyModelPackageVersion>2.1.0-preview1-26116-04</MicrosoftExtensionsDependencyModelPackageVersion>
+    <MicrosoftDotNetCliCommandLinePackageVersion>0.1.1-alpha-174</MicrosoftDotNetCliCommandLinePackageVersion>
     <MicrosoftDotNetProjectJsonMigrationPackageVersion>1.2.1-alpha-002133</MicrosoftDotNetProjectJsonMigrationPackageVersion>
     <MicrosoftDotNetToolsMigrateCommandPackageVersion>$(MicrosoftDotNetProjectJsonMigrationPackageVersion)</MicrosoftDotNetToolsMigrateCommandPackageVersion>
+    <MicrosoftDotNetArchivePackageVersion>0.2.0-beta-000059</MicrosoftDotNetArchivePackageVersion>
     <MicrosoftDiaSymReaderNativePackageVersion>1.6.0-beta2-25304</MicrosoftDiaSymReaderNativePackageVersion>
-    <NuGetBuildTasksPackageVersion>4.6.0-rtm-4918</NuGetBuildTasksPackageVersion>
+    <NuGetBuildTasksPackageVersion>4.7.0-preview1-4846</NuGetBuildTasksPackageVersion>
     <NuGetBuildTasksPackPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetBuildTasksPackPackageVersion>
     <NuGetCommonPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetCommonPackageVersion>
     <NuGetCommandLineXPlatPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetCommandLineXPlatPackageVersion>
@@ -50,33 +54,19 @@
   <!-- NOTE: The property group above is in alignment with orchestrated build version naming conventions. -->
   <Import Condition=" Exists('$(OrchestratedPackageVersionsProps)') " Project="$(OrchestratedPackageVersionsProps)" />
 
-
   <PropertyGroup>
     <CLI_NETStandardLibraryNETFrameworkVersion>2.0.1-servicing-26011-01</CLI_NETStandardLibraryNETFrameworkVersion>
 
-    <SharedFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</SharedFrameworkVersion>
     <SharedHostVersion>$(MicrosoftNETCoreAppPackageVersion)</SharedHostVersion>
     <HostFxrVersion>$(MicrosoftNETCoreAppPackageVersion)</HostFxrVersion>
-
-    <AspNetCoreTemplatePackageVersion>2.0.5</AspNetCoreTemplatePackageVersion>
-    <!-- This should either be timestamped or notimestamp as appropriate -->
-    <AspNetCoreRuntimePackageFlavor>notimestamp</AspNetCoreRuntimePackageFlavor>
-    <!--BranchName and AspNetCoreVersion will not always be the same-->
-    <AspNetCoreBranchName>2.0.5</AspNetCoreBranchName>
-    <AspNetCoreRelease>rtm</AspNetCoreRelease>
-    <AspNetCoreVersion>2.0.5</AspNetCoreVersion>
-    <AspNetCoreRuntimePackageTimestamp>155</AspNetCoreRuntimePackageTimestamp>
-
-    <AspNetCoreRuntimePackageBrandName>aspnetcore-store</AspNetCoreRuntimePackageBrandName>
-    <AspNetCoreVersionAndRelease>$(AspNetCoreVersion)-$(AspNetCoreRelease)</AspNetCoreVersionAndRelease>
-    <AspNetCoreRuntimeAzureblobStoresSubfolderName>$(AspNetCoreBranchName)-$(AspNetCoreRuntimePackageTimestamp)</AspNetCoreRuntimeAzureblobStoresSubfolderName>
+    <AspNetCoreVersion>$(MicrosoftAspNetCoreAppPackageVersion)</AspNetCoreVersion>
   </PropertyGroup>
 
   <!-- infrastructure and test only dependencies -->
   <PropertyGroup>
-    <VersionToolsVersion>2.1.0-prerelease-02430-04</VersionToolsVersion>
+    <BuildTasksFeedToolVersion>2.1.0-prerelease-02430-04</BuildTasksFeedToolVersion>
+    <VersionToolsVersion>$(BuildTasksFeedToolVersion)</VersionToolsVersion>
     <DotnetDebToolVersion>2.0.0-preview2-25331-01</DotnetDebToolVersion>
-    <BuildTasksFeedToolVersion>2.1.0-prerelease-02221-02</BuildTasksFeedToolVersion>
   </PropertyGroup>
 
 </Project>
diff --git a/build/DerivedHostMachineInfo.props b/build/DerivedHostMachineInfo.props
index d9dc94444..3e9712a68 100644
--- a/build/DerivedHostMachineInfo.props
+++ b/build/DerivedHostMachineInfo.props
@@ -1,7 +1,8 @@
-<Project>
-    <PropertyGroup>
-      <IsDebianBaseDistro Condition=" '$(HostOSName)' == 'ubuntu' OR '$(HostOSName)' == 'debian' ">true</IsDebianBaseDistro>
-      <IsRPMBasedDistro Condition=" $(HostRid.StartsWith('rhel')) ">true</IsRPMBasedDistro>
-      <IsLinuxDistroSpecific Condition=" ('$(IsDebianBaseDistro)' == 'true' OR '$(IsRPMBasedDistro)' == 'true') AND '$(IslinuxPortable)' != 'true' ">true</IsLinuxDistroSpecific>
-    </PropertyGroup>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <IsDebianBaseDistro Condition=" '$(HostOSName)' == 'ubuntu' OR '$(HostOSName)' == 'debian' ">true</IsDebianBaseDistro>
+    <IsRPMBasedDistro Condition=" $(HostRid.StartsWith('rhel')) AND '$(HostRid)' != 'rhel.6-x64' ">true</IsRPMBasedDistro>
+    <PublishNativeInstallers Condition=" '$(IslinuxPortable)' != 'true' AND '$(HostRid)' != 'rhel.6-x64' AND '$(HostRid)' != 'alpine.3.6-x64'">true</PublishNativeInstallers>
+    <PublishArchives Condition=" '$(IslinuxPortable)' == 'true' OR ('$(IsDebianBaseDistro)' != 'true' AND '$(IsRPMBasedDistro)' != 'true') ">true</PublishArchives>
+  </PropertyGroup>
 </Project>
diff --git a/build/FileExtensions.props b/build/FileExtensions.props
index 21f8a68d2..c9f943b13 100644
--- a/build/FileExtensions.props
+++ b/build/FileExtensions.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <PropertyGroup>
       <ArchiveExtension Condition=" '$(HostOSName)' == 'win' ">.zip</ArchiveExtension>
       <ArchiveExtension Condition=" '$(HostOSName)' != 'win' ">.tar.gz</ArchiveExtension>
diff --git a/build/GenerateResxSource.targets b/build/GenerateResxSource.targets
index b25582ee2..1eb51907e 100644
--- a/build/GenerateResxSource.targets
+++ b/build/GenerateResxSource.targets
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
   <UsingTask TaskName="GenerateResxSource" AssemblyFile="$(CLIBuildDll)" />
 
diff --git a/build/GitCommitInfo.targets b/build/GitCommitInfo.targets
index 4addb6c8a..6ac729e50 100644
--- a/build/GitCommitInfo.targets
+++ b/build/GitCommitInfo.targets
@@ -23,7 +23,7 @@
       <GitInfoCommitHash>%(GitInfoCommitHashLines.Identity)</GitInfoCommitHash>
 
       <GitCommitInfoPropsContent>
-&lt;Project ToolsVersion=&quot;15.0&quot;&gt;
+&lt;Project ToolsVersion=&quot;15.0&quot; xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;
     &lt;PropertyGroup&gt;
         &lt;CommitCount&gt;$(GitInfoCommitCount)&lt;/CommitCount&gt;
         &lt;CommitHash&gt;$(GitInfoCommitHash)&lt;/CommitHash&gt;
diff --git a/build/HostInfo.targets b/build/HostInfo.targets
index 50331f196..ed1046cc0 100644
--- a/build/HostInfo.targets
+++ b/build/HostInfo.targets
@@ -10,7 +10,7 @@
 
     <PropertyGroup>
       <HostInfoPropsContent>
-&lt;Project ToolsVersion=&quot;15.0&quot;&gt;
+&lt;Project ToolsVersion=&quot;15.0&quot; xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;
     &lt;PropertyGroup&gt;
         &lt;HostRid&gt;$(HostRid)&lt;/HostRid&gt;
         &lt;HostOSName&gt;$(HostOSName)&lt;/HostOSName&gt;
diff --git a/build/InitRepo.props b/build/InitRepo.props
index c83437f02..077c23937 100644
--- a/build/InitRepo.props
+++ b/build/InitRepo.props
@@ -1,11 +1,11 @@
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <GeneratedPropsDir>$(RepoRoot)/artifacts/obj</GeneratedPropsDir>
+    <RelativeGeneratedPropsDir>bin/obj</RelativeGeneratedPropsDir>
+    <GeneratedPropsDir>$(RepoRoot)/$(RelativeGeneratedPropsDir)</GeneratedPropsDir>
     <GitCommitInfoProps>$(GeneratedPropsDir)/GitCommitInfo.props</GitCommitInfoProps>
     <HostInfoProps>$(GeneratedPropsDir)/HostInfo.props</HostInfoProps>
     <BuildInfoProps>$(GeneratedPropsDir)/BuildInfo.props</BuildInfoProps>
     <OrchestratedPackageVersionsProps>$(GeneratedPropsDir)/OrchestratedPackageVersionsProps.props</OrchestratedPackageVersionsProps>
     <GeneratedNuGetConfig>$(RepoRoot)/NuGet.Config</GeneratedNuGetConfig>
-  
-</PropertyGroup>
+  </PropertyGroup>
 </Project>
diff --git a/build/InputDirectories.props b/build/InputDirectories.props
index 0fc1b7a74..7564abe34 100644
--- a/build/InputDirectories.props
+++ b/build/InputDirectories.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <DotnetCliBuildDirectory>$(RepoRoot)/build_projects/dotnet-cli-build</DotnetCliBuildDirectory>
     <SrcDirectory>$(RepoRoot)/src</SrcDirectory>
diff --git a/build/InstallerInfo.props b/build/InstallerInfo.props
index 036369fab..31fadd75e 100644
--- a/build/InstallerInfo.props
+++ b/build/InstallerInfo.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <InstallerOutputDirectory>$(PackagesDirectory)</InstallerOutputDirectory>
     <SdkInstallerFile>$(InstallerOutputDirectory)/$(ArtifactNameWithVersionSdk)$(InstallerExtension)</SdkInstallerFile>
diff --git a/build/LinuxDistrosNativeInstaller.props b/build/LinuxDistrosNativeInstaller.props
new file mode 100644
index 000000000..3827e569e
--- /dev/null
+++ b/build/LinuxDistrosNativeInstaller.props
@@ -0,0 +1,14 @@
+<Project>
+  <ItemGroup>
+    <LinuxDistrosNeedNativeInstaller Include="debian.8-x64">
+      <DockerFolder>debian</DockerFolder>
+      <InstallerExtension>deb</InstallerExtension>
+      <DistroNameInInstaller>x64</DistroNameInInstaller>
+    </LinuxDistrosNeedNativeInstaller>
+    <LinuxDistrosNeedNativeInstaller Include="rhel.7-x64">
+      <DockerFolder>rhel</DockerFolder>
+      <InstallerExtension>rpm</InstallerExtension>
+      <DistroNameInInstaller>rhel-x64</DistroNameInInstaller>
+    </LinuxDistrosNeedNativeInstaller>
+  </ItemGroup>
+</Project>
diff --git a/build/MSBuildExtensions.props b/build/MSBuildExtensions.props
index c36782efe..26f27e8c4 100644
--- a/build/MSBuildExtensions.props
+++ b/build/MSBuildExtensions.props
@@ -1,4 +1,4 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <MSBuildImportsDir>$(RepoRoot)/resources/MSBuildImports</MSBuildImportsDir>
   </PropertyGroup>
diff --git a/build/MSBuildExtensions.targets b/build/MSBuildExtensions.targets
index fd3c473be..f1afbe3cb 100644
--- a/build/MSBuildExtensions.targets
+++ b/build/MSBuildExtensions.targets
@@ -75,7 +75,7 @@
           NuGetPackagesDir=$(NuGetPackagesDir);
           DependencyPackageName=%(ExtensionPackageToRestore.Identity);
           DependencyPackageVersion=%(ExtensionPackageToRestore.Version);
-          Stage0Directory=$(Stage0Directory)
+          PreviousStageDirectory=$(PreviousStageDirectory)
         </Properties>
       </ExtensionRestore>
     </ItemGroup>
@@ -86,7 +86,7 @@
     </MSBuild>
   </Target>
 
-  <Target Name="GenerateBundledVersionsProps">
+  <Target Name="GenerateBundledVersionsProps" DependsOnTargets="RunResolvePackageDependencies">
     <PropertyGroup>
       <BundledVersionsPropsFileName>Microsoft.NETCoreSdk.BundledVersions.props</BundledVersionsPropsFileName>
     </PropertyGroup>
@@ -99,6 +99,8 @@
     <ItemGroup>
       <_NETStandardLibraryVersions Include="@(PackageDefinitions->'%(Version)')"
                                    Condition="%(PackageDefinitions.Name) == 'NetStandard.Library'" />
+      <_NETCorePlatformsImplicitPackageVersion Include="@(PackageDefinitions->'%(Version)')"
+                                   Condition="%(PackageDefinitions.Name) == 'Microsoft.NETCore.Platforms'" />
     </ItemGroup>
 
     <Error Condition="@(_NETStandardLibraryVersions->Distinct()->Count()) != 1"
@@ -107,6 +109,7 @@
     <PropertyGroup>
       <_NETCoreAppPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</_NETCoreAppPackageVersion>
       <_NETStandardPackageVersion>@(_NETStandardLibraryVersions->Distinct())</_NETStandardPackageVersion>
+      <_NETCorePlatformsImplicitPackageVersion>@(_NETCorePlatformsImplicitPackageVersion->Distinct())</_NETCorePlatformsImplicitPackageVersion>
 
       <!-- Use only major and minor in target framework version -->
       <_NETCoreAppTargetFrameworkVersion>$(_NETCoreAppPackageVersion.Split('.')[0]).$(_NETCoreAppPackageVersion.Split('.')[1])</_NETCoreAppTargetFrameworkVersion>
@@ -131,6 +134,7 @@ Copyright (c) .NET Foundation. All rights reserved.
     <BundledNETCoreAppPackageVersion>$(_NETCoreAppPackageVersion)</BundledNETCoreAppPackageVersion>
     <BundledNETStandardTargetFrameworkVersion>$(_NETStandardTargetFrameworkVersion)</BundledNETStandardTargetFrameworkVersion>
     <BundledNETStandardPackageVersion>$(_NETStandardPackageVersion)</BundledNETStandardPackageVersion>
+    <NETCorePlatformsImplicitPackageVersion>$(_NETCorePlatformsImplicitPackageVersion)</NETCorePlatformsImplicitPackageVersion>
   </PropertyGroup>
 </Project>
 ]]>
diff --git a/build/MicroBuild.props b/build/MicroBuild.props
index efd41d7f8..b32b9f115 100644
--- a/build/MicroBuild.props
+++ b/build/MicroBuild.props
@@ -1,9 +1,6 @@
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="DependencyVersions.props" />
 
   <PropertyGroup>
-    <RepoRoot>$(MSBuildThisFileDirectory)/..</RepoRoot>
-    <NuGetPackagesDir>$(NUGET_PACKAGES)</NuGetPackagesDir>
     <NuGetPackagesDir Condition=" '$(NuGetPackagesDir)' == '' ">$(RepoRoot)/.nuget/packages</NuGetPackagesDir>
 
     <MicroBuildPropsAndTargetsPath>$(NuGetPackagesDir)/microbuild.core/$(MicroBuildCorePackageVersion)/build/</MicroBuildPropsAndTargetsPath>
diff --git a/build/NugetConfigFile.targets b/build/NugetConfigFile.targets
index ae5e96175..f8b41839b 100644
--- a/build/NugetConfigFile.targets
+++ b/build/NugetConfigFile.targets
@@ -4,7 +4,7 @@
       <ItemGroup>
         <NugetConfigPrivateFeeds Include="$(ExternalRestoreSources.Split(';'))" />
       </ItemGroup>
-    
+
     <PropertyGroup>
       <NugetConfigHeader>
         <![CDATA[
@@ -18,20 +18,18 @@
 
       <NugetConfigCLIFeeds>
         <![CDATA[
-<add key="BlobFeed" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" />
-<add key="templating" value="https://dotnet.myget.org/F/templating/api/v3/index.json" />
-<add key="aspnet" value="https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json" />
-<add key="websdkfeed" value="https://dotnet.myget.org/F/dotnet-web/api/v3/index.json" />
-<add key="cli-deps" value="https://dotnet.myget.org/F/cli-deps/api/v3/index.json" />
-<add key="roslyn" value="https://dotnet.myget.org/f/roslyn/api/v3/index.json" />
-<add key="symreader-native" value="https://dotnet.myget.org/f/symreader-native/api/v3/index.json" />
-<add key="xunit" value="https://www.myget.org/F/xunit/api/v3/index.json" />
-<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
-<add key="vstest" value="https://dotnet.myget.org/F/vstest/api/v3/index.json" />
-<add key="web-api" value="https://dotnet.myget.org/F/dotnet-web/api/v3/index.json" />
-<add key="symreader-native" value="https://dotnet.myget.org/F/symreader-native/api/v3/index.json" />
-<add key="AspNetMaster" value="https://dotnet.myget.org/F/aspnetcore-master/api/v3/index.json" />
-<add key="AspNetDev" value="https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json" />
+    <add key="BlobFeed" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" />
+    <add key="templating" value="https://dotnet.myget.org/F/templating/api/v3/index.json" />
+    <add key="aspnetcore-release" value="https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json" />
+    <add key="websdkfeed" value="https://dotnet.myget.org/F/dotnet-web/api/v3/index.json" />
+    <add key="cli-deps" value="https://dotnet.myget.org/F/cli-deps/api/v3/index.json" />
+    <add key="roslyn" value="https://dotnet.myget.org/f/roslyn/api/v3/index.json" />
+    <add key="symreader-native" value="https://dotnet.myget.org/f/symreader-native/api/v3/index.json" />
+    <add key="xunit" value="https://www.myget.org/F/xunit/api/v3/index.json" />
+    <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
+    <add key="vstest" value="https://dotnet.myget.org/F/vstest/api/v3/index.json" />
+    <add key="nuget-build" value="https://dotnet.myget.org/F/nuget-build/api/v3/index.json" />
+    <add key="dotnet-corefxlab" value="https://dotnet.myget.org/F/dotnet-corefxlab/api/v3/index.json" />
         ]]>
       </NugetConfigCLIFeeds>
 
@@ -41,13 +39,13 @@
 </configuration>
         ]]>
       </NugetConfigSuffix>
-    
+
   </PropertyGroup>
 
     <WriteLinesToFile File="$(GeneratedNuGetConfig)"
                       Lines="$(NugetConfigHeader)"
                       Overwrite="true" />
-    
+
     <WriteLinesToFile Condition="'$(ExternalRestoreSources)' != '' and '$(DotNetBuildOffline)' != 'true'"
                       File="$(GeneratedNuGetConfig)"
                       Lines="&lt;add key=&quot;PrivateBlobFeed&quot; value=&quot;%(NugetConfigPrivateFeeds.Identity)&quot; /&gt;"
diff --git a/build/OutputDirectories.props b/build/OutputDirectories.props
index 42e7d255a..b5d26d549 100644
--- a/build/OutputDirectories.props
+++ b/build/OutputDirectories.props
@@ -1,23 +1,33 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-      <BaseOutputDirectory>$(RepoRoot)/artifacts/$(Rid)</BaseOutputDirectory>
-      <OutputDirectory>$(BaseOutputDirectory)/stage2</OutputDirectory>
-      <Stage2WithBackwardsCompatibleRuntimesOutputDirectory>$(BaseOutputDirectory)/stage2WithBackwardsCompatibleRuntimes</Stage2WithBackwardsCompatibleRuntimesOutputDirectory>
+      <CliBuildStage Condition="'$(CliBuildStage)' == '' And '$(CliOuterBuildStage)' != ''">$([MSBuild]::Add($(CliOuterBuildStage), '1'))</CliBuildStage>
+      <CliBuildStage Condition="'$(CliBuildStage)' == ''">2</CliBuildStage>
+
+      <!-- BaseOutputDirectory is the root output path for this stage and RID
+           BaseOutputPath is the project-specific output folder that each project builds into.
+           This is not confusing at all. -->
+      <BaseOutputDirectory>$(RepoRoot)/bin/$(CliBuildStage)/$(Rid)</BaseOutputDirectory>
+      <BaseOutputPath>$([System.IO.Path]::GetFullPath('$(BaseOutputDirectory)/bin/$(MSBuildProjectName)'))</BaseOutputPath>
+
+      <BaseIntermediateOutputPath>$([System.IO.Path]::GetFullPath('$(BaseOutputDirectory)/obj/$(MSBuildProjectName)'))</BaseIntermediateOutputPath>
+      <OutputDirectory>$(BaseOutputDirectory)/dotnet</OutputDirectory>
+      <Stage2WithBackwardsCompatibleRuntimesOutputDirectory>$(BaseOutputDirectory)/dotnetWithBackwardsCompatibleRuntimes</Stage2WithBackwardsCompatibleRuntimesOutputDirectory>
       <SdkOutputDirectory>$(OutputDirectory)/sdk/$(SdkVersion)</SdkOutputDirectory>
-      <SymbolsDirectory>$(BaseOutputDirectory)/stage2symbols</SymbolsDirectory>
+      <SymbolsDirectory>$(BaseOutputDirectory)/symbols</SymbolsDirectory>
       <RoslynDirectory>$(SdkOutputDirectory)/Roslyn</RoslynDirectory>
       <FSharpDirectory>$(SdkOutputDirectory)/FSharp</FSharpDirectory>
-      <CompilationDirectory>$(BaseOutputDirectory)/stage2compilation</CompilationDirectory>
+      <CompilationDirectory>$(BaseOutputDirectory)/compilation</CompilationDirectory>
       <IntermediateDirectory>$(BaseOutputDirectory)/intermediate</IntermediateDirectory>
       <PackagesDirectory>$(BaseOutputDirectory)/packages</PackagesDirectory>
       <SharedFrameworkPublishDirectory>$(IntermediateDirectory)/sharedFrameworkPublish</SharedFrameworkPublishDirectory>
-      <!-- The 'AspNetRuntimePackageStorePublishDirectory' needs to be very short due to path length constraints on Win8.1 -->
-      <AspNetRuntimePackageStorePublishDirectory>$(BaseOutputDirectory)/AspRT</AspNetRuntimePackageStorePublishDirectory>
+      <AspNetCoreSharedFxPublishDirectory>$(IntermediateDirectory)/aspnetSharedFxPublish</AspNetCoreSharedFxPublishDirectory>
       <BackwardsCompatibleSharedFrameworksPublishDirectory>$(IntermediateDirectory)/backwardsCompatibleSharedFrameworksPublish</BackwardsCompatibleSharedFrameworksPublishDirectory>
-      <TestOutputDir>$(RepoRoot)/artifacts/testpackages/</TestOutputDir>
+      <TestOutputDir>$(BaseOutputDirectory)/test/</TestOutputDir>
       <DotnetInOutputDirectory>$(OutputDirectory)/dotnet$(ExeExtension)</DotnetInOutputDirectory>
       <GeneratedMSBuildExtensionsDirectory>$(IntermediateDirectory)/GeneratedMSBuildExtensions</GeneratedMSBuildExtensionsDirectory>
       <MSBuildExtensionsLayoutDirectory>$(IntermediateDirectory)/MSBuildExtensionsLayout</MSBuildExtensionsLayoutDirectory>
       <SdkResolverOutputDirectory>$(MSBuildExtensionsLayoutDirectory)/MSBuildSdkResolver</SdkResolverOutputDirectory>
+
+      <NextStagePropsPath>$(BaseOutputDirectory)/PreviousStage.props</NextStagePropsPath>
   </PropertyGroup>
 </Project>
diff --git a/build/Package.targets b/build/Package.targets
index 8896bdb1f..eef514f56 100644
--- a/build/Package.targets
+++ b/build/Package.targets
@@ -7,10 +7,11 @@
   <Import Project="$(MSBuildThisFileDirectory)/package/Installer.MSI.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/package/Installer.PKG.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/package/Installer.RPM.targets" />
+  <Import Project="$(MSBuildThisFileDirectory)/package/CopySandBoxPackageOut.targets" />
 
   <Target Name="GenerateInstallers"
           Condition=" '$(SkipBuildingInstallers)' != 'true' "
-          DependsOnTargets="Init;Layout;GeneratePkgs;GenerateDebs;GenerateMsis;GenerateRpms" />
+          DependsOnTargets="Prepare;Layout;GeneratePkgs;GenerateDebs;GenerateMsis;GenerateRpms" />
 
   <Target Name="Package"
           DependsOnTargets="BuildDotnetCliBuildFramework;
@@ -19,4 +20,8 @@
                             GenerateNugetPackages;
                             GenerateArchives;
                             GenerateInstallers"  />
-</Project>
+
+  <Target Name="GenerateInstallersAndCopyOutOfSandBox"
+          DependsOnTargets="SandBoxPrepare;Layout;GenerateDebs;GenerateRpms;CopySandBoxPackageOut" />
+
+</Project>
\ No newline at end of file
diff --git a/build/Prepare.targets b/build/Prepare.targets
index 214b1f78d..2783c8214 100644
--- a/build/Prepare.targets
+++ b/build/Prepare.targets
@@ -4,7 +4,7 @@
   <Import Project="prepare/CheckPrereqs.targets" />
 
   <Target Name="Prepare"
-          DependsOnTargets="Init;DownloadHostAndSharedFxArtifacts;RestoreSrcPackages;RestoreToolsPackages" />
+          DependsOnTargets="Init;DownloadHostAndSharedFxArtifacts;RestoreSrcPackages;RestoreToolsPackages;IsolateArtifactsFromDirectoryBuildFiles;CreatePropsForNextStage" />
 
   <Target Name="Init"
           DependsOnTargets="PrintBuildInfo;
@@ -13,6 +13,14 @@
                             CheckPrereqs;">
   </Target>
 
+  <Target Name="SandBoxPrepare"
+          DependsOnTargets="PrintBuildInfo;
+                            CheckPrereqs;
+                            DownloadHostAndSharedFxArtifacts;
+                            IsolateArtifactsFromDirectoryBuildFiles;
+                            CreatePropsForNextStage">
+  </Target>
+
   <Target Name="PrintBuildInfo">
     <Message Text="Host info - Rid: $(HostRid), OSName: $(HostOSName)" Importance="High" />
     <Message Text="Build info - Rid: $(Rid), Architecture: $(Architecture), OSName: $(OSName)" Importance="High" />
@@ -31,7 +39,7 @@
       <OverwriteExtractionDestination>%(_DownloadAndExtractItem.OverwriteDestination)</OverwriteExtractionDestination>
       <OverwriteExtractionDestination Condition="'$(OverwriteExtractionDestination)' == ''">True</OverwriteExtractionDestination>
     </PropertyGroup>
-    
+
     <DownloadFile Condition=" '@(_DownloadAndExtractItem)' != '' "
                   Uri="%(_DownloadAndExtractItem.Url)"
                   DestinationPath="%(_DownloadAndExtractItem.DownloadFileName)" />
@@ -54,7 +62,7 @@
 
     <CallTarget Targets="CleanSrcLockFiles" />
 
-    <DotNetRestore ToolPath="$(Stage0Directory)"
+    <DotNetRestore ToolPath="$(PreviousStageDirectory)"
                    ProjectPath="&quot;%(RestoreSrcPackagesInput.FullPath)&quot;" />
 
   </Target>
@@ -79,7 +87,7 @@
 
     <CallTarget Targets="CleanToolsLockFiles" />
 
-    <DotNetRestore ToolPath="$(Stage0Directory)"
+    <DotNetRestore ToolPath="$(PreviousStageDirectory)"
                    ProjectPath="&quot;%(RestoreToolsPackagesInput.FullPath)&quot;"
                    AdditionalParameters="/p:UsePortableLinuxSharedFramework=$(UsePortableLinuxSharedFramework)" />
 
@@ -98,4 +106,39 @@
     </ItemGroup>
   </Target>
 
+  <Target Name="IsolateArtifactsFromDirectoryBuildFiles">
+    <Copy SourceFiles="$(RepoRoot)TestAssets\Directory.Build.props"
+          DestinationFolder ="$(RepoRoot)bin"
+          SkipUnchangedFiles="true" />
+  </Target>
+
+  <Target Name="CreatePropsForNextStage">
+    <PropertyGroup>
+     
+      <NextStagePropsContent>
+&lt;Project&gt;
+    &lt;PropertyGroup&gt;
+        &lt;PreviousStageDirectory&gt;$(OutputDirectory)&lt;/PreviousStageDirectory&gt;
+        &lt;PreviousStageDotnet&gt;$(DotnetInOutputDirectory)&lt;/PreviousStageDotnet&gt;
+        &lt;CliOuterBuildStage&gt;$(CliBuildStage)&lt;/CliOuterBuildStage&gt;
+    &lt;/PropertyGroup&gt;
+&lt;/Project&gt;
+      </NextStagePropsContent>
+
+      <ExistingNextStagePropsContent Condition=" Exists('$(NextStagePropsPath)') ">
+        $([System.IO.File]::ReadAllText($(NextStagePropsPath)))
+      </ExistingNextStagePropsContent>
+
+      <ShouldOverwriteNextStagePropsFile>false</ShouldOverwriteNextStagePropsFile>
+      <ShouldOverwriteNextStagePropsFile
+        Condition=" '$(ExistingNextStagePropsContent.Trim())' != '$(NextStagePropsContent.Trim())' ">true</ShouldOverwriteNextStagePropsFile>
+    </PropertyGroup>
+
+    <WriteLinesToFile File="$(NextStagePropsPath)"
+                  Lines="$(NextStagePropsContent)"
+                  Condition=" '$(ShouldOverwriteNextStagePropsFile)' == 'true' "
+                  Overwrite="true"  />
+  </Target>
+
 </Project>
+
diff --git a/build/Publish.targets b/build/Publish.targets
index 918ae556e..d64388410 100644
--- a/build/Publish.targets
+++ b/build/Publish.targets
@@ -1,22 +1,31 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(NuGetPackagesDir)/microsoft.dotnet.build.tasks.feed/$(BuildTasksFeedToolVersion)/build/Microsoft.DotNet.Build.Tasks.Feed.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/publish/FinishBuild.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/publish/PublishContent.targets" />
-  <Import Project="$(MSBuildThisFileDirectory)/publish/PublishDebian.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/publish/PublishNupkgToBlobFeed.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/publish/Badge.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/publish/Checksum.targets" />
   <Import Project="$(MSBuildThisFileDirectory)/publish/RuntimeCoherence.targets" />
-  
+
   <!-- PUBLISH_TO_AZURE_BLOB env variable set by CI -->
   <Target Name="Publish"
           Condition=" '$(PUBLISH_TO_AZURE_BLOB)' == 'true' "
           DependsOnTargets="Init;
+                            SetBadgeProps;
                             Package;
                             EvaluateRuntimeCoherence;
                             PublishArtifacts;
                             FinishBuild" />
 
+  <Target Name="PublishWithoutPackage"
+          Condition=" '$(PUBLISH_TO_AZURE_BLOB)' == 'true' "
+          DependsOnTargets="Init;
+                            SetBadgeProps;
+                            EvaluateRuntimeCoherence;
+                            PublishArtifacts;
+                            FinishBuild" />
+
   <!-- UploadToAzure target comes from Build Tools -->
   <Target Name="PublishArtifacts"
            DependsOnTargets="GenerateVersionBadge;
@@ -26,31 +35,34 @@
                              UploadArtifactsToAzure;
                              UploadChecksumsToAzure;
                              PublishNupkgToBlobFeed;
-                             PublishDebFilesToDebianRepo;
                              PublishCliVersionBadge" />
 
   <Target Name="GatherItemsForPattern">
     <ItemGroup>
       <ForPublishing Include="@(GeneratedInstallers)"
-                     Condition=" '$(IslinuxPortable)' != 'true' "/>
+                     Condition=" '$(PublishNativeInstallers)' == 'true' "/>
       <ForPublishing Include="%(GenerateArchivesInputsOutputs.Outputs)"
-                     Condition=" '$(IsLinuxDistroSpecific)' != 'true' "/>
-      <ForPublishing Include="@(NupkgsForPublishing)"
-                     Condition=" '$(PUBLISH_NUPKG_TO_AZURE_BLOB)' == 'true' AND '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' "/>
+                     Condition=" '$(PublishArchives)' == 'true' "/>
+      <ForPublishing Include="$(PackagesDirectory)/Microsoft*.nupkg"
+                     Condition=" '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' "/>
       <ForPublishing Include="$(PackagesDirectory)/VS.Redist.Common.Net.Core.SDK.$(Architecture).*.nupkg"
-                     Condition=" '$(PUBLISH_NUPKG_TO_AZURE_BLOB)' == 'true' AND '$(OS)' == 'Windows_NT' "/>
+                     Condition=" '$(OS)' == 'Windows_NT' "/>
       <ForPublishing Include="$(PackagesDirectory)/VS.Redist.Common.Net.Core.SDK.MSBuildExtensions.*.nupkg"
-                     Condition=" '$(PUBLISH_NUPKG_TO_AZURE_BLOB)' == 'true' AND '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' "/>
+                     Condition=" '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' "/>
     </ItemGroup>
 
     <ItemGroup>
       <ForPublishing>
-        <RelativeBlobPath>$(Product)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+        <RelativeBlobPath>$(BlobStoragePartialRelativePath)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+        <ManifestArtifactData>ShipInstaller=dotnetcli</ManifestArtifactData>
       </ForPublishing>
     </ItemGroup>
   </Target>
 
   <Target Name="PublishCliVersionBadge">
+    <Error Condition="'$(ArtifactCloudDropAccessToken)' == ''" Text="Missing property ArtifactCloudDropAccessToken." />
+    <Error Condition="'$(ArtifactCloudDropURL)' == ''" Text="Missing property ArtifactCloudDropURL." />
+    
     <ItemGroup>
       <CliVersionBadgeToUpload Include="$(VersionBadge)" />
       <CliVersionBadgeToUpload Include="$(CoherentBadge)"
@@ -59,21 +71,23 @@
 
     <ItemGroup>
       <CliVersionBadgeToUpload>
-        <RelativeBlobPath>$(Product)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+        <RelativeBlobPath>$(BlobStoragePartialRelativePath)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+        <ManifestArtifactData>ShipInstaller=dotnetcli</ManifestArtifactData>
       </CliVersionBadgeToUpload>
     </ItemGroup>
 
-    <UploadToAzure
-      AccountKey="$(ArtifactCloudDropAccessToken)"
-      AccountName="$(ArtifactCloudDropAccountName)"
-      ContainerName="$(ArtifactContainerName)"
-      Items="@(CliVersionBadgeToUpload)"
-      Overwrite="$(OverwriteOnPublish)" />
-
-    <SetBlobPropertiesBasedOnFileType
-      AccountKey="$(ArtifactCloudDropAccessToken)"
-      AccountName="$(ArtifactCloudDropAccountName)"
-      ContainerName="$(ArtifactContainerName)"
-      Items="@(CliVersionBadgeToUpload)" />
+    <Message Text="Publish badges to blob feed started: $(ArtifactCloudDropURL)" />
+    <PushToBlobFeed ExpectedFeedUrl="$(ArtifactCloudDropURL)"
+                    AccountKey="$(ArtifactCloudDropAccessToken)"
+                    ItemsToPush="@(CliVersionBadgeToUpload)"
+                    ManifestBranch="$(BranchName)"
+                    ManifestBuildId="$(FullNugetVersion)"
+                    ManifestCommit="$(CommitHash)"
+                    ManifestName="$(BuildName)"
+                    ManifestBuildData="ProductVersion=$(FullNugetVersion)"
+                    Overwrite="false" 
+                    PublishFlatContainer="true" 
+                    SkipCreateManifest="$(IsNotOrchestratedPublish)" />
   </Target>
-</Project>
\ No newline at end of file
+
+</Project>
diff --git a/build/RestoreDependency.proj b/build/RestoreDependency.proj
index 142f5e929..19f209ce0 100644
--- a/build/RestoreDependency.proj
+++ b/build/RestoreDependency.proj
@@ -33,7 +33,7 @@
 
   <Target Name="EnsureDependencyRestored"
           Condition="!Exists('$(DependencyNuPkgPath)/$(DependencyPackageName.ToLower()).nuspec')">
-    <DotNetRestore ToolPath="$(Stage0Directory)"
+    <DotNetRestore ToolPath="$(PreviousStageDirectory)"
                    ProjectPath="$(MSBuildThisFileDirectory)/sdks/sdks.csproj"
                    AdditionalParameters="/p:DependencyPackageName=$(DependencyPackageName) /p:DependencyPackageVersion=$(DependencyPackageVersion)" />
   </Target>
diff --git a/build/SandBoxAndPackage.proj b/build/SandBoxAndPackage.proj
new file mode 100644
index 000000000..1387402eb
--- /dev/null
+++ b/build/SandBoxAndPackage.proj
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Layout" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(RepoRoot)/Directory.Build.props" />
+
+  <PropertyGroup>
+    <SandBoxFolderName>bin/WorkingCopy</SandBoxFolderName>
+    <RelativeSandBoxPackageOutputFolder>$(SandBoxFolderName)/RelativeSandBoxPackageOutputFolder</RelativeSandBoxPackageOutputFolder>
+    <SandBoxRepoRoot>$(RepoRoot)/$(SandBoxFolderName)/$(LinuxDistrosNeedNativeInstaller)</SandBoxRepoRoot>
+    <NugetCacheFolderName>.nuget</NugetCacheFolderName>
+    <RelativeCompileOutputPath>bin/2</RelativeCompileOutputPath>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <MirrorOfRepoRootForTools Include="$(RepoRoot)/**/*.*" Exclude="$(RepoRoot)/$(SandBoxFolderName)/**/*.*;$(RepoRoot)/nuget/**/*.*;$(RepoRoot)/bin/**/*.*" />
+    <ArtifactsToPackage Include="$(RepoRoot)/$(RelativeCompileOutputPath)/$(Rid)/**/*.*"/>
+    <LocalDirectoryBuildpropsToPreventFurtherLookUpForIt Include="$(RepoRoot)/bin/Directory.Build.props"/>
+    <ToolsCacheToSpeedUp Include="$(RepoRoot)/$(RelativeCLIBuildBinaries)/**/*.*"/>
+    <NugetCacheToSpeedUp Include="$(RepoRoot)/$(NugetCacheFolderName)/**/*.*" />
+  </ItemGroup>
+
+  <Target Name="SandBoxAndPackage" DependsOnTargets="PackageWithDocker;CopyPackageResult"/>
+
+  <Target Name="PrepareSandBox" >
+    <Copy
+      SourceFiles="@(MirrorOfRepoRootForTools)"
+      DestinationFiles="@(MirrorOfRepoRootForTools -> '$(SandBoxRepoRoot)/%(RecursiveDir)%(Filename)%(Extension)')"/>
+
+    <Exec Command="sh -c 'cd $(SandBoxRepoRoot) &amp;&amp; git clean -fxd'"/>
+
+    <Copy
+      SourceFiles="@(ArtifactsToPackage)"
+      DestinationFiles="@(ArtifactsToPackage -> '$(SandBoxRepoRoot)/$(RelativeCompileOutputPath)/$(Rid)/%(RecursiveDir)%(Filename)%(Extension)')"/>
+
+    <Copy
+      SourceFiles="@(LocalDirectoryBuildpropsToPreventFurtherLookUpForIt)"
+      DestinationFiles="@(LocalDirectoryBuildpropsToPreventFurtherLookUpForIt -> '$(SandBoxRepoRoot)/$(RelativeCompileOutputPath)/$(Rid)/%(RecursiveDir)%(Filename)%(Extension)')"/>
+
+    <Copy
+      SourceFiles="@(ToolsCacheToSpeedUp)"
+      DestinationFiles="@(ToolsCacheToSpeedUp -> '$(SandBoxRepoRoot)/$(RelativeCLIBuildBinaries)/%(RecursiveDir)%(Filename)%(Extension)')"/>
+
+    <Copy
+      SourceFiles="@(NugetCacheToSpeedUp)"
+      DestinationFiles="@(NugetCacheToSpeedUp -> '$(SandBoxRepoRoot)/$(NugetCacheFolderName)/%(RecursiveDir)%(Filename)%(Extension)')"/>
+
+  </Target>
+
+  <Target Name="PackageWithDocker" DependsOnTargets="PrepareSandBox">
+    <PropertyGroup>
+      <CommandToInvokeBuildScriptInDockerToPackageInSandBox>$(SandBoxRepoRoot)/build.sh</CommandToInvokeBuildScriptInDockerToPackageInSandBox>
+      <CommandToInvokeBuildScriptInDockerToPackageInSandBox>$(CommandToInvokeBuildScriptInDockerToPackageInSandBox) --configuration $(BuildConfiguration)</CommandToInvokeBuildScriptInDockerToPackageInSandBox>
+      <CommandToInvokeBuildScriptInDockerToPackageInSandBox>$(CommandToInvokeBuildScriptInDockerToPackageInSandBox) --docker $(DockerFolder)</CommandToInvokeBuildScriptInDockerToPackageInSandBox>
+      <CommandToInvokeBuildScriptInDockerToPackageInSandBox>$(CommandToInvokeBuildScriptInDockerToPackageInSandBox) --skip-prereqs</CommandToInvokeBuildScriptInDockerToPackageInSandBox>
+      <CommandToInvokeBuildScriptInDockerToPackageInSandBox>$(CommandToInvokeBuildScriptInDockerToPackageInSandBox) /t:GenerateInstallersAndCopyOutOfSandBox</CommandToInvokeBuildScriptInDockerToPackageInSandBox>
+      <CommandToInvokeBuildScriptInDockerToPackageInSandBox>$(CommandToInvokeBuildScriptInDockerToPackageInSandBox) /p:RelativeSandBoxPackageOutputFolder=$(RelativeSandBoxPackageOutputFolder)</CommandToInvokeBuildScriptInDockerToPackageInSandBox>
+      <CommandExitCodeFirstTime>0</CommandExitCodeFirstTime>
+      <PipeStderrToStdoutToCatchFirstFailure>2&gt;&amp;1</PipeStderrToStdoutToCatchFirstFailure>
+    </PropertyGroup>
+
+    <Exec Command="$(CommandToInvokeBuildScriptInDockerToPackageInSandBox) $(PipeStderrToStdoutToCatchFirstFailure)" ContinueOnError="WarnAndContinue">
+      <Output TaskParameter="ExitCode" PropertyName="CommandExitCodeFirstTime"/>
+    </Exec>
+
+    <PropertyGroup>
+      <ShouldRetryDueToFirstTimeFailed Condition=" '$(CommandExitCodeFirstTime)' != '0' ">true</ShouldRetryDueToFirstTimeFailed>
+    </PropertyGroup>
+
+    <Exec Condition=" '$(ShouldRetryDueToFirstTimeFailed)' == 'true' " Command="$(CommandToInvokeBuildScriptInDockerToPackageInSandBox)" />
+  </Target >
+
+  <Target Name="CopyPackageResult">
+    <ItemGroup>
+      <SandboxPackageResultFiles Include="$(SandBoxRepoRoot)/$(RelativeSandBoxPackageOutputFolder)/**/*.*"/>
+    </ItemGroup>
+    <Copy
+      SourceFiles="@(SandboxPackageResultFiles)"
+      DestinationFolder="$(InstallerOutputDirectory)/%(RecursiveDir)"/>
+  </Target >
+</Project>
diff --git a/build/SandBoxAndPackageInParallel.proj b/build/SandBoxAndPackageInParallel.proj
new file mode 100644
index 000000000..43a8300fc
--- /dev/null
+++ b/build/SandBoxAndPackageInParallel.proj
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Layout" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <Import Project="$(MSBuildThisFileDirectory)/LinuxDistrosNativeInstaller.props" />
+
+  <Target Name="RunInSandBoxAndPackage">
+    <MSBuild Projects="$(MSBuildThisFileDirectory)/SandBoxAndPackage.proj"
+             Targets="SandBoxAndPackage"
+             Properties="RepoRoot=$(RepoRoot);
+             LinuxDistrosNeedNativeInstaller=%(LinuxDistrosNeedNativeInstaller.Identity);
+             DockerFolder=%(LinuxDistrosNeedNativeInstaller.DockerFolder);
+             BuildConfiguration=$(BuildConfiguration);
+             InstallerOutputDirectory=$(InstallerOutputDirectory);
+             BuildInParallel='true'" />
+  </Target >
+</Project>
diff --git a/build/SetupPreviousStage.props b/build/SetupPreviousStage.props
new file mode 100644
index 000000000..7545eddc7
--- /dev/null
+++ b/build/SetupPreviousStage.props
@@ -0,0 +1,13 @@
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup Condition="'$(PreviousStageProps)' == ''">
+      <PreviousStageDirectory>$(RepoRoot)/.dotnet_stage0/$(Architecture)</PreviousStageDirectory>
+      <PreviousStageDotnet>$(PreviousStageDirectory)/dotnet$(ExeExtension)</PreviousStageDotnet>
+    </PropertyGroup>
+
+    <Import Project="$(PreviousStageProps)" Condition="'$(PreviousStageProps)' != ''" />
+
+    <PropertyGroup>
+      <IsDesktopAvailable>False</IsDesktopAvailable>
+      <IsDesktopAvailable Condition=" '$(OSName)' == 'win' ">True</IsDesktopAvailable>
+    </PropertyGroup>
+</Project>
diff --git a/build/Signing.proj b/build/Signing.proj
index 59addaebd..9cefdeed2 100644
--- a/build/Signing.proj
+++ b/build/Signing.proj
@@ -1,9 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project InitialTargets="SetSigningProperties" DefaultTargets="SignFiles" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <PropertyGroup>
+    <!-- The signing infrastructure runs using MSBuild 14, which doesn't support some of the new syntax we're using.  So set the BuildingSingingProject
+         property here to avoid importing files we don't need for signing which would cause errors if imported when using MSBuild 14. -->
+    <BuildingSigningProject>true</BuildingSigningProject>
+  </PropertyGroup>
+  
+  <Import Project="..\dir.props" />
   <Import Project="MicroBuild.props" />
   <Import Project="$(MicroBuildPropsAndTargetsPath)MicroBuild.Core.props" />
-  <Import Project="InitRepo.props" />
-  <Import Project="$(BuildInfoProps)" />
 
   <!-- This will be overridden if we're building with MicroBuild. -->
   <Target Name="SignFiles">
@@ -13,10 +19,6 @@
   <Target Name="SetSigningProperties">
     <Error Condition="'$(Rid)' == ''" Text="Missing required property 'Rid'." />
     <PropertyGroup>
-      <BaseOutputDirectory Condition="'$(BaseOutputDirectory)' == ''">$(RepoRoot)/artifacts/$(Rid)</BaseOutputDirectory>
-      <OutputDirectory Condition="'$(OutputDirectory)' == ''">$(BaseOutputDirectory)/stage2</OutputDirectory>
-      <CompilationDirectory Condition="'$(CompilationDirectory)' == ''">$(BaseOutputDirectory)/stage2compilation</CompilationDirectory>
-      <PackagesDirectory Condition="'$(PackagesDirectory)' == ''">$(BaseOutputDirectory)/packages</PackagesDirectory>
       <SdkResolverOutputDirectory>$(BaseOutputDirectory)/intermediate/MSBuildExtensionsLayout/MSBuildSdkResolver</SdkResolverOutputDirectory>
 
       <!-- The OutDir and IntermediateOutputPath properties are required by MicroBuild. MicroBuild only
@@ -26,7 +28,7 @@
     </PropertyGroup>
   </Target>
 
-  <Target Name="PostCompileSign" DependsOnTargets="GetPostCompileSignFiles;SignFiles" />
+  <Target Name="PostCompileSign" DependsOnTargets="GetPostCompileSignFiles;GetSignNuPkgContentsFiles;GetSignSdkResolverContentsFiles;SignFiles" />
 
   <Target Name="GetPostCompileSignFiles">
     <ItemGroup>
@@ -69,26 +71,23 @@
     </ItemGroup>
   </Target>
 
-  <Target Name="SignNuPkgContents" DependsOnTargets="GetSignNuPkgContentsFiles;SignFiles" />
+  <!-- Keeping this target around so as not to break existing build definitions. -->
+  <Target Name="SignNuPkgContents" />
 
   <Target Name="GetSignNuPkgContentsFiles">
-    <PropertyGroup>
-      <OutDir>$(RepoRoot)/src/Microsoft.DotNet.Cli.Utils</OutDir>
-    </PropertyGroup>
     <ItemGroup>
       <!-- NuPkg contents -->
-      <FilesToSign Include="$(OutDir)/bin/**/Microsoft.DotNet.Cli.Utils.dll">
+      <FilesToSign Include="$(BaseOutputDirectory)/bin/Microsoft.DotNet.Cli.Utils/**/Microsoft.DotNet.Cli.Utils.dll;
+                            $(BaseOutputDirectory)/bin/Microsoft.DotNet.Cli.Utils/**/Microsoft.DotNet.Cli.Utils.resources.dll">
         <Authenticode>$(InternalCertificateId)</Authenticode>
       </FilesToSign>
     </ItemGroup>
   </Target>
 
-  <Target Name="SignSdkResolverContents" DependsOnTargets="GetSignSdkResolverContentsFiles;SignFiles" />
+  <!-- Keeping this target around so as not to break existing build definitions. -->
+  <Target Name="SignSdkResolverContents" />
 
   <Target Name="GetSignSdkResolverContentsFiles">
-    <PropertyGroup>
-      <OutDir>$(SdkResolverOutputDirectory)</OutDir>
-    </PropertyGroup>
     <ItemGroup>
       <FilesToSign Include="$(SdkResolverOutputDirectory)/Microsoft.DotNet.MSBuildSdkResolver.dll">
         <Authenticode>$(InternalCertificateId)</Authenticode>
@@ -99,9 +98,6 @@
   <Target Name="SignMsiAndCab" DependsOnTargets="GetSignMsiAndCabFiles;SignFiles" />
 
   <Target Name="GetSignMsiAndCabFiles">
-    <PropertyGroup>
-      <OutDir>$(PackagesDirectory)</OutDir>
-    </PropertyGroup>
     <ItemGroup>
       <FilesToSign Include="$(PackagesDirectory)/**/*.msi">
         <Authenticode>$(InternalCertificateId)</Authenticode>
@@ -115,9 +111,6 @@
   <Target Name="SignEngine" DependsOnTargets="GetSignEngineFiles;SignFiles" />
 
   <Target Name="GetSignEngineFiles">
-    <PropertyGroup>
-      <OutDir>$(PackagesDirectory)</OutDir>
-    </PropertyGroup>
     <ItemGroup>
       <FilesToSign Include="$(PackagesDirectory)/**/*engine.exe">
         <Authenticode>$(InternalCertificateId)</Authenticode>
@@ -128,9 +121,6 @@
   <Target Name="SignCliBundle" DependsOnTargets="GetSignCliBundleFiles;SignFiles" />
 
   <Target Name="GetSignCliBundleFiles">
-    <PropertyGroup>
-      <OutDir>$(PackagesDirectory)</OutDir>
-    </PropertyGroup>
     <ItemGroup>
       <FilesToSign Include="$(PackagesDirectory)/**/*.exe">
         <Authenticode>$(InternalCertificateId)</Authenticode>
diff --git a/build/Stage0.props b/build/Stage0.props
deleted file mode 100644
index e5a6a0b50..000000000
--- a/build/Stage0.props
+++ /dev/null
@@ -1,9 +0,0 @@
-<Project>
-    <PropertyGroup>
-      <Stage0Directory>$(RepoRoot)/.dotnet_stage0/$(Architecture)</Stage0Directory>
-      <Stage0PjDirectory>$(RepoRoot)/.dotnet_stage0PJ/$(Architecture)</Stage0PjDirectory>
-      <DotnetStage0>$(Stage0Directory)/dotnet$(ExeExtension)</DotnetStage0>
-      <IsDesktopAvailable>False</IsDesktopAvailable>
-      <IsDesktopAvailable Condition=" '$(OSName)' == 'win' ">True</IsDesktopAvailable>
-    </PropertyGroup>
-</Project>
diff --git a/build/Test.targets b/build/Test.targets
index 83591e179..388a2e1fe 100644
--- a/build/Test.targets
+++ b/build/Test.targets
@@ -12,24 +12,21 @@
     <TestResultXmlDir>$(TestOutputDir)/results/</TestResultXmlDir>
   </PropertyGroup>
 
-  <ItemGroup>
-    <TestTaskEnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsDir)" />
-  </ItemGroup>
-
-  <PropertyGroup>
-    <RunTestEnvironmentVariables>@(TestTaskEnvironmentVariables)</RunTestEnvironmentVariables>
-  </PropertyGroup>
-
   <Target Name="Test"
           Condition=" '$(CLIBUILD_SKIP_TESTS)' != 'true' "
-          DependsOnTargets="BuildTests;">
+          DependsOnTargets="TestsForBuildItself;BuildTests;">
 
+    <!-- Make ure the test packages directory exists so that it's not an error to have it as a package source -->
+    <MakeDir Directories="$(TestPackagesDir)" />
+    
     <ItemGroup>
       <ProjectsToTest Include="build/test/RunTest.proj">
         <Properties>
           CLIBuildDll=$(CLIBuildDll);
           Configuration=$(Configuration);
-          EnvironmentVariables=$(RunTestEnvironmentVariables);
+          TestArtifactsDir=$(TestArtifactsDir);
+          TestPackagesDir=$(TestPackagesDir);
+          PreviousStageProps=$(NextStagePropsPath);
           TestProject=%(TestProjects.Identity);
           TestResultXmlDir=$(TestResultXmlDir);
           ToolPath=$(OutputDirectory);
@@ -38,35 +35,6 @@
       </ProjectsToTest>
     </ItemGroup>
 
-    <!-- Begin Workaround lack of a stable package version for depedencies; copy into simulated stable version folders -->
- 
-    <PropertyGroup>
-        <StableSharedFrameworkDirectory>$(OutputDirectory)/shared/Microsoft.NETCore.App/$(SharedFrameworkStableVersion)</StableSharedFrameworkDirectory>
-        <StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes>$(Stage2WithBackwardsCompatibleRuntimesOutputDirectory)/shared/Microsoft.NETCore.App/$(SharedFrameworkStableVersion)</StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes>
-    </PropertyGroup>
-
-    <ItemGroup>  
-        <Stabilize_SourceFiles_2_0 Include="$(OutputDirectory)/shared/Microsoft.NETCore.App/$(MicrosoftNETCoreAppPackageVersion)/*.*"/>
-        <SimulatedStableSharedFrameworkDirectories Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
-                                          Include="$(StableSharedFrameworkDirectory)" />
-        <SimulatedStableSharedFrameworkDirectories Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
-                                          Include="$(StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes)" />
-    </ItemGroup>
-
-    <Copy
-        Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
-        SourceFiles="@(Stabilize_SourceFiles_2_0)"
-        DestinationFiles="@(Stabilize_SourceFiles_2_0->'$(StableSharedFrameworkDirectory)/%(RecursiveDir)%(Filename)%(Extension)')"
-    />
-
-    <Copy
-        Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
-        SourceFiles="@(Stabilize_SourceFiles_2_0)"
-        DestinationFiles="@(Stabilize_SourceFiles_2_0->'$(StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes)/%(RecursiveDir)%(Filename)%(Extension)')"
-    />
- 
-    <!-- End Workaround lack of a stable package version for depedencies; copy into simulated stable versions -->
-
     <Message Text="Starting test execution" Importance="High" />
   
     <MSBuild
@@ -75,12 +43,6 @@
     </MSBuild>
 
     <Message Text="Finished test execution" Importance="High" />
-
-    <!-- Begin Workaround lack of a stable package version for depedencies; remove simulated stable version folder. -->
-
-    <RemoveDir Directories="@(SimulatedStableSharedFrameworkDirectories)" />
- 
-    <!-- End Workaround lack of a stable package version for depedencies; remove simulated stable version folder. -->
   </Target>
 
   <Target Name="PrepareTests"
@@ -93,13 +55,15 @@
           DependsOnTargets="PrepareTests;
                             CreateTestAssetPackageNuPkgs;">
     <DotNetRestore ToolPath="$(OutputDirectory)"
-                   ProjectPath="&quot;$(TestDirectory)/Microsoft.DotNet.Cli.Tests.sln&quot;" />
+                   ProjectPath="&quot;$(TestDirectory)/Microsoft.DotNet.Cli.Tests.sln&quot;"
+                   AdditionalParameters="/p:PreviousStageProps=$(NextStagePropsPath)" />
   </Target>
 
   <Target Name="BuildTests"
           DependsOnTargets="RestoreTests;">
     <DotNetBuild ToolPath="$(OutputDirectory)"
                  ProjectPath="&quot;$(TestDirectory)/Microsoft.DotNet.Cli.Tests.sln&quot;"
+                 AdditionalParameters="/p:PreviousStageProps=$(NextStagePropsPath)"
                  MaxCpuCount="1" />
   </Target>
 
@@ -109,19 +73,26 @@
 
     <DotNetRestore ToolPath="$(OutputDirectory)"
                    WorkingDirectory="$([System.IO.Directory]::GetParent('%(TestPackageProject.ProjectPath)'))"
-                   ProjectPath="%(TestPackageProject.ProjectPath)" />
+                   ProjectPath="%(TestPackageProject.ProjectPath)"
+                   AdditionalParameters="/p:RestoreAdditionalProjectSources=$(TestOutputDir)/packages /p:PreviousStageProps=$(NextStagePropsPath)"
+                   />
  
     <!-- https://github.com/NuGet/Home/issues/4063 -->
     <DotNetPack Output="$(TestPackagesDir)"
                 ProjectPath="%(TestPackageProject.ProjectPath)"
                 ToolPath="$(OutputDirectory)"
                 VersionSuffix="%(TestPackageProject.VersionSuffix)"
-                MsbuildArgs="%(TestPackageProject.MsbuildArgs) /p:SdkNuGetVersion=$(SdkNugetVersion)" />
+                MsbuildArgs="%(TestPackageProject.MsbuildArgs) /p:SdkNuGetVersion=$(SdkNugetVersion) /p:RestoreAdditionalProjectSources=$(TestOutputDir)/packages /p:PreviousStageProps=$(NextStagePropsPath)" />
 
   </Target>
 
+  <Target Name="TestsForBuildItself">
+    <DotNetMSBuild Arguments="/v:diag $(RepoRoot)/test/MsBuildScript.Tests/runtests.target"
+                   ToolPath="$(PreviousStageDirectory)" />
+  </Target>
+
   <Target Name="EnsureStageSeparation">
     <DotNetMSBuild Arguments="/v:diag $(RepoRoot)/build_projects/Microsoft.DotNet.Cli.Build.SelfTest/InvokeWithStage0.proj /p:OutputDirectory=&quot;$(OutputDirectory)&quot;"
-                   ToolPath="$(Stage0Directory)" />
+                   ToolPath="$(PreviousStageDirectory)" />
   </Target>
 </Project>
diff --git a/build/Version.props b/build/Version.props
index 27be01588..7c3c70205 100644
--- a/build/Version.props
+++ b/build/Version.props
@@ -1,9 +1,9 @@
-<Project>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <VersionMajor>2</VersionMajor>
     <VersionMinor>1</VersionMinor>
-    <VersionPatch>100</VersionPatch>
-    <ReleaseSuffix Condition=" '$(ReleaseSuffix)' == '' ">preview</ReleaseSuffix>
+    <VersionPatch>300</VersionPatch>
+    <ReleaseSuffix Condition=" '$(ReleaseSuffix)' == '' ">preview1</ReleaseSuffix>
 
     <CliVersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)-$(ReleaseSuffix)</CliVersionPrefix>
     <SimpleVersion Condition=" '$(DropSuffix)' == '' ">$(VersionMajor).$(VersionMinor).$(VersionPatch).$(CommitCount)</SimpleVersion> 
diff --git a/build/VersionBadge.props b/build/VersionBadge.props
deleted file mode 100644
index 0dab52fb8..000000000
--- a/build/VersionBadge.props
+++ /dev/null
@@ -1,14 +0,0 @@
-<Project>
-  <PropertyGroup>
-    <VersionBadgeMoniker>$(OSName)_$(Architecture)</VersionBadgeMoniker>
-    <VersionBadgeMoniker Condition=" '$(HostRid)' == 'debian.8-x64' ">debian_8_x64</VersionBadgeMoniker>
-    <VersionBadgeMoniker Condition=" '$(HostRid)' == 'rhel.7-x64' ">rhel_7_x64</VersionBadgeMoniker>
-    <VersionBadgeMoniker Condition=" '$(HostRid)' == 'ubuntu.14.04-x64' ">ubuntu_14_04_x64</VersionBadgeMoniker>
-    <VersionBadgeMoniker Condition=" '$(HostRid)' == 'ubuntu.16.04-x64' ">ubuntu_16_04_x64</VersionBadgeMoniker>
-    <VersionBadgeMoniker Condition=" '$(HostRid)' == 'ubuntu.16.10-x64' ">ubuntu_16_10_x64</VersionBadgeMoniker>
-    <VersionBadgeMoniker Condition=" '$(IslinuxPortable)' == 'true' ">linux_x64</VersionBadgeMoniker>
-
-    <VersionBadge>$(BaseOutputDirectory)/$(VersionBadgeMoniker)_$(Configuration)_version_badge.svg</VersionBadge>
-    <CoherentBadge>$(BaseOutputDirectory)/$(VersionBadgeMoniker)_$(Configuration)_coherent_badge.svg</CoherentBadge>
-  </PropertyGroup>
-</Project>
diff --git a/build/buildpipeline/security/DotNet-CLI-Security-Windows.json b/build/buildpipeline/security/DotNet-CLI-Security-Windows.json
new file mode 100644
index 000000000..74362e939
--- /dev/null
+++ b/build/buildpipeline/security/DotNet-CLI-Security-Windows.json
@@ -0,0 +1,764 @@
+{
+  "build": [
+    {
+      "enabled": true,
+      "continueOnError": false,
+      "alwaysRun": false,
+      "displayName": "Workaround for BuildTools - Clone Core-Setup",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "filename": "$(PB_Git)",
+        "arguments": "clone $(CoreSetupUrl) core-setup",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "failOnStandardError": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": false,
+      "alwaysRun": false,
+      "displayName": "Workaround for BuildTools - Checkout Core-Setup master",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "filename": "$(PB_Git)",
+        "arguments": "checkout master",
+        "workingFolder": "$(build.SourcesDirectory)\\core-setup",
+        "failOnStandardError": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": false,
+      "alwaysRun": false,
+      "displayName": "Workaround for BuildTools - Run init-tools.cmd",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "filename": "init-tools.cmd",
+        "arguments": "",
+        "workingFolder": "$(Build.SourcesDirectory)\\core-setup",
+        "failOnStandardError": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Workaround for BuildTools - Delete CLI dir.props",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-path \"$(Build.SourcesDirectory)\"",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param ($path)\ngci \"$path\\dir.props\" | Remove-Item -Force",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Download blobs from container $(PB_CloudDropAccountName)",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "c6c4c611-aa2e-4a33-b606-5eaba2196824",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "solution": "$(Build.SourcesDirectory)\\build\\buildpipeline\\security\\syncAzure.proj",
+        "msbuildLocationMethod": "version",
+        "msbuildVersion": "latest",
+        "msbuildArchitecture": "x64",
+        "msbuildLocation": "",
+        "platform": "x64",
+        "configuration": "$(BuildConfiguration)",
+        "msbuildArguments": "/p:AzureAccount=\"$(PB_CloudDropAccountName)\" /p:AzureToken=\"$(PB_CloudDropAccessToken)\" /p:BlobName=\"$(PB_BlobNameFilter)\" /verbosity:diag",
+        "clean": "false",
+        "maximumCpuCount": "false",
+        "restoreNugetPackages": "false",
+        "logProjectEvents": "false",
+        "createLogFile": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Copy downloaded packages to security folder",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "refName": "PowerShell_23",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-SrcDir \"$(Build.SourcesDirectory)\"",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$secDir = Join-Path \"$SrcDir\" \"security\"\n$pkgDir = \"$SrcDir\\core-setup\\packages\\AzureTransfer\"\nCopy-Item \"$pkgDir \" \"$secDir\" -Force -Recurse\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Extract downloaded packages",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-SrcDir \"$(Build.SourcesDirectory)\"",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$secDir = Join-Path \"$SrcDir\" \"security\"\ngci \"$secDir\\*.zip\" | % {\n$dstDir = Join-Path \"$secDir\" $($_.BaseName)\nExpand-Archive -Path $($_.FullName) -DestinationPath \"$dstDir\" -Force\nWrite-Host \"Expanded: $($_.FullName)\"\nRemove-Item $_.FullName -Force\n}\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "List all files",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "$(Build.SourcesDirectory)",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$fileCount = 0\ngci $SrcDir -recurse | % {\nWrite-Host $($_.FullName)\n$fileCount += 1\n}\nWrite-Host \"File Count: $fileCount\"\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "environment": {},
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Remove non-CLI folders",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "refName": "PowerShell_22",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-SrcDir \"$(Build.SourcesDirectory)\"",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$secDir = Join-Path \"$SrcDir\" \"security\"\n\ngci \"$secDir\" | where {$_.PSIsContainer} | % {\n    gci $_.FullName | where {$_.PSIsContainer} | % {\n        if ($_.BaseName -ine \"sdk\" -and $_.BaseName -notmatch \"symbols\")\n        {\n            Remove-Item $_.FullName -Recurse -Force -ErrorAction Continue\n            Write-Host \"Removed $($_.FullName)\"\n        }\n    }\n}",
+        "failOnStandardError": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Workaround for long path - DELETE files with path length greater than or equal to 240 characters",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "refName": "Task_10",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-SrcDir \"$(Build.SourcesDirectory)\"",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$longPath = New-Object System.Collections.ArrayList\ngci \"$SrcDir\\*\" -recurse | where {!$_.PSIsContainer}  | % {\nif ($($_.FullName.Length) -ge 240)\n{\n$longPath.Add($($_.Directory.FullName)) | Out-Null\n}\n}\n$longPath | % {\nStart-Process \"cmd\" -ArgumentList \"/c rd /S /Q $_\" -Wait\nWrite-Host \"DELETED $_\"\n}\n",
+        "failOnStandardError": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "List all files - post delete",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "refName": "Task_11",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "$(Build.SourcesDirectory)",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$fileCount = 0\ngci $SrcDir -recurse | % {\nWrite-Host $($_.FullName)\n$fileCount += 1\n}\nWrite-Host \"File Count: $fileCount\"\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "environment": {},
+      "enabled": true,
+      "continueOnError": false,
+      "alwaysRun": false,
+      "displayName": "Get latest version info",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "refName": "PowerShell23",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "filePath",
+        "scriptName": "$(Build.SourcesDirectory)\\build\\buildpipeline\\security\\Get-LatestVersion.ps1",
+        "arguments": "-Branch \"$(CodeBase)\"",
+        "workingFolder": "",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "environment": {},
+      "enabled": true,
+      "continueOnError": false,
+      "alwaysRun": false,
+      "displayName": "Workaround for long package Id",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "refName": "PowerShell24",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-packageId $(CliLatestPackageId)",
+        "workingFolder": "",
+        "inlineScript": "param($packageId)\n\nif ($packageId.Length -ge 16)\n{\n    Write-Host \"Build number for security build is the package Id. TSA has a limit of 16 characters for build number. Since package Id is greater than 16 characters, build number will be set to current date time in yyyymmddHHMMss format.\"\n    $CliLatestPackageId = Get-Date -Format yyyymmddHHMMss\n    Write-Host \"##vso[task.setvariable variable=CliLatestPackageId;]$CliLatestPackageId\"\n}",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Run BinSkim ",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "3056813a-40e9-4b2f-8f6b-612d1bc4e045",
+        "versionSpec": "3.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "InputType": "CommandLine",
+        "arguments": "analyze $(Build.SourcesDirectory)\\security\\*.dll $(Build.SourcesDirectory)\\security\\*.exe --recurse --sympath $(Build.SourcesDirectory)\\security\\*.pdb --verbose --statistics",
+        "Function": "analyze",
+        "AnalyzeTarget": "$(Build.ArtifactStagingDirectory)",
+        "AnalyzeSymPath": "",
+        "AnalyzeConfigPath": "default",
+        "AnalyzePluginPath": "",
+        "AnalyzeRecurse": "true",
+        "AnalyzeVerbose": "true",
+        "AnalyzeHashes": "true",
+        "AnalyzeStatistics": "false",
+        "AnalyzeEnvironment": "false",
+        "ExportRulesOutputType": "SARIF",
+        "DumpTarget": "$(Build.ArtifactStagingDirectory)",
+        "DumpRecurse": "true",
+        "DumpVerbose": "true",
+        "toolVersion": "Latest"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Run APIScan",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "9adea2b1-3752-438c-80c6-a6f0a812abdd",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "targetMode": "binarysym",
+        "softwareFolder": "$(Build.SourcesDirectory)\\security",
+        "mpdFolder": "",
+        "softwareName": "CLI",
+        "softwareVersionNum": "$(CliLatestPackageId)",
+        "softwareBuildNum": "$(CliLatestPackageId)",
+        "modeType": "prerelease",
+        "noCopySymbols": "false",
+        "noCopyBinaries": "false",
+        "noDecompress": "true",
+        "exclusionList": "",
+        "email": "",
+        "symbolsFolder": "$(Build.SourcesDirectory)\\security",
+        "preBbtBinariesFolder": "",
+        "preBbtSymbolsFolder": "",
+        "isLargeApp": "false",
+        "analyzerTimeout": "00:00:00",
+        "preserveTempFiles": "false",
+        "toolVersion": "Latest"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": false,
+      "alwaysRun": false,
+      "displayName": "Checkout CLI at SHA listed in latest.version",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-sha \"$(CliLatestCommitSha)\" -git \"$(PB_Git)\"",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($sha, $git)\n\nStart-Process \"$git\" -ArgumentList \"clean -df\" -Wait -Verbose -ErrorAction Stop\nStart-Process \"$git\" -ArgumentList \"checkout $sha\" -Wait -Verbose -ErrorAction Stop\nWrite-Host \"Checked out at $sha\"\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Run Core-Setup clean.cmd",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "filename": "clean.cmd",
+        "arguments": "-all",
+        "workingFolder": "$(Build.SourcesDirectory)\\core-setup",
+        "failOnStandardError": "false"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Delete Core-Setup folder",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "-path \"$(Build.SourcesDirectory)\\core-setup\"",
+        "workingFolder": "",
+        "inlineScript": "param ($path)\nRemove-Item \"$path\" -Force -Recurse -ErrorAction Continue\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "List all files - post checkout",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "scriptType": "inlineScript",
+        "scriptName": "",
+        "arguments": "$(Build.SourcesDirectory)",
+        "workingFolder": "$(Build.SourcesDirectory)",
+        "inlineScript": "param($SrcDir)\n$fileCount = 0\ngci $SrcDir -recurse | % {\nWrite-Host $($_.FullName)\n$fileCount += 1\n}\nWrite-Host \"File Count: $fileCount\"\n",
+        "failOnStandardError": "true"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Run CredScan",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "ea576cd4-c61f-48f8-97e7-a3cb07b90a6f",
+        "versionSpec": "2.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "outputFormat": "pre",
+        "toolVersion": "Latest",
+        "scanFolder": "$(Build.SourcesDirectory)",
+        "searchersFileType": "Default",
+        "searchersFile": "",
+        "suppressionsFile": "",
+        "suppressAsError": "false",
+        "batchSize": ""
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Run PoliCheck",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "d785890c-0d0d-46bd-8167-8fa9d49990c7",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "inputType": "Basic",
+        "cmdLineArgs": "/F:$(Build.SourcesDirectory) /T:9 /O:PoliCheck.xml",
+        "targetType": "F",
+        "targetArgument": "$(Build.SourcesDirectory)",
+        "importEx": "0",
+        "termTypeT": "0029a9",
+        "termTypeTCustom": "9",
+        "termTypeK": "",
+        "termTypeL": "",
+        "EXGT": "false",
+        "result": "PoliCheck.xml",
+        "optionsFC": "1",
+        "optionsXS": "1",
+        "optionsCTGLEN": "",
+        "optionsSEV": "",
+        "optionsPE": "",
+        "optionsHMENABLE": "",
+        "optionsHPATH": "",
+        "optionsHVER": "",
+        "optionsRulesDBPath": "",
+        "optionsRule": "",
+        "optionsXCLASS": "",
+        "optionsTASKNAME": "",
+        "optionsWORKINGDIRECTORY": "",
+        "optionsFTPATH": "",
+        "optionsD": "",
+        "optionsB1": "",
+        "optionsB2": "",
+        "optionsB3": "",
+        "optionsOCDB": "",
+        "toolVersion": "Latest"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Post Analysis",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "f5679091-e6da-4974-a8dc-0eec03a8ea63",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "APIScan": "true",
+        "BinScope": "false",
+        "BinSkim": "true",
+        "BinSkimBreakOn": "Error",
+        "CredScan": "true",
+        "FortifySCA": "false",
+        "FxCop": "false",
+        "FxCopBreakOn": "ErrorAbove",
+        "ModernCop": "false",
+        "ModernCopBreakOn": "Error",
+        "PoliCheck": "true",
+        "PoliCheckBreakOn": "Severity1",
+        "SDLNativeRules": "false",
+        "TSLint": "false",
+        "TSLintBreakOn": "Error"
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "Publish Security Analysis Logs",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "4096c760-3a8a-435d-9689-88c0311bbc0e",
+        "versionSpec": "2.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "ArtifactName": "CodeAnalysisLogs",
+        "ArtifactType": "Container",
+        "TargetPath": "\\\\my\\share\\$(Build.DefinitionName)\\$(Build.BuildNumber)",
+        "RvName": "",
+        "ProductComponentName": "",
+        "ProductVersionNumber": "",
+        "PlatformName": "",
+        "SDLToolName": "",
+        "SDLToolResultFile": ""
+      }
+    },
+    {
+      "enabled": true,
+      "continueOnError": true,
+      "alwaysRun": false,
+      "displayName": "TSA upload to Codebase: DotNet-CLI-Trusted_$(CodeBase) Stamp: Azure",
+      "timeoutInMinutes": 0,
+      "condition": "succeeded()",
+      "task": {
+        "id": "3da26988-bb64-4a23-8f06-45531d297dae",
+        "versionSpec": "1.*",
+        "definitionType": "task"
+      },
+      "inputs": {
+        "codebase": "NewOrUpdate",
+        "tsaStamp": "Azure",
+        "tsaWebApiUrl": "$(TSAStamp)",
+        "codeBaseName": "DotNet-CLI-Trusted_$(CodeBase)",
+        "notificationAlias": "$(NotificationAlias)",
+        "codeBaseAdmins": "NORTHAMERICA\\raeda",
+        "instanceUrlAzure": "MSAZURE",
+        "instanceUrlBing": "",
+        "instanceUrlCarbon": "",
+        "instanceUrlDevDiv": "DEVDIV",
+        "instanceUrlSkype": "",
+        "instanceUrlTsa": "",
+        "instanceUrlPpe": "",
+        "projectNameDAIPVSTF": "",
+        "projectNameDYNAMICSCRM": "",
+        "projectNameMSAZURE": "One",
+        "projectNameMSDYENG": "",
+        "projectNameMSECG": "",
+        "projectNameIDENTITYDIVISION": "Code Scan - TSA",
+        "projectNameVSTFRD": "",
+        "projectNameMSASG": "",
+        "projectNameMICROSOFTVSTS": "",
+        "projectNameMSDATA": "",
+        "projectNameMSENG": "",
+        "projectNameDEVDIV": "DevDiv",
+        "projectNameSKYPETEST2": "",
+        "projectNameONEDRIVE": "",
+        "projectNameSQLBUVSTS": "",
+        "projectNamePOWERBI": "",
+        "projectNameAZUREVSTFPPE": "",
+        "projectNameSKYPE": "",
+        "projectNameDOMOREEXP": "",
+        "projectNameSQLBUVSTSTEST": "",
+        "areaPath": "One\\DevDiv\\DotNetCore",
+        "iterationPath": "One",
+        "uploadAPIScan": "true",
+        "uploadBinScope": "false",
+        "uploadBinSkim": "true",
+        "uploadCredScan": "true",
+        "uploadFortifySCA": "false",
+        "uploadFxCop": "false",
+        "uploadModernCop": "false",
+        "uploadPoliCheck": "true",
+        "uploadPREfast": "false",
+        "validateToolOutput": "Warning",
+        "validateCompatibility": "Error",
+        "uploadAsync": "true"
+      }
+    }
+  ],
+  "options": [
+    {
+      "enabled": false,
+      "definition": {
+        "id": "5bc3cfb7-6b54-4a4b-b5d2-a3905949f8a6"
+      },
+      "inputs": {}
+    },
+    {
+      "enabled": false,
+      "definition": {
+        "id": "7c555368-ca64-4199-add6-9ebaf0b0137d"
+      },
+      "inputs": {
+        "multipliers": "[]",
+        "parallel": "false",
+        "continueOnError": "true",
+        "additionalFields": "{}"
+      }
+    },
+    {
+      "enabled": false,
+      "definition": {
+        "id": "a9db38f9-9fdc-478c-b0f9-464221e58316"
+      },
+      "inputs": {
+        "workItemType": "234347",
+        "assignToRequestor": "true",
+        "additionalFields": "{}"
+      }
+    },
+    {
+      "enabled": false,
+      "definition": {
+        "id": "57578776-4c22-4526-aeb0-86b6da17ee9c"
+      },
+      "inputs": {}
+    },
+    {
+      "enabled": false,
+      "definition": {
+        "id": "5d58cc01-7c75-450c-be18-a388ddb129ec"
+      },
+      "inputs": {
+        "branchFilters": "[\"+refs/heads/*\"]",
+        "additionalFields": "{}"
+      }
+    }
+  ],
+  "variables": {
+    "system.debug": {
+      "value": "false"
+    }
+  },
+  "demands": [
+    "Agent.OS -equals windows_nt",
+    "msbuild"
+  ],
+  "retentionRules": [
+    {
+      "branches": [
+        "+refs/heads/*"
+      ],
+      "artifacts": [
+        "build.SourceLabel"
+      ],
+      "artifactTypesToDelete": [],
+      "daysToKeep": 10,
+      "minimumToKeep": 1,
+      "deleteBuildRecord": true,
+      "deleteTestResults": true
+    }
+  ],
+  "_links": {
+    "self": {
+      "href": "https://devdiv.visualstudio.com/0bdbc590-a062-4c3f-b0f6-9383f67865ee/_apis/build/Definitions/6661"
+    },
+    "web": {
+      "href": "https://devdiv.visualstudio.com/_permalink/_build/index?collectionId=011b8bdf-6d56-4f87-be0d-0092136884d9&projectId=0bdbc590-a062-4c3f-b0f6-9383f67865ee&definitionId=6661"
+    },
+    "editor": {
+      "href": "https://devdiv.visualstudio.com/_permalink/_build/definitionEditor?collectionId=011b8bdf-6d56-4f87-be0d-0092136884d9&projectId=0bdbc590-a062-4c3f-b0f6-9383f67865ee&definitionId=6661"
+    },
+    "badge": {
+      "href": "https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6661/badge"
+    }
+  },
+  "buildNumberFormat": "$(date:yyyyMMdd)$(rev:-rr)",
+  "jobAuthorizationScope": 1,
+  "jobTimeoutInMinutes": 600,
+  "jobCancelTimeoutInMinutes": 5,
+  "badgeEnabled": true,
+  "repository": {
+    "properties": {
+      "cleanOptions": "3",
+      "labelSources": "0",
+      "labelSourcesFormat": "$(build.buildNumber)",
+      "reportBuildStatus": "true",
+      "gitLfsSupport": "false",
+      "skipSyncSource": "false",
+      "checkoutNestedSubmodules": "false",
+      "fetchDepth": "0"
+    },
+    "id": "ceac4423-53f8-4c97-bc62-173630412581",
+    "type": "TfsGit",
+    "name": "DotNet-Cli-Trusted",
+    "url": "https://devdiv.visualstudio.com/DevDiv/_git/DotNet-Cli-Trusted",
+    "defaultBranch": "refs/heads/master",
+    "clean": "true",
+    "checkoutSubmodules": false
+  },
+  "processParameters": {},
+  "quality": "definition",
+  "authoredBy": {
+    "id": "9d5fdf9f-36b6-4d0c-a12e-2737a673af94",
+    "displayName": "Ravi Eda",
+    "uniqueName": "raeda@microsoft.com",
+    "url": "https://app.vssps.visualstudio.com/Aa44b2c06-f247-425c-8464-4a0676af910a/_apis/Identities/9d5fdf9f-36b6-4d0c-a12e-2737a673af94",
+    "imageUrl": "https://devdiv.visualstudio.com/_api/_common/identityImage?id=9d5fdf9f-36b6-4d0c-a12e-2737a673af94"
+  },
+  "queue": {
+    "id": 36,
+    "name": "DotNet-Build",
+    "pool": {
+      "id": 39,
+      "name": "DotNet-Build"
+    }
+  },
+  "id": 6733,
+  "name": "DotNet-CLI-Security-Windows",
+  "url": "https://devdiv.visualstudio.com/0bdbc590-a062-4c3f-b0f6-9383f67865ee/_apis/build/Definitions/6661",
+  "uri": "vstfs:///Build/Definition/6733",
+  "path": "\\",
+  "type": 2,
+  "revision": 6,
+  "createdDate": "2017-06-21T21:58:12.397Z",
+  "project": {
+    "id": "0bdbc590-a062-4c3f-b0f6-9383f67865ee",
+    "name": "DevDiv",
+    "description": "Visual Studio and DevDiv team project for git source code repositories.  Work items will be added for Adams, Dev14 work items are tracked in vstfdevdiv.  ",
+    "url": "https://devdiv.visualstudio.com/_apis/projects/0bdbc590-a062-4c3f-b0f6-9383f67865ee",
+    "state": "wellFormed",
+    "revision": 418097676,
+    "visibility": 0
+  }
+}
diff --git a/build/buildpipeline/security/Get-LatestVersion.ps1 b/build/buildpipeline/security/Get-LatestVersion.ps1
new file mode 100644
index 000000000..2f921ef3a
--- /dev/null
+++ b/build/buildpipeline/security/Get-LatestVersion.ps1
@@ -0,0 +1,71 @@
+<#
+.SYNOPSIS
+    Retrieves the latest commit SHA and the corresponding package Id for the specified branch of CLI. 
+    This retrieval is achieved by downloading the latest.version file, which contains the commit SHA and package Id info.
+    If retrieval succeeds, then the commit is set as a VSTS Task Variable named CliLatestCommitSha, and similarly package Id is set as CliLatestPackageId.
+.PARAMETER $Branch
+    Name of the CLI branch.
+.PARAMETER $Filename
+    Name of the file that contains latest version info i.e. commit SHA and package Id.
+    If not specified, then the default value is latest.version
+.PARAMETER $UrlPrefix
+    URL prefix for $Filename.
+    If not specified, then the default value is https://dotnetcli.blob.core.windows.net/dotnet/Sdk
+#>
+
+param(
+    [Parameter(Mandatory=$true)]
+    [string]$Branch,
+    [string]$Filename="latest.version",
+    [string]$UrlPrefix="https://dotnetcli.blob.core.windows.net/dotnet/Sdk"
+)
+
+function Get-VersionInfo
+{
+    Write-Host "Attempting to retrieve latest version info from $latestVersionUrl"
+    $retries = 3
+    $retryCount = 1
+    $oldEap = $ErrorActionPreference
+
+    while ($retryCount -le $retries)
+    {
+        $ErrorActionPreference = "Stop"
+
+        try
+        {
+            $content = (Invoke-WebRequest -Uri "$latestVersionUrl" -UseBasicParsing).Content
+            return $content.Split([Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries)
+        }
+        catch
+        {
+            Sleep -Seconds (Get-Random -minimum 3 -maximum 10)
+            Write-Host "Exception occurred while attempting to get latest version info from $latestVersionUrl. $_"
+            Write-Host "Retry $retryCount of $retries"
+        }
+        finally
+        {
+            $ErrorActionPreference = $oldEap
+        }
+
+        $retryCount++
+    }
+}
+
+$latestVersionUrl = "$UrlPrefix/$Branch/$Filename"
+$latestVersionContent = Get-VersionInfo
+
+if ($latestVersionContent -ne $null -and $latestVersionContent.Length -eq 2)
+{
+    $CliLatestCommitSha = $latestVersionContent[0]
+    $CliLatestPackageId = $latestVersionContent[1]
+
+    Write-Host "##vso[task.setvariable variable=CliLatestCommitSha;]$CliLatestCommitSha"
+    Write-Host "##vso[task.setvariable variable=CliLatestPackageId;]$CliLatestPackageId"
+
+    Write-Host "The latest commit SHA in CLI $Branch is $CliLatestCommitSha"
+    Write-Host "The latest package Id in CLI $Branch is $CliLatestPackageId"
+}
+else
+{
+    Write-Error "Unable to get latest version info from $latestVersionUrl"
+}
diff --git a/build/buildpipeline/security/dir.props b/build/buildpipeline/security/dir.props
new file mode 100644
index 000000000..3e28b4a52
--- /dev/null
+++ b/build/buildpipeline/security/dir.props
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\..\..\core-setup\dir.props" />
+</Project>
diff --git a/build/buildpipeline/security/pipeline.json b/build/buildpipeline/security/pipeline.json
new file mode 100644
index 000000000..dbac3626b
--- /dev/null
+++ b/build/buildpipeline/security/pipeline.json
@@ -0,0 +1,22 @@
+{
+    "Repository": "cli",
+    "Definitions": {
+        "Path": ".",
+        "Type": "VSTS",
+        "BaseUrl": "https://devdiv.visualstudio.com/DefaultCollection",
+        "SkipBranchAndVersionOverrides": "false"
+    },
+    "Pipelines": [
+        {
+            "Name": "Security Build for Windows",
+            "Parameters": {
+                "TreatWarningsAsErrors": "false"
+            },
+            "Definitions": [
+                {
+                    "Name": "DotNet-CLI-Security-Windows"
+                }
+            ]
+        }
+    ]
+}
diff --git a/build/buildpipeline/security/syncAzure.proj b/build/buildpipeline/security/syncAzure.proj
new file mode 100644
index 000000000..45d7657eb
--- /dev/null
+++ b/build/buildpipeline/security/syncAzure.proj
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+
+  <PropertyGroup>
+    <CloudTestTasksPath>$(BuildToolsTaskDesktopDir)Microsoft.DotNet.Build.CloudTestTasks.dll</CloudTestTasksPath>
+    <ContainerName Condition="'$(ContainerName)' == ''">dotnet</ContainerName>
+    <DownloadDirectory>$(PackagesDir)AzureTransfer</DownloadDirectory>
+  </PropertyGroup>
+
+  <Import Project="syncAzure.targets" />
+
+  <Target Name="ValidateRequiredProperties">
+    <Error Condition="'$(AzureAccount)' == ''" Text="Missing property AzureAccount." />
+    <Error Condition="'$(AzureToken)' == ''" Text="Missing property AzureToken." />
+    <Error Condition="'$(ContainerName)' == ''" Text="Missing required property 'ContainerName'" />
+    <Error Condition="'$(BlobName)' == ''" Text="Missing required property 'BlobName'" />
+  </Target>
+
+  <Target Name="Build" DependsOnTargets="ValidateRequiredProperties;DownloadBlobsFromAzureTargets" />
+</Project>
diff --git a/build/buildpipeline/security/syncAzure.targets b/build/buildpipeline/security/syncAzure.targets
new file mode 100644
index 000000000..4cc360a11
--- /dev/null
+++ b/build/buildpipeline/security/syncAzure.targets
@@ -0,0 +1,31 @@
+<Project ToolsVersion="12.0" DefaultTargets="DownloadBlobsFromAzureTargets" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <UsingTask TaskName="DownloadFromAzure" AssemblyFile="$(CloudTestTasksPath)"/>
+  <UsingTask TaskName="ListAzureBlobs" AssemblyFile="$(CloudTestTasksPath)" />
+  <UsingTask TaskName="ListAzureContainers" AssemblyFile="$(CloudTestTasksPath)"/>
+
+  <PropertyGroup>
+    <DownloadDirectory Condition="'$(DownloadDirectory)' == ''">$(PackagesDir)/AzureTransfer</DownloadDirectory>
+  </PropertyGroup>
+
+  <Target Name="DownloadBlobsFromAzureTargets" Condition="'$(ContainerName)' != ''">
+    <ListAzureBlobs AccountName="$(AzureAccount)"
+                    AccountKey="$(AzureToken)"
+                    ContainerName="$(ContainerName)"
+                    FilterBlobNames="$(BlobName)">
+      <Output TaskParameter="BlobNames" ItemName="_BlobList" />
+    </ListAzureBlobs>
+
+    <ItemGroup>
+      <_OSFilteredBlobNames Include="@(_BlobList)" 
+                        Condition="'$(OSGroup)' == 'Windows_NT' AND 
+                        ('%(_BlobList.Extension)' == '.zip' OR '%(_BlobList.Extension)' == '.exe' OR '%(_BlobList.Extension)' == '.version')" />
+    </ItemGroup>
+
+    <DownloadFromAzure AccountName="$(AzureAccount)"
+                        AccountKey="$(AzureToken)"
+                        ContainerName="$(ContainerName)"
+                        BlobNames="@(_OSFilteredBlobNames)"
+                        BlobNamePrefix="$(BlobName)"
+                        DownloadDirectory="$(DownloadDirectory)" />
+  </Target>
+</Project>
diff --git a/build/compile/LzmaArchive.targets b/build/compile/LzmaArchive.targets
index 37c96d648..a1fa07e91 100644
--- a/build/compile/LzmaArchive.targets
+++ b/build/compile/LzmaArchive.targets
@@ -3,9 +3,9 @@
 
     <PropertyGroup>
       <FinalArchive>$(SdkOutputDirectory)/nuGetPackagesArchive.lzma</FinalArchive>
-      <NugetPackagesArchiveName>nuGetPackagesArchive.$(AspNetCoreRuntimePackageFlavor).lzma</NugetPackagesArchiveName>
+      <NugetPackagesArchiveName>nuGetPackagesArchive-$(AspNetCoreVersion).lzma</NugetPackagesArchiveName>
       <IntermediateArchive>$(IntermediateDirectory)/$(NugetPackagesArchiveName)</IntermediateArchive>
-      <NugetPackagesArchiveBlobUrl>$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(NugetPackagesArchiveName)</NugetPackagesArchiveBlobUrl>
+      <NugetPackagesArchiveBlobUrl>$(AspNetCoreSharedFxRootUrl)$(AspNetCoreVersion)/$(NugetPackagesArchiveName)</NugetPackagesArchiveBlobUrl>
     </PropertyGroup>
 
     <Target Name="GetNuGetPackagesArchive"
diff --git a/build/package/CopySandBoxPackageOut.targets b/build/package/CopySandBoxPackageOut.targets
new file mode 100644
index 000000000..a7bf6b524
--- /dev/null
+++ b/build/package/CopySandBoxPackageOut.targets
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <Target Name="CopySandBoxPackageOut">
+      <Copy
+      SourceFiles="@(GeneratedInstallers)"
+      DestinationFolder="$(RepoRoot)/$(RelativeSandBoxPackageOutputFolder)"/>
+    </Target>
+
+</Project>
diff --git a/build/package/Installer.DEB.proj b/build/package/Installer.DEB.proj
index ce2a2e27d..f8c741964 100644
--- a/build/package/Installer.DEB.proj
+++ b/build/package/Installer.DEB.proj
@@ -13,21 +13,27 @@
           Condition=" '$(IsDebianBaseDistro)' == 'True' "
           Outputs="@(GeneratedInstallers)"/>
 
+  <Target Name="GetAspNetSharedFxInstallArgs" DependsOnTargets="EvaluateRuntimeCoherence">
+    <PropertyGroup>
+      <!-- Ignored because versions of aspnetcore-runtime may be in incoherent with the version of dotnet-runtime we want to use. -->
+      <InstallAspNetCoreSharedFxArgs>--ignore-depends=dotnet-runtime-$(AspNetCoreSharedFxBaseRuntimeVersion)</InstallAspNetCoreSharedFxArgs>
+    </PropertyGroup>
+  </Target>
+
   <Target Name="BuildSdkDeb"
       Condition=" '$(IsDebianBaseDistro)' == 'True' AND '$(DebuildPresent)'  == 'true' "
       DependsOnTargets="PrepareDotnetDebDirectories;
                         PrepareDotnetDebTool;
-                        DownloadAspNetCoreRuntimeDebInstaller;"
+                        GetAspNetSharedFxInstallArgs;"
       Inputs="@(CLISdkFiles)"
       Outputs="$(SdkInstallerFile)" >
-
       <!-- Install Shared Framework Packages -->
+
+      <Exec Command="sudo dpkg -i $(DownloadedRuntimeDepsInstallerFile)" />
       <Exec Command="sudo dpkg -i $(DownloadedSharedHostInstallerFile)" />
       <Exec Command="sudo dpkg -i $(DownloadedHostFxrInstallerFile)" />
       <Exec Command="sudo dpkg -i $(DownloadedSharedFrameworkInstallerFile)" />
-      <Exec Command="sudo dpkg -i $(DownloadedSharedAspNetCoreRuntime200)" />
-      <Exec Command="sudo dpkg -i $(DownloadedSharedAspNetCoreRuntime203)" />
-      <Exec Command="sudo dpkg -i $(DownloadedSharedAspNetCoreRuntime)" />
+      <Exec Command="sudo dpkg $(InstallAspNetCoreSharedFxArgs) -i $(DownloadedAspNetCoreSharedFxInstallerFile)" />
 
       <!-- Create layout: Binaries -->
       <Copy
@@ -66,7 +72,7 @@
         Mode="u+x" />
 
       <!-- Build SDK Deb package -->
-      <DotNetDebTool ToolPath="$(Stage0Directory)"
+      <DotNetDebTool ToolPath="$(PreviousStageDirectory)"
                      InputDirectory="$(LayoutDirectory)"
                      OutputDirectory="$(DotNetDebToolOutputDirectory)"
                      PackageName="$(SdkDebianPackageName)"
@@ -89,18 +95,16 @@
 
       <!-- Remove Shared Framework and Debian Packages -->
       <Exec Command="sudo dpkg -r $(SdkDebianPackageName)" />
-      <Exec Command="sudo dpkg -r $(AspNetCoreRuntimePackageName)" />
-      <Exec Command="sudo dpkg -r $(AspNetCoreRuntimePackageName203)" />
-      <Exec Command="sudo dpkg -r $(AspNetCoreRuntimePackageName200)" />
+      <Exec Command="sudo dpkg -r $(AspNetCoreSharedFxDebianPackageName)" />
       <Exec Command="sudo dpkg -r $(SharedFxDebianPackageName)" />
       <Exec Command="sudo dpkg -r $(HostFxrDebianPackageName)" />
-
       <Exec Command="sudo dpkg -r $(HostDebianPackageName)" />
+      <Exec Command="sudo dpkg -r $(RuntimeDepsPackageName)" />
   </Target>
 
   <Target Name="TestSdkDeb"
-      Condition=" '$(IsDebianBaseDistro)' == 'True' and '$(DebuildPresent)'  == 'true' and '$(IsSharedFrameworkPreReleaseVersion)' != 'True' "
-      DependsOnTargets="RestoreTests"
+      Condition=" '$(CLIBUILD_SKIP_TESTS)' != 'true' and '$(IsDebianBaseDistro)' == 'True' and '$(DebuildPresent)'  == 'true' "
+      DependsOnTargets="RestoreTests;GetAspNetSharedFxInstallArgs"
       Inputs="$(DownloadedSharedHostInstallerFile);
               $(DownloadedHostFxrInstallerFile);
               $(DownloadedSharedFrameworkInstallerFile);
@@ -108,12 +112,11 @@
       Outputs="$(DebianTestResultsXmlFile)" >
 
       <!-- Install Dependencies and SDK Packages -->
+      <Exec Command="sudo dpkg -i $(DownloadedRuntimeDepsInstallerFile)" />
       <Exec Command="sudo dpkg -i $(DownloadedSharedHostInstallerFile)" />
       <Exec Command="sudo dpkg -i $(DownloadedHostFxrInstallerFile)" />
       <Exec Command="sudo dpkg -i $(DownloadedSharedFrameworkInstallerFile)" />
-      <Exec Command="sudo dpkg -i $(DownloadedSharedAspNetCoreRuntime200)" />
-      <Exec Command="sudo dpkg -i $(DownloadedSharedAspNetCoreRuntime203)" />
-      <Exec Command="sudo dpkg -i $(DownloadedSharedAspNetCoreRuntime)" />
+      <Exec Command="sudo dpkg $(InstallAspNetCoreSharedFxArgs) -i $(DownloadedAspNetCoreSharedFxInstallerFile)" />
 
       <Exec Command="sudo dpkg -i $(SdkInstallerFile)" />
 
@@ -127,13 +130,11 @@
 
       <!-- Clean up Packages -->
       <Exec Command="sudo dpkg -r $(SdkDebianPackageName)" />
-      <Exec Command="sudo dpkg -r $(AspNetCoreRuntimePackageName)" />
-      <Exec Command="sudo dpkg -r $(AspNetCoreRuntimePackageName203)" />
-      <Exec Command="sudo dpkg -r $(AspNetCoreRuntimePackageName200)" />
+      <Exec Command="sudo dpkg -r $(AspNetCoreSharedFxDebianPackageName)" />
       <Exec Command="sudo dpkg -r $(SharedFxDebianPackageName)" />
       <Exec Command="sudo dpkg -r $(HostFxrDebianPackageName)" />
-
       <Exec Command="sudo dpkg -r $(HostDebianPackageName)" />
+      <Exec Command="sudo dpkg -r $(RuntimeDepsPackageName)" />
   </Target>
 
   <Target Name="PrepareDotnetDebDirectories">
@@ -164,22 +165,12 @@
     <MakeDir Directories="$(DotNetDebToolOutputDirectory)" />
   </Target>
 
-  <Target Name="PrepareDotnetDebTool"
-          DependsOnTargets="WriteDotnetDebToolProject">
+  <Target Name="PrepareDotnetDebTool">
 
-    <DotNetRestore ToolPath="$(Stage0Directory)"
+    <DotNetRestore ToolPath="$(PreviousStageDirectory)"
                    WorkingDirectory="$(DotnetDebToolDir)" />
   </Target>
 
-  <Target Name="WriteDotnetDebToolProject"
-          Inputs="$(MSBuildThisFileDirectory)/$(DotnetDebToolConsumerProjectName)"
-          Outputs="$(DotnetDebToolDir)/$(DotnetDebToolConsumerProjectName)">
-
-    <Copy SourceFiles="$(MSBuildThisFileDirectory)/$(DotnetDebToolConsumerProjectName)"
-          DestinationFiles="$(DotnetDebToolDir)/$(DotnetDebToolConsumerProjectName)" />
-
-  </Target>
-
   <Target Name="TestDebuild">
       <Message Text="Don't remove this" />
 
diff --git a/build/package/Installer.DEB.targets b/build/package/Installer.DEB.targets
index 9224596be..a3800edce 100644
--- a/build/package/Installer.DEB.targets
+++ b/build/package/Installer.DEB.targets
@@ -8,8 +8,7 @@
 
     <!-- dotnet deb-tool -->
     <PropertyGroup>
-      <DotnetDebToolConsumerProjectName>dotnet-deb-tool-consumer.csproj</DotnetDebToolConsumerProjectName>
-      <DotnetDebToolDir>$(IntermediateDirectory)/$(DotnetDebToolConsumerProjectName)</DotnetDebToolDir>
+      <DotnetDebToolDir>$(MSBuildThisFileDirectory)/dotnet-deb-tool-consumer</DotnetDebToolDir>
       <PackageTool>$(NuGetPackagesDir)/dotnet-deb-tool/$(DotnetDebToolVersion)/lib/netcoreapp2.0/tool/package_tool</PackageTool>
     </PropertyGroup>
 
@@ -26,22 +25,19 @@
 
     <!-- Package Identities -->
     <PropertyGroup>
+      <RuntimeDepsPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeDepsPackageVersion>
+      <RuntimeDepsPackageName>dotnet-runtime-deps-$(RuntimeDepsPackageVersion)</RuntimeDepsPackageName>
       <SdkDebianPackageVersion>$(SdkVersion)</SdkDebianPackageVersion>
       <SdkDebianPackageName>dotnet-sdk-$(SdkDebianPackageVersion)</SdkDebianPackageName>
-      <SharedFxDebianPackageVersion>$(SharedFrameworkVersion)</SharedFxDebianPackageVersion>
+      <SharedFxDebianPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</SharedFxDebianPackageVersion>
       <SharedFxDebianPackageName>dotnet-runtime-$(SharedFxDebianPackageVersion)</SharedFxDebianPackageName>
       <SharedFxDebianPackageName>$(SharedFxDebianPackageName.ToLower())</SharedFxDebianPackageName>
       <HostFxrDebianPackageVersion>$(HostFxrVersion)</HostFxrDebianPackageVersion>
       <HostFxrDebianPackageName>dotnet-hostfxr-$(HostFxrDebianPackageVersion)</HostFxrDebianPackageName>
       <HostFxrDebianPackageName>$(HostFxrDebianPackageName.ToLower())</HostFxrDebianPackageName>
       <HostDebianPackageName>dotnet-host</HostDebianPackageName>
-      <AspNetCoreRuntimePackageName>$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersionAndRelease)-$(AspNetCoreRuntimePackageTimestamp)</AspNetCoreRuntimePackageName>
-      <AspNetCoreRuntimePackageName200>$(AspNetCoreRuntimePackageBrandName)-2.0.0</AspNetCoreRuntimePackageName200>
-      <AspNetCoreRuntimePackageName203>$(AspNetCoreRuntimePackageBrandName)-2.0.3</AspNetCoreRuntimePackageName203>
-      <AspNetCoreRuntimePackageName Condition=" '$(AspNetCoreRuntimePackageFlavor)' == 'notimestamp' ">$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersion)</AspNetCoreRuntimePackageName>
-      <HostRidInAspNetCoreRuntimeDebInstallerFileName>$(HostRid)</HostRidInAspNetCoreRuntimeDebInstallerFileName>
-      <AspNetCoreRuntimeDebInstallerFileName>$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersionAndRelease)-$(AspNetCoreRuntimePackageTimestamp)-$(HostRidInAspNetCoreRuntimeDebInstallerFileName).deb</AspNetCoreRuntimeDebInstallerFileName>
-      <AspNetCoreRuntimeDebInstallerFileName Condition=" '$(AspNetCoreRuntimePackageFlavor)' == 'notimestamp' ">$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersion)-$(HostRidInAspNetCoreRuntimeDebInstallerFileName).deb</AspNetCoreRuntimeDebInstallerFileName>
+      <AspNetCoreSharedFxDebianPackageName>aspnetcore-runtime-$(AspNetCoreVersion)</AspNetCoreSharedFxDebianPackageName>
+      <AspNetCoreSharedFxDebianPackageName>$(AspNetCoreSharedFxDebianPackageName.ToLower())</AspNetCoreSharedFxDebianPackageName>
     </PropertyGroup>
 
     <!-- Inputs -->
@@ -90,8 +86,8 @@
       <DebianConfigTokenValues Include="%SHARED_FRAMEWORK_DEBIAN_PACKAGE_NAME%">
         <ReplacementString>$(SharedFxDebianPackageName)</ReplacementString>
       </DebianConfigTokenValues>
-      <DebianConfigTokenValues Include="%ASPNETCOREPACKAGESTORE_DEBIAN_PACKAGE_NAME%">
-        <ReplacementString>$(AspNetCoreRuntimePackageName)</ReplacementString>
+      <DebianConfigTokenValues Include="%ASPNETCORE_SHAREDFX_DEBIAN_PACKAGE_NAME%">
+        <ReplacementString>$(AspNetCoreSharedFxDebianPackageName)</ReplacementString>
       </DebianConfigTokenValues>
       <DebianConfigTokenValues Include="%SHARED_FRAMEWORK_DEBIAN_PACKAGE_ADDITIONAL_DEPENDENCY%"
                                Condition="'$(IncludeAdditionalSharedFrameworks)' == 'true'">
@@ -116,29 +112,12 @@
 
     <ItemGroup>
       <TestSdkDebTaskEnvironmentVariables Include="PATH=$(DebianInstalledDirectory)$(PathListSeparator)$(PATH)" />
+      <TestSdkDebTaskEnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsDir)" />
+      <TestSdkDebTaskEnvironmentVariables Include="TEST_PACKAGES=$(TestPackagesDir)" />
+      <TestSdkDebTaskEnvironmentVariables Include="PreviousStageProps=$(NextStagePropsPath)" />
 
       <!-- Consumed By Publish -->
       <GeneratedInstallers Include="$(SdkInstallerFile)" />
     </ItemGroup>
   </Target>
-
-  <Target Name="DownloadAspNetCoreRuntimeDebInstaller"
-        DependsOnTargets="SetupDebProps">
-    <PropertyGroup>
-      <AspNetCoreRuntimeDebInstallerFileName200>$(AspNetCoreRuntimePackageBrandName)-2.0.0-$(HostRidInAspNetCoreRuntimeDebInstallerFileName).deb</AspNetCoreRuntimeDebInstallerFileName200>
-      <AspNetCoreRuntimeDebInstallerFileName203>$(AspNetCoreRuntimePackageBrandName)-2.0.3-$(HostRidInAspNetCoreRuntimeDebInstallerFileName).deb</AspNetCoreRuntimeDebInstallerFileName203>
-      <DownloadedSharedAspNetCoreRuntime200>$(PackagesDirectory)/$(AspNetCoreRuntimeDebInstallerFileName200)</DownloadedSharedAspNetCoreRuntime200>
-      <DownloadedSharedAspNetCoreRuntime203>$(PackagesDirectory)/$(AspNetCoreRuntimeDebInstallerFileName203)</DownloadedSharedAspNetCoreRuntime203>
-      <DownloadedSharedAspNetCoreRuntime>$(PackagesDirectory)/$(AspNetCoreRuntimeDebInstallerFileName)</DownloadedSharedAspNetCoreRuntime>
-    </PropertyGroup>
-    <DownloadFile
-               Uri="$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeDebInstallerFileName200)$(CoreSetupBlobAccessTokenParam)"
-               DestinationPath="$(DownloadedSharedAspNetCoreRuntime200)"/>
-    <DownloadFile
-               Uri="$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeDebInstallerFileName203)$(CoreSetupBlobAccessTokenParam)"
-               DestinationPath="$(DownloadedSharedAspNetCoreRuntime203)"/>
-    <DownloadFile
-               Uri="$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeDebInstallerFileName)$(CoreSetupBlobAccessTokenParam)"
-               DestinationPath="$(DownloadedSharedAspNetCoreRuntime)"/>
-  </Target>
 </Project>
diff --git a/build/package/Installer.MSI.targets b/build/package/Installer.MSI.targets
index e1baf462d..cd550e5a4 100644
--- a/build/package/Installer.MSI.targets
+++ b/build/package/Installer.MSI.targets
@@ -143,7 +143,7 @@
 
       <Exec Command="powershell -NoProfile -NoLogo $(SdkGenerateBundlePowershellScript)
                       '$(SdkInstallerFile)'
-                      '$(AspNetCoreRuntimeInstallerWixLibFile)'
+                      '$(DownloadedAspNetCoreSharedFxInstallerFile)'
                       '$(DownloadedSharedFrameworkInstallerFile)'
                       '$(DownloadedHostFxrInstallerFile)'
                       '$(DownloadedSharedHostInstallerFile)'
@@ -199,7 +199,8 @@
 
       <Exec Command ="powershell -NoProfile -NoLogo $(SdkTestMsiPowershellScript)
                       -InputMsi '$(SdkInstallerFile)'
-                      -DotnetDir '$(Stage0Directory)'" />
+                      -DotnetDir '$(PreviousStageDirectory)'
+                      -TestDir '$(TestOutputDir)'" />
 
       <WriteLinesToFile
           File="$(SdkMsiTestedSentinel)"
diff --git a/build/package/Installer.PKG.targets b/build/package/Installer.PKG.targets
index c2c3f8aec..8d713c49e 100644
--- a/build/package/Installer.PKG.targets
+++ b/build/package/Installer.PKG.targets
@@ -6,7 +6,7 @@
     <!-- Properties for pkg build -->
     <SharedHostComponentId>com.microsoft.dotnet.sharedhost.$(SharedHostVersion).component.osx.x64</SharedHostComponentId>
     <HostFxrComponentId>com.microsoft.dotnet.hostfxr.$(HostFxrVersion).component.osx.x64</HostFxrComponentId>
-    <SharedFrameworkComponentId>com.microsoft.dotnet.sharedframework.$(SharedFrameworkNugetName).$(SharedFrameworkVersion).component.osx.x64</SharedFrameworkComponentId>
+    <SharedFrameworkComponentId>com.microsoft.dotnet.sharedframework.$(SharedFrameworkNugetName).$(MicrosoftNETCoreAppPackageVersion).component.osx.x64</SharedFrameworkComponentId>
     <SdkComponentId>com.microsoft.dotnet.dev.$(SdkVersion).component.osx.x64</SdkComponentId>
     <SdkProductArchiveId>com.microsoft.dotnet.dev.$(SdkVersion).osx.x64</SdkProductArchiveId>
 
diff --git a/build/package/Installer.RPM.targets b/build/package/Installer.RPM.targets
index e987eb530..a3a9c7992 100644
--- a/build/package/Installer.RPM.targets
+++ b/build/package/Installer.RPM.targets
@@ -18,54 +18,8 @@
           DependsOnTargets="GenerateSdkRpm"
           Condition=" '$(BuildRpmPackage)' == 'True' and '$(FPMPresent)' == 'True' "/>
 
-  <Target Name="GenerateSdkRpm">
-    <PropertyGroup>
-      <RpmPackageVersion>$(SdkVersion)</RpmPackageVersion>
-      <InputRoot>$(OutputDirectory)/sdk</InputRoot>
-      <SdkInstallerFile>$(InstallerOutputDirectory)/$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk)$(InstallerExtension)</SdkInstallerFile>
-      <RpmFile>$(SdkInstallerFile)</RpmFile>
-      <ManPagesDir>$(RepoRoot)/Documentation/manpages</ManPagesDir>
-      <ConfigJsonFile>$(RepoRoot)/packaging/rpm/dotnet-config.json</ConfigJsonFile>
-      <RpmIntermediatesDir>$(IntermediateDirectory)/$(RpmPackageName)/$(RpmPackageVersion)</RpmIntermediatesDir>
-      <RpmTestResultsXmlFile>$(RpmIntermediatesDir)/debian-testResults.xml</RpmTestResultsXmlFile>
-      <RpmInstalledDirectory>/usr/share/dotnet</RpmInstalledDirectory>
-    </PropertyGroup>
-
-    <PropertyGroup>
-      <RpmLayoutDirectory>$(RpmIntermediatesDir)/RpmLayoutDirectory/</RpmLayoutDirectory>
-      <RpmLayoutPackageRoot>$(RpmLayoutDirectory)package_root</RpmLayoutPackageRoot>
-      <RpmLayoutSDK>$(RpmLayoutPackageRoot)/sdk</RpmLayoutSDK>
-      <RpmLayoutDocs>$(RpmLayoutDirectory)docs</RpmLayoutDocs>                <!-- Man Pages -->
-      <RpmLayoutTemplates>$(RpmLayoutDirectory)templates</RpmLayoutTemplates> <!-- Copyright, Changelog -->
-      <RpmLayoutScripts>$(RpmLayoutDirectory)scripts</RpmLayoutScripts>
-    </PropertyGroup>
-
-    <PropertyGroup>
-      <SdkRpmPackageVersion>$(SdkVersion)</SdkRpmPackageVersion>
-      <SdkRpmPackageName>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(SdkRpmPackageVersion)</SdkRpmPackageName>
-      <SharedFxRpmPackageVersion>$(SharedFrameworkVersion)</SharedFxRpmPackageVersion>
-      <SharedFxRpmPackageName>dotnet-runtime-$(SharedFxRpmPackageVersion)</SharedFxRpmPackageName>
-      <SharedFxRpmPackageName>$(SharedFxRpmPackageName.ToLower())</SharedFxRpmPackageName>
-      <HostFxrRpmPackageVersion>$(HostFxrVersion)</HostFxrRpmPackageVersion>
-      <HostFxrRpmPackageName>dotnet-hostfxr-$(HostFxrRpmPackageVersion)</HostFxrRpmPackageName>
-      <HostFxrRpmPackageName>$(HostFxrRpmPackageName.ToLower())</HostFxrRpmPackageName>
-      <HostRpmPackageName>dotnet-host</HostRpmPackageName>
-      <HostRidInAspNetCoreRuntimeRpmInstallerFileName>$(HostRid)</HostRidInAspNetCoreRuntimeRpmInstallerFileName>
-      <AspNetCoreRuntimePackageName>$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersionAndRelease)-$(AspNetCoreRuntimePackageTimestamp)</AspNetCoreRuntimePackageName>
-      <AspNetCoreRuntimePackageName Condition="'$(AspNetCoreRuntimePackageFlavor)' == 'notimestamp'">$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersion)</AspNetCoreRuntimePackageName>
-      <AspNetCoreRuntimePackageName200>$(AspNetCoreRuntimePackageBrandName)-2.0.0</AspNetCoreRuntimePackageName200>
-      <AspNetCoreRuntimePackageName203>$(AspNetCoreRuntimePackageBrandName)-2.0.3</AspNetCoreRuntimePackageName203>
-      <AspNetCoreRuntimePackageVersion>$(AspNetCoreVersion)-$(AspNetCoreRelease)-$(AspNetCoreRuntimePackageTimestamp)</AspNetCoreRuntimePackageVersion>
-      <AspNetCoreRuntimePackageVersion Condition="'$(AspNetCoreRuntimePackageFlavor)' == 'notimestamp'">$(AspNetCoreVersion)</AspNetCoreRuntimePackageVersion>
-      <AspNetCoreRuntimeRpmInstallerFileName>$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersionAndRelease)-$(AspNetCoreRuntimePackageTimestamp)-$(HostRidInAspNetCoreRuntimeRpmInstallerFileName).rpm</AspNetCoreRuntimeRpmInstallerFileName>
-      <AspNetCoreRuntimeRpmInstallerFileName Condition="'$(AspNetCoreRuntimePackageFlavor)' == 'notimestamp'">$(AspNetCoreRuntimePackageBrandName)-$(AspNetCoreVersion)-$(HostRidInAspNetCoreRuntimeRpmInstallerFileName).rpm</AspNetCoreRuntimeRpmInstallerFileName>
-      <AfterInstallHostScriptTemplateFile>$(ScriptsDir)/$(AfterInstallHostScriptName)</AfterInstallHostScriptTemplateFile>
-      <AfterInstallHostScriptDestinationFile>$(RpmLayoutScripts)/$(AfterInstallHostScriptName)</AfterInstallHostScriptDestinationFile>
-    </PropertyGroup>
-
-    <PropertyGroup>
-      <EndToEndTestProject>$(RepoRoot)/test/EndToEnd/EndToEnd.csproj</EndToEndTestProject>
-    </PropertyGroup>
+  <Target Name="GenerateSdkRpm"
+          DependsOnTargets="SetupRpmProps">
 
     <RemoveDir Condition="Exists('$(RpmIntermediatesDir)')" Directories="$(RpmIntermediatesDir)"/>
     <MakeDir Directories="$(RpmIntermediatesDir)"/>
@@ -114,13 +68,13 @@
     <!-- Replace config json variables -->
     <ItemGroup>
       <SDKTokenValue Include="%SHARED_HOST_RPM_VERSION%">
-        <ReplacementString>$(SharedFrameworkVersion)</ReplacementString>
+        <ReplacementString>$(MicrosoftNETCoreAppPackageVersion)</ReplacementString>
       </SDKTokenValue>
-      <SDKTokenValue Include="%ASPNETCOREPACKAGESTORE_RPM_PACKAGE_NAME%">
-        <ReplacementString>$(AspNetCoreRuntimePackageName)</ReplacementString>
+      <SDKTokenValue Include="%ASPNETCORE_SHAREDFX_RPM_PACKAGE_NAME%">
+        <ReplacementString>$(AspNetCoreSharedFxRpmPackageName)</ReplacementString>
       </SDKTokenValue>
-      <SDKTokenValue Include="%ASPNETCOREPACKAGESTORE_RPM_PACKAGE_VERSION%">
-        <ReplacementString>$(AspNetCoreRuntimePackageVersion)</ReplacementString>
+      <SDKTokenValue Include="%ASPNETCORE_SHAREDFX_RPM_PACKAGE_VERSION%">
+        <ReplacementString>$(AspNetCoreVersion)</ReplacementString>
       </SDKTokenValue>
       <SDKTokenValue Include="%SHARED_HOST_RPM_NAME%">
         <ReplacementString>$(SharedFxRpmPackageName)</ReplacementString>
@@ -142,6 +96,11 @@
 
     <ItemGroup>
       <TestSdkRpmTaskEnvironmentVariables Include="PATH=$(RpmInstalledDirectory)$(PathListSeparator)$(PATH)" />
+      <TestSdkRpmTaskEnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsDir)" />
+      <TestSdkRpmTaskEnvironmentVariables Include="TEST_PACKAGES=$(TestPackagesDir)" />
+      <TestSdkRpmTaskEnvironmentVariables Include="PreviousStageProps=$(NextStagePropsPath)" />
+
+      <!-- Consumed By Publish -->
       <GeneratedInstallers Include="$(SdkInstallerFile)" />
     </ItemGroup>
 
@@ -184,24 +143,47 @@
 
   </Target>
 
-  <Target Name="DownloadAspNetCoreRuntimeRpmInstaller"
-        DependsOnTargets="SetupDebProps">
+  <Target Name="SetupRpmProps">
     <PropertyGroup>
-      <AspNetCoreRuntimeRpmInstallerFileName200>$(AspNetCoreRuntimePackageBrandName)-2.0.0-$(HostRidInAspNetCoreRuntimeRpmInstallerFileName).rpm</AspNetCoreRuntimeRpmInstallerFileName200>
-      <AspNetCoreRuntimeRpmInstallerFileName203>$(AspNetCoreRuntimePackageBrandName)-2.0.3-$(HostRidInAspNetCoreRuntimeRpmInstallerFileName).rpm</AspNetCoreRuntimeRpmInstallerFileName203>
-      <DownloadedSharedAspNetCoreRuntime200>$(PackagesDirectory)/$(AspNetCoreRuntimeRpmInstallerFileName200)</DownloadedSharedAspNetCoreRuntime200>
-      <DownloadedSharedAspNetCoreRuntime203>$(PackagesDirectory)/$(AspNetCoreRuntimeRpmInstallerFileName203)</DownloadedSharedAspNetCoreRuntime203>
-      <DownloadedSharedAspNetCoreRuntime>$(PackagesDirectory)/$(AspNetCoreRuntimeRpmInstallerFileName)</DownloadedSharedAspNetCoreRuntime>
+      <RpmPackageVersion>$(SdkVersion)</RpmPackageVersion>
+      <InputRoot>$(OutputDirectory)/sdk</InputRoot>
+      <SdkInstallerFile>$(InstallerOutputDirectory)/$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk)$(InstallerExtension)</SdkInstallerFile>
+      <RpmFile>$(SdkInstallerFile)</RpmFile>
+      <ManPagesDir>$(RepoRoot)/Documentation/manpages</ManPagesDir>
+      <ConfigJsonFile>$(RepoRoot)/packaging/rpm/dotnet-config.json</ConfigJsonFile>
+      <RpmIntermediatesDir>$(IntermediateDirectory)/$(RpmPackageName)/$(RpmPackageVersion)</RpmIntermediatesDir>
+      <RpmTestResultsXmlFile>$(RpmIntermediatesDir)/debian-testResults.xml</RpmTestResultsXmlFile>
+      <RpmInstalledDirectory>/usr/share/dotnet</RpmInstalledDirectory>
+    </PropertyGroup>
+
+    <PropertyGroup>
+      <RpmLayoutDirectory>$(RpmIntermediatesDir)/RpmLayoutDirectory/</RpmLayoutDirectory>
+      <RpmLayoutPackageRoot>$(RpmLayoutDirectory)package_root</RpmLayoutPackageRoot>
+      <RpmLayoutSDK>$(RpmLayoutPackageRoot)/sdk</RpmLayoutSDK>
+      <RpmLayoutDocs>$(RpmLayoutDirectory)docs</RpmLayoutDocs>                <!-- Man Pages -->
+      <RpmLayoutTemplates>$(RpmLayoutDirectory)templates</RpmLayoutTemplates> <!-- Copyright, Changelog -->
+      <RpmLayoutScripts>$(RpmLayoutDirectory)scripts</RpmLayoutScripts>
+    </PropertyGroup>
+
+    <PropertyGroup>
+      <SdkRpmPackageVersion>$(SdkVersion)</SdkRpmPackageVersion>
+      <SdkRpmPackageName>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(SdkRpmPackageVersion)</SdkRpmPackageName>
+      <SharedFxRpmPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</SharedFxRpmPackageVersion>
+      <SharedFxRpmPackageName>dotnet-runtime-$(SharedFxRpmPackageVersion)</SharedFxRpmPackageName>
+      <SharedFxRpmPackageName>$(SharedFxRpmPackageName.ToLower())</SharedFxRpmPackageName>
+      <HostFxrRpmPackageVersion>$(HostFxrVersion)</HostFxrRpmPackageVersion>
+      <HostFxrRpmPackageName>dotnet-hostfxr-$(HostFxrRpmPackageVersion)</HostFxrRpmPackageName>
+      <HostFxrRpmPackageName>$(HostFxrRpmPackageName.ToLower())</HostFxrRpmPackageName>
+      <HostRpmPackageName>dotnet-host</HostRpmPackageName>
+      <AspNetCoreSharedFxRpmPackageName>aspnetcore-runtime-$(AspNetCoreVersion)</AspNetCoreSharedFxRpmPackageName>
+      <AspNetCoreSharedFxRpmPackageName>$(AspNetCoreSharedFxRpmPackageName.ToLower())</AspNetCoreSharedFxRpmPackageName>
+      <AfterInstallHostScriptTemplateFile>$(ScriptsDir)/$(AfterInstallHostScriptName)</AfterInstallHostScriptTemplateFile>
+      <AfterInstallHostScriptDestinationFile>$(RpmLayoutScripts)/$(AfterInstallHostScriptName)</AfterInstallHostScriptDestinationFile>
+    </PropertyGroup>
+
+    <PropertyGroup>
+      <EndToEndTestProject>$(RepoRoot)/test/EndToEnd/EndToEnd.csproj</EndToEndTestProject>
     </PropertyGroup>
-    <DownloadFile
-               Uri="$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeRpmInstallerFileName200)$(CoreSetupBlobAccessTokenParam)"
-               DestinationPath="$(DownloadedSharedAspNetCoreRuntime200)"/>
-    <DownloadFile
-               Uri="$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeRpmInstallerFileName203)$(CoreSetupBlobAccessTokenParam)"
-               DestinationPath="$(DownloadedSharedAspNetCoreRuntime203)"/>
-    <DownloadFile
-               Uri="$(AspNetCoreRuntimeInstallerBlobRootUrl)/$(AspNetCoreRuntimeRpmInstallerFileName)$(CoreSetupBlobAccessTokenParam)"
-               DestinationPath="$(DownloadedSharedAspNetCoreRuntime)"/>
   </Target>
 
   <Target Name="TestFPMTool">
@@ -224,12 +206,12 @@
   </Target>
 
   <Target Name="TestSdkRpm"
-          DependsOnTargets="RestoreTests;DownloadAspNetCoreRuntimeRpmInstaller"
-          Condition=" '$(IsRPMBasedDistro)' == 'True' and '$(FPMPresent)' == 'True' and '$(IsSharedFrameworkPreReleaseVersion)' != 'True' "
+          DependsOnTargets="RestoreTests"
+          Condition="  '$(CLIBUILD_SKIP_TESTS)' != 'true' and '$(IsRPMBasedDistro)' == 'True' and '$(FPMPresent)' == 'True' "
           Inputs="$(DownloadedSharedHostInstallerFile);
               $(DownloadedHostFxrInstallerFile);
               $(DownloadedSharedFrameworkInstallerFile);
-              $(DownloadedSharedAspNetCoreRuntime);
+              $(DownloadedAspNetCoreSharedFxInstallerFile);
               $(RpmTestResultsXmlFile);"
           Outputs="$(RpmTestResultsXmlFile)" >
 
@@ -237,9 +219,8 @@
     <Exec Command="sudo yum -y install $(DownloadedSharedHostInstallerFile)" />
     <Exec Command="sudo yum -y install $(DownloadedHostFxrInstallerFile)" />
     <Exec Command="sudo yum -y install $(DownloadedSharedFrameworkInstallerFile)" />
-    <Exec Command="sudo yum -y install $(DownloadedSharedAspNetCoreRuntime200)" />
-    <Exec Command="sudo yum -y install $(DownloadedSharedAspNetCoreRuntime203)" />
-    <Exec Command="sudo yum -y install $(DownloadedSharedAspNetCoreRuntime)" />
+    <!-- Ignore dependencies, which may have an incoherent dependency on dotnet-runtime -->
+    <Exec Command="sudo rpm --install --nodeps $(DownloadedAspNetCoreSharedFxInstallerFile)" />
 
     <Exec Command="sudo yum -y install $(SdkInstallerFile)" />
 
@@ -248,15 +229,13 @@
                    ToolPath="$(RpmInstalledDirectory)" />
 
     <DotNetTest ProjectPath="$(EndToEndTestProject)"
-                EnvironmentVariables="@(TestSdkDebTaskEnvironmentVariables)"
+                EnvironmentVariables="@(TestSdkRpmTaskEnvironmentVariables)"
                 ToolPath="$(RpmInstalledDirectory)" />
 
     <!-- Clean up Packages -->
     <Exec Command="sudo yum remove -y $(SdkRpmPackageName)" />
 
-    <Exec Command="sudo yum remove -y $(AspNetCoreRuntimePackageName)" />
-    <Exec Command="sudo yum remove -y $(AspNetCoreRuntimePackageName203)" />
-    <Exec Command="sudo yum remove -y $(AspNetCoreRuntimePackageName200)" />
+    <Exec Command="sudo yum remove -y $(AspNetCoreSharedFxRpmPackageName)" />
     <Exec Command="sudo yum remove -y $(SharedFxRpmPackageName)" />
     <Exec Command="sudo yum remove -y $(HostFxrRpmPackageName)" />
     <Exec Command="sudo yum remove -y $(HostRpmPackageName)" />
diff --git a/build/package/Layout.targets b/build/package/Layout.targets
index 4c14f6ee3..0ba2c3cfd 100644
--- a/build/package/Layout.targets
+++ b/build/package/Layout.targets
@@ -16,7 +16,7 @@
       <CombinedHostHostFxrFrameworkSdkInput Include="$(OutputDirectory)/**/*" />
       <SdkLanguagePackInput Include="$(OutputDirectory)/sdk/**/$(SatelliteAssemblies)" />
 
-      <AspNetRuntimeFilesInput Include="$(AspNetRuntimePackageStorePublishDirectory)/**/*" />
+      <AspNetRuntimeFilesInput Include="$(AspNetCoreSharedFxPublishDirectory)/**/*" />
 
       <MSBuildExtensionsInput Include="$(MSBuildExtensionsLayoutDirectory)/msbuildExtensions/**/*" />
       <MSBuildExtensionsVerInput Include="$(MSBuildExtensionsLayoutDirectory)/msbuildExtensions-ver/**/*" />
diff --git a/build/package/Nupkg.targets b/build/package/Nupkg.targets
index 9158c2143..d7287c8b7 100644
--- a/build/package/Nupkg.targets
+++ b/build/package/Nupkg.targets
@@ -24,7 +24,7 @@
     <DotNetPack NoBuild="True"
                 Output="$(PackagesDirectory)"
                 ProjectPath="%(ProjectsToPack.Identity)/%(ProjectsToPack.ProjectName).csproj"
-                ToolPath="$(Stage0Directory)"
+                ToolPath="$(PreviousStageDirectory)"
                 VersionSuffix="$(VersionSuffix)"
                 Configuration="$(Configuration)" />
   </Target>
@@ -34,7 +34,7 @@
 
     <MakeDir Directories="$(PackagingBuildBasePath)" />
 
-    <DotNetBuild ToolPath="$(Stage0Directory)"
+    <DotNetBuild ToolPath="$(PreviousStageDirectory)"
                  Configuration="$(Configuration)"
                  ProjectPath="%(ProjectsToPack.Identity)/%(ProjectsToPack.ProjectName).csproj" />
   </Target>
diff --git a/build/package/dotnet-deb-tool-consumer.csproj b/build/package/dotnet-deb-tool-consumer/dotnet-deb-tool-consumer.csproj
similarity index 74%
rename from build/package/dotnet-deb-tool-consumer.csproj
rename to build/package/dotnet-deb-tool-consumer/dotnet-deb-tool-consumer.csproj
index f36499527..6446ffad1 100644
--- a/build/package/dotnet-deb-tool-consumer.csproj
+++ b/build/package/dotnet-deb-tool-consumer/dotnet-deb-tool-consumer.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
diff --git a/build/prepare/CheckPrereqs.targets b/build/prepare/CheckPrereqs.targets
index 1e7454410..03d743c35 100644
--- a/build/prepare/CheckPrereqs.targets
+++ b/build/prepare/CheckPrereqs.targets
@@ -8,8 +8,8 @@
       DependsOnTargets="CheckUbuntuAptGetDependencies;
                         CheckCentOsYumDependencies;">
 
-    <Message Text="Using Stage0 version:" />
-    <Exec Command="$(DotnetStage0) --version" />
+    <Message Text="Using previous stage version:" />
+    <Exec Command="$(PreviousStageDotnet) --version" />
   </Target>
 
   <Target Name="CheckUbuntuAptGetDependencies"
diff --git a/build/publish/Badge.targets b/build/publish/Badge.targets
index d80313c19..1e110eb65 100644
--- a/build/publish/Badge.targets
+++ b/build/publish/Badge.targets
@@ -26,4 +26,17 @@
       ReplacementPatterns="ver_number"
       ReplacementStrings="$(SdkVersion)" />
   </Target>
-</Project>
\ No newline at end of file
+
+  <Target Name="SetBadgeProps">
+    <PropertyGroup>
+      <VersionBadgeMoniker>$(OSName)_$(Architecture)</VersionBadgeMoniker>
+      <VersionBadgeMoniker Condition=" '$(Rid)' == 'rhel.6-x64' ">rhel.6_x64</VersionBadgeMoniker>
+      <VersionBadgeMoniker Condition=" '$(Rid)' == 'alpine.3.6-x64' ">alpine.3.6_x64</VersionBadgeMoniker>
+      <VersionBadgeMoniker Condition=" '$(IslinuxPortable)' == 'true' ">linux_x64</VersionBadgeMoniker>
+      <VersionBadgeMoniker Condition=" '$(IsBuildingAndPublishingAllLinuxDistrosNativeInstallers)' == 'true' ">all_linux_distros_native_installer</VersionBadgeMoniker>
+
+      <VersionBadge>$(BaseOutputDirectory)/$(VersionBadgeMoniker)_$(Configuration)_version_badge.svg</VersionBadge>
+      <CoherentBadge>$(BaseOutputDirectory)/$(VersionBadgeMoniker)_$(Configuration)_coherent_badge.svg</CoherentBadge>
+    </PropertyGroup>
+  </Target>
+</Project>
diff --git a/build/publish/Checksum.targets b/build/publish/Checksum.targets
index 57e27b2a0..527edf31d 100644
--- a/build/publish/Checksum.targets
+++ b/build/publish/Checksum.targets
@@ -15,6 +15,7 @@
       <ArtifactsForGeneratingChecksums Include="@(ForPublishing)">
         <DestinationPath>%(ForPublishing.FullPath).sha</DestinationPath>
         <RelativeBlobPath>%(ForPublishing.RelativeBlobPath).sha</RelativeBlobPath>
+        <ManifestArtifactData>ShipInstaller=dotnetclichecksums</ManifestArtifactData>
       </ArtifactsForGeneratingChecksums>
     </ItemGroup>
   </Target>
diff --git a/build/publish/FinishBuild.targets b/build/publish/FinishBuild.targets
index dfb224431..c9a26e839 100644
--- a/build/publish/FinishBuild.targets
+++ b/build/publish/FinishBuild.targets
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Target Name="FinishBuild"
+          Condition="'$(IsNotOrchestratedPublish)' == 'true'"
           DependsOnTargets="CheckIfAllBuildsHavePublished;
                             FinalizeBuild" />
 
@@ -13,9 +14,8 @@
       <Output TaskParameter="HaveAllBuildsPublished" PropertyName="HaveAllBuildsPublished" />
     </CheckIfAllBuildsHavePublished>
   </Target>
-  
-  <Target Name="FinalizeBuild"
-          Condition=" '$(HaveAllBuildsPublished)' == 'True' ">
+
+  <Target Name="FinalizeBuild" Condition=" '$(HaveAllBuildsPublished)' == 'True' ">
     <CopyBlobsToLatest AccountName="$(ArtifactCloudDropAccountName)"
                        AccountKey="$(ArtifactCloudDropAccessToken)"
                        ContainerName="$(ArtifactContainerName)"
diff --git a/build/publish/PublishContent.targets b/build/publish/PublishContent.targets
index d186a9db4..41b7886a8 100644
--- a/build/publish/PublishContent.targets
+++ b/build/publish/PublishContent.targets
@@ -14,6 +14,7 @@
     <ItemGroup>
       <ForPublishing>
         <RelativeBlobPath>$([System.String]::Copy('%(RecursiveDir)%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+        <ManifestArtifactData>ShipInstaller=dotnetcli</ManifestArtifactData>
       </ForPublishing>
     </ItemGroup>
     <Error Condition="'@(ForPublishing)' == ''" Text="No items were found matching pattern '$(PublishPattern)'." />
@@ -21,40 +22,40 @@
 
   <!-- publishes artifacts to blob storage in Azure -->
   <Target Name="UploadArtifactsToAzure" DependsOnTargets="GatherItemsForPattern">
-    <Error Condition="'$(ArtifactContainerName)' == ''" Text="Missing property ArtifactContainerName." />
-    <Error Condition="'$(ArtifactCloudDropAccountName)' == ''" Text="Missing property ArtifactCloudDropAccountName." />
     <Error Condition="'$(ArtifactCloudDropAccessToken)' == ''" Text="Missing property ArtifactCloudDropAccessToken." />
-    <!-- create the container if it doesn't exist -->
-    <CreateAzureContainer
-      AccountKey="$(ArtifactCloudDropAccessToken)"
-      AccountName="$(ArtifactCloudDropAccountName)"
-      ContainerName="$(ArtifactContainerName)" />
-    <!-- now upload the items -->
-    <UploadToAzure
-      AccountKey="$(ArtifactCloudDropAccessToken)"
-      AccountName="$(ArtifactCloudDropAccountName)"
-      ContainerName="$(ArtifactContainerName)"
-      Items="@(ForPublishing)"
-      Overwrite="$(OverwriteOnPublish)" />
+    <Error Condition="'$(ArtifactCloudDropURL)' == ''" Text="Missing property ArtifactCloudDropURL." />
+                    
+    <Message Text="Publish assets to blob storage started: $(ArtifactCloudDropURL)" />
+    <PushToBlobFeed ExpectedFeedUrl="$(ArtifactCloudDropURL)"
+                    AccountKey="$(ArtifactCloudDropAccessToken)"
+                    ItemsToPush="@(ForPublishing)"
+                    ManifestBranch="$(BranchName)"
+                    ManifestBuildId="$(FullNugetVersion)"
+                    ManifestCommit="$(CommitHash)"
+                    ManifestName="$(BuildName)"
+                    ManifestBuildData="ProductVersion=$(FullNugetVersion)"
+                    Overwrite="$(OverwriteOnPublish)" 
+                    PublishFlatContainer="true" 
+                    SkipCreateManifest="$(IsNotOrchestratedPublish)" />
   </Target>
 
   <!-- publishes checksums for the artifacts to blob storage in Azure -->
   <Target Name="UploadChecksumsToAzure" DependsOnTargets="GenerateChecksums">
-    <Error Condition="'$(ChecksumContainerName)' == ''" Text="Missing property ChecksumContainerName." />
-    <Error Condition="'$(ChecksumCloudDropAccountName)' == ''" Text="Missing property ChecksumCloudDropAccountName." />
     <Error Condition="'$(ChecksumCloudDropAccessToken)' == ''" Text="Missing property ChecksumCloudDropAccessToken." />
-    <!-- create the container if it doesn't exist -->
-    <CreateAzureContainer
-      AccountKey="$(ChecksumCloudDropAccessToken)"
-      AccountName="$(ChecksumCloudDropAccountName)"
-      ContainerName="$(ChecksumContainerName)" />
-    <!-- now upload the items -->
-    <UploadToAzure
-      AccountKey="$(ChecksumCloudDropAccessToken)"
-      AccountName="$(ChecksumCloudDropAccountName)"
-      ContainerName="$(ChecksumContainerName)"
-      Items="@(ArtifactsForGeneratingChecksums->'%(DestinationPath)')"
-      Overwrite="$(OverwriteOnPublish)" />
+    <Error Condition="'$(ChecksumCloudDropURL)' == ''" Text="Missing property ChecksumCloudDropURL." />
+                    
+    <Message Text="Publish checksums to blob storage started: $(ChecksumCloudDropURL)" />
+    <PushToBlobFeed ExpectedFeedUrl="$(ChecksumCloudDropURL)"
+                    AccountKey="$(ChecksumCloudDropAccessToken)"
+                    ItemsToPush="@(ArtifactsForGeneratingChecksums->'%(DestinationPath)')"
+                    ManifestBranch="$(BranchName)"
+                    ManifestBuildId="$(FullNugetVersion)"
+                    ManifestCommit="$(CommitHash)"
+                    ManifestName="$(BuildName)"
+                    ManifestBuildData="ProductVersion=$(FullNugetVersion)"
+                    Overwrite="$(OverwriteOnPublish)" 
+                    PublishFlatContainer="true" 
+                    SkipCreateManifest="$(IsNotOrchestratedPublish)" />
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/build/publish/PublishDebian.targets b/build/publish/PublishDebian.targets
deleted file mode 100644
index 43ab5abda..000000000
--- a/build/publish/PublishDebian.targets
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <SdkDebianPackageName>dotnet-sdk-$(SdkVersion)</SdkDebianPackageName>
-  </PropertyGroup>
-
-  <PropertyGroup>
-    <SdkDebianUploadUrl>$(DotnetBlobRootUrl)/$(Product)/$(FullNugetVersion)/$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk)$(InstallerExtension)</SdkDebianUploadUrl>
-    <DebianUploadJsonFile>$(SdkDebianIntermediateDirectory)/package_upload.json</DebianUploadJsonFile>
-    <DebianRevisionNumber>1</DebianRevisionNumber>
-
-    <DebianUploadJsonContent>
-      {
-      "name":"$(SdkDebianPackageName)",
-      "version":"$(NugetVersion)-$(DebianRevisionNumber)",
-      "repositoryId":"$(REPO_ID)",
-      "sourceUrl": "$(SdkDebianUploadUrl)"
-      }
-    </DebianUploadJsonContent>
-  </PropertyGroup>
-
-  <Target Name="PublishDebFilesToDebianRepo" Condition=" '$(IsDebianBaseDistro)' == 'True' AND '$(SkipPublishToDebianRepo)' != 'true' AND '$(IslinuxPortable)' != 'true' ">
-    <Error Condition="'$(REPO_ID)' == ''" Text="REPO_ID must be set as an environment variable for debian publishing." />
-    <Error Condition="'$(REPO_USER)' == ''" Text="REPO_USER must be set as an environment variable for debian publishing." />
-    <Error Condition="'$(REPO_PASS)' == ''" Text="REPO_PASS must be set as an environment variable for debian publishing." />
-    <Error Condition="'$(REPO_SERVER)' == ''" Text="REPO_SERVER must be set as an environment variable for debian publishing." />
-
-    <Delete Files="$(DebianUploadJsonFile)" />
-    <WriteLinesToFile File="$(DebianUploadJsonFile)" Lines="$(DebianUploadJsonContent)" />
-
-    <Exec Command="$(RepoRoot)/scripts/publish/repoapi_client.sh -addpkg $(DebianUploadJsonFile)" />
-  </Target>
-</Project>
diff --git a/build/publish/PublishNupkgToBlobFeed.targets b/build/publish/PublishNupkgToBlobFeed.targets
index eb8ba821a..23fddc46d 100644
--- a/build/publish/PublishNupkgToBlobFeed.targets
+++ b/build/publish/PublishNupkgToBlobFeed.targets
@@ -1,20 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Condition="'$(GeneratePropsFile)' != 'true'"  Project="$(NuGetPackagesDir)/microsoft.dotnet.build.tasks.feed/$(BuildTasksFeedToolVersion)/build/Microsoft.DotNet.Build.Tasks.Feed.targets" />
-
   <ItemGroup>
     <NupkgsForPublishing Include="$(PackagesDirectory)/Microsoft.DotNet.Cli.Utils.*.nupkg" />
     <NupkgsForPublishing Include="$(PackagesDirectory)/Microsoft.DotNet.MSBuildSdkResolver.*.nupkg" />
   </ItemGroup>
 
-  <Target Name="PublishNupkgToBlobFeed" Condition=" '$(PUBLISH_NUPKG_TO_BLOB_FEED)' == 'true' AND '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' " >
+  <Target Name="PublishNupkgToBlobFeed" Condition=" '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' " >
     <Error Condition="'$(BlobFeedCloudDropAccessToken)' == ''" Text="Missing property BlobFeedCloudDropAccessToken." />
     <Error Condition="'$(BlobFeedExpectedURL)' == ''" Text="Missing property BlobFeedExpectedURL." />
     
-    <Message Text="Publish NuPkgs to Blob feed started" />
-    <PushToBlobFeed AccountKey="$(BlobFeedCloudDropAccessToken)"
-                ExpectedFeedUrl="$(BlobFeedExpectedURL)"
-                ItemsToPush="@(NupkgsForPublishing)"
-                Overwrite="false" />
+    <Message Text="Publish NuPkgs to Blob feed started: $(BlobFeedExpectedURL)" />
+    <PushToBlobFeed ExpectedFeedUrl="$(BlobFeedExpectedURL)"
+                    AccountKey="$(BlobFeedCloudDropAccessToken)"
+                    ItemsToPush="@(NupkgsForPublishing)"
+                    ManifestBranch="$(BranchName)"
+                    ManifestBuildId="$(FullNugetVersion)"
+                    ManifestCommit="$(CommitHash)"
+                    ManifestName="$(BuildName)"
+                    ManifestBuildData="ProductVersion=$(FullNugetVersion)"
+                    Overwrite="true"
+                    PublishFlatContainer="false"
+                    SkipCreateManifest="$(IsNotOrchestratedPublish)" />
   </Target>
 </Project>
diff --git a/build/publish/RuntimeCoherence.targets b/build/publish/RuntimeCoherence.targets
index 5da9ffd49..474c20656 100644
--- a/build/publish/RuntimeCoherence.targets
+++ b/build/publish/RuntimeCoherence.targets
@@ -7,19 +7,19 @@
   <Target Name="ReadAspNetCoreSharedRuntimeVersionFile"
         DependsOnTargets="DownloadHostAndSharedFxArtifacts">
     <ItemGroup>
-      <File Include="$(AspNetCoreSharedRuntimeVersionFile)" />
+      <File Include="$(AspNetCoreSharedFxBaseRuntimeVersionFile)" />
     </ItemGroup>
     <ReadLinesFromFile File="@(File)">
       <Output
           TaskParameter="Lines"
-          ItemName="AspNetCoreSharedRuntimeVersion"/>
+          PropertyName="AspNetCoreSharedFxBaseRuntimeVersion"/>
     </ReadLinesFromFile>
   </Target>
-  
+
   <Target Name="CompareRuntimeVersions">
     <PropertyGroup>
       <Coherent>false</Coherent>
-      <Coherent Condition=" '$(MicrosoftNETCoreAppPackageVersion)' == '@(AspNetCoreSharedRuntimeVersion)' ">true</Coherent>
+      <Coherent Condition=" '$(MicrosoftNETCoreAppPackageVersion)' == '$(AspNetCoreSharedFxBaseRuntimeVersion)' ">true</Coherent>
     </PropertyGroup>
   </Target>
 </Project>
diff --git a/build/sdks/sdks.csproj b/build/sdks/sdks.csproj
index b7c9941c0..496599e4f 100755
--- a/build/sdks/sdks.csproj
+++ b/build/sdks/sdks.csproj
@@ -9,6 +9,7 @@
 
   <ItemGroup>
     <PackageReference Include="$(DependencyPackageName)" Version="$(DependencyPackageVersion)" />
+    <PackageReference Condition="'$(DependencyPackageName)' == 'Microsoft.NET.Sdk.Web'" Include="Microsoft.NET.Sdk" Version="$(MicrosoftNETSdkPackageVersion)" />
   </ItemGroup>
 
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
diff --git a/build/test/RunTest.proj b/build/test/RunTest.proj
index 8b1ec899f..0454d8a6f 100644
--- a/build/test/RunTest.proj
+++ b/build/test/RunTest.proj
@@ -11,7 +11,13 @@
   <UsingTask TaskName="DotNetTest" AssemblyFile="$(CLIBuildDllPath)" /> 
   
   <Target Name="RunTest">
-    <DotNetTest EnvironmentVariables="$(EnvironmentVariables)"
+    <ItemGroup>
+      <EnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsDir)" />
+      <EnvironmentVariables Include="TEST_PACKAGES=$(TestPackagesDir)" />
+      <EnvironmentVariables Include="PreviousStageProps=$(PreviousStageProps)" />
+    </ItemGroup>
+
+    <DotNetTest EnvironmentVariables="@(EnvironmentVariables)"
                 ToolPath="$(ToolPath)"
                 Configuration="$(Configuration)"
                 NoBuild="True"
diff --git a/build/test/TestProjects.targets b/build/test/TestProjects.targets
index 20045c923..8a5d21a55 100644
--- a/build/test/TestProjects.targets
+++ b/build/test/TestProjects.targets
@@ -16,7 +16,8 @@
                              Include="test/ArgumentsReflector/ArgumentsReflector.csproj;
                                       test/Microsoft.DotNet.Tools.Tests.Utilities/Microsoft.DotNet.Tools.Tests.Utilities.csproj;
                                       test/Msbuild.Tests.Utilities/Msbuild.Tests.Utilities.csproj;
-                                      test/Performance/Performance.csproj" />
+                                      test/Performance/Performance.csproj;
+                                      test/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj" />
 
       <PreTestProjectsToExclude Condition=" 'Executed after primary test phase.' != ' Consider moving.' "
                              Include="test/Installer/Microsoft.DotNet.Cli.Msi.Tests/Microsoft.DotNet.Cli.Msi.Tests.csproj;" />
diff --git a/build_projects/Microsoft.DotNet.Cli.Build.Framework/Microsoft.DotNet.Cli.Build.Framework.csproj b/build_projects/Microsoft.DotNet.Cli.Build.Framework/Microsoft.DotNet.Cli.Build.Framework.csproj
index fcaae1196..9457ebacf 100644
--- a/build_projects/Microsoft.DotNet.Cli.Build.Framework/Microsoft.DotNet.Cli.Build.Framework.csproj
+++ b/build_projects/Microsoft.DotNet.Cli.Build.Framework/Microsoft.DotNet.Cli.Build.Framework.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>netstandard1.5</TargetFramework>
diff --git a/build_projects/dotnet-cli-build/CheckIfAllBuildsHavePublished.cs b/build_projects/dotnet-cli-build/CheckIfAllBuildsHavePublished.cs
index 1dfb0b3de..8b0df65ed 100644
--- a/build_projects/dotnet-cli-build/CheckIfAllBuildsHavePublished.cs
+++ b/build_projects/dotnet-cli-build/CheckIfAllBuildsHavePublished.cs
@@ -52,11 +52,10 @@ namespace Microsoft.DotNet.Cli.Build
                 { "win_x86", false },
                 { "win_x64", false },
                 { "osx_x64", false },
-                { "debian_8_x64", false },
-                { "rhel_7_x64", false },
-                { "ubuntu_14_04_x64", false },
-                { "ubuntu_16_04_x64", false },
-                { "linux_x64", false }
+                { "linux_x64", false },
+                { "rhel.6_x64", false },
+                { "alpine.3.6_x64", false },
+                { "all_linux_distros_native_installer", false}
             };
 
             if (!badges.ContainsKey(VersionBadgeMoniker))
diff --git a/build_projects/dotnet-cli-build/DotNetMSBuildTool.cs b/build_projects/dotnet-cli-build/DotNetMSBuildTool.cs
index 18cca3ab3..f0ab3f3a5 100644
--- a/build_projects/dotnet-cli-build/DotNetMSBuildTool.cs
+++ b/build_projects/dotnet-cli-build/DotNetMSBuildTool.cs
@@ -13,11 +13,13 @@ namespace Microsoft.DotNet.Cli.Build
 
         public string Verbosity { get; set; }
 
+        public string AdditionalParameters { get; set; }
+
         protected override string Args
         {
             get
             {
-                return $"{GetVerbosityArg()} {GetMaxCpuCountArg()}";
+                return $"{GetVerbosityArg()} {GetMaxCpuCountArg()} {GetAdditionalParameters()}";
             }
         }
 
@@ -40,5 +42,10 @@ namespace Microsoft.DotNet.Cli.Build
 
             return null;
         }
+
+        private string GetAdditionalParameters()
+        {
+            return AdditionalParameters;
+        }
     }
 }
diff --git a/build_projects/dotnet-cli-build/DotNetRestore.cs b/build_projects/dotnet-cli-build/DotNetRestore.cs
index 88bca5e22..d7d984be3 100644
--- a/build_projects/dotnet-cli-build/DotNetRestore.cs
+++ b/build_projects/dotnet-cli-build/DotNetRestore.cs
@@ -12,13 +12,11 @@ namespace Microsoft.DotNet.Cli.Build
 
         protected override string Args
         {
-            get { return $"{base.Args} {GetProjectPath()} {GetConfigFile()} {GetSource()} {GetPackages()} {GetSkipInvalidConfigurations()} {GetRuntime()} {GetAdditionalParameters()}"; }
+            get { return $"{base.Args} {GetProjectPath()} {GetConfigFile()} {GetSource()} {GetPackages()} {GetSkipInvalidConfigurations()} {GetRuntime()} {AdditionalParameters}"; }
         }
 
         public string ConfigFile { get; set; }
 
-        public string AdditionalParameters { get; set; }
-
         public string ProjectPath { get; set; }
 
         public string Source { get; set; }
@@ -88,10 +86,5 @@ namespace Microsoft.DotNet.Cli.Build
 
             return null;
         }
-
-        private string GetAdditionalParameters()
-        {
-            return AdditionalParameters;
-        }
     }
 }
diff --git a/build_projects/dotnet-cli-build/EnsureFileExistsOnAzureBlobStorage.cs b/build_projects/dotnet-cli-build/EnsureFileExistsOnAzureBlobStorage.cs
new file mode 100644
index 000000000..e795349ff
--- /dev/null
+++ b/build_projects/dotnet-cli-build/EnsureFileExistsOnAzureBlobStorage.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Build.Framework;
+using Microsoft.WindowsAzure.Storage.Blob;
+using System.Threading.Tasks;
+
+namespace Microsoft.DotNet.Build.CloudTestTasks
+{
+    public class EnsureFileExistsOnAzureBlobStorage : Microsoft.Build.Utilities.Task
+    {
+        [Required]
+        public string FileUrl{ get; set; }
+
+        public override bool Execute()
+        {
+            if (!ExecuteAsync().GetAwaiter().GetResult())
+            {
+                throw new FileDoesNotExistOnAzureBlobStorageException(FileUrl);
+
+            }
+            return true;
+        }
+
+        private Task<bool> ExecuteAsync()
+        {
+            var blobClient = new CloudBlockBlob(new Uri(FileUrl));
+            return blobClient.ExistsAsync();
+        }
+
+        public class FileDoesNotExistOnAzureBlobStorageException : Exception
+        {
+            public FileDoesNotExistOnAzureBlobStorageException(string message) : base(message + " cannot be found on Azure Blob Storage")
+            {
+            }
+        }
+    }
+}
diff --git a/build_projects/dotnet-cli-build/MakeRelative.cs b/build_projects/dotnet-cli-build/MakeRelative.cs
index e8f04b159..6361f341c 100644
--- a/build_projects/dotnet-cli-build/MakeRelative.cs
+++ b/build_projects/dotnet-cli-build/MakeRelative.cs
@@ -17,21 +17,12 @@ namespace Microsoft.DotNet.Cli.Build
         [Required]
         public string Path2 { get; set; }
 
-        public char SeparatorChar { get; set; }
-
         [Output]
         public ITaskItem RelativePath { get; set; }
 
         public override bool Execute()
         {
-            if (SeparatorChar == default(char))
-            {
-                SeparatorChar = Path.DirectorySeparatorChar;
-            }
-
-            var relativePath = GetRelativePath(Path1, Path2, SeparatorChar);
-
-            RelativePath = ToTaskItem(Path1, Path2, relativePath);
+            RelativePath = ToTaskItem(Path1, Path2, Path.GetRelativePath(Path1, Path2));
 
             return true;
         }
@@ -47,75 +38,5 @@ namespace Microsoft.DotNet.Cli.Build
 
             return framework;
         }
-
-        private static string GetRelativePath(string path1, string path2, char separator = default(char))
-        {
-
-            StringComparison compare;
-            if (CurrentPlatform.IsWindows)
-            {
-                compare = StringComparison.OrdinalIgnoreCase;
-                // check if paths are on the same volume
-                if (!string.Equals(Path.GetPathRoot(path1), Path.GetPathRoot(path2)))
-                {
-                    // on different volumes, "relative" path is just Path2
-                    return path2;
-                }
-            }
-            else
-            {
-                compare = StringComparison.Ordinal;
-            }
-
-            var index = 0;
-            var path1Segments = path1.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
-            var path2Segments = path2.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
-            // if path1 does not end with / it is assumed the end is not a directory
-            // we will assume that is isn't a directory by ignoring the last split
-            var len1 = path1Segments.Length - 1;
-            var len2 = path2Segments.Length;
-
-            // find largest common absolute path between both paths
-            var min = Math.Min(len1, len2);
-            while (min > index)
-            {
-                if (!string.Equals(path1Segments[index], path2Segments[index], compare))
-                {
-                    break;
-                }
-                // Handle scenarios where folder and file have same name (only if os supports same name for file and directory)
-                // e.g. /file/name /file/name/app
-                else if ((len1 == index && len2 > index + 1) || (len1 > index && len2 == index + 1))
-                {
-                    break;
-                }
-                ++index;
-            }
-
-            var path = "";
-
-            // check if path2 ends with a non-directory separator and if path1 has the same non-directory at the end
-            if (len1 + 1 == len2 && !string.IsNullOrEmpty(path1Segments[index]) &&
-                string.Equals(path1Segments[index], path2Segments[index], compare))
-            {
-                return path;
-            }
-
-            for (var i = index; len1 > i; ++i)
-            {
-                path += ".." + separator;
-            }
-            for (var i = index; len2 - 1 > i; ++i)
-            {
-                path += path2Segments[i] + separator;
-            }
-            // if path2 doesn't end with an empty string it means it ended with a non-directory name, so we add it back
-            if (!string.IsNullOrEmpty(path2Segments[len2 - 1]))
-            {
-                path += path2Segments[len2 - 1];
-            }
-
-            return path;
-        }
     }
 }
diff --git a/build_projects/dotnet-cli-build/dotnet-cli-build.csproj b/build_projects/dotnet-cli-build/dotnet-cli-build.csproj
index 30acb19fd..bd7badca8 100644
--- a/build_projects/dotnet-cli-build/dotnet-cli-build.csproj
+++ b/build_projects/dotnet-cli-build/dotnet-cli-build.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   <PropertyGroup>
     <Description>Build scripts for dotnet-cli</Description>
     <VersionPrefix>1.0.0</VersionPrefix>
@@ -15,18 +14,15 @@
   </ItemGroup>
 
   <ItemGroup>
+    <PackageReference Include="Microsoft.NETCore.App" Version="2.1.0-preview1-26116-04" />
     <PackageReference Include="Microsoft.Build" Version="15.4.8" />
+    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.4.8" />
     <PackageReference Include="Microsoft.CSharp" Version="4.0.1" />
     <PackageReference Include="System.Dynamic.Runtime" Version="4.0.11" />
     <PackageReference Include="System.Reflection.Metadata" Version="1.4.2" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.1.1" />
     <PackageReference Include="System.Xml.XmlSerializer" Version="4.0.11" />
     <PackageReference Include="WindowsAzure.Storage" Version="7.2.1" />
-    <PackageReference Include="NuGet.CommandLine.XPlat" Version="4.4.0" />
-    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.4.8" />
-    <!-- This dependency was added due to an issue in restore where a lower version of this package coming from nuget.commandline.xplat
-    led to an error. This is tracked as NuGet issue : https://github.com/NuGet/Home/issues/4213 -->
-    <PackageReference Include="Microsoft.Build.Framework" Version="15.4.8" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="2.0.0" />
 
     <PackageReference Include="Microsoft.DotNet.VersionTools" Version="$(VersionToolsVersion)" />
diff --git a/build_projects/shared-build-targets-utils/shared-build-targets-utils.csproj b/build_projects/shared-build-targets-utils/shared-build-targets-utils.csproj
index 34994fa7d..fb5f6f8dd 100644
--- a/build_projects/shared-build-targets-utils/shared-build-targets-utils.csproj
+++ b/build_projects/shared-build-targets-utils/shared-build-targets-utils.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <Description>Build scripts for dotnet-cli</Description>
diff --git a/build_projects/update-dependencies/Config.cs b/build_projects/update-dependencies/Config.cs
index 75c0d0c81..88c47ee94 100644
--- a/build_projects/update-dependencies/Config.cs
+++ b/build_projects/update-dependencies/Config.cs
@@ -20,7 +20,7 @@ namespace Microsoft.DotNet.Scripts
     ///
     /// The following Environment Variables can optionally be specified:
     ///
-    /// DOTNET_VERSION_URL - The Url to the root of the version information (this is combined with the fragments bellow) (ex. "https://raw.githubusercontent.com/dotnet/versions/master/build-info")
+    /// DOTNET_VERSION_URL - The Url to the root of the version information (this is combined with the fragments below) (ex. "https://raw.githubusercontent.com/dotnet/versions/master/build-info")
     /// ROSLYN_VERSION_FRAGMENT - The fragment to combine with DOTNET_VERSION_URL to get the current dotnet/roslyn package versions. (ex. "dotnet/roslyn/netcore1.0")
     /// CORESETUP_VERSION_FRAGMENT - The fragment to combine with DOTNET_VERSION_URL to get the current dotnet/core-setup package versions. (ex. "dotnet/core-setup/master")
     /// GITHUB_ORIGIN_OWNER - The owner of the GitHub fork to push the commit and create the PR from. (ex. "dotnet-bot")
diff --git a/build_projects/update-dependencies/Directory.Build.props b/build_projects/update-dependencies/Directory.Build.props
new file mode 100644
index 000000000..a8d332ca6
--- /dev/null
+++ b/build_projects/update-dependencies/Directory.Build.props
@@ -0,0 +1,8 @@
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+<!--
+  Empty Directory.Build.props so the repo's root Directory.Build.props isn't imported,
+  since it imports generated .props files that aren't necessary for update-dependencies.
+-->
+  
+</Project>
diff --git a/build_projects/update-dependencies/update-dependencies.csproj b/build_projects/update-dependencies/update-dependencies.csproj
index 2f82553fe..0ccc4f51f 100644
--- a/build_projects/update-dependencies/update-dependencies.csproj
+++ b/build_projects/update-dependencies/update-dependencies.csproj
@@ -4,7 +4,11 @@
   <PropertyGroup>
     <Description>Updates the repos dependencies</Description>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RestoreSources>
+      https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json;
+      https://api.nuget.org/v3/index.json;
+    </RestoreSources>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/build_projects/update-dependencies/update-dependencies.ps1 b/build_projects/update-dependencies/update-dependencies.ps1
index b76d10bc1..4f23db26b 100644
--- a/build_projects/update-dependencies/update-dependencies.ps1
+++ b/build_projects/update-dependencies/update-dependencies.ps1
@@ -34,6 +34,8 @@ if (!$env:DOTNET_INSTALL_DIR)
     $env:DOTNET_INSTALL_DIR="$RepoRoot\.dotnet_stage0\$Architecture"
 }
 
+$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+
 # Install a stage 0
 Write-Output "Installing .NET Core CLI Stage 0"
 & "$RepoRoot\scripts\obtain\dotnet-install.ps1" -Channel "master" -Architecture $Architecture
@@ -42,11 +44,6 @@ if($LASTEXITCODE -ne 0) { throw "Failed to install stage0" }
 # Put the stage0 on the path
 $env:PATH = "$env:DOTNET_INSTALL_DIR;$env:PATH"
 
-# Restore the app
-Write-Output "Restoring $ProjectPath..."
-dotnet restore "$ProjectPath"
-if($LASTEXITCODE -ne 0) { throw "Failed to restore" }
-
 # Run the app
 Write-Output "Invoking App $ProjectPath..."
 dotnet run -p "$ProjectPath" "$ProjectArgs"
diff --git a/build_projects/update-dependencies/update-dependencies.sh b/build_projects/update-dependencies/update-dependencies.sh
index 4781c8453..5e4872bf9 100755
--- a/build_projects/update-dependencies/update-dependencies.sh
+++ b/build_projects/update-dependencies/update-dependencies.sh
@@ -30,6 +30,8 @@ if [ -z "${DOTNET_INSTALL_DIR:-}" ]; then
    export DOTNET_INSTALL_DIR=$REPO_ROOT/.dotnet_stage0/x64
 fi
 
+export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+
 # Install a stage 0
 echo "Installing .NET Core CLI Stage 0"
 $REPO_ROOT/scripts/obtain/dotnet-install.sh -Channel master -Architecture x64
@@ -42,14 +44,6 @@ fi
 # Put the stage 0 on the path
 export PATH=$DOTNET_INSTALL_DIR:$PATH
 
-echo "Restoring $PROJECT_PATH..."
-dotnet restore "$PROJECT_PATH"
-
-if [ $? -ne 0 ]; then
-    echo "Failed to restore"
-    exit 1
-fi
-
 echo "Invoking App $PROJECT_PATH..."
 dotnet run -p "$PROJECT_PATH" $@
 
diff --git a/dir.props b/dir.props
index a59eba29e..875fe07ca 100644
--- a/dir.props
+++ b/dir.props
@@ -1,45 +1,4 @@
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
-  <PropertyGroup>
-    <RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
-
-    <NuGetPackagesDir>$(NUGET_PACKAGES)</NuGetPackagesDir>
-    <NuGetPackagesDir Condition=" '$(NuGetPackagesDir)' == '' ">$(RepoRoot)/.nuget/packages</NuGetPackagesDir>
-
-    <CLIBuildDll>$(RepoRoot)/build_projects/dotnet-cli-build/bin/dotnet-cli-build.dll</CLIBuildDll>
-
-    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
-    <DisableImplicitPackageTargetFallback>true</DisableImplicitPackageTargetFallback>
-
-    <CliTargetFramework>netcoreapp2.0</CliTargetFramework>
-  </PropertyGroup>
-
-  <Import Project="build/InitRepo.props" />
-  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(GitCommitInfoProps)" />
-  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(HostInfoProps)" />
-  <Import Condition=" '$(GeneratePropsFile)' != 'true' " Project="$(BuildInfoProps)" />
-
-  <Import Project="build/BranchInfo.props" />
-  <Import Project="build/AzureInfo.props" />
-  <Import Project="build/BundledTools.props" />
-  <Import Project="build/BundledSdks.props" />
-  <Import Project="build/BundledTemplates.props" />
-  <Import Project="build/DependencyVersions.props" />
-  <Import Project="build/Version.props" />
-  <Import Project="build/Branding.props" />
-
-  <Import Project="build/DerivedHostMachineInfo.props" />
-  <Import Project="build/FileExtensions.props" />
-  <Import Project="build/InputDirectories.props" />
-  <Import Project="build/MSBuildExtensions.props" />
-  <Import Project="build/OutputDirectories.props" />
-  <Import Project="build/BuildDefaults.props" />
-  <Import Project="build/Stage0.props" />
-  <Import Project="build/VersionBadge.props" />
-  <Import Project="build/BundledRuntimes.props" />
-  <Import Project="build/CrossGen.props" />
-  <Import Project="build/BackwardsCompatibilityRuntimes.props" />
-
-  <Import Project="build/InstallerInfo.props" />
-  <Import Project="build/GenerateResxSource.targets" />
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <!-- Projects which don't import the common targets can import this dir.props file in order to get the common repo build logic -->
+  <Import Project="Directory.Build.props" />
 </Project>
diff --git a/netci.groovy b/netci.groovy
index ca09235d7..d8cec3967 100644
--- a/netci.groovy
+++ b/netci.groovy
@@ -9,7 +9,7 @@ def project = GithubProject
 def branch = GithubBranchName
 def isPR = true
 
-def platformList = ['Linux:x64:Release', 'Debian8.2:x64:Debug', 'Ubuntu:x64:Release', 'Ubuntu16.04:x64:Debug', 'OSX10.12:x64:Release', 'Windows_NT:x64:Release', 'Windows_NT:x86:Debug', 'RHEL7.2:x64:Release', 'CentOS7.1:x64:Debug']
+def platformList = ['Linux:x64:Release', 'Debian8.2:x64:Debug', 'Ubuntu:x64:Release', 'Ubuntu16.04:x64:Debug', 'OSX10.12:x64:Release', 'Windows_NT:x64:Release', 'Windows_NT:x86:Debug', 'Windows_NT_ES:x64:Debug', 'RHEL7.2:x64:Release', 'CentOS7.1:x64:Debug', 'RHEL6:x64:Debug', 'Alpine3.6:x64:Debug']
 
 def static getBuildJobName(def configuration, def os, def architecture) {
     return configuration.toLowerCase() + '_' + os.toLowerCase() + '_' + architecture.toLowerCase()
@@ -32,6 +32,13 @@ platformList.each { platform ->
     else if (os == 'Windows_2016') {
         buildCommand = ".\\build.cmd -Configuration ${configuration} -Architecture ${architecture} -RunInstallerTestsInDocker -Targets Default"
     }
+    else if (os == 'Windows_NT_ES') {
+        osUsedForMachineAffinity = 'Windows_NT'
+        buildCommand = """
+set DOTNET_CLI_UI_LANGUAGE=es
+.\\build.cmd -Configuration ${configuration} -Architecture ${architecture} -Targets Default
+"""
+    }
     else if (os == 'Ubuntu') {
         buildCommand = "./build.sh --skip-prereqs --configuration ${configuration} --docker ubuntu.14.04 --targets Default"
     }
@@ -39,6 +46,14 @@ platformList.each { platform ->
         osUsedForMachineAffinity = 'Ubuntu16.04';
         buildCommand = "./build.sh --linux-portable --skip-prereqs --configuration ${configuration} --targets Default"
     }
+    else if (os == 'RHEL6') {
+        osUsedForMachineAffinity = 'Ubuntu16.04';
+        buildCommand = "./build.sh --skip-prereqs --configuration ${configuration} --runtime-id rhel.6-x64 --docker rhel.6 --targets Default"
+    }
+    else if (os == 'Alpine3.6') {
+        osUsedForMachineAffinity = 'Ubuntu16.04';
+        buildCommand = "./build.sh --skip-prereqs --configuration ${configuration} --runtime-id alpine.3.6-x64 --docker alpine.3.6 --targets Default"
+    }
     else {
         // Jenkins non-Ubuntu CI machines don't have docker
         buildCommand = "./build.sh --skip-prereqs --configuration ${configuration} --targets Default"
@@ -47,7 +62,7 @@ platformList.each { platform ->
     def newJob = job(Utilities.getFullJobName(project, jobName, isPR)) {
         // Set the label.
         steps {
-            if (os == 'Windows_NT' || os == 'Windows_2016') {
+            if (osUsedForMachineAffinity == 'Windows_NT' || osUsedForMachineAffinity == 'Windows_2016') {
                 // Batch
                 batchFile(buildCommand)
             }
diff --git a/packaging/deb/dotnet-debian_config.json b/packaging/deb/dotnet-debian_config.json
index 4d813f3fd..307c8b897 100644
--- a/packaging/deb/dotnet-debian_config.json
+++ b/packaging/deb/dotnet-debian_config.json
@@ -30,6 +30,6 @@
 
     "debian_dependencies":{
         "%SHARED_FRAMEWORK_DEBIAN_PACKAGE_NAME%" : {}%SHARED_FRAMEWORK_DEBIAN_PACKAGE_ADDITIONAL_DEPENDENCY%,
-        "%ASPNETCOREPACKAGESTORE_DEBIAN_PACKAGE_NAME%": {}
+        "%ASPNETCORE_SHAREDFX_DEBIAN_PACKAGE_NAME%": {}
     }
 }
diff --git a/packaging/deb/postinst b/packaging/deb/postinst
index 9eb33f532..4ac4d35e4 100755
--- a/packaging/deb/postinst
+++ b/packaging/deb/postinst
@@ -5,19 +5,18 @@ echo "Please visit http://aka.ms/dotnet-cli-eula for more information."
 # Run 'dotnet new' to trigger the first time experience to initialize the cache
 echo "Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
-.NET Core Tools Telemetry
+Telemetry
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
+
+Configuring...
 --------------
-The .NET Core Tools include a telemetry feature that collects usage information. It is important that the .NET Team understands how the tools are being used so that we can improve them.
-
-The data collected is anonymous and will be published in an aggregated form for use by both Microsoft and community engineers under the Creative Commons Attribution License.
-
-The .NET Core Tools telemetry feature is enabled by default. You can opt-out of the telemetry feature by setting an environment variable DOTNET_CLI_TELEMETRY_OPTOUT (for example, 'export' on macOS/Linux, 'set' on Windows) to true (for example, 'true', 1). You can read more about .NET Core tools telemetry at https://aka.ms/dotnet-cli-telemetry.
-
-Installation Note
---------------
-A command will be run during the install process that will improve project restore speed and enable offline access. It will take up to a minute to complete."
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once."
 
 first_run() {
     /usr/share/dotnet/dotnet exec /usr/share/dotnet/sdk/%SDK_VERSION%/dotnet.dll internal-reportinstallsuccess "debianpackage" > /dev/null 2>&1 || true
diff --git a/packaging/osx/clisdk/resources/cs.lproj/conclusion.html b/packaging/osx/clisdk/resources/cs.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/cs.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/cs.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/de.lproj/conclusion.html b/packaging/osx/clisdk/resources/de.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/de.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/de.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/en.lproj/conclusion.html b/packaging/osx/clisdk/resources/en.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/en.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/en.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/es.lproj/conclusion.html b/packaging/osx/clisdk/resources/es.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/es.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/es.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/fr.lproj/conclusion.html b/packaging/osx/clisdk/resources/fr.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/fr.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/fr.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/it.lproj/conclusion.html b/packaging/osx/clisdk/resources/it.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/it.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/it.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/ja.lproj/conclusion.html b/packaging/osx/clisdk/resources/ja.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/ja.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/ja.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/ko.lproj/conclusion.html b/packaging/osx/clisdk/resources/ko.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/ko.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/ko.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/pl.lproj/conclusion.html b/packaging/osx/clisdk/resources/pl.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/pl.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/pl.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/pt-br.lproj/conclusion.html b/packaging/osx/clisdk/resources/pt-br.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/pt-br.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/pt-br.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/ru.lproj/conclusion.html b/packaging/osx/clisdk/resources/ru.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/ru.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/ru.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/tr.lproj/conclusion.html b/packaging/osx/clisdk/resources/tr.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/tr.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/tr.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/zh-hans.lproj/conclusion.html b/packaging/osx/clisdk/resources/zh-hans.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/zh-hans.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/zh-hans.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/osx/clisdk/resources/zh-hant.lproj/conclusion.html b/packaging/osx/clisdk/resources/zh-hant.lproj/conclusion.html
index 30bd2b485..7d91816fd 100644
--- a/packaging/osx/clisdk/resources/zh-hant.lproj/conclusion.html
+++ b/packaging/osx/clisdk/resources/zh-hant.lproj/conclusion.html
@@ -7,9 +7,9 @@
         <div align="left" style="font-family: Helvetica;padding-left:10px">
             <p>The following was installed at /usr/local/share/dotnet</h2>
                 <ul>
-                    <li>.NET Core SDK 2.1.100</li>
-                    <li>.NET Core Runtime 2.0.5</li>
-                    <li>Runtime Package Store</li>
+                    <li>.NET Core SDK 2.1.300</li>
+                    <li>.NET Core Runtime 2.1.0</li>
+                    <li>ASP.NET Core Runtime 2.1.0</li>
                 </ul>
         </div>
         <br>
diff --git a/packaging/rpm/dotnet-config.json b/packaging/rpm/dotnet-config.json
index 38f533bcb..d4d7a48c0 100644
--- a/packaging/rpm/dotnet-config.json
+++ b/packaging/rpm/dotnet-config.json
@@ -27,8 +27,8 @@
             "package_version": "%SHARED_HOST_RPM_VERSION%"
         },
         {
-            "package_name": "%ASPNETCOREPACKAGESTORE_RPM_PACKAGE_NAME%",
-            "package_version": "%ASPNETCOREPACKAGESTORE_RPM_PACKAGE_VERSION%"
+            "package_name": "%ASPNETCORE_SHAREDFX_RPM_PACKAGE_NAME%",
+            "package_version": "%ASPNETCORE_SHAREDFX_RPM_PACKAGE_VERSION%"
         }
     ],
     "directories": [
diff --git a/packaging/rpm/scripts/after_install_host.sh b/packaging/rpm/scripts/after_install_host.sh
index 7bc9596c7..21999daaf 100644
--- a/packaging/rpm/scripts/after_install_host.sh
+++ b/packaging/rpm/scripts/after_install_host.sh
@@ -9,19 +9,18 @@ echo "Please visit http://aka.ms/dotnet-cli-eula for more information."
 # Run 'dotnet new' as the user to trigger the first time experience to initialize the cache
 echo "Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
-.NET Core Tools Telemetry
+Telemetry
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
+
+Configuring...
 --------------
-The .NET Core Tools include a telemetry feature that collects usage information. It is important that the .NET Team understands how the tools are being used so that we can improve them.
-
-The data collected is anonymous and will be published in an aggregated form for use by both Microsoft and community engineers under the Creative Commons Attribution License.
-
-The .NET Core Tools telemetry feature is enabled by default. You can opt-out of the telemetry feature by setting an environment variable DOTNET_CLI_TELEMETRY_OPTOUT (for example, 'export' on macOS/Linux, 'set' on Windows) to true (for example, 'true', 1). You can read more about .NET Core tools telemetry at https://aka.ms/dotnet-cli-telemetry.
-
-Installation Note
---------------
-A command will be run during the install process that will improve project restore speed and enable offline access. It will take up to a minute to complete."
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once."
 
 first_run() {
     /usr/share/dotnet/dotnet exec /usr/share/dotnet/sdk/%SDK_VERSION%/dotnet.dll internal-reportinstallsuccess "rpmpackage" > /dev/null 2>&1 || true
diff --git a/packaging/windows/clisdk/bundle.thm b/packaging/windows/clisdk/bundle.thm
index a9c3d64d3..797d2cab1 100644
--- a/packaging/windows/clisdk/bundle.thm
+++ b/packaging/windows/clisdk/bundle.thm
@@ -24,14 +24,15 @@
 
         <Text X="155" Y="80" Width="-11" Height="-70" TabStop="no" FontId="2" HexStyle="0x800000" DisablePrefix="yes" />
         <Text Name="WelcomeHeaderMessage" X="160" Y="81" Width="300" Height="30" TabStop="yes" FontId="2">#(loc.WelcomeHeaderMessage)</Text>
-        <Text Name="WelcomeDescription" X="160" Y="125" Width="460" Height="65" TabStop="yes" FontId="3">#(loc.WelcomeDescription)</Text>
-        <Text Name="LearnMoreTitle" X="160" Y="179" Width="460" Height="30" TabStop="yes" FontId="2">#(loc.LearnMoreTitle)</Text>
-        <Hypertext Name="CoreDocumentationLink" X="185" Y="223" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.CoreDocumentationLink)</Hypertext>
-        <Hypertext Name="SDKDocumentation" X="185" Y="243" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SDKDocumentation)</Hypertext>
-        <Hypertext Name="PrivacyStatementLink" X="185" Y="263" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.PrivacyStatementLink)</Hypertext>
-        <Hypertext Name="MITLicenseLink" X="185" Y="283" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.MITLicenseLink)</Hypertext>
-        <Text Name="InstallationNoteTitle" X="160" Y="308" Width="460" Height="30" TabStop="yes" FontId="2">#(loc.InstallationNoteTitle)</Text>
-        <Text Name="InstallationNote" X="160" Y="352" Width="460" Height="30" TabStop="yes" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.InstallationNote)</Text>
+        <Text Name="WelcomeDescription" X="160" Y="115" Width="460" Height="65" TabStop="yes" FontId="3">#(loc.WelcomeDescription)</Text>
+        <Text Name="LearnMoreTitle" X="160" Y="164" Width="460" Height="30" TabStop="yes" FontId="2">#(loc.LearnMoreTitle)</Text>
+        <Hypertext Name="CoreDocumentationLink" X="185" Y="198" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.CoreDocumentationLink)</Hypertext>
+        <Hypertext Name="SDKDocumentation" X="185" Y="218" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SDKDocumentation)</Hypertext>
+        <Hypertext Name="PrivacyStatementLink" X="185" Y="238" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.PrivacyStatementLink)</Hypertext>
+        <Hypertext Name="MITLicenseLink" X="185" Y="258" Width="400" Height="22" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.MITLicenseLink)</Hypertext>
+        <Text Name="InstallationNoteTitle" X="160" Y="278" Width="460" Height="30" TabStop="yes" FontId="2">#(loc.InstallationNoteTitle)</Text>
+        <Text Name="InstallationNote" X="160" Y="312" Width="460" Height="30" TabStop="yes" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.InstallationNote)</Text>
+        <Hypertext Name="VisualStudioWarning" X="160" Y="350" Width="460" Height="30" TabStop="yes" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.VisualStudioWarning)</Hypertext>
         <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
         <Button Name="WelcomeCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
     </Page>
diff --git a/packaging/windows/clisdk/bundle.wxl b/packaging/windows/clisdk/bundle.wxl
index 74f1df4d6..92deb5132 100644
--- a/packaging/windows/clisdk/bundle.wxl
+++ b/packaging/windows/clisdk/bundle.wxl
@@ -50,9 +50,9 @@
   <String Id="FirstTimeWelcomeMessage">The installation was successful
 
 The following were installed at [DOTNETHOME]
-    • .NET Core SDK 2.1.100
-    • .NET Core Runtime 2.0.5
-    • Runtime Package Store
+    • .NET Core SDK 2.1.300
+    • .NET Core Runtime 2.1.0
+    • ASP.NET Core Runtime 2.1.0
 
 This product collects usage data
     • More information and opt-out https://aka.ms/dotnet-cli-telemetry
@@ -74,4 +74,6 @@ Resources
   <String Id="InstallationNoteTitle">Installation note</String>
   <String Id="InstallationNote">A command will be run during the install process that will improve project restore speed and enable offline access. It will take up to a minute to complete.
   </String>
+  <String Id="VisualStudioWarning">If you plan to use .NET Core 2.1 with Visual Studio, Visual Studio 2017 15.7 or newer is recommended. &lt;A HREF=&quot;https://go.microsoft.com/fwlink/?linkid=866799&quot;&gt;Learn More&lt;/A&gt;.
+  </String>
 </WixLocalization>
diff --git a/packaging/windows/clisdk/bundle.wxs b/packaging/windows/clisdk/bundle.wxs
index 4f379ca3e..5e6936af7 100644
--- a/packaging/windows/clisdk/bundle.wxs
+++ b/packaging/windows/clisdk/bundle.wxs
@@ -40,9 +40,9 @@
         <MsiProperty Name="EXEFULLPATH" Value="[WixBundleOriginalSource]" />
       </MsiPackage>
       <?if $(var.Platform)=x86?>
-        <PackageGroupRef Id="PG_AspNetCorePackageStore_x86"/>
+        <PackageGroupRef Id="PG_AspNetCoreSharedFramework_x86"/>
       <?elseif $(var.Platform)=x64?>
-        <PackageGroupRef Id="PG_AspNetCorePackageStore_x64"/>
+        <PackageGroupRef Id="PG_AspNetCoreSharedFramework_x64"/>
       <?endif?>
     </Chain>
   </Bundle>
diff --git a/packaging/windows/eula.rtf b/packaging/windows/eula.rtf
new file mode 100644
index 000000000..7f40e11a8
--- /dev/null
+++ b/packaging/windows/eula.rtf
@@ -0,0 +1,97 @@
+{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\froman\fprq2\fcharset0 Times New Roman;}{\f3\fswiss\fprq2\fcharset0 Calibri;}}
+{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;}
+{\*\generator Riched20 10.0.10586}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 
+\pard\widctlpar\sb120\sa120\cf1\b\f0\fs24 MICROSOFT SOFTWARE LICENSE TERMS\fs28\par
+\fs24 MICROSOFT .NET LIBRARY\fs28\par
+\fs19 These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft\par
+
+\pard\widctlpar\fi-363\li720\sb120\sa120\b0\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 updates,\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 supplements,\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 Internet-based services, and\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 support services\par
+
+\pard\widctlpar\sb120\sa120\b for this software, unless other terms accompany those items. If so, those terms apply.\par
+BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.\par
+IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.\par
+
+\pard\widctlpar\fi-357\li357\sb120\sa120\kerning36\fs20 1.\b0\f2\fs14\~\~\~\~\b\f0\fs19 INSTALLATION AND USE RIGHTS.\par
+
+\pard\widctlpar\fi-363\li720\sb120\sa120\kerning0\fs20 a.\b0\f2\fs14\~\~\~\~\b\f0\fs19 Installation and Use.\b0\fs20\~You may install and use any number of copies of the software to design, develop and test your programs.\b\fs19\par
+\fs20 b.\b0\f2\fs14\~\~\~\~\b\f0\fs19 Third Party Programs.\b0\fs20\~The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only.\b\fs19\par
+
+\pard\widctlpar\fi-357\li357\sb120\sa120\kerning36\fs20 2.\b0\f2\fs14\~\~\~\~\b\f0\fs19 DATA.\~\kerning0\b0\fs20 The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to improve our products and services.\~You can learn more about data collection and use in the help documentation and the privacy statement at\~{\cf0\f3\fs24{\field{\*\fldinst{HYPERLINK "http://go.microsoft.com/fwlink/?LinkId=528096&clcid=0x409"}}{\fldrslt{\ul\cf2\cf2\ul\f0\fs20 http://go.microsoft.com/fwlink/?LinkId=528096}}}}\f0\fs20 . Your use of the software operates as your consent to these practices.\kerning36\b\fs19\par
+\fs20 3.\b0\f2\fs14\~\~\~\~\b\f0\fs20 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.\fs19\par
+
+\pard\widctlpar\fi-363\li720\sb120\sa120\kerning0\fs20 a.\b0\f2\fs14\~\~\~\~\b\f0\fs20 DISTRIBUTABLE CODE.\~\~\b0 The software is comprised of Distributable Code. \ldblquote Distributable Code\rdblquote  is code that you are permitted to distribute in programs you develop if you comply with the terms below.\b\fs19\par
+
+\pard\widctlpar\fi-357\li1077\sb120\sa120\fs20 i.\b0\f2\fs14\~\~\~\~\~\~\b\f0\fs20 Right to Use and Distribute.\b0\fs19\par
+
+\pard\widctlpar\fi-357\li1434\sb120\sa120\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 You may copy and distribute the object code form of the software.\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.\fs19\par
+
+\pard\widctlpar\fi-357\li1077\sb120\sa120\b\fs20 ii.\b0\f2\fs14\~\~\~\~\b\f0\fs20 Distribution Requirements.\b0\~\b For any Distributable Code you distribute, you must\b0\fs19\par
+
+\pard\widctlpar\fi-357\li1434\sb120\sa120\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 add significant primary functionality to it in your programs;\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 require distributors and external end users to agree to terms that protect it at least as much as this agreement;\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 display your valid copyright notice on your programs; and\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\rquote  fees, related to the distribution or use of your programs.\fs19\par
+
+\pard\widctlpar\fi-357\li1077\sb120\sa120\b\fs20 iii.\b0\f2\fs14\~\~\~\b\f0\fs20 Distribution Restrictions.\b0\~\b You may not\b0\fs19\par
+
+\pard\widctlpar\fi-357\li1434\sb120\sa120\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 alter any copyright, trademark or patent notice in the Distributable Code;\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 use Microsoft\rquote s trademarks in your programs\rquote  names or in a way that suggests your programs come from or are endorsed by Microsoft;\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 include Distributable Code in malicious, deceptive or unlawful programs; or\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that\fs19\par
+
+\pard\widctlpar\fi-358\li1792\sb120\sa120\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 the code be disclosed or distributed in source code form; or\fs19\par
+\f1\fs20\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs20 others have the right to modify it.\fs19\par
+
+\pard\widctlpar\fi-357\li357\sb120\sa120\kerning36\b\fs20 4.\b0\f2\fs14\~\~\~\~\b\f0\fs19 SCOPE OF LICENSE.\~\b0 The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not\b\par
+
+\pard\widctlpar\fi-363\li720\sb120\sa120\kerning0\b0\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 work around any technical limitations in the software;\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 publish the software for others to copy;\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 rent, lease or lend the software;\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 transfer the software or this agreement to any third party; or\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 use the software for commercial software hosting services.\par
+
+\pard\widctlpar\fi-357\li357\sb120\sa120\kerning36\b\fs20 5.\b0\f2\fs14\~\~\~\~\b\f0\fs19 BACKUP COPY.\~\b0 You may make one backup copy of the software. You may use it only to reinstall the software.\b\par
+\fs20 6.\b0\f2\fs14\~\~\~\~\b\f0\fs19 DOCUMENTATION.\~\b0 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.\b\par
+\fs20 7.\b0\f2\fs14\~\~\~\~\b\f0\fs19 EXPORT RESTRICTIONS.\~\b0 The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see\~{\cf0\fs20{\field{\*\fldinst{HYPERLINK www.microsoft.com/exporting }}{\fldrslt{www.microsoft.com/exporting\ul0\cf0}}}}\f0\fs19 .\b\par
+\fs20 8.\b0\f2\fs14\~\~\~\~\b\f0\fs19 SUPPORT SERVICES.\~\b0 Because this software is \ldblquote as is,\rdblquote  we may not provide support services for it.\b\par
+\fs20 9.\b0\f2\fs14\~\~\~\~\b\f0\fs19 ENTIRE AGREEMENT.\~\b0 This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.\b\par
+\fs20 10.\b0\f2\fs14\~\~\~\b\f0\fs19 APPLICABLE LAW.\par
+
+\pard\widctlpar\fi-363\li720\sb120\sa120\kerning0\fs20 a.\b0\f2\fs14\~\~\~\~\b\f0\fs19 United States.\~\b0 If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.\b\par
+\fs20 b.\b0\f2\fs14\~\~\~\~\b\f0\fs19 Outside the United States. If you acquired the software in any other country, the laws of that country apply.\par
+
+\pard\widctlpar\fi-357\li357\sb120\sa120\kerning36\fs20 11.\b0\f2\fs14\~\~\b\f0\fs19 LEGAL EFFECT.\~\b0 This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\b\par
+\fs20 12.\b0\f2\fs14\~\~\b\f0\fs19 DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \ldblquote AS-IS.\rdblquote  YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\par
+
+\pard\widctlpar\li357\sb120\sa120\kerning0 FOR AUSTRALIA \endash  YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.\b0\par
+
+\pard\widctlpar\fi-357\li357\sb120\sa120\kerning36\b\fs20 13.\b0\f2\fs14\~\~\b\f0\fs19 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.\par
+
+\pard\widctlpar\li357\sb120\sa120\kerning0\b0 This limitation applies to\par
+
+\pard\widctlpar\fi-363\li720\sb120\sa120\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and\par
+\f1\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.\par
+
+\pard\widctlpar\sb120\sa120 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.\par
+\lang9 Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French.\lang1033\par
+\lang9 Remarque : Ce logiciel \'e9tant distribu\'e9 au Qu\'e9bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7ais.\lang1033\par
+\kerning36\b EXON\'c9RATION DE GARANTIE.\~\b0 Le logiciel vis\'e9 par une licence est offert \'ab tel quel \'bb. Toute utilisation de ce logiciel est \'e0 votre seule risque et p\'e9ril. Microsoft n\rquote accorde aucune autre garantie expresse. Vous pouvez b\'e9n\'e9ficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9 marchande, d\rquote ad\'e9quation \'e0 un usage particulier et d\rquote absence de contrefa\'e7on sont exclues.\b\par
+LIMITATION DES DOMMAGES-INT\'c9R\'caTS ET EXCLUSION DE RESPONSABILIT\'c9 POUR LES DOMMAGES.\~\b0 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0 hauteur de 5,00 $ US. Vous ne pouvez pr\'e9tendre \'e0 aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9ciaux, indirects ou accessoires et pertes de b\'e9n\'e9fices.\b\par
+\kerning0\b0\lang9 Cette limitation concerne :\lang1033\par
+
+\pard\widctlpar\li720\sb120\f1\lang9\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 tout ce qui est reli\'e9 au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et\lang1033\par
+
+\pard\widctlpar\li720\sa120\f1\lang9\'b7\f2\fs14\~\~\~\~\~\~\~\~\~\f0\fs19 les r\'e9clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9 stricte, de n\'e9gligence ou d\rquote une autre faute dans la limite autoris\'e9e par la loi en vigueur.\lang1033\par
+
+\pard\widctlpar\sb120\sa120\lang9 Elle s\rquote applique \'e9galement, m\'eame si Microsoft connaissait ou devrait conna\'eetre l\rquote\'e9ventualit\'e9 d\rquote un tel dommage. Si votre pays n\rquote autorise pas l\rquote exclusion ou la limitation de responsabilit\'e9 pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\rquote exclusion ci-dessus ne s\rquote appliquera pas \'e0 votre \'e9gard.\lang1033\par
+\kerning36\b EFFET JURIDIQUE.\~\b0 Le pr\'e9sent contrat d\'e9crit certains droits juridiques. Vous pourriez avoir d\rquote autres droits pr\'e9vus par les lois de votre pays. Le pr\'e9sent contrat ne modifie pas les droits que vous conf\'e8rent les lois de votre pays si celles-ci ne le permettent pas.\b\par
+\kerning0\fs20\lang1036\~\fs19\lang1033\par
+
+\pard\widctlpar\cf0\b0\f3\fs24\par
+}
+�
\ No newline at end of file
diff --git a/run-build.ps1 b/run-build.ps1
index 366267f3e..c92b91b6d 100644
--- a/run-build.ps1
+++ b/run-build.ps1
@@ -16,7 +16,7 @@ param(
 
 if($Help)
 {
-    Write-Output "Usage: .\run-build.ps1 [-Configuration <CONFIGURATION>] [-Architecture <ARCHITECTURE>] [-NoPackage] [-Help]"
+    Write-Output "Usage: .\run-build.ps1 [-Configuration <CONFIGURATION>] [-Architecture <ARCHITECTURE>] [-NoPackage] [-NoBuild] [-Help]"
     Write-Output ""
     Write-Output "Options:"
     Write-Output "  -Configuration <CONFIGURATION>     Build the specified Configuration (Debug or Release, default: Debug)"
@@ -27,6 +27,20 @@ if($Help)
     exit 0
 }
 
+# The first 'pass' call to "dotnet msbuild build.proj" has a hard-coded "WriteDynamicPropsToStaticPropsFiles" target
+#    therefore, this call should not have other targets defined. Remove all targets passed in as 'extra parameters'.
+if ($ExtraParameters)
+{
+    $ExtraParametersNoTargets = $ExtraParameters.GetRange(0,$ExtraParameters.Count)
+    foreach ($param in $ExtraParameters)
+    {
+        if(($param.StartsWith("/t:", [StringComparison]::OrdinalIgnoreCase)) -or ($param.StartsWith("/target:", [StringComparison]::OrdinalIgnoreCase)))
+        {
+            $ExtraParametersNoTargets.Remove("$param") | Out-Null
+        }
+    }
+}
+
 $env:CONFIGURATION = $Configuration;
 $RepoRoot = "$PSScriptRoot"
 if(!$env:NUGET_PACKAGES){
@@ -53,18 +67,6 @@ if (!(Test-Path $env:DOTNET_INSTALL_DIR))
     mkdir $env:DOTNET_INSTALL_DIR | Out-Null
 }
 
-# We also need to pull down a project.json based CLI that is used by some tests
-# so create another directory for that.
-if (!$env:DOTNET_INSTALL_DIR_PJ)
-{
-    $env:DOTNET_INSTALL_DIR_PJ="$RepoRoot\.dotnet_stage0PJ\$Architecture"
-}
-
-if (!(Test-Path $env:DOTNET_INSTALL_DIR_PJ))
-{
-    mkdir $env:DOTNET_INSTALL_DIR_PJ | Out-Null
-}
-
 
 
 # Disable first run since we want to control all package sources
@@ -80,16 +82,8 @@ $env:VSTEST_TRACE_BUILD=1
 # install a stage0
 $dotnetInstallPath = Join-Path $RepoRoot "scripts\obtain\dotnet-install.ps1"
 
-Write-Output "$dotnetInstallPath -InstallDir $env:DOTNET_INSTALL_DIR -Architecture ""$Architecture"" -Channel ""release/2.0.0"""
-Invoke-Expression "$dotnetInstallPath -InstallDir $env:DOTNET_INSTALL_DIR -Architecture ""$Architecture"" -Channel ""release/2.0.0"""
-if ($LastExitCode -ne 0)
-{
-    Write-Output "The .NET CLI installation failed with exit code $LastExitCode"
-    exit $LastExitCode
-}
-
-Write-Output "$dotnetInstallPath -InstallDir $env:DOTNET_INSTALL_DIR_PJ -Architecture ""$Architecture"" -Version 1.0.0-preview2-1-003177"
-Invoke-Expression "$dotnetInstallPath -InstallDir $env:DOTNET_INSTALL_DIR_PJ -Architecture ""$Architecture"" -Version 1.0.0-preview2-1-003177"
+Write-Output "$dotnetInstallPath -version ""2.2.0-preview1-007799"" -InstallDir $env:DOTNET_INSTALL_DIR -Architecture ""$Architecture"""
+Invoke-Expression "$dotnetInstallPath -version ""2.2.0-preview1-007799"" -InstallDir $env:DOTNET_INSTALL_DIR -Architecture ""$Architecture"""
 if ($LastExitCode -ne 0)
 {
     Write-Output "The .NET CLI installation failed with exit code $LastExitCode"
@@ -106,7 +100,7 @@ if ($NoBuild)
 }
 else
 {
-    dotnet msbuild build.proj /p:Architecture=$Architecture /p:GeneratePropsFile=true /t:WriteDynamicPropsToStaticPropsFiles $ExtraParameters
+    dotnet msbuild build.proj /p:Architecture=$Architecture /p:GeneratePropsFile=true /t:WriteDynamicPropsToStaticPropsFiles $ExtraParametersNoTargets
     dotnet msbuild build.proj /m /v:normal /fl /flp:v=diag /p:Architecture=$Architecture $ExtraParameters
     if($LASTEXITCODE -ne 0) { throw "Failed to build" } 
 }
diff --git a/run-build.sh b/run-build.sh
index 597268b25..7d383f86f 100755
--- a/run-build.sh
+++ b/run-build.sh
@@ -51,6 +51,8 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 REPOROOT="$DIR"
 
 ARCHITECTURE="x64"
+STAGE0_SOURCE_DIR=
+
 source "$REPOROOT/scripts/common/_prettyprint.sh"
 
 BUILD=1
@@ -61,66 +63,61 @@ CUSTOM_BUILD_ARGS=
 # Set nuget package cache under the repo
 [ -z $NUGET_PACKAGES ] && export NUGET_PACKAGES="$REPOROOT/.nuget/packages"
 
-args=( "$@" )
+args=( )
 
 while [[ $# > 0 ]]; do
     lowerI="$(echo $1 | awk '{print tolower($0)}')"
     case $lowerI in
         -c|--configuration)
             export CONFIGURATION=$2
-            args=( "${args[@]/$1}" )
-            args=( "${args[@]/$2}" )
             shift
             ;;
         --nopackage)
             export DOTNET_BUILD_SKIP_PACKAGING=1
-            args=( "${args[@]/$1}" )
             ;;
         --skip-prereqs)
             # Allow CI to disable prereqs check since the CI has the pre-reqs but not ldconfig it seems
             export DOTNET_INSTALL_SKIP_PREREQS=1
-            args=( "${args[@]/$1}" )
             ;;
         --nobuild)
             BUILD=0
             ;;
-        --architecture)
+        -a|--architecture)
             ARCHITECTURE=$2
-            args=( "${args[@]/$1}" )
-            args=( "${args[@]/$2}" )
             shift
             ;;
         --runtime-id)
             CUSTOM_BUILD_ARGS="/p:Rid=\"$2\""
-            args=( "${args[@]/$1}" )
-            args=( "${args[@]/$2}" )
             shift
             ;;
         # This is here just to eat away this parameter because CI still passes this in.
         --targets)            
-            args=( "${args[@]/$1}" )
-            args=( "${args[@]/$2}" )
             shift
             ;;
         --linux-portable)
             LINUX_PORTABLE_INSTALL_ARGS="--runtime-id linux-x64"
             CUSTOM_BUILD_ARGS="/p:Rid=\"linux-x64\" /p:OSName=\"linux\" /p:IslinuxPortable=\"true\""
-            args=( "${args[@]/$1}" )
+            ;;
+        --stage0)
+            STAGE0_SOURCE_DIR=$2
+            shift
             ;;
         --help)
-            echo "Usage: $0 [--configuration <CONFIGURATION>] [--targets <TARGETS...>] [--skip-prereqs] [--nopackage] [--docker <IMAGENAME>] [--help]"
+            echo "Usage: $0 [--configuration <CONFIGURATION>] [--architecture <ARCHITECTURE>] [--skip-prereqs] [--nopackage] [--nobuild ] [--docker <IMAGENAME>] [--stage0 <DIRECTORY>] [--help]"
             echo ""
             echo "Options:"
             echo "  --configuration <CONFIGURATION>     Build the specified Configuration (Debug or Release, default: Debug)"
+            echo "  --architecture <ARCHITECTURE>       Build the specified architecture (x64 or x86 (supported only on Windows), default: x64)"
             echo "  --skip-prereqs                      Skip checks for pre-reqs in dotnet_install"
             echo "  --nopackage                         Skip packaging targets"
             echo "  --nobuild                           Skip building, showing the command that would be used to build"
             echo "  --docker <IMAGENAME>                Build in Docker using the Dockerfile located in scripts/docker/IMAGENAME"
-            echo "  --linux-portable                    Builds the Linux portable .NET Tools instead of a distro-specific version."
+            echo "  --stage0 <DIRECTORY>                Set the stage0 source directory. The default is to download it from Azure."
             echo "  --help                              Display this help message"
             exit 0
             ;;
         *)
+            args=$@
             break
             ;;
     esac
@@ -128,22 +125,21 @@ while [[ $# > 0 ]]; do
     shift
 done
 
-# $args array may have empty elements in it.
-# The easiest way to remove them is to cast to string and back to array.
-# This will actually break quoted arguments, arguments like
-# -test "hello world" will be broken into three arguments instead of two, as it should.
-temp="${args[@]}"
-args=($temp)
+# The first 'pass' call to "dotnet msbuild build.proj" has a hard-coded "WriteDynamicPropsToStaticPropsFiles" target
+#    therefore, this call should not have other targets defined. Remove all targets passed in as 'extra parameters'.
+argsnotargets=( )
+for arg in ${args[@]} 
+do  
+  arglower="$(echo $arg | awk '{print tolower($0)}')"
+  if [[ $arglower != '/t:'* ]] && [[ $arglower != '/target:'* ]]; then
+    argsnotargets+=($arg)
+  fi
+done
 
 # Create an install directory for the stage 0 CLI
 [ -z "$DOTNET_INSTALL_DIR" ] && export DOTNET_INSTALL_DIR=$REPOROOT/.dotnet_stage0/$ARCHITECTURE
 [ -d "$DOTNET_INSTALL_DIR" ] || mkdir -p $DOTNET_INSTALL_DIR
 
-# We also need to pull down a project.json based CLI that is used by some tests
-# so create another directory for that.
-[ -z "$DOTNET_INSTALL_DIR_PJ" ] && export DOTNET_INSTALL_DIR_PJ=$REPOROOT/.dotnet_stage0PJ/$ARCHITECTURE
-[ -d "$DOTNET_INSTALL_DIR_PJ" ] || mkdir -p $DOTNET_INSTALL_DIR_PJ
-
 export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
 
 # Enable verbose VS Test Console logging
@@ -155,7 +151,12 @@ export VSTEST_TRACE_BUILD=1
 export DOTNET_MULTILEVEL_LOOKUP=0
 
 # Install a stage 0
-(set -x ; "$REPOROOT/scripts/obtain/dotnet-install.sh" --channel "release/2.0.0" --install-dir "$DOTNET_INSTALL_DIR" --architecture "$ARCHITECTURE" $LINUX_PORTABLE_INSTALL_ARGS)
+if [ "$STAGE0_SOURCE_DIR" == "" ]; then
+    (set -x ; "$REPOROOT/scripts/obtain/dotnet-install.sh" --version "2.2.0-preview1-007799" --install-dir "$DOTNET_INSTALL_DIR" --architecture "$ARCHITECTURE" $LINUX_PORTABLE_INSTALL_ARGS)
+else
+    echo "Copying bootstrap cli from $STAGE0_SOURCE_DIR"
+    cp -r $STAGE0_SOURCE_DIR/* "$DOTNET_INSTALL_DIR"
+fi
 
 EXIT_CODE=$?
 if [ $EXIT_CODE != 0 ]; then
@@ -163,14 +164,6 @@ if [ $EXIT_CODE != 0 ]; then
     exit $EXIT_CODE
 fi
 
-# Install a project.json based CLI for use by tests
-(set -x ; "$REPOROOT/scripts/obtain/dotnet-install.sh" --channel "master" --install-dir "$DOTNET_INSTALL_DIR_PJ" --architecture "$ARCHITECTURE" --version "1.0.0-preview2-1-003177")
-EXIT_CODE=$?
-if [ $EXIT_CODE != 0 ]; then
-    echo "run-build: Error: installing project-json based cli failed with exit code $EXIT_CODE." >&2
-    exit $EXIT_CODE
-fi
-
 # Put stage 0 on the PATH (for this shell only)
 PATH="$DOTNET_INSTALL_DIR:$PATH"
 
@@ -185,12 +178,10 @@ fi
 # Disable first run since we want to control all package sources
 export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
 
-echo "${args[@]}"
-
 if [ $BUILD -eq 1 ]; then
-    dotnet msbuild build.proj /p:Architecture=$ARCHITECTURE $CUSTOM_BUILD_ARGS /p:GeneratePropsFile=true /t:WriteDynamicPropsToStaticPropsFiles "${args[@]}"
-    dotnet msbuild build.proj /m /v:normal /fl /flp:v=diag /p:Architecture=$ARCHITECTURE $CUSTOM_BUILD_ARGS "${args[@]}"
+    dotnet msbuild build.proj /p:Architecture=$ARCHITECTURE $CUSTOM_BUILD_ARGS /p:GeneratePropsFile=true /t:WriteDynamicPropsToStaticPropsFiles $argsnotargets
+    dotnet msbuild build.proj /m /v:normal /fl /flp:v=diag /p:Architecture=$ARCHITECTURE $CUSTOM_BUILD_ARGS $args
 else
     echo "Not building due to --nobuild"
-    echo "Command that would be run is: 'dotnet msbuild build.proj /m /p:Architecture=$ARCHITECTURE $CUSTOM_BUILD_ARGS ${args[@]}'"
+    echo "Command that would be run is: 'dotnet msbuild build.proj /m /p:Architecture=$ARCHITECTURE $CUSTOM_BUILD_ARGS $args'"
 fi
diff --git a/scripts/cli-build-env.bat b/scripts/cli-build-env.bat
new file mode 100644
index 000000000..03b6ded6f
--- /dev/null
+++ b/scripts/cli-build-env.bat
@@ -0,0 +1,17 @@
+@echo off
+REM Copyright (c) .NET Foundation and contributors. All rights reserved.
+REM Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+REM Get normalized version of parent path
+for %%i in (%~dp0..\) DO (
+    SET CLI_REPO_ROOT=%%~dpi
+)
+
+title CLI Build (%CLI_REPO_ROOT%)
+
+REM Add Stage 0 CLI to path
+set PATH=%CLI_REPO_ROOT%.dotnet_stage0\x64;%PATH%
+
+set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+set DOTNET_MULTILEVEL_LOOKUP=0
+set NUGET_PACKAGES=%CLI_REPO_ROOT%.nuget\packages
\ No newline at end of file
diff --git a/scripts/dev-dotnet.sh b/scripts/cli-build-env.sh
old mode 100755
new mode 100644
similarity index 68%
rename from scripts/dev-dotnet.sh
rename to scripts/cli-build-env.sh
index e7d8e6eac..1534aeb66
--- a/scripts/dev-dotnet.sh
+++ b/scripts/cli-build-env.sh
@@ -4,22 +4,20 @@
 # Licensed under the MIT license. See LICENSE file in the project root for full license information.
 #
 
-set -e
-
 SOURCE="${BASH_SOURCE[0]}"
 while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
   DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
   SOURCE="$(readlink "$SOURCE")"
   [[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
 done
-DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
-source "$DIR/common/_common.sh"
+REPO_ROOT="$( cd -P "$( dirname "$SOURCE" )/../" && pwd )"
 
-if [ -d "$STAGE2_DIR" ]; then
-    PATH=$STAGE2_DIR/bin:$PATH
-    dotnet "$@"
-else
-    echo "You don't have a dev build!" 1>&2
-    exit 1
-fi
+STAGE0_DIR=$REPO_ROOT/.dotnet_stage0/x64
+export PATH=$STAGE0_DIR:$PATH
+
+
+export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+export DOTNET_MULTILEVEL_LOOKUP=0
+
+export NUGET_PACKAGES=$REPO_ROOT/.nuget/packages
diff --git a/scripts/cli-test-env.bat b/scripts/cli-test-env.bat
new file mode 100644
index 000000000..91a31c078
--- /dev/null
+++ b/scripts/cli-test-env.bat
@@ -0,0 +1,20 @@
+@echo off
+REM Copyright (c) .NET Foundation and contributors. All rights reserved.
+REM Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+REM Get normalized version of parent path
+for %%i in (%~dp0..\) DO (
+    SET CLI_REPO_ROOT=%%~dpi
+)
+
+title CLI Test (%CLI_REPO_ROOT%)
+
+REM Add Stage 2 CLI to path
+set PATH=%CLI_REPO_ROOT%bin\2\win10-x64\dotnet;%PATH%
+
+set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+set DOTNET_MULTILEVEL_LOOKUP=0
+set NUGET_PACKAGES=%CLI_REPO_ROOT%.nuget\packages
+set TEST_PACKAGES=%CLI_REPO_ROOT%bin\2\win10-x64\test\packages
+set TEST_ARTIFACTS=%CLI_REPO_ROOT%bin\2\win10-x64\test\artifacts
+set PreviousStageProps=%CLI_REPO_ROOT%bin\2\win10-x64\PreviousStage.props
diff --git a/scripts/cli-test-env.sh b/scripts/cli-test-env.sh
new file mode 100755
index 000000000..888200d32
--- /dev/null
+++ b/scripts/cli-test-env.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) .NET Foundation and contributors. All rights reserved.
+# Licensed under the MIT license. See LICENSE file in the project root for full license information.
+#
+
+SOURCE="${BASH_SOURCE[0]}"
+while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
+  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+  SOURCE="$(readlink "$SOURCE")"
+  [[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
+done
+
+REPO_ROOT="$( cd -P "$( dirname "$SOURCE" )/../" && pwd )"
+
+uname=$(uname)
+if [ "$(uname)" = "Darwin" ]
+then
+  RID=osx.10.13-x64
+else
+  RID=linux-x64
+fi
+
+STAGE2_DIR=$REPO_ROOT/bin/2/$RID/dotnet
+export PATH=$STAGE2_DIR:$PATH
+
+
+export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+export DOTNET_MULTILEVEL_LOOKUP=0
+
+export NUGET_PACKAGES=$REPO_ROOT/.nuget/packages
+export TEST_PACKAGES=$REPO_ROOT/bin/2/$RID/test/packages
+export TEST_ARTIFACTS=$REPO_ROOT/bin/2/$RID/test/artifacts
+export PreviousStageProps=$REPO_ROOT/bin/2/$RID/PreviousStage.props
diff --git a/scripts/dev-dotnet.ps1 b/scripts/dev-dotnet.ps1
deleted file mode 100644
index afcfe46d5..000000000
--- a/scripts/dev-dotnet.ps1
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Copyright (c) .NET Foundation and contributors. All rights reserved.
-# Licensed under the MIT license. See LICENSE file in the project root for full license information.
-#
-
-$oldPath = $env:PATH
-try {
-    # Put the stage2 output on the front of the path
-    if(!(Get-Command dotnet -ErrorAction SilentlyContinue)) {
-        throw "You need to have a version of 'dotnet' on your path so we can determine the RID"
-    }
-
-    $rid = dotnet --version | where { $_ -match "^ Runtime Id:\s*(.*)$" } | foreach { $matches[1] } 
-    $stage2 = "$PSScriptRoot\..\artifacts\$rid\stage2\bin"
-    if (Test-Path $stage2) {
-        $env:PATH="$stage2;$env:PATH"
-    } else {
-        Write-Output "You don't have a dev build in the 'artifacts\$rid\stage2' folder!"
-    }
-
-    dotnet @args
-} finally {
-    $env:PATH = $oldPath
-}
diff --git a/scripts/docker/alpine.3.6/Dockerfile b/scripts/docker/alpine.3.6/Dockerfile
new file mode 100644
index 000000000..746f1bd4b
--- /dev/null
+++ b/scripts/docker/alpine.3.6/Dockerfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) .NET Foundation and contributors. All rights reserved.
+# Licensed under the MIT license. See LICENSE file in the project root for full license information.
+#
+
+# Dockerfile that creates a container suitable to build dotnet-cli
+FROM microsoft/dotnet-buildtools-prereqs:alpine-3.6-3148f11-20171119021156
+
+# This Dockerfile doesn't use the USER_ID, but the parameter needs to be declared to prevent docker
+# from issuing a warning
+ARG USER_ID=0
+
+# Set working directory
+WORKDIR /opt/code
+
diff --git a/scripts/docker/rhel.6/Dockerfile b/scripts/docker/rhel.6/Dockerfile
new file mode 100644
index 000000000..1275f3293
--- /dev/null
+++ b/scripts/docker/rhel.6/Dockerfile
@@ -0,0 +1,31 @@
+#
+# Copyright (c) .NET Foundation and contributors. All rights reserved.
+# Licensed under the MIT license. See LICENSE file in the project root for full license information.
+#
+
+# Dockerfile that creates a container suitable to build dotnet-cli
+FROM microsoft/dotnet-buildtools-prereqs:centos-6-376e1a3-20174311014331
+
+# yum doesn't work with the special curl version we have in the base docker image,
+# so we remove /usr/local/lib from the library path for this command
+RUN yum -q -y install sudo
+
+# Setup User to match Host User, and give superuser permissions
+ARG USER_ID=0
+RUN useradd -m code_executor -u ${USER_ID} -g root
+RUN echo 'code_executor ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
+
+# With the User Change, we need to change permssions on these directories
+RUN chmod -R a+rwx /usr/local
+RUN chmod -R a+rwx /home
+RUN chmod -R 755 /usr/bin/sudo
+
+# Set user to the one we just created
+USER ${USER_ID}
+
+# Set library path to make CURL and ICU libraries that are in /usr/local/lib visible
+ENV LD_LIBRARY_PATH /usr/local/lib
+
+# Set working directory
+WORKDIR /opt/code
+
diff --git a/scripts/docker/rhel/Dockerfile b/scripts/docker/rhel/Dockerfile
index 17ad16cf5..ec809ea73 100644
--- a/scripts/docker/rhel/Dockerfile
+++ b/scripts/docker/rhel/Dockerfile
@@ -4,11 +4,7 @@
 #
 
 # Dockerfile that creates a container suitable to build dotnet-cli
-FROM microsoft/dotnet-buildtools-prereqs:rhel-7-rpmpkg-c982313-20174116044113
-
-# Install from sudo main package TODO This package needs to be mirrored
-RUN yum install -y https://www.sudo.ws/sudo/dist/packages/RHEL/7/sudo-1.8.20-3.el7.x86_64.rpm \
-    && yum clean all
+FROM microsoft/dotnet-buildtools-prereqs:rhel-7-rpmpkg-e1b4a89-20175311035359
 
 # Setup User to match Host User, and give superuser permissions
 ARG USER_ID=0
diff --git a/scripts/dockerrun.sh b/scripts/dockerrun.sh
index abdaec636..1b96a5021 100755
--- a/scripts/dockerrun.sh
+++ b/scripts/dockerrun.sh
@@ -115,24 +115,17 @@ echo "Running command: $BUILD_COMMAND"
 echo "Using code from: $DOCKER_HOST_SHARE_DIR"
 [ -z "$INTERACTIVE" ] || echo "Running Interactive"
 
+# Note: passwords/keys should not be passed in the environment
 docker run $INTERACTIVE -t --rm --sig-proxy=true \
     --name $DOTNET_BUILD_CONTAINER_NAME \
     -v $DOCKER_HOST_SHARE_DIR:/opt/code \
     -e CHANNEL \
-    -e CONNECTION_STRING \
-    -e REPO_ID \
-    -e REPO_USER \
-    -e REPO_PASS \
-    -e REPO_SERVER \
     -e DOTNET_BUILD_SKIP_CROSSGEN \
     -e PUBLISH_TO_AZURE_BLOB \
     -e NUGET_FEED_URL \
     -e NUGET_API_KEY \
-    -e GITHUB_PASSWORD \
-    -e ARTIFACT_STORAGE_KEY \
     -e ARTIFACT_STORAGE_ACCOUNT \
     -e ARTIFACT_STORAGE_CONTAINER \
-    -e CHECKSUM_STORAGE_KEY \
     -e CHECKSUM_STORAGE_ACCOUNT \
     -e CHECKSUM_STORAGE_CONTAINER \
     -e CLIBUILD_SKIP_TESTS \
@@ -141,10 +134,11 @@ docker run $INTERACTIVE -t --rm --sig-proxy=true \
     -e RELEASESUFFIX \
     -e COREFXAZURECONTAINER \
     -e AZUREACCOUNTNAME \
-    -e AZUREACCESSTOKEN \
-    -e VSOPASSWORD \
     -e RELEASETOOLSGITURL \
     -e CORESETUPBLOBROOTURL \
-    -e CORESETUPBLOBACCESSTOKEN \
+    -e PB_ASSETROOTURL \
+    -e PB_PACKAGEVERSIONPROPSURL \
+    -e PB_PUBLISHBLOBFEEDURL \
+    -e EXTERNALRESTORESOURCES \
     $DOTNET_BUILD_CONTAINER_TAG \
     $BUILD_COMMAND "$@"
diff --git a/scripts/obtain/dotnet-install.ps1 b/scripts/obtain/dotnet-install.ps1
index 1b92f0c20..1a35ec4fb 100644
--- a/scripts/obtain/dotnet-install.ps1
+++ b/scripts/obtain/dotnet-install.ps1
@@ -34,8 +34,17 @@
     Architecture of dotnet binaries to be installed.
     Possible values are: <auto>, x64 and x86
 .PARAMETER SharedRuntime
+    This parameter is obsolete and may be removed in a future version of this script.
+    The recommended alternative is '-Runtime dotnet'.
+
     Default: false
-    Installs just the shared runtime bits, not the entire SDK
+    Installs just the shared runtime bits, not the entire SDK.
+    This is equivalent to specifying `-Runtime dotnet`.
+.PARAMETER Runtime
+    Installs just a shared runtime, not the entire SDK.
+    Possible values:
+        - dotnet     - the Microsoft.NETCore.App shared runtime
+        - aspnetcore - the Microsoft.AspNetCore.App shared runtime
 .PARAMETER DryRun
     If set it will not perform installation but instead display what command line to use to consistently install
     currently requested version of dotnet cli. In example if you specify version 'latest' it will display a link
@@ -71,6 +80,9 @@ param(
    [string]$Version="Latest",
    [string]$InstallDir="<auto>",
    [string]$Architecture="<auto>",
+   [ValidateSet("dotnet", "aspnetcore", IgnoreCase = $false)]
+   [string]$Runtime,
+   [Obsolete("This parameter may be removed in a future version of this script. The recommended alternative is '-Runtime dotnet'.")]
    [switch]$SharedRuntime,
    [switch]$DryRun,
    [switch]$NoPath,
@@ -88,6 +100,10 @@ $ProgressPreference="SilentlyContinue"
 
 $BinFolderRelativePath=""
 
+if ($SharedRuntime -and (-not $Runtime)) {
+    $Runtime = "dotnet"
+}
+
 # example path with regex: shared/1.0.0-beta-12345/somepath
 $VersionRegEx="/\d+\.\d+[^/]+/"
 $OverrideNonVersionedFiles = !$SkipNonVersionedFiles
@@ -198,6 +214,7 @@ function GetHTTPResponse([Uri] $Uri)
                 $HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
             }
             else {
+
                 $HttpClient = New-Object System.Net.Http.HttpClient
             }
             # Default timeout for HttpClient is 100s.  For a 50 MB download this assumes 500 KB/s average, any less will time out
@@ -229,10 +246,13 @@ function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel, [bool]$Co
     Say-Invocation $MyInvocation
 
     $VersionFileUrl = $null
-    if ($SharedRuntime) {
+    if ($Runtime -eq "dotnet") {
         $VersionFileUrl = "$UncachedFeed/Runtime/$Channel/latest.version"
     }
-    else {
+    elseif ($Runtime -eq "aspnetcore") {
+        $VersionFileUrl = "$UncachedFeed/aspnetcore/Runtime/$Channel/latest.version"
+    }
+    elseif (-not $Runtime) {
         if ($Coherent) {
             $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.coherent.version"
         }
@@ -240,6 +260,9 @@ function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel, [bool]$Co
             $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.version"
         }
     }
+    else {
+        throw "Invalid value for `$Runtime"
+    }
 
     $Response = GetHTTPResponse -Uri $VersionFileUrl
     $StringContent = $Response.Content.ReadAsStringAsync().Result
@@ -276,12 +299,18 @@ function Get-Specific-Version-From-Version([string]$AzureFeed, [string]$Channel,
 function Get-Download-Link([string]$AzureFeed, [string]$SpecificVersion, [string]$CLIArchitecture) {
     Say-Invocation $MyInvocation
 
-    if ($SharedRuntime) {
+    if ($Runtime -eq "dotnet") {
         $PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/dotnet-runtime-$SpecificVersion-win-$CLIArchitecture.zip"
     }
-    else {
+    elseif ($Runtime -eq "aspnetcore") {
+        $PayloadURL = "$AzureFeed/aspnetcore/Runtime/$SpecificVersion/aspnetcore-runtime-$SpecificVersion-win-$CLIArchitecture.zip"
+    }
+    elseif (-not $Runtime) {
         $PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-sdk-$SpecificVersion-win-$CLIArchitecture.zip"
     }
+    else {
+        throw "Invalid value for `$Runtime"
+    }
 
     Say-Verbose "Constructed primary payload URL: $PayloadURL"
 
@@ -291,11 +320,14 @@ function Get-Download-Link([string]$AzureFeed, [string]$SpecificVersion, [string
 function Get-LegacyDownload-Link([string]$AzureFeed, [string]$SpecificVersion, [string]$CLIArchitecture) {
     Say-Invocation $MyInvocation
 
-    if ($SharedRuntime) {
+    if (-not $Runtime) {
+        $PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-dev-win-$CLIArchitecture.$SpecificVersion.zip"
+    }
+    elseif ($Runtime -eq "dotnet") {
         $PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/dotnet-win-$CLIArchitecture.$SpecificVersion.zip"
     }
     else {
-        $PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-dev-win-$CLIArchitecture.$SpecificVersion.zip"
+        return $null
     }
 
     Say-Verbose "Constructed legacy payload URL: $PayloadURL"
@@ -464,7 +496,9 @@ $LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $AzureFeed -SpecificVer
 if ($DryRun) {
     Say "Payload URLs:"
     Say "Primary - $DownloadLink"
-    Say "Legacy - $LegacyDownloadLink"
+    if ($LegacyDownloadLink) {
+        Say "Legacy - $LegacyDownloadLink"
+    }
     Say "Repeatable invocation: .\$($MyInvocation.Line)"
     exit 0
 }
@@ -472,15 +506,25 @@ if ($DryRun) {
 $InstallRoot = Resolve-Installation-Path $InstallDir
 Say-Verbose "InstallRoot: $InstallRoot"
 
-$dotnetPackageRelativePath = if ($SharedRuntime) { "shared\Microsoft.NETCore.App" } else { "sdk" }
+if ($Runtime -eq "dotnet") {
+    $assetName = ".NET Core Runtime"
+    $dotnetPackageRelativePath = "shared\Microsoft.NETCore.App"
+}
+elseif ($Runtime -eq "aspnetcore") {
+    $assetName = "ASP.NET Core Runtime"
+    $dotnetPackageRelativePath = "shared\Microsoft.AspNetCore.App"
+}
+elseif (-not $Runtime) {
+    $assetName = ".NET Core SDK"
+    $dotnetPackageRelativePath = "sdk"
+}
+else {
+    throw "Invalid value for `$Runtime"
+}
 
 $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
 if ($isAssetInstalled) {
-    if ($SharedRuntime) {
-        Say ".NET Core Runtime version $SpecificVersion is already installed."
-    } else {
-        Say ".NET Core SDK version $SpecificVersion is already installed."
-    }
+    Say "$assetName version $SpecificVersion is already installed."
     Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath
     exit 0
 }
@@ -502,11 +546,16 @@ try {
 }
 catch {
     Say "Cannot download: $DownloadLink"
-    $DownloadLink = $LegacyDownloadLink
-    $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
-    Say-Verbose "Legacy zip path: $ZipPath"
-    Say "Downloading legacy link: $DownloadLink"
-    DownloadFile -Uri $DownloadLink -OutPath $ZipPath
+    if ($LegacyDownloadLink) {
+        $DownloadLink = $LegacyDownloadLink
+        $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
+        Say-Verbose "Legacy zip path: $ZipPath"
+        Say "Downloading legacy link: $DownloadLink"
+        DownloadFile -Uri $DownloadLink -OutPath $ZipPath
+    }
+    else {
+        throw "Could not download $assetName version $SpecificVersion"
+    }
 }
 
 Say "Extracting zip from $DownloadLink"
diff --git a/scripts/obtain/dotnet-install.sh b/scripts/obtain/dotnet-install.sh
index e69e3a1fa..04b5a3820 100755
--- a/scripts/obtain/dotnet-install.sh
+++ b/scripts/obtain/dotnet-install.sh
@@ -22,7 +22,7 @@ exec 3>&1
 
 # Setup some colors to use. These need to work in fairly limited shells, like the Ubuntu Docker container where there are only 8 colors.
 # See if stdout is a terminal
-if [ -t 1 ]; then
+if [ -t 1 ] && command -v tput > /dev/null; then
     # see if it supports colors
     ncolors=$(tput colors)
     if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
@@ -39,6 +39,10 @@ if [ -t 1 ]; then
     fi
 fi
 
+say_warning() {
+    printf "%b\n" "${yellow:-}dotnet_install: Warning: $1${normal:-}"
+}
+
 say_err() {
     printf "%b\n" "${red:-}dotnet_install: Error: $1${normal:-}" >&2
 }
@@ -120,6 +124,10 @@ get_linux_platform_name() {
     else
         if [ -e /etc/os-release ]; then
             . /etc/os-release
+            if [[ $ID == "alpine" ]]; then
+                # remove the last version digit
+                VERSION_ID=${VERSION_ID%.*}
+            fi
             echo "$ID.$VERSION_ID"
             return 0
         elif [ -e /etc/redhat-release ]; then
@@ -130,7 +138,7 @@ get_linux_platform_name() {
             fi
         fi
     fi
-    
+
     say_verbose "Linux specific platform name and version could not be detected: $ID.$VERSION_ID"
     return 1
 }
@@ -146,15 +154,15 @@ get_current_os_name() {
         local linux_platform_name
         linux_platform_name="$(get_linux_platform_name)" || { echo "linux" && return 0 ; }
 
-        if [[ $linux_platform_name == "rhel.6"* ]]; then
-            echo "rhel.6"
+        if [[ $linux_platform_name == "rhel.6" || $linux_platform_name == "alpine.3.6" ]]; then
+            echo $linux_platform_name
             return 0
         else
             echo "linux"
             return 0
         fi
     fi
-    
+
     say_err "OS name could not be detected: $ID.$VERSION_ID"
     return 1
 }
@@ -179,7 +187,7 @@ get_legacy_os_name() {
             fi
         fi
     fi
-    
+
     say_verbose "Distribution specific OS name and version could not be detected: $ID.$VERSION_ID"
     return 1
 }
@@ -209,7 +217,7 @@ check_min_reqs() {
 
 check_pre_reqs() {
     eval $invocation
-    
+
     local failing=false;
 
     if [ "${DOTNET_INSTALL_SKIP_PREREQS:-}" = "1" ]; then
@@ -236,7 +244,7 @@ check_pre_reqs() {
     if [ "$failing" = true ]; then
        return 1
     fi
-    
+
     return 0
 }
 
@@ -244,7 +252,7 @@ check_pre_reqs() {
 # input - $1
 to_lowercase() {
     #eval $invocation
-    
+
     echo "$1" | tr '[:upper:]' '[:lower:]'
     return 0
 }
@@ -253,7 +261,7 @@ to_lowercase() {
 # input - $1
 remove_trailing_slash() {
     #eval $invocation
-    
+
     local input="${1:-}"
     echo "${input%/}"
     return 0
@@ -263,7 +271,7 @@ remove_trailing_slash() {
 # input - $1
 remove_beginning_slash() {
     #eval $invocation
-    
+
     local input="${1:-}"
     echo "${input#/}"
     return 0
@@ -274,13 +282,13 @@ remove_beginning_slash() {
 # child_path - $2 - this parameter can be empty
 combine_paths() {
     eval $invocation
-    
+
     # TODO: Consider making it work with any number of paths. For now:
     if [ ! -z "${3:-}" ]; then
         say_err "combine_paths: Function takes two parameters."
         return 1
     fi
-    
+
     local root_path="$(remove_trailing_slash "$1")"
     local child_path="$(remove_beginning_slash "${2:-}")"
     say_verbose "combine_paths: root_path=$root_path"
@@ -291,7 +299,7 @@ combine_paths() {
 
 get_machine_architecture() {
     eval $invocation
-    
+
     # Currently the only one supported
     echo "x64"
     return 0
@@ -301,7 +309,7 @@ get_machine_architecture() {
 # architecture - $1
 get_normalized_architecture_from_architecture() {
     eval $invocation
-    
+
     local architecture="$(to_lowercase "$1")"
     case "$architecture" in
         \<auto\>)
@@ -317,7 +325,7 @@ get_normalized_architecture_from_architecture() {
             return 1
             ;;
     esac
-   
+
     say_err "Architecture \`$architecture\` not supported. If you think this is a bug, please report it at https://github.com/dotnet/cli/issues"
     return 1
 }
@@ -331,7 +339,7 @@ get_normalized_architecture_from_architecture() {
 # version_text - stdin
 get_version_from_version_info() {
     eval $invocation
-    
+
     cat | tail -n 1 | sed 's/\r$//'
     return 0
 }
@@ -340,7 +348,7 @@ get_version_from_version_info() {
 # version_text - stdin
 get_commit_hash_from_version_info() {
     eval $invocation
-    
+
     cat | head -n 1 | sed 's/\r$//'
     return 0
 }
@@ -351,14 +359,14 @@ get_commit_hash_from_version_info() {
 # specific_version - $3
 is_dotnet_package_installed() {
     eval $invocation
-    
+
     local install_root="$1"
     local relative_path_to_package="$2"
     local specific_version="${3//[$'\t\r\n']}"
-    
+
     local dotnet_package_path="$(combine_paths "$(combine_paths "$install_root" "$relative_path_to_package")" "$specific_version")"
     say_verbose "is_dotnet_package_installed: dotnet_package_path=$dotnet_package_path"
-    
+
     if [ -d "$dotnet_package_path" ]; then
         return 0
     else
@@ -373,24 +381,29 @@ is_dotnet_package_installed() {
 # coherent - $4
 get_latest_version_info() {
     eval $invocation
-    
+
     local azure_feed="$1"
     local channel="$2"
     local normalized_architecture="$3"
     local coherent="$4"
 
     local version_file_url=null
-    if [ "$shared_runtime" = true ]; then
+    if [[ "$runtime" == "dotnet" ]]; then
         version_file_url="$uncached_feed/Runtime/$channel/latest.version"
-    else
+    elif [[ "$runtime" == "aspnetcore" ]]; then
+        version_file_url="$uncached_feed/aspnetcore/Runtime/$channel/latest.version"
+    elif [ -z "$runtime" ]; then
         if [ "$coherent" = true ]; then
             version_file_url="$uncached_feed/Sdk/$channel/latest.coherent.version"
         else
             version_file_url="$uncached_feed/Sdk/$channel/latest.version"
         fi
+    else
+        say_err "Invalid value for \$runtime"
+        return 1
     fi
     say_verbose "get_latest_version_info: latest url: $version_file_url"
-    
+
     download "$version_file_url"
     return $?
 }
@@ -402,7 +415,7 @@ get_latest_version_info() {
 # version - $4
 get_specific_version_from_version() {
     eval $invocation
-    
+
     local azure_feed="$1"
     local channel="$2"
     local normalized_architecture="$3"
@@ -437,22 +450,26 @@ get_specific_version_from_version() {
 # specific_version - $4
 construct_download_link() {
     eval $invocation
-    
+
     local azure_feed="$1"
     local channel="$2"
     local normalized_architecture="$3"
     local specific_version="${4//[$'\t\r\n']}"
-    
+
     local osname
     osname="$(get_current_os_name)" || return 1
 
     local download_link=null
-    if [ "$shared_runtime" = true ]; then
+    if [[ "$runtime" == "dotnet" ]]; then
         download_link="$azure_feed/Runtime/$specific_version/dotnet-runtime-$specific_version-$osname-$normalized_architecture.tar.gz"
-    else
+    elif [[ "$runtime" == "aspnetcore" ]]; then
+        download_link="$azure_feed/aspnetcore/Runtime/$specific_version/aspnetcore-runtime-$specific_version-$osname-$normalized_architecture.tar.gz"
+    elif [ -z "$runtime" ]; then
         download_link="$azure_feed/Sdk/$specific_version/dotnet-sdk-$specific_version-$osname-$normalized_architecture.tar.gz"
+    else
+        return 1
     fi
-    
+
     echo "$download_link"
     return 0
 }
@@ -464,7 +481,7 @@ construct_download_link() {
 # specific_version - $4
 construct_legacy_download_link() {
     eval $invocation
-    
+
     local azure_feed="$1"
     local channel="$2"
     local normalized_architecture="$3"
@@ -474,10 +491,12 @@ construct_legacy_download_link() {
     distro_specific_osname="$(get_legacy_os_name)" || return 1
 
     local legacy_download_link=null
-    if [ "$shared_runtime" = true ]; then
+    if [[ "$runtime" == "dotnet" ]]; then
         legacy_download_link="$azure_feed/Runtime/$specific_version/dotnet-$distro_specific_osname-$normalized_architecture.$specific_version.tar.gz"
-    else
+    elif [ -z "$runtime" ]; then
         legacy_download_link="$azure_feed/Sdk/$specific_version/dotnet-dev-$distro_specific_osname-$normalized_architecture.$specific_version.tar.gz"
+    else
+        return 1
     fi
 
     echo "$legacy_download_link"
@@ -486,7 +505,7 @@ construct_legacy_download_link() {
 
 get_user_install_path() {
     eval $invocation
-    
+
     if [ ! -z "${DOTNET_INSTALL_DIR:-}" ]; then
         echo "$DOTNET_INSTALL_DIR"
     else
@@ -499,7 +518,7 @@ get_user_install_path() {
 # install_dir - $1
 resolve_installation_path() {
     eval $invocation
-    
+
     local install_dir=$1
     if [ "$install_dir" = "<auto>" ]; then
         local user_install_path="$(get_user_install_path)"
@@ -507,7 +526,7 @@ resolve_installation_path() {
         echo "$user_install_path"
         return 0
     fi
-    
+
     echo "$install_dir"
     return 0
 }
@@ -516,7 +535,7 @@ resolve_installation_path() {
 # install_root - $1
 get_installed_version_info() {
     eval $invocation
-    
+
     local install_root="$1"
     local version_file="$(combine_paths "$install_root" "$local_version_file_relative_path")"
     say_verbose "Local version file: $version_file"
@@ -525,7 +544,7 @@ get_installed_version_info() {
         echo "$version_info"
         return 0
     fi
-    
+
     say_verbose "Local version file not found."
     return 0
 }
@@ -534,7 +553,7 @@ get_installed_version_info() {
 # relative_or_absolute_path - $1
 get_absolute_path() {
     eval $invocation
-    
+
     local relative_or_absolute_path=$1
     echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"
     return 0
@@ -552,7 +571,7 @@ copy_files_or_dirs_from_list() {
     local out_path="$(remove_trailing_slash "$2")"
     local override="$3"
     local override_switch=$(if [ "$override" = false ]; then printf -- "-n"; fi)
-    
+
     cat | uniq | while read -r file_path; do
         local path="$(remove_beginning_slash "${file_path#$root_path}")"
         local target="$out_path/$path"
@@ -568,21 +587,21 @@ copy_files_or_dirs_from_list() {
 # out_path - $2
 extract_dotnet_package() {
     eval $invocation
-    
+
     local zip_path="$1"
     local out_path="$2"
-    
+
     local temp_out_path="$(mktemp -d "$temporary_file_template")"
-    
+
     local failed=false
     tar -xzf "$zip_path" -C "$temp_out_path" > /dev/null || failed=true
-    
+
     local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/'
     find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false
     find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files"
-    
+
     rm -rf "$temp_out_path"
-    
+
     if [ "$failed" = true ]; then
         say_err "Extraction failed"
         return 1
@@ -646,7 +665,7 @@ downloadwget() {
     if [ -z "$out_path" ]; then
         wget -q --tries 10 -O - "$remote_path" || failed=true
     else
-        wget -v --tries 10 -O "$out_path" "$remote_path" || failed=true
+        wget --tries 10 -O "$out_path" "$remote_path" || failed=true
     fi
     if [ "$failed" = true ]; then
         say_verbose "Wget download failed"
@@ -661,14 +680,14 @@ calculate_vars() {
 
     normalized_architecture="$(get_normalized_architecture_from_architecture "$architecture")"
     say_verbose "normalized_architecture=$normalized_architecture"
-    
+
     specific_version="$(get_specific_version_from_version "$azure_feed" "$channel" "$normalized_architecture" "$version")"
     say_verbose "specific_version=$specific_version"
     if [ -z "$specific_version" ]; then
         say_err "Could not get version information."
         return 1
     fi
-    
+
     download_link="$(construct_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")"
     say_verbose "download_link=$download_link"
 
@@ -687,42 +706,60 @@ calculate_vars() {
 install_dotnet() {
     eval $invocation
     local download_failed=false
+    local asset_name=''
+    local asset_relative_path=''
 
-    if [ "$shared_runtime" = true ]; then
-        if is_dotnet_package_installed "$install_root" "shared/Microsoft.NETCore.App" "$specific_version"; then
-            say ".NET Core Runtime version $specific_version is already installed."
-            return 0
-        fi
+    if [[ "$runtime" == "dotnet" ]]; then
+        asset_relative_path="shared/Microsoft.NETCore.App"
+        asset_name=".NET Core Runtime"
+    elif [[ "$runtime" == "aspnetcore" ]]; then
+        asset_relative_path="shared/Microsoft.AspNetCore.App"
+        asset_name="ASP.NET Core Runtime"
+    elif [ -z "$runtime" ]; then
+        asset_relative_path="sdk"
+        asset_name=".NET Core SDK"
     else
-        if is_dotnet_package_installed "$install_root" "sdk" "$specific_version"; then
-            say ".NET Core SDK version $specific_version is already installed."
-            return 0
-        fi
+        say_err "Invalid value for \$runtime"
+        return 1
     fi
-    
+
+    if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then
+        say "$asset_name version $specific_version is already installed."
+        return 0
+    fi
+
     mkdir -p "$install_root"
     zip_path="$(mktemp "$temporary_file_template")"
     say_verbose "Zip path: $zip_path"
 
     say "Downloading link: $download_link"
-    
+
     # Failures are normal in the non-legacy case for ultimately legacy downloads.
     # Do not output to stderr, since output to stderr is considered an error.
     download "$download_link" "$zip_path" 2>&1 || download_failed=true
 
     #  if the download fails, download the legacy_download_link
-    if [ "$download_failed" = true ] && [ "$valid_legacy_download_link" = true ]; then
+    if [ "$download_failed" = true ]; then
         say "Cannot download: $download_link"
-        download_link="$legacy_download_link"
-        zip_path="$(mktemp "$temporary_file_template")"
-        say_verbose "Legacy zip path: $zip_path"
-        say "Downloading legacy link: $download_link"
-        download "$download_link" "$zip_path"
+
+        if [ "$valid_legacy_download_link" = true ]; then
+            download_failed=false
+            download_link="$legacy_download_link"
+            zip_path="$(mktemp "$temporary_file_template")"
+            say_verbose "Legacy zip path: $zip_path"
+            say "Downloading legacy link: $download_link"
+            download "$download_link" "$zip_path" 2>&1 || download_failed=true
+        fi
     fi
-    
+
+    if [ "$download_failed" = true ]; then
+        say_err "Could not download $asset_name version $specific_version"
+        return 1
+    fi
+
     say "Extracting zip from $download_link"
     extract_dotnet_package "$zip_path" "$install_root"
-    
+
     return 0
 }
 
@@ -740,7 +777,7 @@ azure_feed="https://dotnetcli.azureedge.net/dotnet"
 uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
 feed_credential=""
 verbose=false
-shared_runtime=false
+runtime=""
 runtime_id=""
 override_non_versioned_files=true
 
@@ -765,7 +802,18 @@ do
             architecture="$1"
             ;;
         --shared-runtime|-[Ss]hared[Rr]untime)
-            shared_runtime=true
+            say_warning "The --shared-runtime flag is obsolete and may be removed in a future version of this script. The recommended usage is to specify '--runtime dotnet'."
+            if [ -z "$runtime" ]; then
+                runtime="dotnet"
+            fi
+            ;;
+        --runtime|-[Rr]untime)
+            shift
+            runtime="$1"
+            if [[ "$runtime" != "dotnet" ]] && [[ "$runtime" != "aspnetcore" ]]; then
+                say_err "Unsupported value for --runtime: '$1'. Valid values are 'dotnet' and 'aspnetcore'."
+                exit 1
+            fi
             ;;
         --dry-run|-[Dd]ry[Rr]un)
             dry_run=true
@@ -825,8 +873,11 @@ do
             echo "      -InstallDir"
             echo "  --architecture <ARCHITECTURE>      Architecture of .NET Tools. Currently only x64 is supported."
             echo "      --arch,-Architecture,-Arch"
-            echo "  --shared-runtime                   Installs just the shared runtime bits, not the entire SDK."
-            echo "      -SharedRuntime"
+            echo "  --runtime <RUNTIME>                Installs a shared runtime only, without the SDK."
+            echo "      -Runtime"
+            echo "          Possible values:"
+            echo "          - dotnet     - the Microsoft.NETCore.App shared runtime"
+            echo "          - aspnetcore - the Microsoft.AspNetCore.App shared runtime"
             echo "  --skip-non-versioned-files         Skips non-versioned files if they already exist, such as the dotnet executable."
             echo "      -SkipNonVersionedFiles"
             echo "  --dry-run,-DryRun                  Do not perform installation. Display download link."
@@ -839,6 +890,10 @@ do
             echo "      -RuntimeId"
             echo "  -?,--?,-h,--help,-Help             Shows this help message"
             echo ""
+            echo "Obsolete parameters:"
+            echo "  --shared-runtime                   The recommended alternative is '--runtime dotnet'."
+            echo "      -SharedRuntime                 Installs just the shared runtime bits, not the entire SDK."
+            echo ""
             echo "Install Location:"
             echo "  Location is chosen in following order:"
             echo "    - --install-dir option"
diff --git a/scripts/obtain/uninstall/dotnet-uninstall-debian-packages.sh b/scripts/obtain/uninstall/dotnet-uninstall-debian-packages.sh
index a62ce9ed4..f9784ef5d 100755
--- a/scripts/obtain/uninstall/dotnet-uninstall-debian-packages.sh
+++ b/scripts/obtain/uninstall/dotnet-uninstall-debian-packages.sh
@@ -13,10 +13,10 @@ if [ $current_userid -ne 0 ]; then
 fi
 
 host_package_name="dotnet-host"
-aspnetcore_package_store_package_name="^aspnetcore-store.*"
+aspnetcore_runtime_package_name="^aspnetcore-runtime.*"
 
 remove_all(){
-    apt-get purge -y $aspnetcore_package_store_package_name
+    apt-get purge -y $aspnetcore_runtime_package_name
     apt-get purge -y $host_package_name
 }
 
@@ -25,6 +25,9 @@ is_dotnet_host_installed(){
     [ -z "$out" ]
 }
 
+dotnet_tool_path_file="/etc/profile.d/dotnet-cli-tools-bin-path.sh"
+rm -f "$dotnet_tool_path_file"
+
 is_dotnet_host_installed
 [ "$?" -eq 0 ] && echo "Unable to find dotnet installation to remove." >&2 \
     && exit 0
diff --git a/scripts/obtain/uninstall/dotnet-uninstall-pkgs.sh b/scripts/obtain/uninstall/dotnet-uninstall-pkgs.sh
index 31a5d8e99..647ae4a61 100755
--- a/scripts/obtain/uninstall/dotnet-uninstall-pkgs.sh
+++ b/scripts/obtain/uninstall/dotnet-uninstall-pkgs.sh
@@ -16,6 +16,7 @@ fi
 dotnet_pkg_name_suffix="com.microsoft.dotnet"
 dotnet_install_root="/usr/local/share/dotnet"
 dotnet_path_file="/etc/paths.d/dotnet"
+dotnet_tool_path_file="/etc/paths.d/dotnet-cli-tools"
 
 remove_dotnet_pkgs(){
     installed_pkgs=($(pkgutil --pkgs | grep $dotnet_pkg_name_suffix))
@@ -33,6 +34,7 @@ remove_dotnet_pkgs
 echo "Deleting install root - $dotnet_install_root" >&2
 rm -rf "$dotnet_install_root"
 rm -f "$dotnet_path_file"
+rm -f "$dotnet_tool_path_file"
 
 echo "dotnet packages removal succeeded." >&2
 exit 0
diff --git a/scripts/obtain/uninstall/dotnet-uninstall-rpm-packages.sh b/scripts/obtain/uninstall/dotnet-uninstall-rpm-packages.sh
index ef7be91af..c34bb245e 100755
--- a/scripts/obtain/uninstall/dotnet-uninstall-rpm-packages.sh
+++ b/scripts/obtain/uninstall/dotnet-uninstall-rpm-packages.sh
@@ -13,11 +13,11 @@ if [ $current_userid -ne 0 ]; then
 fi
 
 host_package_name="dotnet-host"
-aspnetcore_package_store_package_name="aspnetcore-store*"
+aspnetcore_runtime_package_name="aspnetcore-runtime*"
 
 remove_all(){
     yum remove -y $host_package_name
-    yum remove -y $aspnetcore_package_store_package_name
+    yum remove -y $aspnetcore_runtime_package_name
 }
 
 is_dotnet_host_installed(){
@@ -25,6 +25,9 @@ is_dotnet_host_installed(){
     [ -z "$out" ]
 }
 
+dotnet_tool_path_file="/etc/profile.d/dotnet-cli-tools-bin-path.sh"
+rm -f "$dotnet_tool_path_file"
+
 is_dotnet_host_installed
 [ "$?" -eq 0 ] && echo "Unable to find dotnet installation to remove." >&2 \
     && exit 0
diff --git a/scripts/publish/repoapi_client.sh b/scripts/publish/repoapi_client.sh
deleted file mode 100755
index 875210bff..000000000
--- a/scripts/publish/repoapi_client.sh
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) .NET Foundation and contributors. All rights reserved.
-# Licensed under the MIT license. See LICENSE file in the project root for full license information.
-#
-
-# This is a VERY basic script for Create/Delete operations on repos and packages
-# 
-# Environment Dependencies:
-#   $REPO_SERVER
-#   $REPO_USER
-#   $REPO_PASS
-
-cmd=$1
-urls=urls.txt
-defaultPackageFile=new_package.json
-defaultRepoFile=new_repo.json
-repositoryId=$REPO_ID
-server=$REPO_SERVER
-user=$REPO_USER
-pass=$REPO_PASS
-protocol=https
-port=443
-baseurl="$protocol://$user:$pass@$server:$port"
-
-echo $baseurl
-
-function BailIf
-{
-    if [ $1 -ne 0 ]; then
-        echo "Failure occurred communicating with $server"
-        exit 1
-    fi
-}
-
-# List packages, using $1 as a regex to filter results
-function ListPackages
-{
-    curl -k "$baseurl/v1/packages" | sed 's/{/\n{/g' | egrep "$1" | sed 's/,/,\n/g' | sed 's/^"/\t"/g'
-    echo ""
-}
-
-# Create a new Repo using the specified JSON file
-function AddRepo
-{
-    repoFile=$1
-    if [ -z $repoFile ]; then
-        echo "Error: Must specify a JSON-formatted file. Reference $defaultRepoFile.template"
-        exit 1
-    fi
-    if [ ! -f $repoFile ]; then
-        echo "Error: Cannot create repo - $repoFile does not exist"
-        exit 1
-    fi
-    packageUrl=$(grep "url" $repoFile  | head -n 1 | awk '{print $2}' | tr -d ',')
-    echo "Creating new repo on $server [$packageUrl]"
-    curl -i -k "$baseurl/v1/repositories" --data @./$repoFile -H "Content-Type: application/json"
-    BailIf $?
-    echo ""
-}
-
-# Upload a single package using the specified JSON file
-function AddPackage
-{
-    packageFile=$1
-    if [ -z $packageFile ]; then
-        echo "Error: Must specify a JSON-formatted file. Reference $defaultPackageFile.template"
-        exit 1
-    fi
-    if [ ! -f $packageFile ]; then
-        echo "Error: Cannot add package - $packageFile does not exist"
-        exit 1
-    fi
-    packageUrl=$(grep "sourceUrl" $packageFile  | head -n 1 | awk '{print $2}')
-    echo "Adding package to $server [$packageUrl]"
-    curl -i -k "$baseurl/v1/packages" --data @$packageFile -H "Content-Type: application/json"
-    BailIf $?
-    echo ""
-}
-
-# Upload a single package by dynamically creating a JSON file using a provided URL
-function AddPackageByUrl
-{
-	# Parse URL
-	url=$(echo "$1")
-    if [ -z $url ]; then
-        return
-    fi
-	escapedUrl=$(echo "$url" | sed 's/\//\\\//g')
-	set -- "$1" 
-	oldIFS=$IFS
-	IFS="/"; declare -a splitUrl=($*) 
-	index=${#splitUrl[@]}
-	let "index -= 1"
-	filename=${splitUrl[$index]}
-	set -- "$filename"
-	IFS="_"; declare -a splitFile=($*)
-	IFS=$oldIFS
-	pkgName=${splitFile[0]}
-	pkgVer=${splitFile[1]}
-	if [ -z $pkgName ] || [ -z $pkgVer ]; then
-		echo "ERROR parsing $url"
-		return
-	fi
-	# Create Package .json file
-	cp $defaultPackageFile.template $defaultPackageFile
-	sed -i "s/PACKAGENAME/$pkgName/g" $defaultPackageFile
-	sed -i "s/PACKAGEVERSION/$pkgVer/g" $defaultPackageFile
-	sed -i "s/PACKAGEURL/$escapedUrl/g" $defaultPackageFile
-	sed -i "s/REPOSITORYID/$repositoryId/g" $defaultPackageFile
-	# Test that URL is ok
-	wget -q --spider "$url"
-	if [[ $? -eq 0 ]]; then
-		echo "Ready to upload $pkgName [$pkgVer]"
-	else
-		echo "ERROR testing URL $url"
-		return
-	fi
-	# Perform Upload
-	AddPackage $defaultPackageFile
-	# Cleanup
-	# rm $defaultPackageFile
-}
-
-# Upload multiple packages by reading urls line-by-line from the specified file
-function AddPackages
-{
-    urlFile=$1
-    if [ -z $urlFile ]; then
-        echo "Error: Must specify a flat text file containing one or more URLs"
-        exit 1
-    fi
-    if [ ! -f $urlFile ]; then
-        echo "Error: Cannot add packages. File $urlFile does not exist"
-        exit 1
-    fi
-    for url in $(cat $urlFile); do
-        AddPackageByUrl "$url" 
-        sleep 5
-    done
-}
-
-# Delete the specified repo
-function DeleteRepo
-{
-    repoId=$1
-    if [ -z $repoId ]; then
-        echo "Error: Please specify repository ID. Run -listrepos for a list of IDs"
-        exit 1
-    fi
-    curl -I -k -X DELETE "$baseurl/v1/repositories/$repoId"
-    BailIf $?
-}
-
-# Delete the specified package
-function DeletePackage
-{
-    packageId=$1
-    if [ -z $packageId ]; then
-        echo "Error: Please specify package ID. Run -listpkgs for a list of IDs"
-        exit 1
-    fi
-    echo Removing pkgId $packageId from repo $repositoryId
-    curl -I -k -X DELETE "$baseurl/v1/packages/$packageId"
-    BailIf $?
-}
-
-if [[ "$1" == "-listrepos" ]]; then
-  echo "Fetching repo list from $server..."
-  curl -k "$baseurl/v1/repositories" | sed 's/,/,\n/g' | sed 's/^"/\t"/g'
-  echo ""
-elif [[ "$1" == "-listpkgs" ]]; then
-  echo "Fetching package list from $server"
-  ListPackages $2
-elif [[ "$1" == "-addrepo" ]]; then
-  AddRepo $2
-elif [[ "$1" == "-addpkg" ]]; then
-  AddPackage $2
-elif [[ "$1" == "-addpkgs" ]]; then
-  AddPackages $2
-elif [[ "$1" == "-delrepo" ]]; then
-  DeleteRepo $2
-elif [[ "$1" == "-delpkg" ]]; then
-  DeletePackage $2
-else
-  echo "USAGE: ./repotool.sh -OPTION"
-  echo "-listrepos: Gather a list of repos"
-  echo "-listpkgs:  Gather a list of packages"
-  echo "-addrepo [FILENAME] :   Create a new repo using the specified JSON file"
-  echo "-addpkg [FILENAME]  :   Add package to repo using the specified JSON file"
-  echo "-addpkgs [FILENAME] :   Add packages to repo using urls contained in FILENAME"
-  echo "-delrepo REPOID     :   Delete the specified repo by ID"
-  echo "-delpkg PKGID       :   Delete the specified package by ID"
-fi
diff --git a/scripts/unuse-dev.ps1 b/scripts/unuse-dev.ps1
deleted file mode 100644
index fbf5f4c18..000000000
--- a/scripts/unuse-dev.ps1
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Copyright (c) .NET Foundation and contributors. All rights reserved.
-# Licensed under the MIT license. See LICENSE file in the project root for full license information.
-#
-
-# Remove the stage2 output from the path
-$splat = $env:PATH.Split(";")
-$stripped = @($splat | where { $_ -notlike "*artifacts\win7-x64\stage2*" })
-$env:PATH = [string]::Join(";", $stripped)
diff --git a/scripts/use-dev.ps1 b/scripts/use-dev.ps1
deleted file mode 100644
index 1d7225bd6..000000000
--- a/scripts/use-dev.ps1
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright (c) .NET Foundation and contributors. All rights reserved.
-# Licensed under the MIT license. See LICENSE file in the project root for full license information.
-#
-
-# Put the stage2 output on the front of the path
-$stage2 = "$PSScriptRoot\..\artifacts\win10-x64\stage2"
-if (Test-Path $stage2) {
-    $splat = $env:PATH.Split(";")
-    $stage2 = Convert-Path $stage2
-    if ($splat -notcontains $stage2) {
-        $env:PATH="$stage2;$env:PATH"
-    }
-} else {
-    Write-Output "You don't have a dev build in the 'artifacts\win10-x64\stage2' folder!"
-}
diff --git a/src/Microsoft.DotNet.Archive/CompressionUtility.cs b/src/Microsoft.DotNet.Archive/CompressionUtility.cs
deleted file mode 100644
index 285799116..000000000
--- a/src/Microsoft.DotNet.Archive/CompressionUtility.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using SevenZip;
-using System;
-using System.IO;
-
-namespace Microsoft.DotNet.Archive
-{
-    internal static class CompressionUtility
-    {
-        enum MeasureBy
-        {
-            Input,
-            Output
-        }
-
-        private class LzmaProgress : ICodeProgress
-        {
-            private IProgress<ProgressReport> progress;
-            private long totalSize;
-            private string phase;
-            private MeasureBy measureBy;
-
-            public LzmaProgress(IProgress<ProgressReport> progress, string phase, long totalSize, MeasureBy measureBy)
-            {
-                this.progress = progress;
-                this.totalSize = totalSize;
-                this.phase = phase;
-                this.measureBy = measureBy;
-            }
-
-            public void SetProgress(long inSize, long outSize)
-            {
-                progress.Report(phase, measureBy == MeasureBy.Input ? inSize : outSize, totalSize);
-            }
-        }
-
-        public static void Compress(Stream inStream, Stream outStream, IProgress<ProgressReport> progress)
-        {
-            SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
-
-            CoderPropID[] propIDs =
-            {
-                    CoderPropID.DictionarySize,
-                    CoderPropID.PosStateBits,
-                    CoderPropID.LitContextBits,
-                    CoderPropID.LitPosBits,
-                    CoderPropID.Algorithm,
-                    CoderPropID.NumFastBytes,
-                    CoderPropID.MatchFinder,
-                    CoderPropID.EndMarker
-            };
-            object[] properties =
-            {
-                    (Int32)(1 << 26),
-                    (Int32)(1),
-                    (Int32)(8),
-                    (Int32)(0),
-                    (Int32)(2),
-                    (Int32)(96),
-                    "bt4",
-                    false
-             };
-
-            encoder.SetCoderProperties(propIDs, properties);
-            encoder.WriteCoderProperties(outStream);
-
-            Int64 inSize = inStream.Length;
-            for (int i = 0; i < 8; i++)
-            {
-                outStream.WriteByte((Byte)(inSize >> (8 * i)));
-            }
-
-            var lzmaProgress = new LzmaProgress(progress, "Compressing", inSize, MeasureBy.Input);
-            lzmaProgress.SetProgress(0, 0);
-            encoder.Code(inStream, outStream, -1, -1, lzmaProgress);
-            lzmaProgress.SetProgress(inSize, outStream.Length);
-        }
-
-        public static void Decompress(Stream inStream, Stream outStream, IProgress<ProgressReport> progress)
-        {
-            byte[] properties = new byte[5];
-
-            if (inStream.Read(properties, 0, 5) != 5)
-                throw (new Exception("input .lzma is too short"));
-
-            SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
-            decoder.SetDecoderProperties(properties);
-
-            long outSize = 0;
-            for (int i = 0; i < 8; i++)
-            {
-                int v = inStream.ReadByte();
-                if (v < 0)
-                    throw (new Exception("Can't Read 1"));
-                outSize |= ((long)(byte)v) << (8 * i);
-            }
-
-            long compressedSize = inStream.Length - inStream.Position;
-            var lzmaProgress = new LzmaProgress(progress, LocalizableStrings.Decompressing, outSize, MeasureBy.Output);
-            lzmaProgress.SetProgress(0, 0);
-            decoder.Code(inStream, outStream, compressedSize, outSize, lzmaProgress);
-            lzmaProgress.SetProgress(inStream.Length, outSize);
-        }
-    }
-}
diff --git a/src/Microsoft.DotNet.Archive/ConsoleProgressReport.cs b/src/Microsoft.DotNet.Archive/ConsoleProgressReport.cs
deleted file mode 100644
index e8f6cd0df..000000000
--- a/src/Microsoft.DotNet.Archive/ConsoleProgressReport.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-using System.Diagnostics;
-
-namespace Microsoft.DotNet.Archive
-{
-    public class ConsoleProgressReport : IProgress<ProgressReport>
-    {
-        private string _currentPhase;
-        private int _lastLineLength = 0;
-        private double _lastProgress = -1;
-        private Stopwatch _stopwatch;
-        private object _stateLock = new object();
-
-        public void Report(ProgressReport value)
-        {
-            long progress = (long)(100 * ((double)value.Ticks / value.Total));
-
-            if (progress == _lastProgress && value.Phase == _currentPhase)
-            {
-                return;
-            }
-            _lastProgress = progress;
-
-            lock (_stateLock)
-            {
-                string line = $"{value.Phase} {progress}%";
-                if (value.Phase == _currentPhase)
-                {
-                    if (Console.IsOutputRedirected)
-                    {
-                        Console.Write($"...{progress}%");
-                    }
-                    else
-                    {
-                        Console.Write(new string('\b', _lastLineLength));
-                        Console.Write(line);
-                    }
-
-                    _lastLineLength = line.Length;
-
-                    if (progress == 100)
-                    {
-                        Console.WriteLine($" {_stopwatch.ElapsedMilliseconds} ms");
-                    }
-                }
-                else
-                {
-                    Console.Write(line);
-                    _currentPhase = value.Phase;
-                    _lastLineLength = line.Length;
-                    _stopwatch = Stopwatch.StartNew();
-                }
-            }
-        }
-    }
-}
diff --git a/src/Microsoft.DotNet.Archive/IndexedArchive.cs b/src/Microsoft.DotNet.Archive/IndexedArchive.cs
deleted file mode 100644
index fb0ef22f6..000000000
--- a/src/Microsoft.DotNet.Archive/IndexedArchive.cs
+++ /dev/null
@@ -1,538 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-using System.Security.Cryptography;
-using System.Text;
-using System.Threading;
-
-namespace Microsoft.DotNet.Archive
-{
-    public class IndexedArchive : IDisposable
-    {
-        private class DestinationFileInfo
-        {
-            public DestinationFileInfo(string destinationPath, string hash)
-            {
-                DestinationPath = destinationPath;
-                Hash = hash;
-            }
-
-            public string DestinationPath { get; }
-            public string Hash { get; }
-        }
-
-        private class ArchiveSource
-        {
-            public ArchiveSource(string sourceArchive, string sourceFile, string archivePath, string hash, long size)
-            {
-                SourceArchive = sourceArchive;
-                SourceFile = sourceFile;
-                ArchivePath = archivePath;
-                Hash = hash;
-                Size = size;
-            }
-
-            public string SourceArchive { get; set; }
-            public string SourceFile { get; set; }
-            public string ArchivePath { get; }
-            public string Hash { get; }
-            public string FileName { get { return Path.GetFileNameWithoutExtension(ArchivePath); } }
-            public string Extension { get { return Path.GetExtension(ArchivePath); } }
-            public long Size { get; }
-
-            public void CopyTo(Stream destination)
-            {
-                if (!String.IsNullOrEmpty(SourceArchive))
-                {
-                    using (var zip = new ZipArchive(File.OpenRead(SourceArchive), ZipArchiveMode.Read))
-                    using (var sourceStream = zip.GetEntry(SourceFile)?.Open())
-                    {
-                        if (sourceStream == null)
-                        {
-                            throw new Exception($"Couldn't find entry {SourceFile} in archive {SourceArchive}");
-                        }
-
-                        sourceStream.CopyTo(destination);
-                    }
-                }
-                else
-                {
-                    using (var sourceStream = File.OpenRead(SourceFile))
-                    {
-                        sourceStream.CopyTo(destination);
-                    }
-                }
-            }
-        }
-
-        static string[] ZipExtensions = new[] { ".zip", ".nupkg" };
-        static string IndexFileName = "index.txt";
-
-        // maps file hash to archve path
-        // $ prefix indicates that the file is not in the archive and path is a hash
-        private Dictionary<string, ArchiveSource> _archiveFiles = new Dictionary<string, ArchiveSource>();
-        // maps file hash to external path
-        private Dictionary<string, string> _externalFiles = new Dictionary<string, string>();
-        // lists all extracted files & hashes
-        private List<DestinationFileInfo> _destFiles = new List<DestinationFileInfo>();
-        private bool _disposed = false;
-        private ThreadLocal<SHA256> _sha = new ThreadLocal<SHA256>(() => SHA256.Create());
-
-        public IndexedArchive()
-        { }
-        
-        private static Stream CreateTemporaryStream()
-        {
-            string temp = Path.GetTempPath();
-            string tempFile = Path.Combine(temp, Guid.NewGuid().ToString());
-            return File.Create(tempFile, 4096, FileOptions.DeleteOnClose);
-        }
-
-        private static FileStream CreateTemporaryFileStream()
-        {
-            string temp = Path.GetTempPath();
-            string tempFile = Path.Combine(temp, Guid.NewGuid().ToString());
-            return new FileStream(tempFile, FileMode.Create, FileAccess.ReadWrite, FileShare.Read | FileShare.Delete, 4096, FileOptions.DeleteOnClose);
-        }
-
-        public void Save(string archivePath, IProgress<ProgressReport> progress)
-        {
-            CheckDisposed();
-
-            using (var archiveStream = CreateTemporaryStream())
-            {
-                using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
-                {
-                    BuildArchive(archive, progress);
-                }  // close archive
-
-                archiveStream.Seek(0, SeekOrigin.Begin);
-
-                using (var lzmaStream = File.Create(archivePath))
-                {
-                    CompressionUtility.Compress(archiveStream, lzmaStream, progress);
-                }
-            }  // close archiveStream
-        }
-
-        private void BuildArchive(ZipArchive archive, IProgress<ProgressReport> progress)
-        {
-            // write the file index
-            var indexEntry = archive.CreateEntry(IndexFileName, CompressionLevel.NoCompression);
-
-            using (var stream = indexEntry.Open())
-            using (var textWriter = new StreamWriter(stream))
-            {
-                foreach (var entry in _destFiles)
-                {
-                    var archiveFile = _archiveFiles[entry.Hash];
-                    string archivePath = _archiveFiles[entry.Hash].ArchivePath;
-                    if (archiveFile.SourceFile == null)
-                    {
-                        archivePath = "$" + archivePath;
-                    }
-
-                    textWriter.WriteLine($"{entry.DestinationPath}|{archivePath}");
-                }
-            }
-
-            // sort the files so that similar files are close together
-            var filesToArchive = _archiveFiles.Values.ToList();
-            filesToArchive.Sort((f1, f2) =>
-            {
-                // first sort by extension
-                var comp = String.Compare(f1.Extension, f2.Extension, StringComparison.OrdinalIgnoreCase);
-
-                if (comp == 0)
-                {
-                    // then sort by filename
-                    comp = String.Compare(f1.FileName, f2.FileName, StringComparison.OrdinalIgnoreCase);
-                }
-
-                if (comp == 0)
-                {
-                    // sort by file size (helps differentiate ref/lib/facade)
-                    comp = f1.Size.CompareTo(f2.Size);
-                }
-
-                if (comp == 0)
-                {
-                    // finally sort by full archive path so we have stable output
-                    comp = String.Compare(f1.ArchivePath, f2.ArchivePath, StringComparison.OrdinalIgnoreCase);
-                }
-
-                return comp;
-            });
-
-            int filesAdded = 0;
-            // add all the files
-            foreach (var fileToArchive in filesToArchive)
-            {
-                var entry = archive.CreateEntry(fileToArchive.ArchivePath, CompressionLevel.NoCompression);
-                using (var entryStream = entry.Open())
-                {
-                    fileToArchive.CopyTo(entryStream);
-                }
-
-                progress.Report("Archiving files", ++filesAdded, filesToArchive.Count);
-            }
-        }
-
-        private abstract class ExtractOperation
-        {
-            public ExtractOperation(string destinationPath)
-            {
-                DestinationPath = destinationPath;
-            }
-
-            public string DestinationPath { get; }
-            public virtual void DoOperation()
-            {
-                string directory = Path.GetDirectoryName(DestinationPath);
-
-                if (!Directory.Exists(directory))
-                {
-                    Directory.CreateDirectory(directory);
-                }
-
-                Execute();
-            }
-            protected abstract void Execute();
-        }
-
-        private class CopyOperation : ExtractOperation
-        {
-            public CopyOperation(ExtractSource source, string destinationPath) : base(destinationPath)
-            {
-                Source = source;
-            }
-            public ExtractSource Source { get; }
-            protected override void Execute()
-            {
-                if (Source.LocalPath != null)
-                {
-                    File.Copy(Source.LocalPath, DestinationPath, true);
-                }
-                else
-                {
-                    using (var destinationStream = File.Create(DestinationPath))
-                    {
-                        Source.CopyToStream(destinationStream);
-                    }
-                }
-            }
-        }
-
-        private class ZipOperation : ExtractOperation
-        {
-            public ZipOperation(string destinationPath) : base(destinationPath)
-            {
-            }
-
-            private List<Tuple<string, ExtractSource>> entries = new List<Tuple<string, ExtractSource>>();
-
-            public void AddEntry(string entryName, ExtractSource source)
-            {
-                entries.Add(Tuple.Create(entryName, source));
-            }
-
-            protected override void Execute()
-            {
-                using (var archiveStream = File.Create(DestinationPath))
-                using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create))
-                {
-                    foreach(var zipSource in entries)
-                    {
-                        var entry = archive.CreateEntry(zipSource.Item1, CompressionLevel.Optimal);
-                        using (var entryStream = entry.Open())
-                        {
-                            zipSource.Item2.CopyToStream(entryStream);
-                        }
-                    }
-                }
-            }
-        }
-
-        private class ExtractSource
-        {
-            private string _entryName;
-            private readonly string _localPath;
-            private ThreadLocalZipArchive _archive;
-
-            public ExtractSource(string sourceString, Dictionary<string, string> externalFiles, ThreadLocalZipArchive archive)
-            {
-                if (sourceString[0] == '$')
-                {
-                    var externalHash = sourceString.Substring(1);
-                    if (!externalFiles.TryGetValue(externalHash, out _localPath))
-                    {
-                        throw new Exception("Could not find external file with hash {externalHash}.");
-                    }
-                }
-                else
-                {
-                    _entryName = sourceString;
-                    _archive = archive;
-                }
-            }
-
-            public string LocalPath { get { return _localPath; } }
-
-            public void CopyToStream(Stream destinationStream)
-            {
-                if (_localPath != null)
-                {
-                    using (var sourceStream = File.OpenRead(_localPath))
-                    {
-                        sourceStream.CopyTo(destinationStream);
-                    }
-                }
-                else
-                {
-                    using (var sourceStream = _archive.Archive.GetEntry(_entryName).Open())
-                    {
-                        sourceStream.CopyTo(destinationStream);
-                    }
-                }
-
-            }
-        }
-
-        private static char[] pipeSeperator = new[] { '|' };
-        public void Extract(string compressedArchivePath, string outputDirectory, IProgress<ProgressReport> progress)
-        {
-            using (var archiveStream = CreateTemporaryFileStream())
-            {
-                // decompress the LZMA stream
-                using (var lzmaStream = File.OpenRead(compressedArchivePath))
-                {
-                    CompressionUtility.Decompress(lzmaStream, archiveStream, progress);
-                }
-
-                var archivePath = ((FileStream)archiveStream).Name;
-
-                // reset the uncompressed stream
-                archiveStream.Seek(0, SeekOrigin.Begin);
-
-                // read as a zip archive
-                using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Read))
-                using (var tlArchive = new ThreadLocalZipArchive(archivePath, archive))
-                {
-                    List<ExtractOperation> extractOperations = new List<ExtractOperation>();
-                    Dictionary<string, ExtractSource> sourceCache = new Dictionary<string, ExtractSource>();
-
-                    // process the index to determine all extraction operations
-                    var indexEntry = archive.GetEntry(IndexFileName);
-                    using (var indexReader = new StreamReader(indexEntry.Open()))
-                    {
-                        Dictionary<string, ZipOperation> zipOperations = new Dictionary<string, ZipOperation>(StringComparer.OrdinalIgnoreCase);
-                        for (var line = indexReader.ReadLine(); line != null; line = indexReader.ReadLine())
-                        {
-                            var lineParts = line.Split(pipeSeperator);
-                            if (lineParts.Length != 2)
-                            {
-                                throw new Exception("Unexpected index line format, too many '|'s.");
-                            }
-
-                            string target = lineParts[0];
-                            string source = lineParts[1];
-
-                            ExtractSource extractSource;
-                            if (!sourceCache.TryGetValue(source, out extractSource))
-                            {
-                                sourceCache[source] = extractSource = new ExtractSource(source, _externalFiles, tlArchive);
-                            }
-
-                            var zipSeperatorIndex = target.IndexOf("::", StringComparison.OrdinalIgnoreCase);
-
-                            if (zipSeperatorIndex != -1)
-                            {
-                                string zipRelativePath = target.Substring(0, zipSeperatorIndex);
-                                string zipEntryName = target.Substring(zipSeperatorIndex + 2);
-                                string destinationPath = Path.Combine(outputDirectory, zipRelativePath);
-
-                                // operations on a zip file will be sequential
-                                ZipOperation currentZipOperation;
-
-                                if (!zipOperations.TryGetValue(destinationPath, out currentZipOperation))
-                                {
-                                    extractOperations.Add(currentZipOperation = new ZipOperation(destinationPath));
-                                    zipOperations.Add(destinationPath, currentZipOperation);
-                                }
-                                currentZipOperation.AddEntry(zipEntryName, extractSource);
-                            }
-                            else
-                            {
-                                string destinationPath = Path.Combine(outputDirectory, target);
-                                extractOperations.Add(new CopyOperation(extractSource, destinationPath));
-                            }
-                        }
-                    }
-
-                    int opsExecuted = 0;
-                    // execute all operations
-                    //foreach(var extractOperation in extractOperations)
-                    extractOperations.AsParallel().ForAll(extractOperation =>
-                    {
-                        extractOperation.DoOperation();
-                        progress.Report(LocalizableStrings.Expanding, Interlocked.Increment(ref opsExecuted), extractOperations.Count);
-                    });
-                }
-            }
-        }
-
-        public void AddExternalDirectory(string externalDirectory)
-        {
-            CheckDisposed();
-            foreach (var externalFile in Directory.EnumerateFiles(externalDirectory, "*", SearchOption.AllDirectories))
-            {
-                AddExternalFile(externalFile);
-            }
-        }
-
-        public void AddExternalFile(string externalFile)
-        {
-            CheckDisposed();
-            using (var fs = File.OpenRead(externalFile))
-            {
-                string hash = GetHash(fs); 
-                // $ prefix indicates that the file is not in the archive and path is relative to an external directory
-                _archiveFiles[hash] = new ArchiveSource(null, null, "$" + hash , hash, fs.Length);
-                _externalFiles[hash] = externalFile;
-            }
-        }
-        public void AddDirectory(string sourceDirectory, IProgress<ProgressReport> progress, string destinationDirectory = null)
-        {
-            var sourceFiles = Directory.EnumerateFiles(sourceDirectory, "*", SearchOption.AllDirectories).ToArray();
-            int filesAdded = 0;
-            sourceFiles.AsParallel().ForAll(sourceFile =>
-                {
-                    // path relative to the destination/extracted directory to write the file
-                    string destinationRelativePath = sourceFile.Substring(sourceDirectory.Length + 1);
-
-                    if (destinationDirectory != null)
-                    {
-                        destinationRelativePath = Path.Combine(destinationDirectory, destinationRelativePath);
-                    }
-
-                    string extension = Path.GetExtension(sourceFile);
-
-                    if (ZipExtensions.Any(ze => ze.Equals(extension, StringComparison.OrdinalIgnoreCase)))
-                    {
-                        AddZip(sourceFile, destinationRelativePath);
-                    }
-                    else
-                    {
-                        AddFile(sourceFile, destinationRelativePath);
-                    }
-
-                    progress.Report($"Adding {sourceDirectory}", Interlocked.Increment(ref filesAdded), sourceFiles.Length);
-                });
-        }
-
-        public void AddZip(string sourceZipFile, string destinationZipFile)
-        {
-            CheckDisposed();
-
-            using (var sourceArchive = new ZipArchive(File.OpenRead(sourceZipFile), ZipArchiveMode.Read))
-            {
-                foreach(var entry in sourceArchive.Entries)
-                {
-                    string hash = null;
-                    long size = entry.Length;
-                    string destinationPath = $"{destinationZipFile}::{entry.FullName}";
-                    using (var stream = entry.Open())
-                    {
-                        hash = GetHash(stream);
-                    }
-
-                    AddArchiveSource(sourceZipFile, entry.FullName, destinationPath, hash, size);
-                }
-            }
-        }
-
-        public void AddFile(string sourceFilePath, string destinationPath)
-        {
-            CheckDisposed();
-
-            string hash;
-            long size;
-            // lifetime of this stream is managed by AddStream
-            using (var stream = File.Open(sourceFilePath, FileMode.Open))
-            {
-                hash = GetHash(stream);
-                size = stream.Length;
-            }
-
-            AddArchiveSource(null, sourceFilePath, destinationPath, hash, size);
-        }
-
-        private void AddArchiveSource(string sourceArchive, string sourceFile, string destinationPath, string hash, long size)
-        {
-            lock (_archiveFiles)
-            {
-                _destFiles.Add(new DestinationFileInfo(destinationPath, hash));
-
-                // see if we already have this file in the archive/external
-                ArchiveSource existing = null;
-                if (_archiveFiles.TryGetValue(hash, out existing))
-                {
-                    // if we have raw source file, prefer that over a zipped source file
-                    if (sourceArchive == null && existing.SourceArchive != null)
-                    {
-                        existing.SourceArchive = null;
-                        existing.SourceFile = sourceFile;
-                    }
-                }
-                else
-                {
-                    var archivePath = Path.Combine(hash, Path.GetFileName(destinationPath));
-
-                    _archiveFiles.Add(hash, new ArchiveSource(sourceArchive, sourceFile, archivePath, hash, size));
-                }
-            }
-        }
-
-        public string GetHash(Stream stream)
-        {
-            var hashBytes = _sha.Value.ComputeHash(stream);
-
-            return GetHashString(hashBytes);
-        }
-
-        private static string GetHashString(byte[] hashBytes)
-        {
-            StringBuilder builder = new StringBuilder(hashBytes.Length * 2);
-            foreach (var b in hashBytes)
-            {
-                builder.AppendFormat("{0:x2}", b);
-            }
-            return builder.ToString();
-        }
-
-        public void Dispose()
-        {
-            if (!_disposed)
-            {
-                if (_sha != null)
-                {
-                    _sha.Dispose();
-                    _sha = null;
-                }
-            }
-        }
-
-        private void CheckDisposed()
-        {
-            if (_disposed)
-            {
-                throw new ObjectDisposedException(nameof(IndexedArchive));
-            }
-        }
-    }
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Common/CRC.cs b/src/Microsoft.DotNet.Archive/LZMA/Common/CRC.cs
deleted file mode 100644
index 5d38bf911..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Common/CRC.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// Common/CRC.cs
-
-namespace SevenZip
-{
-	class CRC
-	{
-		public static readonly uint[] Table;
-
-		static CRC()
-		{
-			Table = new uint[256];
-			const uint kPoly = 0xEDB88320;
-			for (uint i = 0; i < 256; i++)
-			{
-				uint r = i;
-				for (int j = 0; j < 8; j++)
-					if ((r & 1) != 0)
-						r = (r >> 1) ^ kPoly;
-					else
-						r >>= 1;
-				Table[i] = r;
-			}
-		}
-
-		uint _value = 0xFFFFFFFF;
-
-		public void Init() { _value = 0xFFFFFFFF; }
-
-		public void UpdateByte(byte b)
-		{
-			_value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8);
-		}
-
-		public void Update(byte[] data, uint offset, uint size)
-		{
-			for (uint i = 0; i < size; i++)
-				_value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8);
-		}
-
-		public uint GetDigest() { return _value ^ 0xFFFFFFFF; }
-
-		static uint CalculateDigest(byte[] data, uint offset, uint size)
-		{
-			CRC crc = new CRC();
-			// crc.Init();
-			crc.Update(data, offset, size);
-			return crc.GetDigest();
-		}
-
-		static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size)
-		{
-			return (CalculateDigest(data, offset, size) == digest);
-		}
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Common/InBuffer.cs b/src/Microsoft.DotNet.Archive/LZMA/Common/InBuffer.cs
deleted file mode 100644
index a26bf4a29..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Common/InBuffer.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// InBuffer.cs
-
-namespace SevenZip.Buffer
-{
-	public class InBuffer
-	{
-		byte[] m_Buffer;
-		uint m_Pos;
-		uint m_Limit;
-		uint m_BufferSize;
-		System.IO.Stream m_Stream;
-		bool m_StreamWasExhausted;
-		ulong m_ProcessedSize;
-
-		public InBuffer(uint bufferSize)
-		{
-			m_Buffer = new byte[bufferSize];
-			m_BufferSize = bufferSize;
-		}
-
-		public void Init(System.IO.Stream stream)
-		{
-			m_Stream = stream;
-			m_ProcessedSize = 0;
-			m_Limit = 0;
-			m_Pos = 0;
-			m_StreamWasExhausted = false;
-		}
-
-		public bool ReadBlock()
-		{
-			if (m_StreamWasExhausted)
-				return false;
-			m_ProcessedSize += m_Pos;
-			int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize);
-			m_Pos = 0;
-			m_Limit = (uint)aNumProcessedBytes;
-			m_StreamWasExhausted = (aNumProcessedBytes == 0);
-			return (!m_StreamWasExhausted);
-		}
-
-
-		public void ReleaseStream()
-		{
-			// m_Stream.Close(); 
-			m_Stream = null;
-		}
-
-		public bool ReadByte(byte b) // check it
-		{
-			if (m_Pos >= m_Limit)
-				if (!ReadBlock())
-					return false;
-			b = m_Buffer[m_Pos++];
-			return true;
-		}
-
-		public byte ReadByte()
-		{
-			// return (byte)m_Stream.ReadByte();
-			if (m_Pos >= m_Limit)
-				if (!ReadBlock())
-					return 0xFF;
-			return m_Buffer[m_Pos++];
-		}
-
-		public ulong GetProcessedSize()
-		{
-			return m_ProcessedSize + m_Pos;
-		}
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Common/OutBuffer.cs b/src/Microsoft.DotNet.Archive/LZMA/Common/OutBuffer.cs
deleted file mode 100644
index 429bccfc9..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Common/OutBuffer.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// OutBuffer.cs
-
-namespace SevenZip.Buffer
-{
-	public class OutBuffer
-	{
-		byte[] m_Buffer;
-		uint m_Pos;
-		uint m_BufferSize;
-		System.IO.Stream m_Stream;
-		ulong m_ProcessedSize;
-
-		public OutBuffer(uint bufferSize)
-		{
-			m_Buffer = new byte[bufferSize];
-			m_BufferSize = bufferSize;
-		}
-
-		public void SetStream(System.IO.Stream stream) { m_Stream = stream; }
-		public void FlushStream() { m_Stream.Flush(); }
-		public void CloseStream() { m_Stream.Dispose(); }
-		public void ReleaseStream() { m_Stream = null; }
-
-		public void Init()
-		{
-			m_ProcessedSize = 0;
-			m_Pos = 0;
-		}
-
-		public void WriteByte(byte b)
-		{
-			m_Buffer[m_Pos++] = b;
-			if (m_Pos >= m_BufferSize)
-				FlushData();
-		}
-
-		public void FlushData()
-		{
-			if (m_Pos == 0)
-				return;
-			m_Stream.Write(m_Buffer, 0, (int)m_Pos);
-			m_Pos = 0;
-		}
-
-		public ulong GetProcessedSize() { return m_ProcessedSize + m_Pos; }
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/IMatchFinder.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/IMatchFinder.cs
deleted file mode 100644
index 2916aedb0..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/IMatchFinder.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// IMatchFinder.cs
-
-using System;
-
-namespace SevenZip.Compression.LZ
-{
-	interface IInWindowStream
-	{
-		void SetStream(System.IO.Stream inStream);
-		void Init();
-		void ReleaseStream();
-		Byte GetIndexByte(Int32 index);
-		UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit);
-		UInt32 GetNumAvailableBytes();
-	}
-
-	interface IMatchFinder : IInWindowStream
-	{
-		void Create(UInt32 historySize, UInt32 keepAddBufferBefore,
-				UInt32 matchMaxLen, UInt32 keepAddBufferAfter);
-		UInt32 GetMatches(UInt32[] distances);
-		void Skip(UInt32 num);
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzBinTree.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzBinTree.cs
deleted file mode 100644
index 017cf8ea2..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzBinTree.cs
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// LzBinTree.cs
-
-using System;
-
-namespace SevenZip.Compression.LZ
-{
-	public class BinTree : InWindow, IMatchFinder
-	{
-		UInt32 _cyclicBufferPos;
-		UInt32 _cyclicBufferSize = 0;
-		UInt32 _matchMaxLen;
-
-		UInt32[] _son;
-		UInt32[] _hash;
-
-		UInt32 _cutValue = 0xFF;
-		UInt32 _hashMask;
-		UInt32 _hashSizeSum = 0;
-
-		bool HASH_ARRAY = true;
-
-		const UInt32 kHash2Size = 1 << 10;
-		const UInt32 kHash3Size = 1 << 16;
-		const UInt32 kBT2HashSize = 1 << 16;
-		const UInt32 kStartMaxLen = 1;
-		const UInt32 kHash3Offset = kHash2Size;
-		const UInt32 kEmptyHashValue = 0;
-		const UInt32 kMaxValForNormalize = ((UInt32)1 << 31) - 1;
-	
-		UInt32 kNumHashDirectBytes = 0;
-		UInt32 kMinMatchCheck = 4;
-		UInt32 kFixHashSize = kHash2Size + kHash3Size;
-		
-		public void SetType(int numHashBytes)
-		{
-			HASH_ARRAY = (numHashBytes > 2);
-			if (HASH_ARRAY)
-			{
-				kNumHashDirectBytes = 0;
-				kMinMatchCheck = 4;
-				kFixHashSize = kHash2Size + kHash3Size;
-			}
-			else
-			{
-				kNumHashDirectBytes = 2;
-				kMinMatchCheck = 2 + 1;
-				kFixHashSize = 0;
-			}
-		}
-
-		public new void SetStream(System.IO.Stream stream) { base.SetStream(stream); }
-		public new void ReleaseStream() { base.ReleaseStream(); }
-		
-		public new void Init()
-		{
-			base.Init();
-			for (UInt32 i = 0; i < _hashSizeSum; i++)
-				_hash[i] = kEmptyHashValue;
-			_cyclicBufferPos = 0;
-			ReduceOffsets(-1);
-		}
-
-		public new void MovePos()
-		{
-			if (++_cyclicBufferPos >= _cyclicBufferSize)
-				_cyclicBufferPos = 0;
-			base.MovePos();
-			if (_pos == kMaxValForNormalize)
-				Normalize();
-		}
-
-		public new Byte GetIndexByte(Int32 index) { return base.GetIndexByte(index); }
-
-		public new UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit)
-		{ return base.GetMatchLen(index, distance, limit); }
-
-		public new UInt32 GetNumAvailableBytes() { return base.GetNumAvailableBytes(); }
-
-		public void Create(UInt32 historySize, UInt32 keepAddBufferBefore,
-				UInt32 matchMaxLen, UInt32 keepAddBufferAfter)
-		{
-			if (historySize > kMaxValForNormalize - 256)
-				throw new Exception();
-			_cutValue = 16 + (matchMaxLen >> 1);
-				
-			UInt32 windowReservSize = (historySize + keepAddBufferBefore +
-					matchMaxLen + keepAddBufferAfter) / 2 + 256;
-
-			base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize);
-
-			_matchMaxLen = matchMaxLen;
-
-			UInt32 cyclicBufferSize = historySize + 1;
-			if (_cyclicBufferSize != cyclicBufferSize)
-				_son = new UInt32[(_cyclicBufferSize = cyclicBufferSize) * 2];
-
-			UInt32 hs = kBT2HashSize;
-
-			if (HASH_ARRAY)
-			{
-				hs = historySize - 1;
-				hs |= (hs >> 1);
-				hs |= (hs >> 2);
-				hs |= (hs >> 4);
-				hs |= (hs >> 8);
-				hs >>= 1;
-				hs |= 0xFFFF;
-				if (hs > (1 << 24))
-					hs >>= 1;
-				_hashMask = hs;
-				hs++;
-				hs += kFixHashSize;
-			}
-			if (hs != _hashSizeSum)
-				_hash = new UInt32[_hashSizeSum = hs];
-		}
-
-		public UInt32 GetMatches(UInt32[] distances)
-		{
-			UInt32 lenLimit;
-			if (_pos + _matchMaxLen <= _streamPos)
-				lenLimit = _matchMaxLen;
-			else
-			{
-				lenLimit = _streamPos - _pos;
-				if (lenLimit < kMinMatchCheck)
-				{
-					MovePos();
-					return 0;
-				}
-			}
-
-			UInt32 offset = 0;
-			UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
-			UInt32 cur = _bufferOffset + _pos;
-			UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize;
-			UInt32 hashValue, hash2Value = 0, hash3Value = 0;
-
-			if (HASH_ARRAY)
-			{
-				UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1];
-				hash2Value = temp & (kHash2Size - 1);
-				temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8);
-				hash3Value = temp & (kHash3Size - 1);
-				hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask;
-			}
-			else
-				hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8);
-
-			UInt32 curMatch = _hash[kFixHashSize + hashValue];
-			if (HASH_ARRAY)
-			{
-				UInt32 curMatch2 = _hash[hash2Value];
-				UInt32 curMatch3 = _hash[kHash3Offset + hash3Value];
-				_hash[hash2Value] = _pos;
-				_hash[kHash3Offset + hash3Value] = _pos;
-				if (curMatch2 > matchMinPos)
-					if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur])
-					{
-						distances[offset++] = maxLen = 2;
-						distances[offset++] = _pos - curMatch2 - 1;
-					}
-				if (curMatch3 > matchMinPos)
-					if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur])
-					{
-						if (curMatch3 == curMatch2)
-							offset -= 2;
-						distances[offset++] = maxLen = 3;
-						distances[offset++] = _pos - curMatch3 - 1;
-						curMatch2 = curMatch3;
-					}
-				if (offset != 0 && curMatch2 == curMatch)
-				{
-					offset -= 2;
-					maxLen = kStartMaxLen;
-				}
-			}
-
-			_hash[kFixHashSize + hashValue] = _pos;
-
-			UInt32 ptr0 = (_cyclicBufferPos << 1) + 1;
-			UInt32 ptr1 = (_cyclicBufferPos << 1);
-
-			UInt32 len0, len1;
-			len0 = len1 = kNumHashDirectBytes;
-			
-			if (kNumHashDirectBytes != 0)
-			{
-				if (curMatch > matchMinPos)
-				{
-					if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] !=
-							_bufferBase[cur + kNumHashDirectBytes])
-					{
-						distances[offset++] = maxLen = kNumHashDirectBytes;
-						distances[offset++] = _pos - curMatch - 1;
-					}
-				}
-			}
-			
-			UInt32 count = _cutValue;
-			
-			while(true)
-			{
-				if(curMatch <= matchMinPos || count-- == 0)
-				{
-					_son[ptr0] = _son[ptr1] = kEmptyHashValue;
-					break;
-				}
-				UInt32 delta = _pos - curMatch;
-				UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ?
-							(_cyclicBufferPos - delta) :
-							(_cyclicBufferPos - delta + _cyclicBufferSize)) << 1;
-
-				UInt32 pby1 = _bufferOffset + curMatch;
-				UInt32 len = Math.Min(len0, len1);
-				if (_bufferBase[pby1 + len] == _bufferBase[cur + len])
-				{
-					while(++len != lenLimit)
-						if (_bufferBase[pby1 + len] != _bufferBase[cur + len])
-							break;
-					if (maxLen < len)
-					{
-						distances[offset++] = maxLen = len;
-						distances[offset++] = delta - 1;
-						if (len == lenLimit)
-						{
-							_son[ptr1] = _son[cyclicPos];
-							_son[ptr0] = _son[cyclicPos + 1];
-							break;
-						}
-					}
-				}
-				if (_bufferBase[pby1 + len] < _bufferBase[cur + len])
-				{
-					_son[ptr1] = curMatch;
-					ptr1 = cyclicPos + 1;
-					curMatch = _son[ptr1];
-					len1 = len;
-				}
-				else
-				{
-					_son[ptr0] = curMatch;
-					ptr0 = cyclicPos;
-					curMatch = _son[ptr0];
-					len0 = len;
-				}
-			}
-			MovePos();
-			return offset;
-		}
-
-		public void Skip(UInt32 num)
-		{
-			do
-			{
-				UInt32 lenLimit;
-				if (_pos + _matchMaxLen <= _streamPos)
-					lenLimit = _matchMaxLen;
-				else
-				{
-					lenLimit = _streamPos - _pos;
-					if (lenLimit < kMinMatchCheck)
-					{
-						MovePos();
-						continue;
-					}
-				}
-
-				UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
-				UInt32 cur = _bufferOffset + _pos;
-
-				UInt32 hashValue;
-
-				if (HASH_ARRAY)
-				{
-					UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1];
-					UInt32 hash2Value = temp & (kHash2Size - 1);
-					_hash[hash2Value] = _pos;
-					temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8);
-					UInt32 hash3Value = temp & (kHash3Size - 1);
-					_hash[kHash3Offset + hash3Value] = _pos;
-					hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask;
-				}
-				else
-					hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8);
-
-				UInt32 curMatch = _hash[kFixHashSize + hashValue];
-				_hash[kFixHashSize + hashValue] = _pos;
-
-				UInt32 ptr0 = (_cyclicBufferPos << 1) + 1;
-				UInt32 ptr1 = (_cyclicBufferPos << 1);
-
-				UInt32 len0, len1;
-				len0 = len1 = kNumHashDirectBytes;
-
-				UInt32 count = _cutValue;
-				while (true)
-				{
-					if (curMatch <= matchMinPos || count-- == 0)
-					{
-						_son[ptr0] = _son[ptr1] = kEmptyHashValue;
-						break;
-					}
-
-					UInt32 delta = _pos - curMatch;
-					UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ?
-								(_cyclicBufferPos - delta) :
-								(_cyclicBufferPos - delta + _cyclicBufferSize)) << 1;
-
-					UInt32 pby1 = _bufferOffset + curMatch;
-					UInt32 len = Math.Min(len0, len1);
-					if (_bufferBase[pby1 + len] == _bufferBase[cur + len])
-					{
-						while (++len != lenLimit)
-							if (_bufferBase[pby1 + len] != _bufferBase[cur + len])
-								break;
-						if (len == lenLimit)
-						{
-							_son[ptr1] = _son[cyclicPos];
-							_son[ptr0] = _son[cyclicPos + 1];
-							break;
-						}
-					}
-					if (_bufferBase[pby1 + len] < _bufferBase[cur + len])
-					{
-						_son[ptr1] = curMatch;
-						ptr1 = cyclicPos + 1;
-						curMatch = _son[ptr1];
-						len1 = len;
-					}
-					else
-					{
-						_son[ptr0] = curMatch;
-						ptr0 = cyclicPos;
-						curMatch = _son[ptr0];
-						len0 = len;
-					}
-				}
-				MovePos();
-			}
-			while (--num != 0);
-		}
-
-		void NormalizeLinks(UInt32[] items, UInt32 numItems, UInt32 subValue)
-		{
-			for (UInt32 i = 0; i < numItems; i++)
-			{
-				UInt32 value = items[i];
-				if (value <= subValue)
-					value = kEmptyHashValue;
-				else
-					value -= subValue;
-				items[i] = value;
-			}
-		}
-
-		void Normalize()
-		{
-			UInt32 subValue = _pos - _cyclicBufferSize;
-			NormalizeLinks(_son, _cyclicBufferSize * 2, subValue);
-			NormalizeLinks(_hash, _hashSizeSum, subValue);
-			ReduceOffsets((Int32)subValue);
-		}
-
-		public void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; }
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzInWindow.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzInWindow.cs
deleted file mode 100644
index 1ee8282f1..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzInWindow.cs
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// LzInWindow.cs
-
-using System;
-
-namespace SevenZip.Compression.LZ
-{
-	public class InWindow
-	{
-		public Byte[] _bufferBase = null; // pointer to buffer with data
-		System.IO.Stream _stream;
-		UInt32 _posLimit; // offset (from _buffer) of first byte when new block reading must be done
-		bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream
-
-		UInt32 _pointerToLastSafePosition;
-
-		public UInt32 _bufferOffset;
-
-		public UInt32 _blockSize; // Size of Allocated memory block
-		public UInt32 _pos; // offset (from _buffer) of curent byte
-		UInt32 _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos
-		UInt32 _keepSizeAfter; // how many BYTEs must be kept buffer after _pos
-		public UInt32 _streamPos; // offset (from _buffer) of first not read byte from Stream
-
-		public void MoveBlock()
-		{
-			UInt32 offset = (UInt32)(_bufferOffset) + _pos - _keepSizeBefore;
-			// we need one additional byte, since MovePos moves on 1 byte.
-			if (offset > 0)
-				offset--;
-			
-			UInt32 numBytes = (UInt32)(_bufferOffset) + _streamPos - offset;
-
-			// check negative offset ????
-			for (UInt32 i = 0; i < numBytes; i++)
-				_bufferBase[i] = _bufferBase[offset + i];
-			_bufferOffset -= offset;
-		}
-
-		public virtual void ReadBlock()
-		{
-			if (_streamEndWasReached)
-				return;
-			while (true)
-			{
-				int size = (int)((0 - _bufferOffset) + _blockSize - _streamPos);
-				if (size == 0)
-					return;
-				int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size);
-				if (numReadBytes == 0)
-				{
-					_posLimit = _streamPos;
-					UInt32 pointerToPostion = _bufferOffset + _posLimit;
-					if (pointerToPostion > _pointerToLastSafePosition)
-						_posLimit = (UInt32)(_pointerToLastSafePosition - _bufferOffset);
-
-					_streamEndWasReached = true;
-					return;
-				}
-				_streamPos += (UInt32)numReadBytes;
-				if (_streamPos >= _pos + _keepSizeAfter)
-					_posLimit = _streamPos - _keepSizeAfter;
-			}
-		}
-
-		void Free() { _bufferBase = null; }
-
-		public void Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv)
-		{
-			_keepSizeBefore = keepSizeBefore;
-			_keepSizeAfter = keepSizeAfter;
-			UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;
-			if (_bufferBase == null || _blockSize != blockSize)
-			{
-				Free();
-				_blockSize = blockSize;
-				_bufferBase = new Byte[_blockSize];
-			}
-			_pointerToLastSafePosition = _blockSize - keepSizeAfter;
-		}
-
-		public void SetStream(System.IO.Stream stream) { _stream = stream; }
-		public void ReleaseStream() { _stream = null; }
-
-		public void Init()
-		{
-			_bufferOffset = 0;
-			_pos = 0;
-			_streamPos = 0;
-			_streamEndWasReached = false;
-			ReadBlock();
-		}
-
-		public void MovePos()
-		{
-			_pos++;
-			if (_pos > _posLimit)
-			{
-				UInt32 pointerToPostion = _bufferOffset + _pos;
-				if (pointerToPostion > _pointerToLastSafePosition)
-					MoveBlock();
-				ReadBlock();
-			}
-		}
-
-		public Byte GetIndexByte(Int32 index) { return _bufferBase[_bufferOffset + _pos + index]; }
-
-		// index + limit have not to exceed _keepSizeAfter;
-		public UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit)
-		{
-			if (_streamEndWasReached)
-				if ((_pos + index) + limit > _streamPos)
-					limit = _streamPos - (UInt32)(_pos + index);
-			distance++;
-			// Byte *pby = _buffer + (size_t)_pos + index;
-			UInt32 pby = _bufferOffset + _pos + (UInt32)index;
-
-			UInt32 i;
-			for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++);
-			return i;
-		}
-
-		public UInt32 GetNumAvailableBytes() { return _streamPos - _pos; }
-
-		public void ReduceOffsets(Int32 subValue)
-		{
-			_bufferOffset += (UInt32)subValue;
-			_posLimit -= (UInt32)subValue;
-			_pos -= (UInt32)subValue;
-			_streamPos -= (UInt32)subValue;
-		}
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzOutWindow.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzOutWindow.cs
deleted file mode 100644
index 479ae4f13..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZ/LzOutWindow.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// LzOutWindow.cs
-
-namespace SevenZip.Compression.LZ
-{
-	public class OutWindow
-	{
-		byte[] _buffer = null;
-		uint _pos;
-		uint _windowSize = 0;
-		uint _streamPos;
-		System.IO.Stream _stream;
-
-		public uint TrainSize = 0;
-
-		public void Create(uint windowSize)
-		{
-			if (_windowSize != windowSize)
-			{
-				// System.GC.Collect();
-				_buffer = new byte[windowSize];
-			}
-			_windowSize = windowSize;
-			_pos = 0;
-			_streamPos = 0;
-		}
-
-		public void Init(System.IO.Stream stream, bool solid)
-		{
-			ReleaseStream();
-			_stream = stream;
-			if (!solid)
-			{
-				_streamPos = 0;
-				_pos = 0;
-				TrainSize = 0;
-			}
-		}
-	
-		public bool Train(System.IO.Stream stream)
-		{
-			long len = stream.Length;
-			uint size = (len < _windowSize) ? (uint)len : _windowSize;
-			TrainSize = size;
-			stream.Position = len - size;
-			_streamPos = _pos = 0;
-			while (size > 0)
-			{
-				uint curSize = _windowSize - _pos;
-				if (size < curSize)
-					curSize = size;
-				int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize);
-				if (numReadBytes == 0)
-					return false;
-				size -= (uint)numReadBytes;
-				_pos += (uint)numReadBytes;
-				_streamPos += (uint)numReadBytes;
-				if (_pos == _windowSize)
-					_streamPos = _pos = 0;
-			}
-			return true;
-		}
-
-		public void ReleaseStream()
-		{
-			Flush();
-			_stream = null;
-		}
-
-		public void Flush()
-		{
-			uint size = _pos - _streamPos;
-			if (size == 0)
-				return;
-			_stream.Write(_buffer, (int)_streamPos, (int)size);
-			if (_pos >= _windowSize)
-				_pos = 0;
-			_streamPos = _pos;
-		}
-
-		public void CopyBlock(uint distance, uint len)
-		{
-			uint pos = _pos - distance - 1;
-			if (pos >= _windowSize)
-				pos += _windowSize;
-			for (; len > 0; len--)
-			{
-				if (pos >= _windowSize)
-					pos = 0;
-				_buffer[_pos++] = _buffer[pos++];
-				if (_pos >= _windowSize)
-					Flush();
-			}
-		}
-
-		public void PutByte(byte b)
-		{
-			_buffer[_pos++] = b;
-			if (_pos >= _windowSize)
-				Flush();
-		}
-
-		public byte GetByte(uint distance)
-		{
-			uint pos = _pos - distance - 1;
-			if (pos >= _windowSize)
-				pos += _windowSize;
-			return _buffer[pos];
-		}
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaBase.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaBase.cs
deleted file mode 100644
index f4a8f823f..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaBase.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// LzmaBase.cs
-
-namespace SevenZip.Compression.LZMA
-{
-	internal abstract class Base
-	{
-		public const uint kNumRepDistances = 4;
-		public const uint kNumStates = 12;
-
-		// static byte []kLiteralNextStates  = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
-		// static byte []kMatchNextStates    = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
-		// static byte []kRepNextStates      = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
-		// static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
-
-		public struct State
-		{
-			public uint Index;
-			public void Init() { Index = 0; }
-			public void UpdateChar()
-			{
-				if (Index < 4) Index = 0;
-				else if (Index < 10) Index -= 3;
-				else Index -= 6;
-			}
-			public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); }
-			public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); }
-			public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); }
-			public bool IsCharState() { return Index < 7; }
-		}
-
-		public const int kNumPosSlotBits = 6;
-		public const int kDicLogSizeMin = 0;
-		// public const int kDicLogSizeMax = 30;
-		// public const uint kDistTableSizeMax = kDicLogSizeMax * 2;
-
-		public const int kNumLenToPosStatesBits = 2; // it's for speed optimization
-		public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits;
-
-		public const uint kMatchMinLen = 2;
-
-		public static uint GetLenToPosState(uint len)
-		{
-			len -= kMatchMinLen;
-			if (len < kNumLenToPosStates)
-				return len;
-			return (uint)(kNumLenToPosStates - 1);
-		}
-
-		public const int kNumAlignBits = 4;
-		public const uint kAlignTableSize = 1 << kNumAlignBits;
-		public const uint kAlignMask = (kAlignTableSize - 1);
-
-		public const uint kStartPosModelIndex = 4;
-		public const uint kEndPosModelIndex = 14;
-		public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
-
-		public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2);
-
-		public const uint kNumLitPosStatesBitsEncodingMax = 4;
-		public const uint kNumLitContextBitsMax = 8;
-
-		public const int kNumPosStatesBitsMax = 4;
-		public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
-		public const int kNumPosStatesBitsEncodingMax = 4;
-		public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
-
-		public const int kNumLowLenBits = 3;
-		public const int kNumMidLenBits = 3;
-		public const int kNumHighLenBits = 8;
-		public const uint kNumLowLenSymbols = 1 << kNumLowLenBits;
-		public const uint kNumMidLenSymbols = 1 << kNumMidLenBits;
-		public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols +
-				(1 << kNumHighLenBits);
-		public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1;
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaDecoder.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaDecoder.cs
deleted file mode 100644
index 95d42eed0..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaDecoder.cs
+++ /dev/null
@@ -1,402 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// LzmaDecoder.cs
-
-using System;
-
-namespace SevenZip.Compression.LZMA
-{
-	using RangeCoder;
-
-	public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream
-	{
-		class LenDecoder
-		{
-			BitDecoder m_Choice = new BitDecoder();
-			BitDecoder m_Choice2 = new BitDecoder();
-			BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax];
-			BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax];
-			BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits);
-			uint m_NumPosStates = 0;
-
-			public void Create(uint numPosStates)
-			{
-				for (uint posState = m_NumPosStates; posState < numPosStates; posState++)
-				{
-					m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits);
-					m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits);
-				}
-				m_NumPosStates = numPosStates;
-			}
-
-			public void Init()
-			{
-				m_Choice.Init();
-				for (uint posState = 0; posState < m_NumPosStates; posState++)
-				{
-					m_LowCoder[posState].Init();
-					m_MidCoder[posState].Init();
-				}
-				m_Choice2.Init();
-				m_HighCoder.Init();
-			}
-
-			public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState)
-			{
-				if (m_Choice.Decode(rangeDecoder) == 0)
-					return m_LowCoder[posState].Decode(rangeDecoder);
-				else
-				{
-					uint symbol = Base.kNumLowLenSymbols;
-					if (m_Choice2.Decode(rangeDecoder) == 0)
-						symbol += m_MidCoder[posState].Decode(rangeDecoder);
-					else
-					{
-						symbol += Base.kNumMidLenSymbols;
-						symbol += m_HighCoder.Decode(rangeDecoder);
-					}
-					return symbol;
-				}
-			}
-		}
-
-		class LiteralDecoder
-		{
-			struct Decoder2
-			{
-				BitDecoder[] m_Decoders;
-				public void Create() { m_Decoders = new BitDecoder[0x300]; }
-				public void Init() { for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); }
-
-				public byte DecodeNormal(RangeCoder.Decoder rangeDecoder)
-				{
-					uint symbol = 1;
-					do
-						symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder);
-					while (symbol < 0x100);
-					return (byte)symbol;
-				}
-
-				public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte)
-				{
-					uint symbol = 1;
-					do
-					{
-						uint matchBit = (uint)(matchByte >> 7) & 1;
-						matchByte <<= 1;
-						uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder);
-						symbol = (symbol << 1) | bit;
-						if (matchBit != bit)
-						{
-							while (symbol < 0x100)
-								symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder);
-							break;
-						}
-					}
-					while (symbol < 0x100);
-					return (byte)symbol;
-				}
-			}
-
-			Decoder2[] m_Coders;
-			int m_NumPrevBits;
-			int m_NumPosBits;
-			uint m_PosMask;
-
-			public void Create(int numPosBits, int numPrevBits)
-			{
-				if (m_Coders != null && m_NumPrevBits == numPrevBits &&
-					m_NumPosBits == numPosBits)
-					return;
-				m_NumPosBits = numPosBits;
-				m_PosMask = ((uint)1 << numPosBits) - 1;
-				m_NumPrevBits = numPrevBits;
-				uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
-				m_Coders = new Decoder2[numStates];
-				for (uint i = 0; i < numStates; i++)
-					m_Coders[i].Create();
-			}
-
-			public void Init()
-			{
-				uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
-				for (uint i = 0; i < numStates; i++)
-					m_Coders[i].Init();
-			}
-
-			uint GetState(uint pos, byte prevByte)
-			{ return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); }
-
-			public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte)
-			{ return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); }
-
-			public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte)
-			{ return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); }
-		};
-
-		LZ.OutWindow m_OutWindow = new LZ.OutWindow();
-		RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder();
-
-		BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
-		BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates];
-		BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates];
-		BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates];
-		BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates];
-		BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
-
-		BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates];
-		BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex];
-
-		BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits);
-
-		LenDecoder m_LenDecoder = new LenDecoder();
-		LenDecoder m_RepLenDecoder = new LenDecoder();
-
-		LiteralDecoder m_LiteralDecoder = new LiteralDecoder();
-
-		uint m_DictionarySize;
-		uint m_DictionarySizeCheck;
-
-		uint m_PosStateMask;
-
-		public Decoder()
-		{
-			m_DictionarySize = 0xFFFFFFFF;
-			for (int i = 0; i < Base.kNumLenToPosStates; i++)
-				m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits);
-		}
-
-		void SetDictionarySize(uint dictionarySize)
-		{
-			if (m_DictionarySize != dictionarySize)
-			{
-				m_DictionarySize = dictionarySize;
-				m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1);
-				uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12));
-				m_OutWindow.Create(blockSize);
-			}
-		}
-
-		void SetLiteralProperties(int lp, int lc)
-		{
-			if (lp > 8)
-				throw new InvalidParamException();
-			if (lc > 8)
-				throw new InvalidParamException();
-			m_LiteralDecoder.Create(lp, lc);
-		}
-
-		void SetPosBitsProperties(int pb)
-		{
-			if (pb > Base.kNumPosStatesBitsMax)
-				throw new InvalidParamException();
-			uint numPosStates = (uint)1 << pb;
-			m_LenDecoder.Create(numPosStates);
-			m_RepLenDecoder.Create(numPosStates);
-			m_PosStateMask = numPosStates - 1;
-		}
-
-		bool _solid = false;
-		void Init(System.IO.Stream inStream, System.IO.Stream outStream)
-		{
-			m_RangeDecoder.Init(inStream);
-			m_OutWindow.Init(outStream, _solid);
-
-			uint i;
-			for (i = 0; i < Base.kNumStates; i++)
-			{
-				for (uint j = 0; j <= m_PosStateMask; j++)
-				{
-					uint index = (i << Base.kNumPosStatesBitsMax) + j;
-					m_IsMatchDecoders[index].Init();
-					m_IsRep0LongDecoders[index].Init();
-				}
-				m_IsRepDecoders[i].Init();
-				m_IsRepG0Decoders[i].Init();
-				m_IsRepG1Decoders[i].Init();
-				m_IsRepG2Decoders[i].Init();
-			}
-
-			m_LiteralDecoder.Init();
-			for (i = 0; i < Base.kNumLenToPosStates; i++)
-				m_PosSlotDecoder[i].Init();
-			// m_PosSpecDecoder.Init();
-			for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++)
-				m_PosDecoders[i].Init();
-
-			m_LenDecoder.Init();
-			m_RepLenDecoder.Init();
-			m_PosAlignDecoder.Init();
-		}
-
-		public void Code(System.IO.Stream inStream, System.IO.Stream outStream,
-			Int64 inSize, Int64 outSize, ICodeProgress progress)
-		{
-			Init(inStream, outStream);
-
-			Base.State state = new Base.State();
-			state.Init();
-			uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0;
-
-			UInt64 nowPos64 = 0;
-			UInt64 outSize64 = (UInt64)outSize;
-			if (nowPos64 < outSize64)
-			{
-				if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0)
-					throw new DataErrorException();
-				state.UpdateChar();
-				byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0);
-				m_OutWindow.PutByte(b);
-				nowPos64++;
-			}
-			while (nowPos64 < outSize64)
-			{
-                progress.SetProgress(inStream.Position, (long)nowPos64);
-				// UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64);
-					// while(nowPos64 < next)
-				{
-					uint posState = (uint)nowPos64 & m_PosStateMask;
-					if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
-					{
-						byte b;
-						byte prevByte = m_OutWindow.GetByte(0);
-						if (!state.IsCharState())
-							b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder,
-								(uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0));
-						else
-							b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte);
-						m_OutWindow.PutByte(b);
-						state.UpdateChar();
-						nowPos64++;
-					}
-					else
-					{
-						uint len;
-						if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1)
-						{
-							if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0)
-							{
-								if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
-								{
-									state.UpdateShortRep();
-									m_OutWindow.PutByte(m_OutWindow.GetByte(rep0));
-									nowPos64++;
-									continue;
-								}
-							}
-							else
-							{
-								UInt32 distance;
-								if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0)
-								{
-									distance = rep1;
-								}
-								else
-								{
-									if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0)
-										distance = rep2;
-									else
-									{
-										distance = rep3;
-										rep3 = rep2;
-									}
-									rep2 = rep1;
-								}
-								rep1 = rep0;
-								rep0 = distance;
-							}
-							len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen;
-							state.UpdateRep();
-						}
-						else
-						{
-							rep3 = rep2;
-							rep2 = rep1;
-							rep1 = rep0;
-							len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState);
-							state.UpdateMatch();
-							uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder);
-							if (posSlot >= Base.kStartPosModelIndex)
-							{
-								int numDirectBits = (int)((posSlot >> 1) - 1);
-								rep0 = ((2 | (posSlot & 1)) << numDirectBits);
-								if (posSlot < Base.kEndPosModelIndex)
-									rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders,
-											rep0 - posSlot - 1, m_RangeDecoder, numDirectBits);
-								else
-								{
-									rep0 += (m_RangeDecoder.DecodeDirectBits(
-										numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits);
-									rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder);
-								}
-							}
-							else
-								rep0 = posSlot;
-						}
-						if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck)
-						{
-							if (rep0 == 0xFFFFFFFF)
-								break;
-							throw new DataErrorException();
-						}
-						m_OutWindow.CopyBlock(rep0, len);
-						nowPos64 += len;
-					}
-				}
-			}
-			m_OutWindow.Flush();
-			m_OutWindow.ReleaseStream();
-			m_RangeDecoder.ReleaseStream();
-		}
-
-		public void SetDecoderProperties(byte[] properties)
-		{
-			if (properties.Length < 5)
-				throw new InvalidParamException();
-			int lc = properties[0] % 9;
-			int remainder = properties[0] / 9;
-			int lp = remainder % 5;
-			int pb = remainder / 5;
-			if (pb > Base.kNumPosStatesBitsMax)
-				throw new InvalidParamException();
-			UInt32 dictionarySize = 0;
-			for (int i = 0; i < 4; i++)
-				dictionarySize += ((UInt32)(properties[1 + i])) << (i * 8);
-			SetDictionarySize(dictionarySize);
-			SetLiteralProperties(lp, lc);
-			SetPosBitsProperties(pb);
-		}
-
-		public bool Train(System.IO.Stream stream)
-		{
-			_solid = true;
-			return m_OutWindow.Train(stream);
-		}
-
-		/*
-		public override bool CanRead { get { return true; }}
-		public override bool CanWrite { get { return true; }}
-		public override bool CanSeek { get { return true; }}
-		public override long Length { get { return 0; }}
-		public override long Position
-		{
-			get { return 0;	}
-			set { }
-		}
-		public override void Flush() { }
-		public override int Read(byte[] buffer, int offset, int count) 
-		{
-			return 0;
-		}
-		public override void Write(byte[] buffer, int offset, int count)
-		{
-		}
-		public override long Seek(long offset, System.IO.SeekOrigin origin)
-		{
-			return 0;
-		}
-		public override void SetLength(long value) {}
-		*/
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaEncoder.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaEncoder.cs
deleted file mode 100644
index 527a67e0c..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/LZMA/LzmaEncoder.cs
+++ /dev/null
@@ -1,1483 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// LzmaEncoder.cs
-
-using System;
-
-namespace SevenZip.Compression.LZMA
-{
-	using RangeCoder;
-
-	public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties
-	{
-		enum EMatchFinderType
-		{
-			BT2,
-			BT4,
-		};
-
-		const UInt32 kIfinityPrice = 0xFFFFFFF;
-
-		static Byte[] g_FastPos = new Byte[1 << 11];
-
-		static Encoder()
-		{
-			const Byte kFastSlots = 22;
-			int c = 2;
-			g_FastPos[0] = 0;
-			g_FastPos[1] = 1;
-			for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++)
-			{
-				UInt32 k = ((UInt32)1 << ((slotFast >> 1) - 1));
-				for (UInt32 j = 0; j < k; j++, c++)
-					g_FastPos[c] = slotFast;
-			}
-		}
-
-		static UInt32 GetPosSlot(UInt32 pos)
-		{
-			if (pos < (1 << 11))
-				return g_FastPos[pos];
-			if (pos < (1 << 21))
-				return (UInt32)(g_FastPos[pos >> 10] + 20);
-			return (UInt32)(g_FastPos[pos >> 20] + 40);
-		}
-
-		static UInt32 GetPosSlot2(UInt32 pos)
-		{
-			if (pos < (1 << 17))
-				return (UInt32)(g_FastPos[pos >> 6] + 12);
-			if (pos < (1 << 27))
-				return (UInt32)(g_FastPos[pos >> 16] + 32);
-			return (UInt32)(g_FastPos[pos >> 26] + 52);
-		}
-
-		Base.State _state = new Base.State();
-		Byte _previousByte;
-		UInt32[] _repDistances = new UInt32[Base.kNumRepDistances];
-
-		void BaseInit()
-		{
-			_state.Init();
-			_previousByte = 0;
-			for (UInt32 i = 0; i < Base.kNumRepDistances; i++)
-				_repDistances[i] = 0;
-		}
-
-		const int kDefaultDictionaryLogSize = 22;
-		const UInt32 kNumFastBytesDefault = 0x20;
-
-		class LiteralEncoder
-		{
-			public struct Encoder2
-			{
-				BitEncoder[] m_Encoders;
-
-				public void Create() { m_Encoders = new BitEncoder[0x300]; }
-
-				public void Init() { for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); }
-
-				public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol)
-				{
-					uint context = 1;
-					for (int i = 7; i >= 0; i--)
-					{
-						uint bit = (uint)((symbol >> i) & 1);
-						m_Encoders[context].Encode(rangeEncoder, bit);
-						context = (context << 1) | bit;
-					}
-				}
-
-				public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol)
-				{
-					uint context = 1;
-					bool same = true;
-					for (int i = 7; i >= 0; i--)
-					{
-						uint bit = (uint)((symbol >> i) & 1);
-						uint state = context;
-						if (same)
-						{
-							uint matchBit = (uint)((matchByte >> i) & 1);
-							state += ((1 + matchBit) << 8);
-							same = (matchBit == bit);
-						}
-						m_Encoders[state].Encode(rangeEncoder, bit);
-						context = (context << 1) | bit;
-					}
-				}
-
-				public uint GetPrice(bool matchMode, byte matchByte, byte symbol)
-				{
-					uint price = 0;
-					uint context = 1;
-					int i = 7;
-					if (matchMode)
-					{
-						for (; i >= 0; i--)
-						{
-							uint matchBit = (uint)(matchByte >> i) & 1;
-							uint bit = (uint)(symbol >> i) & 1;
-							price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit);
-							context = (context << 1) | bit;
-							if (matchBit != bit)
-							{
-								i--;
-								break;
-							}
-						}
-					}
-					for (; i >= 0; i--)
-					{
-						uint bit = (uint)(symbol >> i) & 1;
-						price += m_Encoders[context].GetPrice(bit);
-						context = (context << 1) | bit;
-					}
-					return price;
-				}
-			}
-
-			Encoder2[] m_Coders;
-			int m_NumPrevBits;
-			int m_NumPosBits;
-			uint m_PosMask;
-
-			public void Create(int numPosBits, int numPrevBits)
-			{
-				if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits)
-					return;
-				m_NumPosBits = numPosBits;
-				m_PosMask = ((uint)1 << numPosBits) - 1;
-				m_NumPrevBits = numPrevBits;
-				uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
-				m_Coders = new Encoder2[numStates];
-				for (uint i = 0; i < numStates; i++)
-					m_Coders[i].Create();
-			}
-
-			public void Init()
-			{
-				uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
-				for (uint i = 0; i < numStates; i++)
-					m_Coders[i].Init();
-			}
-
-			public Encoder2 GetSubCoder(UInt32 pos, Byte prevByte)
-			{ return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; }
-		}
-
-		class LenEncoder
-		{
-			RangeCoder.BitEncoder _choice = new RangeCoder.BitEncoder();
-			RangeCoder.BitEncoder _choice2 = new RangeCoder.BitEncoder();
-			RangeCoder.BitTreeEncoder[] _lowCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax];
-			RangeCoder.BitTreeEncoder[] _midCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax];
-			RangeCoder.BitTreeEncoder _highCoder = new RangeCoder.BitTreeEncoder(Base.kNumHighLenBits);
-
-			public LenEncoder()
-			{
-				for (UInt32 posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++)
-				{
-					_lowCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumLowLenBits);
-					_midCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumMidLenBits);
-				}
-			}
-
-			public void Init(UInt32 numPosStates)
-			{
-				_choice.Init();
-				_choice2.Init();
-				for (UInt32 posState = 0; posState < numPosStates; posState++)
-				{
-					_lowCoder[posState].Init();
-					_midCoder[posState].Init();
-				}
-				_highCoder.Init();
-			}
-
-			public void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState)
-			{
-				if (symbol < Base.kNumLowLenSymbols)
-				{
-					_choice.Encode(rangeEncoder, 0);
-					_lowCoder[posState].Encode(rangeEncoder, symbol);
-				}
-				else
-				{
-					symbol -= Base.kNumLowLenSymbols;
-					_choice.Encode(rangeEncoder, 1);
-					if (symbol < Base.kNumMidLenSymbols)
-					{
-						_choice2.Encode(rangeEncoder, 0);
-						_midCoder[posState].Encode(rangeEncoder, symbol);
-					}
-					else
-					{
-						_choice2.Encode(rangeEncoder, 1);
-						_highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols);
-					}
-				}
-			}
-
-			public void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32[] prices, UInt32 st)
-			{
-				UInt32 a0 = _choice.GetPrice0();
-				UInt32 a1 = _choice.GetPrice1();
-				UInt32 b0 = a1 + _choice2.GetPrice0();
-				UInt32 b1 = a1 + _choice2.GetPrice1();
-				UInt32 i = 0;
-				for (i = 0; i < Base.kNumLowLenSymbols; i++)
-				{
-					if (i >= numSymbols)
-						return;
-					prices[st + i] = a0 + _lowCoder[posState].GetPrice(i);
-				}
-				for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++)
-				{
-					if (i >= numSymbols)
-						return;
-					prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols);
-				}
-				for (; i < numSymbols; i++)
-					prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols);
-			}
-		};
-
-		const UInt32 kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols;
-
-		class LenPriceTableEncoder : LenEncoder
-		{
-			UInt32[] _prices = new UInt32[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax];
-			UInt32 _tableSize;
-			UInt32[] _counters = new UInt32[Base.kNumPosStatesEncodingMax];
-
-			public void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; }
-
-			public UInt32 GetPrice(UInt32 symbol, UInt32 posState)
-			{
-				return _prices[posState * Base.kNumLenSymbols + symbol];
-			}
-
-			void UpdateTable(UInt32 posState)
-			{
-				SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols);
-				_counters[posState] = _tableSize;
-			}
-
-			public void UpdateTables(UInt32 numPosStates)
-			{
-				for (UInt32 posState = 0; posState < numPosStates; posState++)
-					UpdateTable(posState);
-			}
-
-			public new void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState)
-			{
-				base.Encode(rangeEncoder, symbol, posState);
-				if (--_counters[posState] == 0)
-					UpdateTable(posState);
-			}
-		}
-
-		const UInt32 kNumOpts = 1 << 12;
-		class Optimal
-		{
-			public Base.State State;
-
-			public bool Prev1IsChar;
-			public bool Prev2;
-
-			public UInt32 PosPrev2;
-			public UInt32 BackPrev2;
-
-			public UInt32 Price;
-			public UInt32 PosPrev;
-			public UInt32 BackPrev;
-
-			public UInt32 Backs0;
-			public UInt32 Backs1;
-			public UInt32 Backs2;
-			public UInt32 Backs3;
-
-			public void MakeAsChar() { BackPrev = 0xFFFFFFFF; Prev1IsChar = false; }
-			public void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; }
-			public bool IsShortRep() { return (BackPrev == 0); }
-		};
-		Optimal[] _optimum = new Optimal[kNumOpts];
-		LZ.IMatchFinder _matchFinder = null;
-		RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder();
-
-		RangeCoder.BitEncoder[] _isMatch = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
-		RangeCoder.BitEncoder[] _isRep = new RangeCoder.BitEncoder[Base.kNumStates];
-		RangeCoder.BitEncoder[] _isRepG0 = new RangeCoder.BitEncoder[Base.kNumStates];
-		RangeCoder.BitEncoder[] _isRepG1 = new RangeCoder.BitEncoder[Base.kNumStates];
-		RangeCoder.BitEncoder[] _isRepG2 = new RangeCoder.BitEncoder[Base.kNumStates];
-		RangeCoder.BitEncoder[] _isRep0Long = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
-
-		RangeCoder.BitTreeEncoder[] _posSlotEncoder = new RangeCoder.BitTreeEncoder[Base.kNumLenToPosStates];
-		
-		RangeCoder.BitEncoder[] _posEncoders = new RangeCoder.BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex];
-		RangeCoder.BitTreeEncoder _posAlignEncoder = new RangeCoder.BitTreeEncoder(Base.kNumAlignBits);
-
-		LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder();
-		LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder();
-
-		LiteralEncoder _literalEncoder = new LiteralEncoder();
-
-		UInt32[] _matchDistances = new UInt32[Base.kMatchMaxLen * 2 + 2];
-		
-		UInt32 _numFastBytes = kNumFastBytesDefault;
-		UInt32 _longestMatchLength;
-		UInt32 _numDistancePairs;
-
-		UInt32 _additionalOffset;
-
-		UInt32 _optimumEndIndex;
-		UInt32 _optimumCurrentIndex;
-
-		bool _longestMatchWasFound;
-
-		UInt32[] _posSlotPrices = new UInt32[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)];
-		UInt32[] _distancesPrices = new UInt32[Base.kNumFullDistances << Base.kNumLenToPosStatesBits];
-		UInt32[] _alignPrices = new UInt32[Base.kAlignTableSize];
-		UInt32 _alignPriceCount;
-
-		UInt32 _distTableSize = (kDefaultDictionaryLogSize * 2);
-
-		int _posStateBits = 2;
-		UInt32 _posStateMask = (4 - 1);
-		int _numLiteralPosStateBits = 0;
-		int _numLiteralContextBits = 3;
-
-		UInt32 _dictionarySize = (1 << kDefaultDictionaryLogSize);
-		UInt32 _dictionarySizePrev = 0xFFFFFFFF;
-		UInt32 _numFastBytesPrev = 0xFFFFFFFF;
-
-		Int64 nowPos64;
-		bool _finished;
-		System.IO.Stream _inStream;
-
-		EMatchFinderType _matchFinderType = EMatchFinderType.BT4;
-		bool _writeEndMark = false;
-		
-		bool _needReleaseMFStream;
-
-		void Create()
-		{
-			if (_matchFinder == null)
-			{
-				LZ.BinTree bt = new LZ.BinTree();
-				int numHashBytes = 4;
-				if (_matchFinderType == EMatchFinderType.BT2)
-					numHashBytes = 2;
-				bt.SetType(numHashBytes);
-				_matchFinder = bt;
-			}
-			_literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits);
-
-			if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes)
-				return;
-			_matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1);
-			_dictionarySizePrev = _dictionarySize;
-			_numFastBytesPrev = _numFastBytes;
-		}
-
-		public Encoder()
-		{
-			for (int i = 0; i < kNumOpts; i++)
-				_optimum[i] = new Optimal();
-			for (int i = 0; i < Base.kNumLenToPosStates; i++)
-				_posSlotEncoder[i] = new RangeCoder.BitTreeEncoder(Base.kNumPosSlotBits);
-		}
-
-		void SetWriteEndMarkerMode(bool writeEndMarker)
-		{
-			_writeEndMark = writeEndMarker;
-		}
-
-		void Init()
-		{
-			BaseInit();
-			_rangeEncoder.Init();
-
-			uint i;
-			for (i = 0; i < Base.kNumStates; i++)
-			{
-				for (uint j = 0; j <= _posStateMask; j++)
-				{
-					uint complexState = (i << Base.kNumPosStatesBitsMax) + j;
-					_isMatch[complexState].Init();
-					_isRep0Long[complexState].Init();
-				}
-				_isRep[i].Init();
-				_isRepG0[i].Init();
-				_isRepG1[i].Init();
-				_isRepG2[i].Init();
-			}
-			_literalEncoder.Init();
-			for (i = 0; i < Base.kNumLenToPosStates; i++)
-				_posSlotEncoder[i].Init();
-			for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++)
-				_posEncoders[i].Init();
-
-			_lenEncoder.Init((UInt32)1 << _posStateBits);
-			_repMatchLenEncoder.Init((UInt32)1 << _posStateBits);
-
-			_posAlignEncoder.Init();
-
-			_longestMatchWasFound = false;
-			_optimumEndIndex = 0;
-			_optimumCurrentIndex = 0;
-			_additionalOffset = 0;
-		}
-
-		void ReadMatchDistances(out UInt32 lenRes, out UInt32 numDistancePairs)
-		{
-			lenRes = 0;
-			numDistancePairs = _matchFinder.GetMatches(_matchDistances);
-			if (numDistancePairs > 0)
-			{
-				lenRes = _matchDistances[numDistancePairs - 2];
-				if (lenRes == _numFastBytes)
-					lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1],
-						Base.kMatchMaxLen - lenRes);
-			}
-			_additionalOffset++;
-		}
-
-
-		void MovePos(UInt32 num)
-		{
-			if (num > 0)
-			{
-				_matchFinder.Skip(num);
-				_additionalOffset += num;
-			}
-		}
-
-		UInt32 GetRepLen1Price(Base.State state, UInt32 posState)
-		{
-			return _isRepG0[state.Index].GetPrice0() +
-					_isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0();
-		}
-
-		UInt32 GetPureRepPrice(UInt32 repIndex, Base.State state, UInt32 posState)
-		{
-			UInt32 price;
-			if (repIndex == 0)
-			{
-				price = _isRepG0[state.Index].GetPrice0();
-				price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1();
-			}
-			else
-			{
-				price = _isRepG0[state.Index].GetPrice1();
-				if (repIndex == 1)
-					price += _isRepG1[state.Index].GetPrice0();
-				else
-				{
-					price += _isRepG1[state.Index].GetPrice1();
-					price += _isRepG2[state.Index].GetPrice(repIndex - 2);
-				}
-			}
-			return price;
-		}
-
-		UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, Base.State state, UInt32 posState)
-		{
-			UInt32 price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState);
-			return price + GetPureRepPrice(repIndex, state, posState);
-		}
-	
-		UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState)
-		{
-			UInt32 price;
-			UInt32 lenToPosState = Base.GetLenToPosState(len);
-			if (pos < Base.kNumFullDistances)
-				price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos];
-			else
-				price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] +
-					_alignPrices[pos & Base.kAlignMask];
-			return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState);
-		}
-
-		UInt32 Backward(out UInt32 backRes, UInt32 cur)
-		{
-			_optimumEndIndex = cur;
-			UInt32 posMem = _optimum[cur].PosPrev;
-			UInt32 backMem = _optimum[cur].BackPrev;
-			do
-			{
-				if (_optimum[cur].Prev1IsChar)
-				{
-					_optimum[posMem].MakeAsChar();
-					_optimum[posMem].PosPrev = posMem - 1;
-					if (_optimum[cur].Prev2)
-					{
-						_optimum[posMem - 1].Prev1IsChar = false;
-						_optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2;
-						_optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2;
-					}
-				}
-				UInt32 posPrev = posMem;
-				UInt32 backCur = backMem;
-
-				backMem = _optimum[posPrev].BackPrev;
-				posMem = _optimum[posPrev].PosPrev;
-
-				_optimum[posPrev].BackPrev = backCur;
-				_optimum[posPrev].PosPrev = cur;
-				cur = posPrev;
-			}
-			while (cur > 0);
-			backRes = _optimum[0].BackPrev;
-			_optimumCurrentIndex = _optimum[0].PosPrev;
-			return _optimumCurrentIndex;
-		}
-
-		UInt32[] reps = new UInt32[Base.kNumRepDistances];
-		UInt32[] repLens = new UInt32[Base.kNumRepDistances];
-
-
-		UInt32 GetOptimum(UInt32 position, out UInt32 backRes)
-		{
-			if (_optimumEndIndex != _optimumCurrentIndex)
-			{
-				UInt32 lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex;
-				backRes = _optimum[_optimumCurrentIndex].BackPrev;
-				_optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev;
-				return lenRes;
-			}
-			_optimumCurrentIndex = _optimumEndIndex = 0;
-
-			UInt32 lenMain, numDistancePairs;
-			if (!_longestMatchWasFound)
-			{
-				ReadMatchDistances(out lenMain, out numDistancePairs);
-			}
-			else
-			{
-				lenMain = _longestMatchLength;
-				numDistancePairs = _numDistancePairs;
-				_longestMatchWasFound = false;
-			}
-
-			UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1;
-			if (numAvailableBytes < 2)
-			{
-				backRes = 0xFFFFFFFF;
-				return 1;
-			}
-			if (numAvailableBytes > Base.kMatchMaxLen)
-				numAvailableBytes = Base.kMatchMaxLen;
-
-			UInt32 repMaxIndex = 0;
-			UInt32 i;			
-			for (i = 0; i < Base.kNumRepDistances; i++)
-			{
-				reps[i] = _repDistances[i];
-				repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen);
-				if (repLens[i] > repLens[repMaxIndex])
-					repMaxIndex = i;
-			}
-			if (repLens[repMaxIndex] >= _numFastBytes)
-			{
-				backRes = repMaxIndex;
-				UInt32 lenRes = repLens[repMaxIndex];
-				MovePos(lenRes - 1);
-				return lenRes;
-			}
-
-			if (lenMain >= _numFastBytes)
-			{
-				backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances;
-				MovePos(lenMain - 1);
-				return lenMain;
-			}
-			
-			Byte currentByte = _matchFinder.GetIndexByte(0 - 1);
-			Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - 1));
-
-			if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2)
-			{
-				backRes = (UInt32)0xFFFFFFFF;
-				return 1;
-			}
-
-			_optimum[0].State = _state;
-
-			UInt32 posState = (position & _posStateMask);
-
-			_optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() +
-					_literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), matchByte, currentByte);
-			_optimum[1].MakeAsChar();
-
-			UInt32 matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1();
-			UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1();
-
-			if (matchByte == currentByte)
-			{
-				UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState);
-				if (shortRepPrice < _optimum[1].Price)
-				{
-					_optimum[1].Price = shortRepPrice;
-					_optimum[1].MakeAsShortRep();
-				}
-			}
-
-			UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]);
-
-			if(lenEnd < 2)
-			{
-				backRes = _optimum[1].BackPrev;
-				return 1;
-			}
-			
-			_optimum[1].PosPrev = 0;
-
-			_optimum[0].Backs0 = reps[0];
-			_optimum[0].Backs1 = reps[1];
-			_optimum[0].Backs2 = reps[2];
-			_optimum[0].Backs3 = reps[3];
-
-			UInt32 len = lenEnd;
-			do
-				_optimum[len--].Price = kIfinityPrice;
-			while (len >= 2);
-
-			for (i = 0; i < Base.kNumRepDistances; i++)
-			{
-				UInt32 repLen = repLens[i];
-				if (repLen < 2)
-					continue;
-				UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState);
-				do
-				{
-					UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState);
-					Optimal optimum = _optimum[repLen];
-					if (curAndLenPrice < optimum.Price)
-					{
-						optimum.Price = curAndLenPrice;
-						optimum.PosPrev = 0;
-						optimum.BackPrev = i;
-						optimum.Prev1IsChar = false;
-					}
-				}
-				while (--repLen >= 2);
-			}
-
-			UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0();
-			
-			len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
-			if (len <= lenMain)
-			{
-				UInt32 offs = 0;
-				while (len > _matchDistances[offs])
-					offs += 2;
-				for (; ; len++)
-				{
-					UInt32 distance = _matchDistances[offs + 1];
-					UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState);
-					Optimal optimum = _optimum[len];
-					if (curAndLenPrice < optimum.Price)
-					{
-						optimum.Price = curAndLenPrice;
-						optimum.PosPrev = 0;
-						optimum.BackPrev = distance + Base.kNumRepDistances;
-						optimum.Prev1IsChar = false;
-					}
-					if (len == _matchDistances[offs])
-					{
-						offs += 2;
-						if (offs == numDistancePairs)
-							break;
-					}
-				}
-			}
-
-			UInt32 cur = 0;
-
-			while (true)
-			{
-				cur++;
-				if (cur == lenEnd)
-					return Backward(out backRes, cur);
-				UInt32 newLen;
-				ReadMatchDistances(out newLen, out numDistancePairs);
-				if (newLen >= _numFastBytes)
-				{
-					_numDistancePairs = numDistancePairs;
-					_longestMatchLength = newLen;
-					_longestMatchWasFound = true;
-					return Backward(out backRes, cur);
-				}
-				position++;
-				UInt32 posPrev = _optimum[cur].PosPrev;
-				Base.State state;
-				if (_optimum[cur].Prev1IsChar)
-				{
-					posPrev--;
-					if (_optimum[cur].Prev2)
-					{
-						state = _optimum[_optimum[cur].PosPrev2].State;
-						if (_optimum[cur].BackPrev2 < Base.kNumRepDistances)
-							state.UpdateRep();
-						else
-							state.UpdateMatch();
-					}
-					else
-						state = _optimum[posPrev].State;
-					state.UpdateChar();
-				}
-				else
-					state = _optimum[posPrev].State;
-				if (posPrev == cur - 1)
-				{
-					if (_optimum[cur].IsShortRep())
-						state.UpdateShortRep();
-					else
-						state.UpdateChar();
-				}
-				else
-				{
-					UInt32 pos;
-					if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2)
-					{
-						posPrev = _optimum[cur].PosPrev2;
-						pos = _optimum[cur].BackPrev2;
-						state.UpdateRep();
-					}
-					else
-					{
-						pos = _optimum[cur].BackPrev;
-						if (pos < Base.kNumRepDistances)
-							state.UpdateRep();
-						else
-							state.UpdateMatch();
-					}
-					Optimal opt = _optimum[posPrev];
-					if (pos < Base.kNumRepDistances)
-					{
-						if (pos == 0)
-						{
-							reps[0] = opt.Backs0;
-							reps[1] = opt.Backs1;
-							reps[2] = opt.Backs2;
-							reps[3] = opt.Backs3;
-						}
-						else if (pos == 1)
-						{
-							reps[0] = opt.Backs1;
-							reps[1] = opt.Backs0;
-							reps[2] = opt.Backs2;
-							reps[3] = opt.Backs3;
-						}
-						else if (pos == 2)
-						{
-							reps[0] = opt.Backs2;
-							reps[1] = opt.Backs0;
-							reps[2] = opt.Backs1;
-							reps[3] = opt.Backs3;
-						}
-						else
-						{
-							reps[0] = opt.Backs3;
-							reps[1] = opt.Backs0;
-							reps[2] = opt.Backs1;
-							reps[3] = opt.Backs2;
-						}
-					}
-					else
-					{
-						reps[0] = (pos - Base.kNumRepDistances);
-						reps[1] = opt.Backs0;
-						reps[2] = opt.Backs1;
-						reps[3] = opt.Backs2;
-					}
-				}
-				_optimum[cur].State = state;
-				_optimum[cur].Backs0 = reps[0];
-				_optimum[cur].Backs1 = reps[1];
-				_optimum[cur].Backs2 = reps[2];
-				_optimum[cur].Backs3 = reps[3];
-				UInt32 curPrice = _optimum[cur].Price;
-
-				currentByte = _matchFinder.GetIndexByte(0 - 1);
-				matchByte = _matchFinder.GetIndexByte((Int32)(0 - reps[0] - 1 - 1));
-
-				posState = (position & _posStateMask);
-
-				UInt32 curAnd1Price = curPrice +
-					_isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() +
-					_literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)).
-					GetPrice(!state.IsCharState(), matchByte, currentByte);
-
-				Optimal nextOptimum = _optimum[cur + 1];
-
-				bool nextIsChar = false;
-				if (curAnd1Price < nextOptimum.Price)
-				{
-					nextOptimum.Price = curAnd1Price;
-					nextOptimum.PosPrev = cur;
-					nextOptimum.MakeAsChar();
-					nextIsChar = true;
-				}
-
-				matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1();
-				repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1();
-
-				if (matchByte == currentByte &&
-					!(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0))
-				{
-					UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState);
-					if (shortRepPrice <= nextOptimum.Price)
-					{
-						nextOptimum.Price = shortRepPrice;
-						nextOptimum.PosPrev = cur;
-						nextOptimum.MakeAsShortRep();
-						nextIsChar = true;
-					}
-				}
-
-				UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1;
-				numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull);
-				numAvailableBytes = numAvailableBytesFull;
-
-				if (numAvailableBytes < 2)
-					continue;
-				if (numAvailableBytes > _numFastBytes)
-					numAvailableBytes = _numFastBytes;
-				if (!nextIsChar && matchByte != currentByte)
-				{
-					// try Literal + rep0
-					UInt32 t = Math.Min(numAvailableBytesFull - 1, _numFastBytes);
-					UInt32 lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t);
-					if (lenTest2 >= 2)
-					{
-						Base.State state2 = state;
-						state2.UpdateChar();
-						UInt32 posStateNext = (position + 1) & _posStateMask;
-						UInt32 nextRepMatchPrice = curAnd1Price +
-							_isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() +
-							_isRep[state2.Index].GetPrice1();
-						{
-							UInt32 offset = cur + 1 + lenTest2;
-							while (lenEnd < offset)
-								_optimum[++lenEnd].Price = kIfinityPrice;
-							UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(
-								0, lenTest2, state2, posStateNext);
-							Optimal optimum = _optimum[offset];
-							if (curAndLenPrice < optimum.Price)
-							{
-								optimum.Price = curAndLenPrice;
-								optimum.PosPrev = cur + 1;
-								optimum.BackPrev = 0;
-								optimum.Prev1IsChar = true;
-								optimum.Prev2 = false;
-							}
-						}
-					}
-				}
-
-				UInt32 startLen = 2; // speed optimization 
-
-				for (UInt32 repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++)
-				{
-					UInt32 lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes);
-					if (lenTest < 2)
-						continue;
-					UInt32 lenTestTemp = lenTest;
-					do
-					{
-						while (lenEnd < cur + lenTest)
-							_optimum[++lenEnd].Price = kIfinityPrice;
-						UInt32 curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState);
-						Optimal optimum = _optimum[cur + lenTest];
-						if (curAndLenPrice < optimum.Price)
-						{
-							optimum.Price = curAndLenPrice;
-							optimum.PosPrev = cur;
-							optimum.BackPrev = repIndex;
-							optimum.Prev1IsChar = false;
-						}
-					}
-					while(--lenTest >= 2);
-					lenTest = lenTestTemp;
-
-					if (repIndex == 0)
-						startLen = lenTest + 1;
-
-					// if (_maxMode)
-					if (lenTest < numAvailableBytesFull)
-					{
-						UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes);
-						UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, reps[repIndex], t);
-						if (lenTest2 >= 2)
-						{
-							Base.State state2 = state;
-							state2.UpdateRep();
-							UInt32 posStateNext = (position + lenTest) & _posStateMask;
-							UInt32 curAndLenCharPrice = 
-									repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + 
-									_isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() +
-									_literalEncoder.GetSubCoder(position + lenTest, 
-									_matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).GetPrice(true,
-									_matchFinder.GetIndexByte((Int32)((Int32)lenTest - 1 - (Int32)(reps[repIndex] + 1))), 
-									_matchFinder.GetIndexByte((Int32)lenTest - 1));
-							state2.UpdateChar();
-							posStateNext = (position + lenTest + 1) & _posStateMask;
-							UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1();
-							UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1();
-							
-							// for(; lenTest2 >= 2; lenTest2--)
-							{
-								UInt32 offset = lenTest + 1 + lenTest2;
-								while(lenEnd < cur + offset)
-									_optimum[++lenEnd].Price = kIfinityPrice;
-								UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
-								Optimal optimum = _optimum[cur + offset];
-								if (curAndLenPrice < optimum.Price) 
-								{
-									optimum.Price = curAndLenPrice;
-									optimum.PosPrev = cur + lenTest + 1;
-									optimum.BackPrev = 0;
-									optimum.Prev1IsChar = true;
-									optimum.Prev2 = true;
-									optimum.PosPrev2 = cur;
-									optimum.BackPrev2 = repIndex;
-								}
-							}
-						}
-					}
-				}
-
-				if (newLen > numAvailableBytes)
-				{
-					newLen = numAvailableBytes;
-					for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ;
-					_matchDistances[numDistancePairs] = newLen;
-					numDistancePairs += 2;
-				}
-				if (newLen >= startLen)
-				{
-					normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0();
-					while (lenEnd < cur + newLen)
-						_optimum[++lenEnd].Price = kIfinityPrice;
-
-					UInt32 offs = 0;
-					while (startLen > _matchDistances[offs])
-						offs += 2;
-
-					for (UInt32 lenTest = startLen; ; lenTest++)
-					{
-						UInt32 curBack = _matchDistances[offs + 1];
-						UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState);
-						Optimal optimum = _optimum[cur + lenTest];
-						if (curAndLenPrice < optimum.Price)
-						{
-							optimum.Price = curAndLenPrice;
-							optimum.PosPrev = cur;
-							optimum.BackPrev = curBack + Base.kNumRepDistances;
-							optimum.Prev1IsChar = false;
-						}
-
-						if (lenTest == _matchDistances[offs])
-						{
-							if (lenTest < numAvailableBytesFull)
-							{
-								UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes);
-								UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, curBack, t);
-								if (lenTest2 >= 2)
-								{
-									Base.State state2 = state;
-									state2.UpdateMatch();
-									UInt32 posStateNext = (position + lenTest) & _posStateMask;
-									UInt32 curAndLenCharPrice = curAndLenPrice +
-										_isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() +
-										_literalEncoder.GetSubCoder(position + lenTest,
-										_matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).
-										GetPrice(true,
-										_matchFinder.GetIndexByte((Int32)lenTest - (Int32)(curBack + 1) - 1),
-										_matchFinder.GetIndexByte((Int32)lenTest - 1));
-									state2.UpdateChar();
-									posStateNext = (position + lenTest + 1) & _posStateMask;
-									UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1();
-									UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1();
-
-									UInt32 offset = lenTest + 1 + lenTest2;
-									while (lenEnd < cur + offset)
-										_optimum[++lenEnd].Price = kIfinityPrice;
-									curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
-									optimum = _optimum[cur + offset];
-									if (curAndLenPrice < optimum.Price)
-									{
-										optimum.Price = curAndLenPrice;
-										optimum.PosPrev = cur + lenTest + 1;
-										optimum.BackPrev = 0;
-										optimum.Prev1IsChar = true;
-										optimum.Prev2 = true;
-										optimum.PosPrev2 = cur;
-										optimum.BackPrev2 = curBack + Base.kNumRepDistances;
-									}
-								}
-							}
-							offs += 2;
-							if (offs == numDistancePairs)
-								break;
-						}
-					}
-				}
-			}
-		}
-
-		bool ChangePair(UInt32 smallDist, UInt32 bigDist)
-		{
-			const int kDif = 7;
-			return (smallDist < ((UInt32)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif));
-		}
-
-		void WriteEndMarker(UInt32 posState)
-		{
-			if (!_writeEndMark)
-				return;
-
-			_isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1);
-			_isRep[_state.Index].Encode(_rangeEncoder, 0);
-			_state.UpdateMatch();
-			UInt32 len = Base.kMatchMinLen;
-			_lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
-			UInt32 posSlot = (1 << Base.kNumPosSlotBits) - 1;
-			UInt32 lenToPosState = Base.GetLenToPosState(len);
-			_posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot);
-			int footerBits = 30;
-			UInt32 posReduced = (((UInt32)1) << footerBits) - 1;
-			_rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits);
-			_posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask);
-		}
-
-		void Flush(UInt32 nowPos)
-		{
-			ReleaseMFStream();
-			WriteEndMarker(nowPos & _posStateMask);
-			_rangeEncoder.FlushData();
-			_rangeEncoder.FlushStream();
-		}
-
-		public void CodeOneBlock(out Int64 inSize, out Int64 outSize, out bool finished)
-		{
-			inSize = 0;
-			outSize = 0;
-			finished = true;
-
-			if (_inStream != null)
-			{
-				_matchFinder.SetStream(_inStream);
-				_matchFinder.Init();
-				_needReleaseMFStream = true;
-				_inStream = null;
-				if (_trainSize > 0)
-					_matchFinder.Skip(_trainSize);
-			}
-
-			if (_finished)
-				return;
-			_finished = true;
-
-
-			Int64 progressPosValuePrev = nowPos64;
-			if (nowPos64 == 0)
-			{
-				if (_matchFinder.GetNumAvailableBytes() == 0)
-				{
-					Flush((UInt32)nowPos64);
-					return;
-				}
-				UInt32 len, numDistancePairs; // it's not used
-				ReadMatchDistances(out len, out numDistancePairs);
-				UInt32 posState = (UInt32)(nowPos64) & _posStateMask;
-				_isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0);
-				_state.UpdateChar();
-				Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset));
-				_literalEncoder.GetSubCoder((UInt32)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte);
-				_previousByte = curByte;
-				_additionalOffset--;
-				nowPos64++;
-			}
-			if (_matchFinder.GetNumAvailableBytes() == 0)
-			{
-				Flush((UInt32)nowPos64);
-				return;
-			}
-			while (true)
-			{
-				UInt32 pos;
-				UInt32 len = GetOptimum((UInt32)nowPos64, out pos);
-				
-				UInt32 posState = ((UInt32)nowPos64) & _posStateMask;
-				UInt32 complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState;
-				if (len == 1 && pos == 0xFFFFFFFF)
-				{
-					_isMatch[complexState].Encode(_rangeEncoder, 0);
-					Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset));
-					LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((UInt32)nowPos64, _previousByte);
-					if (!_state.IsCharState())
-					{
-						Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - _additionalOffset));
-						subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte);
-					}
-					else
-						subCoder.Encode(_rangeEncoder, curByte);
-					_previousByte = curByte;
-					_state.UpdateChar();
-				}
-				else
-				{
-					_isMatch[complexState].Encode(_rangeEncoder, 1);
-					if (pos < Base.kNumRepDistances)
-					{
-						_isRep[_state.Index].Encode(_rangeEncoder, 1);
-						if (pos == 0)
-						{
-							_isRepG0[_state.Index].Encode(_rangeEncoder, 0);
-							if (len == 1)
-								_isRep0Long[complexState].Encode(_rangeEncoder, 0);
-							else
-								_isRep0Long[complexState].Encode(_rangeEncoder, 1);
-						}
-						else
-						{
-							_isRepG0[_state.Index].Encode(_rangeEncoder, 1);
-							if (pos == 1)
-								_isRepG1[_state.Index].Encode(_rangeEncoder, 0);
-							else
-							{
-								_isRepG1[_state.Index].Encode(_rangeEncoder, 1);
-								_isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2);
-							}
-						}
-						if (len == 1)
-							_state.UpdateShortRep();
-						else
-						{
-							_repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
-							_state.UpdateRep();
-						}
-						UInt32 distance = _repDistances[pos];
-						if (pos != 0)
-						{
-							for (UInt32 i = pos; i >= 1; i--)
-								_repDistances[i] = _repDistances[i - 1];
-							_repDistances[0] = distance;
-						}
-					}
-					else
-					{
-						_isRep[_state.Index].Encode(_rangeEncoder, 0);
-						_state.UpdateMatch();
-						_lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
-						pos -= Base.kNumRepDistances;
-						UInt32 posSlot = GetPosSlot(pos);
-						UInt32 lenToPosState = Base.GetLenToPosState(len);
-						_posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot);
-
-						if (posSlot >= Base.kStartPosModelIndex)
-						{
-							int footerBits = (int)((posSlot >> 1) - 1);
-							UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits);
-							UInt32 posReduced = pos - baseVal;
-
-							if (posSlot < Base.kEndPosModelIndex)
-								RangeCoder.BitTreeEncoder.ReverseEncode(_posEncoders,
-										baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced);
-							else
-							{
-								_rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits);
-								_posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask);
-								_alignPriceCount++;
-							}
-						}
-						UInt32 distance = pos;
-						for (UInt32 i = Base.kNumRepDistances - 1; i >= 1; i--)
-							_repDistances[i] = _repDistances[i - 1];
-						_repDistances[0] = distance;
-						_matchPriceCount++;
-					}
-					_previousByte = _matchFinder.GetIndexByte((Int32)(len - 1 - _additionalOffset));
-				}
-				_additionalOffset -= len;
-				nowPos64 += len;
-				if (_additionalOffset == 0)
-				{
-					// if (!_fastMode)
-					if (_matchPriceCount >= (1 << 7))
-						FillDistancesPrices();
-					if (_alignPriceCount >= Base.kAlignTableSize)
-						FillAlignPrices();
-					inSize = nowPos64;
-					outSize = _rangeEncoder.GetProcessedSizeAdd();
-					if (_matchFinder.GetNumAvailableBytes() == 0)
-					{
-						Flush((UInt32)nowPos64);
-						return;
-					}
-
-					if (nowPos64 - progressPosValuePrev >= (1 << 12))
-					{
-						_finished = false;
-						finished = false;
-						return;
-					}
-				}
-			}
-		}
-
-		void ReleaseMFStream()
-		{
-			if (_matchFinder != null && _needReleaseMFStream)
-			{
-				_matchFinder.ReleaseStream();
-				_needReleaseMFStream = false;
-			}
-		}
-
-		void SetOutStream(System.IO.Stream outStream) { _rangeEncoder.SetStream(outStream); }
-		void ReleaseOutStream() { _rangeEncoder.ReleaseStream(); }
-
-		void ReleaseStreams()
-		{
-			ReleaseMFStream();
-			ReleaseOutStream();
-		}
-
-		void SetStreams(System.IO.Stream inStream, System.IO.Stream outStream,
-				Int64 inSize, Int64 outSize)
-		{
-			_inStream = inStream;
-			_finished = false;
-			Create();
-			SetOutStream(outStream);
-			Init();
-
-			// if (!_fastMode)
-			{
-				FillDistancesPrices();
-				FillAlignPrices();
-			}
-
-			_lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen);
-			_lenEncoder.UpdateTables((UInt32)1 << _posStateBits);
-			_repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen);
-			_repMatchLenEncoder.UpdateTables((UInt32)1 << _posStateBits);
-
-			nowPos64 = 0;
-		}
-
-
-		public void Code(System.IO.Stream inStream, System.IO.Stream outStream,
-			Int64 inSize, Int64 outSize, ICodeProgress progress)
-		{
-			_needReleaseMFStream = false;
-			try
-			{
-				SetStreams(inStream, outStream, inSize, outSize);
-				while (true)
-				{
-					Int64 processedInSize;
-					Int64 processedOutSize;
-					bool finished;
-					CodeOneBlock(out processedInSize, out processedOutSize, out finished);
-					if (finished)
-						return;
-					if (progress != null)
-					{
-						progress.SetProgress(processedInSize, processedOutSize);
-					}
-				}
-			}
-			finally
-			{
-				ReleaseStreams();
-			}
-		}
-
-		const int kPropSize = 5;
-		Byte[] properties = new Byte[kPropSize];
-
-		public void WriteCoderProperties(System.IO.Stream outStream)
-		{
-			properties[0] = (Byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits);
-			for (int i = 0; i < 4; i++)
-				properties[1 + i] = (Byte)((_dictionarySize >> (8 * i)) & 0xFF);
-			outStream.Write(properties, 0, kPropSize);
-		}
-		
-		UInt32[] tempPrices = new UInt32[Base.kNumFullDistances];
-		UInt32 _matchPriceCount;
-
-		void FillDistancesPrices()
-		{
-			for (UInt32 i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++)
-			{ 
-				UInt32 posSlot = GetPosSlot(i);
-				int footerBits = (int)((posSlot >> 1) - 1);
-				UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits);
-				tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, 
-					baseVal - posSlot - 1, footerBits, i - baseVal);
-			}
-
-			for (UInt32 lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++)
-			{
-				UInt32 posSlot;
-				RangeCoder.BitTreeEncoder encoder = _posSlotEncoder[lenToPosState];
-			
-				UInt32 st = (lenToPosState << Base.kNumPosSlotBits);
-				for (posSlot = 0; posSlot < _distTableSize; posSlot++)
-					_posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot);
-				for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++)
-					_posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << RangeCoder.BitEncoder.kNumBitPriceShiftBits);
-
-				UInt32 st2 = lenToPosState * Base.kNumFullDistances;
-				UInt32 i;
-				for (i = 0; i < Base.kStartPosModelIndex; i++)
-					_distancesPrices[st2 + i] = _posSlotPrices[st + i];
-				for (; i < Base.kNumFullDistances; i++)
-					_distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i];
-			}
-			_matchPriceCount = 0;
-		}
-
-		void FillAlignPrices()
-		{
-			for (UInt32 i = 0; i < Base.kAlignTableSize; i++)
-				_alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i);
-			_alignPriceCount = 0;
-		}
-
-
-		static string[] kMatchFinderIDs = 
-		{
-			"BT2",
-			"BT4",
-		};
-
-		static int FindMatchFinder(string s)
-		{
-			for (int m = 0; m < kMatchFinderIDs.Length; m++)
-				if (s == kMatchFinderIDs[m])
-					return m;
-			return -1;
-		}
-	
-		public void SetCoderProperties(CoderPropID[] propIDs, object[] properties)
-		{
-			for (UInt32 i = 0; i < properties.Length; i++)
-			{
-				object prop = properties[i];
-				switch (propIDs[i])
-				{
-					case CoderPropID.NumFastBytes:
-					{
-						if (!(prop is Int32))
-							throw new InvalidParamException();
-						Int32 numFastBytes = (Int32)prop;
-						if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen)
-							throw new InvalidParamException();
-						_numFastBytes = (UInt32)numFastBytes;
-						break;
-					}
-					case CoderPropID.Algorithm:
-					{
-						/*
-						if (!(prop is Int32))
-							throw new InvalidParamException();
-						Int32 maximize = (Int32)prop;
-						_fastMode = (maximize == 0);
-						_maxMode = (maximize >= 2);
-						*/
-						break;
-					}
-					case CoderPropID.MatchFinder:
-					{
-						if (!(prop is String))
-							throw new InvalidParamException();
-						EMatchFinderType matchFinderIndexPrev = _matchFinderType;
-						int m = FindMatchFinder(((string)prop).ToUpper());
-						if (m < 0)
-							throw new InvalidParamException();
-						_matchFinderType = (EMatchFinderType)m;
-						if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType)
-							{
-							_dictionarySizePrev = 0xFFFFFFFF;
-							_matchFinder = null;
-							}
-						break;
-					}
-					case CoderPropID.DictionarySize:
-					{
-						const int kDicLogSizeMaxCompress = 30;
-						if (!(prop is Int32))
-							throw new InvalidParamException(); ;
-						Int32 dictionarySize = (Int32)prop;
-						if (dictionarySize < (UInt32)(1 << Base.kDicLogSizeMin) ||
-							dictionarySize > (UInt32)(1 << kDicLogSizeMaxCompress))
-							throw new InvalidParamException();
-						_dictionarySize = (UInt32)dictionarySize;
-						int dicLogSize;
-						for (dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++)
-							if (dictionarySize <= ((UInt32)(1) << dicLogSize))
-								break;
-						_distTableSize = (UInt32)dicLogSize * 2;
-						break;
-					}
-					case CoderPropID.PosStateBits:
-					{
-						if (!(prop is Int32))
-							throw new InvalidParamException();
-						Int32 v = (Int32)prop;
-						if (v < 0 || v > (UInt32)Base.kNumPosStatesBitsEncodingMax)
-							throw new InvalidParamException();
-						_posStateBits = (int)v;
-						_posStateMask = (((UInt32)1) << (int)_posStateBits) - 1;
-						break;
-					}
-					case CoderPropID.LitPosBits:
-					{
-						if (!(prop is Int32))
-							throw new InvalidParamException();
-						Int32 v = (Int32)prop;
-						if (v < 0 || v > (UInt32)Base.kNumLitPosStatesBitsEncodingMax)
-							throw new InvalidParamException();
-						_numLiteralPosStateBits = (int)v;
-						break;
-					}
-					case CoderPropID.LitContextBits:
-					{
-						if (!(prop is Int32))
-							throw new InvalidParamException();
-						Int32 v = (Int32)prop;
-						if (v < 0 || v > (UInt32)Base.kNumLitContextBitsMax)
-							throw new InvalidParamException(); ;
-						_numLiteralContextBits = (int)v;
-						break;
-					}
-					case CoderPropID.EndMarker:
-					{
-						if (!(prop is Boolean))
-							throw new InvalidParamException();
-						SetWriteEndMarkerMode((Boolean)prop);
-						break;
-					}
-					default:
-						throw new InvalidParamException();
-				}
-			}
-		}
-
-		uint _trainSize = 0;
-		public void SetTrainSize(uint trainSize)
-		{
-			_trainSize = trainSize;
-		}
-		
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoder.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoder.cs
deleted file mode 100644
index d9c2e30ce..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoder.cs
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-
-namespace SevenZip.Compression.RangeCoder
-{
-	class Encoder
-	{
-		public const uint kTopValue = (1 << 24);
-
-		System.IO.Stream Stream;
-
-		public UInt64 Low;
-		public uint Range;
-		uint _cacheSize;
-		byte _cache;
-
-		long StartPosition;
-
-		public void SetStream(System.IO.Stream stream)
-		{
-			Stream = stream;
-		}
-
-		public void ReleaseStream()
-		{
-			Stream = null;
-		}
-
-		public void Init()
-		{
-			StartPosition = Stream.Position;
-
-			Low = 0;
-			Range = 0xFFFFFFFF;
-			_cacheSize = 1;
-			_cache = 0;
-		}
-
-		public void FlushData()
-		{
-			for (int i = 0; i < 5; i++)
-				ShiftLow();
-		}
-
-		public void FlushStream()
-		{
-			Stream.Flush();
-		}
-
-		public void CloseStream()
-		{
-			Stream.Dispose();
-		}
-
-		public void Encode(uint start, uint size, uint total)
-		{
-			Low += start * (Range /= total);
-			Range *= size;
-			while (Range < kTopValue)
-			{
-				Range <<= 8;
-				ShiftLow();
-			}
-		}
-
-		public void ShiftLow()
-		{
-			if ((uint)Low < (uint)0xFF000000 || (uint)(Low >> 32) == 1)
-			{
-				byte temp = _cache;
-				do
-				{
-					Stream.WriteByte((byte)(temp + (Low >> 32)));
-					temp = 0xFF;
-				}
-				while (--_cacheSize != 0);
-				_cache = (byte)(((uint)Low) >> 24);
-			}
-			_cacheSize++;
-			Low = ((uint)Low) << 8;
-		}
-
-		public void EncodeDirectBits(uint v, int numTotalBits)
-		{
-			for (int i = numTotalBits - 1; i >= 0; i--)
-			{
-				Range >>= 1;
-				if (((v >> i) & 1) == 1)
-					Low += Range;
-				if (Range < kTopValue)
-				{
-					Range <<= 8;
-					ShiftLow();
-				}
-			}
-		}
-
-		public void EncodeBit(uint size0, int numTotalBits, uint symbol)
-		{
-			uint newBound = (Range >> numTotalBits) * size0;
-			if (symbol == 0)
-				Range = newBound;
-			else
-			{
-				Low += newBound;
-				Range -= newBound;
-			}
-			while (Range < kTopValue)
-			{
-				Range <<= 8;
-				ShiftLow();
-			}
-		}
-
-		public long GetProcessedSizeAdd()
-		{
-			return _cacheSize +
-				Stream.Position - StartPosition + 4;
-			// (long)Stream.GetProcessedSize();
-		}
-	}
-
-	class Decoder
-	{
-		public const uint kTopValue = (1 << 24);
-		public uint Range;
-		public uint Code;
-		// public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16);
-		public System.IO.Stream Stream;
-
-		public void Init(System.IO.Stream stream)
-		{
-			// Stream.Init(stream);
-			Stream = stream;
-
-			Code = 0;
-			Range = 0xFFFFFFFF;
-			for (int i = 0; i < 5; i++)
-				Code = (Code << 8) | (byte)Stream.ReadByte();
-		}
-
-		public void ReleaseStream()
-		{
-			// Stream.ReleaseStream();
-			Stream = null;
-		}
-
-		public void CloseStream()
-		{
-			Stream.Dispose();
-		}
-
-		public void Normalize()
-		{
-			while (Range < kTopValue)
-			{
-				Code = (Code << 8) | (byte)Stream.ReadByte();
-				Range <<= 8;
-			}
-		}
-
-		public void Normalize2()
-		{
-			if (Range < kTopValue)
-			{
-				Code = (Code << 8) | (byte)Stream.ReadByte();
-				Range <<= 8;
-			}
-		}
-
-		public uint GetThreshold(uint total)
-		{
-			return Code / (Range /= total);
-		}
-
-		public void Decode(uint start, uint size, uint total)
-		{
-			Code -= start * Range;
-			Range *= size;
-			Normalize();
-		}
-
-		public uint DecodeDirectBits(int numTotalBits)
-		{
-			uint range = Range;
-			uint code = Code;
-			uint result = 0;
-			for (int i = numTotalBits; i > 0; i--)
-			{
-				range >>= 1;
-				/*
-				result <<= 1;
-				if (code >= range)
-				{
-					code -= range;
-					result |= 1;
-				}
-				*/
-				uint t = (code - range) >> 31;
-				code -= range & (t - 1);
-				result = (result << 1) | (1 - t);
-
-				if (range < kTopValue)
-				{
-					code = (code << 8) | (byte)Stream.ReadByte();
-					range <<= 8;
-				}
-			}
-			Range = range;
-			Code = code;
-			return result;
-		}
-
-		public uint DecodeBit(uint size0, int numTotalBits)
-		{
-			uint newBound = (Range >> numTotalBits) * size0;
-			uint symbol;
-			if (Code < newBound)
-			{
-				symbol = 0;
-				Range = newBound;
-			}
-			else
-			{
-				symbol = 1;
-				Code -= newBound;
-				Range -= newBound;
-			}
-			Normalize();
-			return symbol;
-		}
-
-		// ulong GetProcessedSize() {return Stream.GetProcessedSize(); }
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoderBit.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoderBit.cs
deleted file mode 100644
index 46d27ed0f..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoderBit.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-
-namespace SevenZip.Compression.RangeCoder
-{
-	struct BitEncoder
-	{
-		public const int kNumBitModelTotalBits = 11;
-		public const uint kBitModelTotal = (1 << kNumBitModelTotalBits);
-		const int kNumMoveBits = 5;
-		const int kNumMoveReducingBits = 2;
-		public const int kNumBitPriceShiftBits = 6;
-
-		uint Prob;
-
-		public void Init() { Prob = kBitModelTotal >> 1; }
-
-		public void UpdateModel(uint symbol)
-		{
-			if (symbol == 0)
-				Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
-			else
-				Prob -= (Prob) >> kNumMoveBits;
-		}
-
-		public void Encode(Encoder encoder, uint symbol)
-		{
-			// encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol);
-			// UpdateModel(symbol);
-			uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob;
-			if (symbol == 0)
-			{
-				encoder.Range = newBound;
-				Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
-			}
-			else
-			{
-				encoder.Low += newBound;
-				encoder.Range -= newBound;
-				Prob -= (Prob) >> kNumMoveBits;
-			}
-			if (encoder.Range < Encoder.kTopValue)
-			{
-				encoder.Range <<= 8;
-				encoder.ShiftLow();
-			}
-		}
-
-		private static UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits];
-
-		static BitEncoder()
-		{
-			const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
-			for (int i = kNumBits - 1; i >= 0; i--)
-			{
-				UInt32 start = (UInt32)1 << (kNumBits - i - 1);
-				UInt32 end = (UInt32)1 << (kNumBits - i);
-				for (UInt32 j = start; j < end; j++)
-					ProbPrices[j] = ((UInt32)i << kNumBitPriceShiftBits) +
-						(((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1));
-			}
-		}
-
-		public uint GetPrice(uint symbol)
-		{
-			return ProbPrices[(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits];
-		}
-	  public uint GetPrice0() { return ProbPrices[Prob >> kNumMoveReducingBits]; }
-		public uint GetPrice1() { return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; }
-	}
-
-	struct BitDecoder
-	{
-		public const int kNumBitModelTotalBits = 11;
-		public const uint kBitModelTotal = (1 << kNumBitModelTotalBits);
-		const int kNumMoveBits = 5;
-
-		uint Prob;
-
-		public void UpdateModel(int numMoveBits, uint symbol)
-		{
-			if (symbol == 0)
-				Prob += (kBitModelTotal - Prob) >> numMoveBits;
-			else
-				Prob -= (Prob) >> numMoveBits;
-		}
-
-		public void Init() { Prob = kBitModelTotal >> 1; }
-
-		public uint Decode(RangeCoder.Decoder rangeDecoder)
-		{
-			uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob;
-			if (rangeDecoder.Code < newBound)
-			{
-				rangeDecoder.Range = newBound;
-				Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
-				if (rangeDecoder.Range < Decoder.kTopValue)
-				{
-					rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
-					rangeDecoder.Range <<= 8;
-				}
-				return 0;
-			}
-			else
-			{
-				rangeDecoder.Range -= newBound;
-				rangeDecoder.Code -= newBound;
-				Prob -= (Prob) >> kNumMoveBits;
-				if (rangeDecoder.Range < Decoder.kTopValue)
-				{
-					rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
-					rangeDecoder.Range <<= 8;
-				}
-				return 1;
-			}
-		}
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoderBitTree.cs b/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoderBitTree.cs
deleted file mode 100644
index f7985c47b..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/Compress/RangeCoder/RangeCoderBitTree.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-
-namespace SevenZip.Compression.RangeCoder
-{
-	struct BitTreeEncoder
-	{
-		BitEncoder[] Models;
-		int NumBitLevels;
-
-		public BitTreeEncoder(int numBitLevels)
-		{
-			NumBitLevels = numBitLevels;
-			Models = new BitEncoder[1 << numBitLevels];
-		}
-
-		public void Init()
-		{
-			for (uint i = 1; i < (1 << NumBitLevels); i++)
-				Models[i].Init();
-		}
-
-		public void Encode(Encoder rangeEncoder, UInt32 symbol)
-		{
-			UInt32 m = 1;
-			for (int bitIndex = NumBitLevels; bitIndex > 0; )
-			{
-				bitIndex--;
-				UInt32 bit = (symbol >> bitIndex) & 1;
-				Models[m].Encode(rangeEncoder, bit);
-				m = (m << 1) | bit;
-			}
-		}
-
-		public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol)
-		{
-			UInt32 m = 1;
-			for (UInt32 i = 0; i < NumBitLevels; i++)
-			{
-				UInt32 bit = symbol & 1;
-				Models[m].Encode(rangeEncoder, bit);
-				m = (m << 1) | bit;
-				symbol >>= 1;
-			}
-		}
-
-		public UInt32 GetPrice(UInt32 symbol)
-		{
-			UInt32 price = 0;
-			UInt32 m = 1;
-			for (int bitIndex = NumBitLevels; bitIndex > 0; )
-			{
-				bitIndex--;
-				UInt32 bit = (symbol >> bitIndex) & 1;
-				price += Models[m].GetPrice(bit);
-				m = (m << 1) + bit;
-			}
-			return price;
-		}
-
-		public UInt32 ReverseGetPrice(UInt32 symbol)
-		{
-			UInt32 price = 0;
-			UInt32 m = 1;
-			for (int i = NumBitLevels; i > 0; i--)
-			{
-				UInt32 bit = symbol & 1;
-				symbol >>= 1;
-				price += Models[m].GetPrice(bit);
-				m = (m << 1) | bit;
-			}
-			return price;
-		}
-
-		public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex,
-			int NumBitLevels, UInt32 symbol)
-		{
-			UInt32 price = 0;
-			UInt32 m = 1;
-			for (int i = NumBitLevels; i > 0; i--)
-			{
-				UInt32 bit = symbol & 1;
-				symbol >>= 1;
-				price += Models[startIndex + m].GetPrice(bit);
-				m = (m << 1) | bit;
-			}
-			return price;
-		}
-
-		public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex,
-			Encoder rangeEncoder, int NumBitLevels, UInt32 symbol)
-		{
-			UInt32 m = 1;
-			for (int i = 0; i < NumBitLevels; i++)
-			{
-				UInt32 bit = symbol & 1;
-				Models[startIndex + m].Encode(rangeEncoder, bit);
-				m = (m << 1) | bit;
-				symbol >>= 1;
-			}
-		}
-	}
-
-	struct BitTreeDecoder
-	{
-		BitDecoder[] Models;
-		int NumBitLevels;
-
-		public BitTreeDecoder(int numBitLevels)
-		{
-			NumBitLevels = numBitLevels;
-			Models = new BitDecoder[1 << numBitLevels];
-		}
-
-		public void Init()
-		{
-			for (uint i = 1; i < (1 << NumBitLevels); i++)
-				Models[i].Init();
-		}
-
-		public uint Decode(RangeCoder.Decoder rangeDecoder)
-		{
-			uint m = 1;
-			for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
-				m = (m << 1) + Models[m].Decode(rangeDecoder);
-			return m - ((uint)1 << NumBitLevels);
-		}
-
-		public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
-		{
-			uint m = 1;
-			uint symbol = 0;
-			for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
-			{
-				uint bit = Models[m].Decode(rangeDecoder);
-				m <<= 1;
-				m += bit;
-				symbol |= (bit << bitIndex);
-			}
-			return symbol;
-		}
-
-		public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex,
-			RangeCoder.Decoder rangeDecoder, int NumBitLevels)
-		{
-			uint m = 1;
-			uint symbol = 0;
-			for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
-			{
-				uint bit = Models[startIndex + m].Decode(rangeDecoder);
-				m <<= 1;
-				m += bit;
-				symbol |= (bit << bitIndex);
-			}
-			return symbol;
-		}
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/ICoder.cs b/src/Microsoft.DotNet.Archive/LZMA/ICoder.cs
deleted file mode 100644
index 992f6823f..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/ICoder.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-// ICoder.h
-
-using System;
-
-namespace SevenZip
-{
-	/// <summary>
-	/// The exception that is thrown when an error in input stream occurs during decoding.
-	/// </summary>
-	class DataErrorException : Exception
-	{
-		public DataErrorException(): base("Data Error") { }
-	}
-
-	/// <summary>
-	/// The exception that is thrown when the value of an argument is outside the allowable range.
-	/// </summary>
-	class InvalidParamException : Exception
-	{
-		public InvalidParamException(): base("Invalid Parameter") { }
-	}
-
-	public interface ICodeProgress
-	{
-		/// <summary>
-		/// Callback progress.
-		/// </summary>
-		/// <param name="inSize">
-		/// input size. -1 if unknown.
-		/// </param>
-		/// <param name="outSize">
-		/// output size. -1 if unknown.
-		/// </param>
-		void SetProgress(Int64 inSize, Int64 outSize);
-	};
-
-	public interface ICoder
-	{
-		/// <summary>
-		/// Codes streams.
-		/// </summary>
-		/// <param name="inStream">
-		/// input Stream.
-		/// </param>
-		/// <param name="outStream">
-		/// output Stream.
-		/// </param>
-		/// <param name="inSize">
-		/// input Size. -1 if unknown.
-		/// </param>
-		/// <param name="outSize">
-		/// output Size. -1 if unknown.
-		/// </param>
-		/// <param name="progress">
-		/// callback progress reference.
-		/// </param>
-		/// <exception cref="SevenZip.DataErrorException">
-		/// if input stream is not valid
-		/// </exception>
-		void Code(System.IO.Stream inStream, System.IO.Stream outStream,
-			Int64 inSize, Int64 outSize, ICodeProgress progress);
-	};
-
-	/*
-	public interface ICoder2
-	{
-		 void Code(ISequentialInStream []inStreams,
-				const UInt64 []inSizes, 
-				ISequentialOutStream []outStreams, 
-				UInt64 []outSizes,
-				ICodeProgress progress);
-	};
-  */
-
-	/// <summary>
-	/// Provides the fields that represent properties idenitifiers for compressing.
-	/// </summary>
-	public enum CoderPropID
-	{
-		/// <summary>
-		/// Specifies default property.
-		/// </summary>
-		DefaultProp = 0,
-		/// <summary>
-		/// Specifies size of dictionary.
-		/// </summary>
-		DictionarySize,
-		/// <summary>
-		/// Specifies size of memory for PPM*.
-		/// </summary>
-		UsedMemorySize,
-		/// <summary>
-		/// Specifies order for PPM methods.
-		/// </summary>
-		Order,
-		/// <summary>
-		/// Specifies Block Size.
-		/// </summary>
-		BlockSize,
-		/// <summary>
-		/// Specifies number of postion state bits for LZMA (0 <= x <= 4).
-		/// </summary>
-		PosStateBits,
-		/// <summary>
-		/// Specifies number of literal context bits for LZMA (0 <= x <= 8).
-		/// </summary>
-		LitContextBits,
-		/// <summary>
-		/// Specifies number of literal position bits for LZMA (0 <= x <= 4).
-		/// </summary>
-		LitPosBits,
-		/// <summary>
-		/// Specifies number of fast bytes for LZ*.
-		/// </summary>
-		NumFastBytes,
-		/// <summary>
-		/// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B".
-		/// </summary>
-		MatchFinder,
-		/// <summary>
-		/// Specifies the number of match finder cyckes.
-		/// </summary>
-		MatchFinderCycles,
-		/// <summary>
-		/// Specifies number of passes.
-		/// </summary>
-		NumPasses,
-		/// <summary>
-		/// Specifies number of algorithm.
-		/// </summary>
-		Algorithm,
-		/// <summary>
-		/// Specifies the number of threads.
-		/// </summary>
-		NumThreads,
-		/// <summary>
-		/// Specifies mode with end marker.
-		/// </summary>
-		EndMarker
-	};
-
-
-	public interface ISetCoderProperties
-	{
-		void SetCoderProperties(CoderPropID[] propIDs, object[] properties);
-	};
-
-	public interface IWriteCoderProperties
-	{
-		void WriteCoderProperties(System.IO.Stream outStream);
-	}
-
-	public interface ISetDecoderProperties
-	{
-		void SetDecoderProperties(byte[] properties);
-	}
-}
diff --git a/src/Microsoft.DotNet.Archive/LZMA/README.md b/src/Microsoft.DotNet.Archive/LZMA/README.md
deleted file mode 100644
index 74e275852..000000000
--- a/src/Microsoft.DotNet.Archive/LZMA/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-## LZMA SDK
-This source came from the C# implementation of LZMA from the LZMA SDK, version 16.02, from http://www.7-zip.org/sdk.html.
-
-## License
-LZMA SDK is placed in the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute the original LZMA SDK code, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
-
-## Thanks!
-Thanks goes to Igor Pavlov for making this available.
diff --git a/src/Microsoft.DotNet.Archive/Microsoft.DotNet.Archive.csproj b/src/Microsoft.DotNet.Archive/Microsoft.DotNet.Archive.csproj
deleted file mode 100644
index 368cbdc14..000000000
--- a/src/Microsoft.DotNet.Archive/Microsoft.DotNet.Archive.csproj
+++ /dev/null
@@ -1,22 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
-  <PropertyGroup>
-    <Description>Archive and compression types.</Description>
-    <VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
-    <TargetFramework>netstandard1.3</TargetFramework>
-    <AssemblyOriginatorKeyFile>../../tools/Key.snk</AssemblyOriginatorKeyFile>
-    <SignAssembly>true</SignAssembly>
-    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <EmbeddedResource Update="**\*.resx" GenerateSource="true" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="NETStandard.Library" Version="1.6.0" />
-    <PackageReference Include="System.Linq.Parallel" Version="4.0.1" />
-    <PackageReference Include="XliffTasks" Version="$(XliffTasksPackageVersion)" PrivateAssets="All" />
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Archive/ProgressReport.cs b/src/Microsoft.DotNet.Archive/ProgressReport.cs
deleted file mode 100644
index 6eb955563..000000000
--- a/src/Microsoft.DotNet.Archive/ProgressReport.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-
-namespace Microsoft.DotNet.Archive
-{
-    public struct ProgressReport
-    {
-        public ProgressReport(string phase, long ticks, long total)
-        {
-            Phase = phase;
-            Ticks = ticks;
-            Total = total;
-        }
-        public string Phase { get; }
-        public long Ticks { get; }
-        public long Total { get; }
-    }
-
-    public static class ProgressReportExtensions
-    {
-        public static void Report(this IProgress<ProgressReport> progress, string phase, long ticks, long total)
-        {
-            progress.Report(new ProgressReport(phase, ticks, total));
-        }
-    }
-
-}
diff --git a/src/Microsoft.DotNet.Archive/ThreadLocalZipArchive.cs b/src/Microsoft.DotNet.Archive/ThreadLocalZipArchive.cs
deleted file mode 100644
index 7f61207cb..000000000
--- a/src/Microsoft.DotNet.Archive/ThreadLocalZipArchive.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-using System.IO;
-using System.IO.Compression;
-using System.Threading;
-
-namespace Microsoft.DotNet.Archive
-{
-    /// <summary>
-    /// Wraps ThreadLocal<ZipArchive> and exposes Dispose semantics that dispose all archives
-    /// </summary>
-    internal class ThreadLocalZipArchive : IDisposable
-    {
-        private ThreadLocal<ZipArchive> _archive;
-        private bool _disposed = false;
-
-        public ThreadLocalZipArchive(string archivePath, ZipArchive local = null)
-        {
-            _archive = new ThreadLocal<ZipArchive>(() =>
-                         new ZipArchive(File.Open(archivePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete), ZipArchiveMode.Read),
-                         trackAllValues:true);
-
-            if (local != null)
-            {
-                // reuse provided one for current thread
-                _archive.Value = local;
-            }
-        }
-
-        public ZipArchive Archive { get { return _archive.Value; } }
-
-        public void Dispose()
-        {
-            if (!_disposed)
-            {
-                if (_archive != null)
-                {
-                    // dispose all archives
-                    if (_archive.Values != null)
-                    {
-                        foreach (var value in _archive.Values)
-                        {
-                            if (value != null)
-                            {
-                                value.Dispose();
-                            }
-                        }
-                    }
-
-                    // dispose ThreadLocal
-                    _archive.Dispose();
-                    _archive = null;
-                }
-            }
-        }
-    }
-}
diff --git a/src/Microsoft.DotNet.Cli.Sln.Internal/Microsoft.DotNet.Cli.Sln.Internal.csproj b/src/Microsoft.DotNet.Cli.Sln.Internal/Microsoft.DotNet.Cli.Sln.Internal.csproj
index 518040d30..2120e657e 100644
--- a/src/Microsoft.DotNet.Cli.Sln.Internal/Microsoft.DotNet.Cli.Sln.Internal.csproj
+++ b/src/Microsoft.DotNet.Cli.Sln.Internal/Microsoft.DotNet.Cli.Sln.Internal.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <Description>SLN file reader/writer</Description>
diff --git a/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs b/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs
index 87fad297e..fa89ce258 100644
--- a/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs
+++ b/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs
@@ -33,6 +33,7 @@ using System.IO;
 using System.Collections;
 using System.Globalization;
 using System.Reflection;
+using System.Text;
 using Microsoft.DotNet.Cli.Sln.Internal.FileManipulation;
 using Microsoft.DotNet.Tools.Common;
 
@@ -211,7 +212,7 @@ namespace Microsoft.DotNet.Cli.Sln.Internal
             }
             var sw = new StringWriter();
             Write(sw);
-            File.WriteAllText(FullPath, sw.ToString());
+            File.WriteAllText(FullPath, sw.ToString(), Encoding.UTF8);
         }
 
         private void Write(TextWriter writer)
@@ -285,6 +286,14 @@ namespace Microsoft.DotNet.Cli.Sln.Internal
             get { return _sections; }
         }
 
+        public SlnSection Dependencies
+        {
+            get
+            {
+                return _sections.GetSection("ProjectDependencies", SlnSectionType.PostProcess);
+            }
+        }
+
         internal void Read(TextReader reader, string line, ref int curLineNum)
         {
             Line = curLineNum;
diff --git a/src/Microsoft.DotNet.Cli.Utils/ArgumentEscaper.cs b/src/Microsoft.DotNet.Cli.Utils/ArgumentEscaper.cs
index c8469a9ac..79ab2aa1c 100644
--- a/src/Microsoft.DotNet.Cli.Utils/ArgumentEscaper.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/ArgumentEscaper.cs
@@ -5,7 +5,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using System.Threading.Tasks;
 
 namespace Microsoft.DotNet.Cli.Utils
 {
@@ -22,7 +21,12 @@ namespace Microsoft.DotNet.Cli.Utils
         /// <returns></returns>
         public static string EscapeAndConcatenateArgArrayForProcessStart(IEnumerable<string> args)
         { 
-            return string.Join(" ", EscapeArgArray(args));
+            var escaped = EscapeArgArray(args);
+#if NET35
+            return string.Join(" ", escaped.ToArray());
+#else
+            return string.Join(" ", escaped);
+#endif
         }
 
         /// <summary>
@@ -36,7 +40,12 @@ namespace Microsoft.DotNet.Cli.Utils
         /// <returns></returns>
         public static string EscapeAndConcatenateArgArrayForCmdProcessStart(IEnumerable<string> args)
         {
-            return string.Join(" ", EscapeArgArrayForCmd(args));
+            var escaped = EscapeArgArrayForCmd(args);
+#if NET35
+            return string.Join(" ", escaped.ToArray());
+#else
+            return string.Join(" ", escaped);
+#endif
         }
 
         /// <summary>
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs
index c22af40ba..5c3b64763 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs
@@ -13,11 +13,11 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class PackagedCommandSpecFactoryWithCliRuntime : PackagedCommandSpecFactory
     {
-        public PackagedCommandSpecFactoryWithCliRuntime() : base(AddAditionalParameters)
+        public PackagedCommandSpecFactoryWithCliRuntime() : base(AddAdditionalParameters)
         {
         }
 
-        private static void AddAditionalParameters(string commandPath, IList<string> arguments)
+        private static void AddAdditionalParameters(string commandPath, IList<string> arguments)
         {
             if(PrefersCliRuntime(commandPath))
             {
diff --git a/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs b/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs
index 6c23d4c9e..b8d85b3b7 100644
--- a/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs
@@ -11,7 +11,10 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class EnvironmentProvider : IEnvironmentProvider
     {
+        private static char[] s_pathSeparator = new char[] { Path.PathSeparator };
+        private static char[] s_quote = new char[] { '"' };
         private IEnumerable<string> _searchPaths;
+        private readonly Lazy<string> _userHomeDirectory = new Lazy<string>(() => Environment.GetEnvironmentVariable("HOME") ?? string.Empty);
         private IEnumerable<string> _executableExtensions;
 
         public IEnumerable<string> ExecutableExtensions
@@ -42,8 +45,9 @@ namespace Microsoft.DotNet.Cli.Utils
 
                     searchPaths.AddRange(Environment
                         .GetEnvironmentVariable("PATH")
-                        .Split(Path.PathSeparator)
-                        .Select(p => p.Trim('"')));
+                        .Split(s_pathSeparator)
+                        .Select(p => p.Trim(s_quote))
+                        .Select(p => ExpandTildeSlash(p)));
 
                     _searchPaths = searchPaths;
                 }
@@ -52,6 +56,19 @@ namespace Microsoft.DotNet.Cli.Utils
             }
         }
 
+        private string ExpandTildeSlash(string path)
+        {
+            const string tildeSlash = "~/";
+            if (path.StartsWith(tildeSlash, StringComparison.Ordinal) && !string.IsNullOrEmpty(_userHomeDirectory.Value))
+            {
+                return Path.Combine(_userHomeDirectory.Value, path.Substring(tildeSlash.Length));
+            }
+            else
+            {
+                return path;
+            }
+        }
+
         public EnvironmentProvider(
             IEnumerable<string> extensionsOverride = null,
             IEnumerable<string> searchPathsOverride = null)
diff --git a/src/Microsoft.DotNet.Cli.Utils/IEnvironmentPath.cs b/src/Microsoft.DotNet.Cli.Utils/IEnvironmentPath.cs
new file mode 100644
index 000000000..7c8ddd6bd
--- /dev/null
+++ b/src/Microsoft.DotNet.Cli.Utils/IEnvironmentPath.cs
@@ -0,0 +1,10 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace Microsoft.DotNet.Cli.Utils
+{
+    public interface IEnvironmentPath: IEnvironmentPathInstruction
+    {
+        void AddPackageExecutablePathToUserPath();
+    }
+}
diff --git a/src/Microsoft.DotNet.Cli.Utils/IEnvironmentPathInstruction.cs b/src/Microsoft.DotNet.Cli.Utils/IEnvironmentPathInstruction.cs
new file mode 100644
index 000000000..1ab69e4a1
--- /dev/null
+++ b/src/Microsoft.DotNet.Cli.Utils/IEnvironmentPathInstruction.cs
@@ -0,0 +1,7 @@
+namespace Microsoft.DotNet.Cli.Utils
+{
+    public interface IEnvironmentPathInstruction
+    {
+        void PrintAddPathInstructionIfPathDoesNotExist();
+    }
+}
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj b/src/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj
index bcf9bd712..c7c98b98b 100644
--- a/src/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj
+++ b/src/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <Version>$(SdkVersion)</Version>
@@ -24,7 +23,7 @@
     <PackageReference Include="NuGet.ProjectModel" Version="$(NuGetProjectModelPackageVersion)" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
     <PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(MicrosoftBuildUtilitiesCorePackageVersion)" />
-    <PackageReference Include="System.Runtime.InteropServices.RuntimeInformation" Version="4.0.0" />
+    <PackageReference Include="System.Runtime.InteropServices.RuntimeInformation" Version="4.3.0" />
     <PackageReference Include="XliffTasks" Version="$(XliffTasksPackageVersion)" PrivateAssets="All" />
 </ItemGroup>
 
diff --git a/src/Microsoft.DotNet.Cli.Utils/PathUtility.cs b/src/Microsoft.DotNet.Cli.Utils/PathUtility.cs
index cbbc0d401..32620e0d5 100644
--- a/src/Microsoft.DotNet.Cli.Utils/PathUtility.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/PathUtility.cs
@@ -151,7 +151,7 @@ namespace Microsoft.DotNet.Tools.Common
             {
                 compare = StringComparison.OrdinalIgnoreCase;
                 // check if paths are on the same volume
-                if (!string.Equals(Path.GetPathRoot(path1), Path.GetPathRoot(path2)))
+                if (!string.Equals(Path.GetPathRoot(path1), Path.GetPathRoot(path2), compare))
                 {
                     // on different volumes, "relative" path is just path2
                     return path2;
@@ -273,7 +273,22 @@ namespace Microsoft.DotNet.Tools.Common
 
             foreach (var component in components)
             {
-                if (!string.IsNullOrEmpty(component))
+                if (string.IsNullOrEmpty(component))
+                {
+                    continue;
+                }
+
+                if (string.IsNullOrEmpty(result))
+                {
+                    result = component;
+
+                    // On Windows, manually append a separator for drive references because Path.Combine won't do so
+                    if (result.EndsWith(":") && RuntimeEnvironment.OperatingSystemPlatform == Platform.Windows)
+                    {
+                        result += Path.DirectorySeparatorChar;
+                    }
+                }
+                else
                 {
                     result = Path.Combine(result, component);
                 }
@@ -315,13 +330,14 @@ namespace Microsoft.DotNet.Tools.Common
 
         public static void EnsureAllPathsExist(
             IReadOnlyCollection<string> paths,
-            string pathDoesNotExistLocalizedFormatString)
+            string pathDoesNotExistLocalizedFormatString,
+            bool allowDirectories = false)
         {
             var notExisting = new List<string>();
 
             foreach (var p in paths)
             {
-                if (!File.Exists(p))
+                if (!File.Exists(p) && (!allowDirectories || !Directory.Exists(p)))
                 {
                     notExisting.Add(p);
                 }
diff --git a/src/Microsoft.DotNet.Cli.Utils/Properties/AssemblyInfo.cs b/src/Microsoft.DotNet.Cli.Utils/Properties/AssemblyInfo.cs
index 5ebd03235..119f225c7 100644
--- a/src/Microsoft.DotNet.Cli.Utils/Properties/AssemblyInfo.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/Properties/AssemblyInfo.cs
@@ -12,3 +12,4 @@ using System.Runtime.CompilerServices;
 [assembly: InternalsVisibleTo("Microsoft.DotNet.TestFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("Microsoft.DotNet.Tools.Tests.Utilities, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("Microsoft.DotNet.ProjectJsonMigration, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.DotNet.ShellShim.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Microsoft.DotNet.Configurer/AspNetCertificateSentinel.cs b/src/Microsoft.DotNet.Configurer/AspNetCertificateSentinel.cs
new file mode 100644
index 000000000..c8dc622c0
--- /dev/null
+++ b/src/Microsoft.DotNet.Configurer/AspNetCertificateSentinel.cs
@@ -0,0 +1,61 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.Configurer
+{
+    public class AspNetCertificateSentinel : IAspNetCertificateSentinel
+    {
+        public static readonly string SENTINEL = $"{Product.Version}.aspNetCertificateSentinel";
+
+        private readonly IFile _file;
+        private readonly IDirectory _directory;
+
+        private string _dotnetUserProfileFolderPath;
+
+        private string SentinelPath => Path.Combine(_dotnetUserProfileFolderPath, SENTINEL);
+
+        public AspNetCertificateSentinel(CliFolderPathCalculator cliFallbackFolderPathCalculator) :
+            this(
+                CliFolderPathCalculator.DotnetUserProfileFolderPath,
+                FileSystemWrapper.Default.File,
+                FileSystemWrapper.Default.Directory)
+        {
+        }
+
+        internal AspNetCertificateSentinel(string dotnetUserProfileFolderPath, IFile file, IDirectory directory)
+        {
+            _file = file;
+            _directory = directory;
+            _dotnetUserProfileFolderPath = dotnetUserProfileFolderPath;
+        }
+
+        public bool Exists()
+        {
+            return _file.Exists(SentinelPath);
+        }
+
+        public void CreateIfNotExists()
+        {
+            if (!Exists())
+            {
+                if (!_directory.Exists(_dotnetUserProfileFolderPath))
+                {
+                    _directory.CreateDirectory(_dotnetUserProfileFolderPath);
+                }
+
+                _file.CreateEmptyFile(SentinelPath);
+            }
+        }
+
+        public void Dispose()
+        {
+        }
+    }
+}
diff --git a/src/Microsoft.DotNet.Configurer/BashPathUnderHomeDirectory.cs b/src/Microsoft.DotNet.Configurer/BashPathUnderHomeDirectory.cs
new file mode 100644
index 000000000..1bf9b4c73
--- /dev/null
+++ b/src/Microsoft.DotNet.Configurer/BashPathUnderHomeDirectory.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace Microsoft.DotNet.Configurer
+{
+    public struct BashPathUnderHomeDirectory
+    {
+        private readonly string _fullHomeDirectoryPath;
+        private readonly string _pathRelativeToHome;
+
+        public BashPathUnderHomeDirectory(string fullHomeDirectoryPath, string pathRelativeToHome)
+        {
+            _fullHomeDirectoryPath =
+                fullHomeDirectoryPath ?? throw new ArgumentNullException(nameof(fullHomeDirectoryPath));
+            _pathRelativeToHome = pathRelativeToHome ?? throw new ArgumentNullException(nameof(pathRelativeToHome));
+        }
+
+        public string PathWithTilde => $"~/{_pathRelativeToHome}";
+
+        public string PathWithDollar => $"$HOME/{_pathRelativeToHome}";
+
+        public string Path => $"{_fullHomeDirectoryPath}/{_pathRelativeToHome}";
+    }
+}
diff --git a/src/Microsoft.DotNet.Configurer/CliFallbackFolderPathCalculator.cs b/src/Microsoft.DotNet.Configurer/CliFallbackFolderPathCalculator.cs
deleted file mode 100644
index ddeac908f..000000000
--- a/src/Microsoft.DotNet.Configurer/CliFallbackFolderPathCalculator.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using Microsoft.DotNet.Cli.Utils;
-using Microsoft.DotNet.PlatformAbstractions;
-using NuGet.Common;
-
-namespace Microsoft.DotNet.Configurer
-{
-    public class CliFallbackFolderPathCalculator
-    {
-        public string CliFallbackFolderPath =>
-            Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_FALLBACKFOLDER") ??
-            Path.Combine(new DirectoryInfo(AppContext.BaseDirectory).Parent.FullName, "NuGetFallbackFolder");
-
-        public string DotnetUserProfileFolderPath
-        {
-            get
-            {
-                string profileDir = Environment.GetEnvironmentVariable(
-                    RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "USERPROFILE" : "HOME");
-
-                return Path.Combine(profileDir, ".dotnet");
-            }
-        }
-
-        public string NuGetUserSettingsDirectory =>
-            NuGetEnvironment.GetFolderPath(NuGetFolderPath.UserSettingsDirectory);
-    }
-}
diff --git a/src/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs b/src/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs
new file mode 100644
index 000000000..20901eb48
--- /dev/null
+++ b/src/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs
@@ -0,0 +1,49 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.PlatformAbstractions;
+using NuGet.Common;
+
+namespace Microsoft.DotNet.Configurer
+{
+    public class CliFolderPathCalculator
+    {
+        // ToolsShimFolderName ToolPackageFolderName cannot be the same
+        // or if the PackageId is the same as CommandName, they will conflict on unix.
+        private const string ToolsShimFolderName = "tools";
+        private const string ToolPackageFolderName = "toolspkgs";
+        private const string DotnetProfileDirectoryName = ".dotnet";
+
+        public string CliFallbackFolderPath => Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_FALLBACKFOLDER") ??
+                                               Path.Combine(new DirectoryInfo(AppContext.BaseDirectory).Parent.FullName, "NuGetFallbackFolder");
+        
+        public string ToolsShimPath => Path.Combine(DotnetUserProfileFolderPath, ToolsShimFolderName);
+        public string ToolsPackagePath => Path.Combine(DotnetUserProfileFolderPath, ToolPackageFolderName);
+        public BashPathUnderHomeDirectory ToolsShimPathInUnix
+        {
+            get
+            {
+                return new BashPathUnderHomeDirectory(Environment.GetEnvironmentVariable("HOME"),
+                    Path.Combine(DotnetProfileDirectoryName, ToolsShimFolderName));
+            }
+        }
+
+        public static string DotnetUserProfileFolderPath
+        {
+            get
+            {
+                string profileDir = Environment.GetEnvironmentVariable(
+                    RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "USERPROFILE" : "HOME");
+
+                return Path.Combine(profileDir, DotnetProfileDirectoryName);
+            }
+        }
+
+        public string NuGetUserSettingsDirectory =>
+            NuGetEnvironment.GetFolderPath(NuGetFolderPath.UserSettingsDirectory);
+    }
+}
diff --git a/src/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs b/src/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs
index 9a89bcb6f..584ae0923 100644
--- a/src/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs
+++ b/src/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs
@@ -1,7 +1,9 @@
 // Copyright (c) .NET Foundation and contributors. All rights reserved.
 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
+using System;
 using System.IO;
+using System.Runtime.InteropServices;
 using Microsoft.DotNet.Cli.Utils;
 using Microsoft.Extensions.EnvironmentAbstractions;
 
@@ -14,26 +16,37 @@ namespace Microsoft.DotNet.Configurer
         private INuGetCachePrimer _nugetCachePrimer;
         private INuGetCacheSentinel _nugetCacheSentinel;
         private IFirstTimeUseNoticeSentinel _firstTimeUseNoticeSentinel;
+        private IAspNetCertificateSentinel _aspNetCertificateSentinel;
+        private IAspNetCoreCertificateGenerator _aspNetCoreCertificateGenerator;
         private string _cliFallbackFolderPath;
+        private readonly IEnvironmentPath _pathAdder;
 
         public DotnetFirstTimeUseConfigurer(
             INuGetCachePrimer nugetCachePrimer,
             INuGetCacheSentinel nugetCacheSentinel,
             IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel,
+            IAspNetCertificateSentinel aspNetCertificateSentinel,
+            IAspNetCoreCertificateGenerator aspNetCoreCertificateGenerator,
             IEnvironmentProvider environmentProvider,
             IReporter reporter,
-            string cliFallbackFolderPath)
+            string cliFallbackFolderPath,
+            IEnvironmentPath pathAdder)
         {
             _nugetCachePrimer = nugetCachePrimer;
             _nugetCacheSentinel = nugetCacheSentinel;
             _firstTimeUseNoticeSentinel = firstTimeUseNoticeSentinel;
+            _aspNetCertificateSentinel = aspNetCertificateSentinel;
+            _aspNetCoreCertificateGenerator = aspNetCoreCertificateGenerator;
             _environmentProvider = environmentProvider;
             _reporter = reporter;
             _cliFallbackFolderPath = cliFallbackFolderPath;
+            _pathAdder = pathAdder ?? throw new ArgumentNullException(nameof(pathAdder));
         }
 
         public void Configure()
         {
+            AddPackageExecutablePath();
+
             if (ShouldPrintFirstTimeUseNotice())
             {
                 PrintFirstTimeUseNotice();
@@ -52,6 +65,48 @@ namespace Microsoft.DotNet.Configurer
                     _nugetCachePrimer.PrimeCache();
                 }
             }
+
+            if(ShouldGenerateAspNetCertificate())
+            {
+                GenerateAspNetCertificate();
+            }
+        }
+
+        private void GenerateAspNetCertificate()
+        {
+            _aspNetCoreCertificateGenerator.GenerateAspNetCoreDevelopmentCertificate();
+
+            _reporter.WriteLine();
+            _reporter.WriteLine(LocalizableStrings.AspNetCertificateInstalled);
+
+            _aspNetCertificateSentinel.CreateIfNotExists();
+        }
+
+        private bool ShouldGenerateAspNetCertificate()
+        {
+            var generateAspNetCertificate =
+                _environmentProvider.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true);
+
+            return ShouldRunFirstRunExperience() &&
+                generateAspNetCertificate &&
+                !_aspNetCertificateSentinel.Exists();
+        }
+
+        private void AddPackageExecutablePath()
+        {
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                if (!_firstTimeUseNoticeSentinel.Exists())
+                { 
+                    // Invoke when Windows first run
+                    _pathAdder.AddPackageExecutablePathToUserPath();
+                }
+            }
+            else
+            {
+                // Invoke during installer, otherwise, _pathAdder will be no op object that this point
+                _pathAdder.AddPackageExecutablePathToUserPath();
+            }
         }
 
         private bool ShouldPrintFirstTimeUseNotice()
diff --git a/src/Microsoft.DotNet.Configurer/FirstTimeUseNoticeSentinel.cs b/src/Microsoft.DotNet.Configurer/FirstTimeUseNoticeSentinel.cs
index d7335dee5..78ae9caa5 100644
--- a/src/Microsoft.DotNet.Configurer/FirstTimeUseNoticeSentinel.cs
+++ b/src/Microsoft.DotNet.Configurer/FirstTimeUseNoticeSentinel.cs
@@ -19,9 +19,9 @@ namespace Microsoft.DotNet.Configurer
 
         private string SentinelPath => Path.Combine(_dotnetUserProfileFolderPath, SENTINEL);
 
-        public FirstTimeUseNoticeSentinel(CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator) :
+        public FirstTimeUseNoticeSentinel(CliFolderPathCalculator cliFolderPathCalculator) :
             this(
-                cliFallbackFolderPathCalculator.DotnetUserProfileFolderPath,
+                CliFolderPathCalculator.DotnetUserProfileFolderPath,
                 FileSystemWrapper.Default.File,
                 FileSystemWrapper.Default.Directory)
         {
diff --git a/src/Microsoft.DotNet.Configurer/IAspNetCertificateSentinel.cs b/src/Microsoft.DotNet.Configurer/IAspNetCertificateSentinel.cs
new file mode 100644
index 000000000..5a422a1f7
--- /dev/null
+++ b/src/Microsoft.DotNet.Configurer/IAspNetCertificateSentinel.cs
@@ -0,0 +1,12 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace Microsoft.DotNet.Configurer
+{
+    public interface IAspNetCertificateSentinel
+    {
+        bool Exists();
+
+        void CreateIfNotExists();
+    }
+}
diff --git a/src/Microsoft.DotNet.Configurer/IAspNetCoreCertificateGenerator.cs b/src/Microsoft.DotNet.Configurer/IAspNetCoreCertificateGenerator.cs
new file mode 100644
index 000000000..e19fc15d6
--- /dev/null
+++ b/src/Microsoft.DotNet.Configurer/IAspNetCoreCertificateGenerator.cs
@@ -0,0 +1,10 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace Microsoft.DotNet.Configurer
+{
+    public interface IAspNetCoreCertificateGenerator
+    {
+        void GenerateAspNetCoreDevelopmentCertificate();
+    }
+}
diff --git a/src/Microsoft.DotNet.Configurer/LocalizableStrings.resx b/src/Microsoft.DotNet.Configurer/LocalizableStrings.resx
index 7b56bd336..3b46d09d5 100644
--- a/src/Microsoft.DotNet.Configurer/LocalizableStrings.resx
+++ b/src/Microsoft.DotNet.Configurer/LocalizableStrings.resx
@@ -120,30 +120,38 @@
   <data name="FirstTimeWelcomeMessage" xml:space="preserve">
     <value>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</value>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</value>
   </data>
   <data name="NugetCachePrimeMessage" xml:space="preserve">
     <value>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</value>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</value>
   </data>
   <data name="FailedToPrimeCacheError" xml:space="preserve">
     <value>Failed to prime the NuGet cache. {0} failed with: {1}</value>
   </data>
-  <data name="UnauthorizedAccessMessage"  xml:space="preserve">
+  <data name="UnauthorizedAccessMessage" xml:space="preserve">
     <value>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
     </value>
   </data>
-</root>
+  <data name="AspNetCertificateInstalled" xml:space="preserve">
+    <value>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj b/src/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj
index 0b4daa29e..bac6b0f9f 100644
--- a/src/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj
+++ b/src/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
@@ -19,12 +18,12 @@
   <ItemGroup>
     <PackageReference Include="NuGet.Common" Version="$(NuGetCommonPackageVersion)" />
     <PackageReference Include="NuGet.Configuration" Version="$(NuGetConfigurationPackageVersion)" />
+    <PackageReference Include="Microsoft.DotNet.Archive" Version="$(MicrosoftDotNetArchivePackageVersion)" />
     <PackageReference Include="XliffTasks" Version="$(XliffTasksPackageVersion)" PrivateAssets="All" />
   </ItemGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
     <ProjectReference Include="..\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
-    <ProjectReference Include="..\Microsoft.DotNet.Archive\Microsoft.DotNet.Archive.csproj" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/NoOpAspNetCertificateSentinel.cs b/src/Microsoft.DotNet.Configurer/NoOpAspNetCertificateSentinel.cs
new file mode 100644
index 000000000..0459226c7
--- /dev/null
+++ b/src/Microsoft.DotNet.Configurer/NoOpAspNetCertificateSentinel.cs
@@ -0,0 +1,21 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace Microsoft.DotNet.Configurer
+{
+    public class NoOpAspNetCertificateSentinel : IAspNetCertificateSentinel
+    {
+        public bool Exists()
+        {
+            return true;
+        }
+
+        public void CreateIfNotExists()
+        {
+        }
+
+        public void Dispose()
+        {
+        }
+    }
+}
diff --git a/src/Microsoft.DotNet.Configurer/NuGetCachePrimer.cs b/src/Microsoft.DotNet.Configurer/NuGetCachePrimer.cs
index 5233d3359..a0bc3bca5 100644
--- a/src/Microsoft.DotNet.Configurer/NuGetCachePrimer.cs
+++ b/src/Microsoft.DotNet.Configurer/NuGetCachePrimer.cs
@@ -17,15 +17,15 @@ namespace Microsoft.DotNet.Configurer
 
         private readonly INuGetCacheSentinel _nuGetCacheSentinel;
 
-        private readonly CliFallbackFolderPathCalculator _cliFallbackFolderPathCalculator;
+        private readonly CliFolderPathCalculator _cliFolderPathCalculator;
 
         public NuGetCachePrimer(
             INuGetPackagesArchiver nugetPackagesArchiver,
             INuGetCacheSentinel nuGetCacheSentinel,
-            CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator)
+            CliFolderPathCalculator cliFolderPathCalculator)
             : this(nugetPackagesArchiver,
                 nuGetCacheSentinel,
-                cliFallbackFolderPathCalculator,
+                cliFolderPathCalculator,
                 FileSystemWrapper.Default.File)
         {
         }
@@ -33,14 +33,14 @@ namespace Microsoft.DotNet.Configurer
         internal NuGetCachePrimer(
             INuGetPackagesArchiver nugetPackagesArchiver,
             INuGetCacheSentinel nuGetCacheSentinel,
-            CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator,
+            CliFolderPathCalculator cliFolderPathCalculator,
             IFile file)
         {
             _nugetPackagesArchiver = nugetPackagesArchiver;
 
             _nuGetCacheSentinel = nuGetCacheSentinel;
 
-            _cliFallbackFolderPathCalculator = cliFallbackFolderPathCalculator;
+            _cliFolderPathCalculator = cliFolderPathCalculator;
 
             _file = file;
         }
@@ -52,7 +52,7 @@ namespace Microsoft.DotNet.Configurer
                 return;
             }
 
-            var nuGetFallbackFolder = _cliFallbackFolderPathCalculator.CliFallbackFolderPath;
+            var nuGetFallbackFolder = _cliFolderPathCalculator.CliFallbackFolderPath;
 
             _nugetPackagesArchiver.ExtractArchive(nuGetFallbackFolder);
 
diff --git a/src/Microsoft.DotNet.Configurer/NuGetCacheSentinel.cs b/src/Microsoft.DotNet.Configurer/NuGetCacheSentinel.cs
index bfc7a29d9..ebaff5819 100644
--- a/src/Microsoft.DotNet.Configurer/NuGetCacheSentinel.cs
+++ b/src/Microsoft.DotNet.Configurer/NuGetCacheSentinel.cs
@@ -27,8 +27,8 @@ namespace Microsoft.DotNet.Configurer
 
         private Stream InProgressSentinel { get; set; }
 
-        public NuGetCacheSentinel(CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator) :
-            this(cliFallbackFolderPathCalculator.CliFallbackFolderPath,
+        public NuGetCacheSentinel(CliFolderPathCalculator cliFolderPathCalculator) :
+            this(cliFolderPathCalculator.CliFallbackFolderPath,
                  FileSystemWrapper.Default.File,
                  FileSystemWrapper.Default.Directory)
         {
diff --git a/src/Microsoft.DotNet.Configurer/UserLevelCacheWriter.cs b/src/Microsoft.DotNet.Configurer/UserLevelCacheWriter.cs
index 9e5fd4a78..eeb69e526 100644
--- a/src/Microsoft.DotNet.Configurer/UserLevelCacheWriter.cs
+++ b/src/Microsoft.DotNet.Configurer/UserLevelCacheWriter.cs
@@ -14,9 +14,9 @@ namespace Microsoft.DotNet.Configurer
         private readonly IDirectory _directory;
         private string _dotnetUserProfileFolderPath;
 
-        public UserLevelCacheWriter(CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator) :
+        public UserLevelCacheWriter(CliFolderPathCalculator cliFolderPathCalculator) :
             this(
-                cliFallbackFolderPathCalculator.DotnetUserProfileFolderPath,
+                CliFolderPathCalculator.DotnetUserProfileFolderPath,
                 FileSystemWrapper.Default.File,
                 FileSystemWrapper.Default.Directory)
         {
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf
index 69c2a2361..52d1e0afb 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">Vítá vás .NET Core!
 ---------------------
-Další informace o .NET Core najdete na https://aka.ms/dotnet-docs. Dostupné příkazy si zobrazíte pomocí dotnet --help, případně přejděte na https://aka.ms/dotnet-cli-docs.
+Další informace o .NET Core: https://aka.ms/dotnet-docs
+Dostupné příkazy si zobrazíte pomocí dotnet --help, případně navštivte: https://aka.ms/dotnet-cli-docs.
 
 Telemetrie
---------------
-Nástroje .NET Core shromažďují data o využití s cílem vylepšit vaše prostředí. Data jsou anonymní a nezahrnují argumenty příkazového řádku. Data shromažďuje Microsoft, který je sdílí s komunitou.
-S telemetrií můžete vyjádřit výslovný nesouhlas, a to nastavením proměnné prostředí DOTNET_CLI_TELEMETRY_OPTOUT na 1 prostřednictvím svého oblíbeného rozhraní.
-Další informace o telemetrii nástrojů .NET Core si můžete přečíst na webu https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+Nástroje .NET Core shromažďují data o využití s cílem usnadnit nám vylepšování vašeho prostředí. Data jsou anonymní a nezahrnují argumenty příkazového řádku. Data shromažďuje Microsoft, který je sdílí s komunitou. S telemetrií můžete vyjádřit výslovný nesouhlas, a to nastavením proměnné prostředí DOTNET_CLI_TELEMETRY_OPTOUT na 1 (neboli Pravda) prostřednictvím svého oblíbeného rozhraní.
+
+Další informace o telemetrii nástrojů .NET Core CLI: https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ Další informace o telemetrii nástrojů .NET Core si můžete přečíst na we
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Probíhá konfigurace...
--------------------
-Běží příkaz pro počáteční naplnění vaší místní mezipaměti balíčků, aby se vylepšila rychlost obnovování a umožnil se offline přístup. Provádění tohoto příkazu může trvat až minutu a proběhne jen jednou.</target>
+--------------
+Běží příkaz pro naplnění vaší místní mezipaměti balíčků, aby se vylepšila rychlost obnovování a umožnil se offline přístup. Provádění tohoto příkazu trvá až minutu a proběhne jen jednou.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">Oprávnění ke změně složky {0} bylo zamítnuto.
 
 Tuto chybu můžete opravit pomocí některé z těchto možností:
----------------------
+----------------------------------------
 1. Znovu spusťte tento příkaz pomocí přístupu se zvýšenou úrovní oprávnění.
 2. Zakažte software spouštěný při prvním zapnutí počítače tak, že nastavíte proměnnou prostředí DOTNET_SKIP_FIRST_TIME_EXPERIENCE na hodnotu Pravda.
 3. Zkopírujte sadu .NET Core SDK do nechráněného umístění a použijte ji z tohoto umístění.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Nainstaloval se vývojový certifikát ASP.NET Core HTTPS. Další informace najdete na https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf
index e101ef579..60943a88f 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf
@@ -5,21 +5,23 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">Willkommen bei .NET Core!
 ---------------------
-Weitere Informationen zu .NET Core finden Sie unter https://aka.ms/dotnet-docs. Verwenden Sie "dotnet --help", um die verfügbaren Befehle anzuzeigen, oder wechseln Sie zu https://aka.ms/dotnet-cli-docs.
+Weitere Informationen zu .NET Core finden Sie unter https://aka.ms/dotnet-docs.
+Verwenden Sie "dotnet --help", um die verfügbaren Befehle anzuzeigen, oder wechseln Sie zu https://aka.ms/dotnet-cli-docs.
 
 Telemetrie
---------------
-Über die .NET Core-Tools werden Nutzungsdaten erfasst, damit wir die Benutzeroberfläche weiter für Sie verbessern können. Die Daten sind anonym und enthalten keine Befehlszeilenargumente. Die Daten werden von Microsoft gesammelt und mit der Community geteilt.
-Sie können die Erfassung von Telemetriedaten deaktivieren, indem Sie die Umgebungsvariable DOTNET_CLI_TELEMETRY_OPTOUT mithilfe Ihrer bevorzugten Shell auf 1 festlegen.
+---------
+Über die .NET Core-Tools werden Nutzungsdaten erfasst, damit wir die Benutzeroberfläche weiter für Sie verbessern können. Die Daten sind anonym und enthalten keine Befehlszeilenargumente. Die Daten werden von Microsoft gesammelt und mit der Community geteilt. Sie können die Erfassung von Telemetriedaten deaktivieren, indem Sie die Umgebungsvariable DOTNET_CLI_TELEMETRY_OPTOUT mithilfe Ihrer bevorzugten Shell auf "1" oder "true" festlegen.
+
 Weitere Informationen zur Telemetrie der .NET Core-Tools finden Sie unter https://aka.ms/dotnet-cli-telemetry.</target>
         <note />
       </trans-unit>
@@ -30,18 +32,18 @@ Weitere Informationen zur Telemetrie der .NET Core-Tools finden Sie unter https:
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Konfiguration wird durchgeführt...
--------------------
-Ein Befehl wird ausgeführt, um Ihren lokalen Paketcache erstmals aufzufüllen, die Wiederherstellungsgeschwindigkeit zu verbessern und Onlinezugriff zu ermöglichen. Die Ausführung dieses Befehls nimmt bis zu einer Minute in Anspruch und wird einmalig ausgeführt.</target>
+--------------
+Ein Befehl wird ausgeführt, um Ihren lokalen Paketcache aufzufüllen, die Wiederherstellungsgeschwindigkeit zu verbessern und Onlinezugriff zu ermöglichen. Die Ausführung dieses Befehls nimmt bis zu einer Minute in Anspruch und wird nur einmal ausgeführt.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">Die Berechtigung zum Ändern des Ordners "{0}" wurde verweigert.
 
 Im Folgenden finden Sie einige Optionen, um diesen Fehler zu beheben:
----------------------
+----------------------------------------
 1. Führen Sie diesen Befehl mit erhöhten Zugriffsrechten noch mal aus.
 2. Deaktivieren Sie die erste Ausführung, indem Sie die Umgebungsvariable DOTNET_SKIP_FIRST_TIME_EXPERIENCE auf "true" festlegen.
 3. Kopieren Sie das .NET Core SDK an einen nicht geschützten Speicherort, und kopieren Sie es von dort.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Installiertes ASP.NET Core-HTTPS-Entwicklungszertifikat. Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf
index 49e0cd07d..9d71f4883 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf
@@ -5,22 +5,23 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">Bienvenido a .NET Core
 ---------------------
-Aprenda sobre .NET Core en https://aka.ms/dotnet-docs. Use dotnet --help para ver los comandos disponibles o vaya a https://aka.ms/dotnet-cli-docs.
+Aprenda sobre .NET Core en https://aka.ms/dotnet-docs. Use "dotnet --help" para ver los comandos disponibles o vaya a https://aka.ms/dotnet-cli-docs.
 
 Telemetría
---------------
-Las herramientas de .NET Core recopilan datos de uso con el fin de mejorar su experiencia. Los datos son anónimos y no incluyen argumentos de la línea de comandos. Microsoft recopila los datos y los comparte con la comunidad.
-Si desea optar por no participar en la telemetría, establezca una variable de entorno DOTNET_CLI_TELEMETRY_OPTOUT en 1 con el shell de su preferencia.
-Puede leer más información sobre la telemetría de las herramientas de .NET Core en https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+Las herramientas de .NET Core recopilan datos de uso con el fin de ayudarnos a mejorar su experiencia. Los datos son anónimos y no incluyen argumentos de la línea de comandos. Microsoft recopila los datos y los comparte con la comunidad. Si desea optar por no participar en la telemetría, establezca una variable de entorno DOTNET_CLI_TELEMETRY_OPTOUT en "1" o "true" con el shell de su preferencia.
+
+Obtenga más información sobre la telemetría de las herramientas de la CLI de .NET Core en https://aka.ms/dotnet-cli-telemetry.</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +31,18 @@ Puede leer más información sobre la telemetría de las herramientas de .NET Co
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Configurando...
--------------------
-Se está ejecutando un comando para rellenar inicialmente la caché de paquetes local, para mejorar la velocidad de restauración y habilitar el acceso sin conexión. Este comando tardará en completarse un minuto y solo sucederá una vez.</target>
+--------------
+Se está ejecutando un comando para rellenar la caché de paquetes local para mejorar la velocidad de restauración y habilitar el acceso sin conexión. Este comando tarda en completarse hasta un minuto y solo se ejecuta una vez.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +50,24 @@ Here are some options to fix this error:
         <target state="translated">Permiso denegado para modificar la carpeta "{0}".
 
 Estas son algunas opciones para corregir este error:
----------------------
+----------------------------------------
 1. Vuelva a ejecutar este comando con acceso con privilegios elevados.
 2. Deshabilite la primera experiencia de ejecución; para ello, establezca la variable de entorno DOTNET_SKIP_FIRST_TIME_EXPERIENCE en true.
 3. Copie el SDK de .NET Core en una ubicación no protegida y úselo desde ahí.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Se instaló el certificado de desarrollo HTTPS de ASP.NET Core. Para más información, vaya a https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf
index fb9d015ce..041cede23 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">Bienvenue dans .NET Core !
 ---------------------
-En savoir plus sur .NET Core @ https://aka.ms/dotnet-docs. Utilisez dotnet --help pour voir les commandes disponibles, ou accédez à https://aka.ms/dotnet-cli-docs.
+En savoir plus sur .NET Core : https://aka.ms/dotnet-docs.
+Utilisez 'dotnet --help' pour voir les commandes disponibles ou visitez : https://aka.ms/dotnet-cli-docs
 
 Télémétrie
---------------
-Les outils .NET Core collectent des données d'utilisation pour améliorer votre expérience utilisateur. Ces données sont anonymes et n'incluent aucun argument de ligne de commande. Les données sont collectées par Microsoft et partagées par la communauté.
-Vous pouvez refuser l'adhésion à la télémétrie en affectant la valeur 1 à la variable d'environnement DOTNET_CLI_TELEMETRY_OPTOUT via l'interpréteur de commandes de votre choix.
-Pour plus d'informations sur la télémétrie des outils .NET Core, consultez https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+Les outils .NET Core collectent des données d'utilisation pour nous aider à améliorer votre expérience utilisateur. Ces données sont anonymes et n'incluent aucun argument de ligne de commande. Elles sont collectées par Microsoft et partagées avec la communauté. Vous pouvez refuser la télémétrie en affectant la valeur '1' ou 'true' à la variable d'environnement DOTNET_CLI_TELEMETRY_OPTOUT via l'interpréteur de commandes de votre choix.
+
+En savoir plus sur la télémétrie des outils .NET Core CLI : https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ Pour plus d'informations sur la télémétrie des outils .NET Core, consultez ht
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
-        <target state="translated">Configuration en cours...
--------------------
-Une commande s'exécute pour remplir votre cache de package local, améliorer la vitesse de restauration et activer l'accès hors connexion. L'exécution de cette commande peut prendre jusqu'à une minute et n'a lieu qu'une seule fois.</target>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
+        <target state="translated">Configuration en cours
+--------------
+Une commande s'exécute pour remplir votre cache de package local afin d'améliorer la vitesse de restauration et activer l'accès hors connexion. Cette commande peut prendre jusqu'à une minute et ne s'exécute qu'une seule fois.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">Autorisation refusée pour la modification du dossier '{0}'.
 
 Voici quelques options pour corriger cette erreur :
----------------------
+----------------------------------------
 1. Réexécutez cette commande avec un accès élevé.
 2. Désactivez l'introduction de l'interface logicielle lors de la première utilisation en affectant la valeur true à la variable d'environnement DOTNET_SKIP_FIRST_TIME_EXPERIENCE.
-3. Copiez le kit .NET Core SDK à un emplacement non protégé à partir duquel vous l'utiliserez ensuite.
+3. Copiez le kit .NET Core SDK dans un emplacement non protégé à partir duquel vous l'utiliserez ensuite.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Certificat de développement HTTPS ASP.NET Core installé. Pour plus d’informations, accédez à https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf
index c24c80849..9608daf2e 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">Benvenuti a .NET Core
 ---------------------
-Per altre informazioni su .NET Core, vedere https://aka.ms/dotnet-docs. Per visualizzare i comandi disponibili, usare dotnet --help oppure vedere https://aka.ms/dotnet-cli-docs.
+Per altre informazioni su .NET Core, vedere https://aka.ms/dotnet-docs.
+Per visualizzare i comandi disponibili, usare 'dotnet --help' oppure visitare https://aka.ms/dotnet-cli-docs.
 
 Telemetria
---------------
-Gli strumenti di .NET Core consentono di raccogliere i dati di utilizzo allo scopo di migliorare l'esperienza. I dati sono anonimi e non includono gli argomenti della riga di comando. Vengono raccolti da Microsoft e condivisi con la community.
-È possibile escludere la telemetria impostando la variabile di ambiente DOTNET_CLI_TELEMETRY_OPTOUT su 1 nella shell preferita.
-Per altre informazioni sulla telemetria degli strumenti di .NET Core, vedere https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+Gli strumenti di .NET Core consentono di raccogliere i dati di utilizzo allo scopo di migliorare l'esperienza. I dati sono anonimi e non includono gli argomenti della riga di comando. Vengono raccolti da Microsoft e condivisi con la community. È possibile escludere la telemetria impostando la variabile di ambiente DOTNET_CLI_TELEMETRY_OPTOUT su '1' o su 'true' nella shell preferita.
+
+Per altre informazioni sulla telemetria degli strumenti dell'interfaccia della riga di comando di .NET Core, vedere https://aka.ms/dotnet-cli-telemetry.</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ Per altre informazioni sulla telemetria degli strumenti di .NET Core, vedere htt
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Configurazione...
--------------------
-È in esecuzione un comando per popolare inizialmente la cache dei pacchetti locale, migliorare la velocità di ripristino e abilitare l'accesso offline. Il completamento di questo comando, che viene eseguito una sola volta, richiede circa un minuto.</target>
+--------------
+È in esecuzione un comando per popolare la cache dei pacchetti locale, migliorare la velocità di ripristino e abilitare l'accesso offline. Il completamento di questo comando, che viene eseguito una sola volta, richiede fino a un minuto.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">L'autorizzazione per modificare la cartella '{0}' è stata negata.
 
 Ecco alcune opzioni per correggere questo errore:
----------------------
+----------------------------------------
 1. Eseguire di nuovo questo comando con privilegi di accesso elevati.
 2. Disabilitare il completamento dell'installazione impostando su true la variabile di ambiente DOTNET_SKIP_FIRST_TIME_EXPERIENCE.
 3. Copiare .NET Core SDK in un percorso non protetto e usarlo da tale posizione.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Il certificato di sviluppo HTTPS di ASP.NET Core è stato installato. Per altre informazioni, vedere https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf
index b201c5144..33589ba3a 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">.NET Core へようこそ!
 ---------------------
-.NET Core について詳しくは、https://aka.ms/dotnet-docs をご覧ください。dotnet --help を使って使用可能なコマンドを確認するか、https://aka.ms/dotnet-cli-docs をご覧ください。
+.NET Core についての詳細情報: https://aka.ms/dotnet-docs
+'dotnet --help' を使用して利用可能なコマンドを確認するか、次にアクセスしてください: https://aka.ms/dotnet-cli-docs
 
 テレメトリ
---------------
-.NET Core ツールは、操作性を向上させるために利用状況データを収集します。データは匿名で、コマンドライン引数が含まれません。データは Microsoft によって収集され、コミュニティと共有されます。
-テレメトリを無効にするには、お好きなシェルを使用して、DOTNET_CLI_TELEMETRY_OPTOUT 環境変数を 1 に設定します。
-.NET Core ツールのテレメトリについて詳しくは、https://aka.ms/dotnet-cli-telemetry をお読みください。</target>
+---------
+.NET Core ツールは、エクスペリエンスの向上に役立つ利用状況データを収集します。データは匿名で、コマンドライン引数が含まれません。データは Microsoft によって収集され、コミュニティと共有されます。テレメトリをオプトアウトするには、お好きなシェルを使用して、DOTNET_CLI_TELEMETRY_OPTOUT 環境変数を '1' または 'true' に設定します。
+
+.NET Core CLI ツールのテレメトリに関する詳細情報をお読みください: https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-te
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">構成中...
--------------------
-ローカル パッケージ キャッシュを最初に設定し、復元速度を向上させ、オフライン アクセスを可能にするため、コマンドを実行しています。このコマンドは 1 回だけ実行され、完了までに最大 1 分かかる場合があります。</target>
+--------------
+ローカル パッケージ キャッシュを設定し、復元速度を向上させ、オフライン アクセスを有効にするため、コマンドを実行しています。このコマンドは 1 回だけ実行され、完了までに最大 1 分かかります。</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">'{0}' フォルダーを変更するためのアクセス許可が拒否されました。
 
 このエラーを修正するためのいくつかのオプションを次に示します。
----------------------
+----------------------------------------
 1. 昇格したアクセス権でこのコマンドを再実行します。
 2. 環境変数 DOTNET_SKIP_FIRST_TIME_EXPERIENCE を true に設定して、最初の実行エクスペリエンスを無効にします。
 3. 保護されていない場所に .NET Core SDK をコピーし、そこから使用します。
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+ASP.NET Core HTTPS 開発証明書をインストールしました。詳しくは、https://go.microsoft.com/fwlink/?linkid=84805 をご覧ください</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf
index 6f912a283..b59e79ae4 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
-        <target state="translated">.NET Core를 시작합니다!
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
+        <target state="translated">.NET Core를 시작합니다.
 ---------------------
-.NET Core에 대한 자세한 내용은 https://aka.ms/dotnet-docs를 참조하세요. 사용 가능한 명령을 보려면 dotnet --help를 사용하거나 https://aka.ms/dotnet-cli-docs를 방문하세요.
+.NET Core에 대한 자세한 내용은 https://aka.ms/dotnet-docs를 참조하세요. 사용 가능한 명령을 보려면 ‘dotnet --help’를 사용하거나 https://aka.ms/dotnet-cli-docs를 방문하세요.
 
 원격 분석
---------------
+---------
 .NET Core 도구는 사용자 환경 개선을 위해 사용량 데이터를 수집합니다. 데이터는 익명이며 명령줄 인수를 포함하지 않습니다. Microsoft에서 데이터를 수집하여 커뮤니티와 공유합니다.
-자주 사용하는 셸에서 DOTNET_CLI_TELEMETRY_OPTOUT 환경 변수를 1로 설정하여 원격 분석을 옵트아웃할 수 있습니다.
-.NET Core 도구 원격 분석에 대한 자세한 내용은 https://aka.ms/dotnet-cli-telemetry에서 확인할 수 있습니다.</target>
+자주 사용하는 셸에서 DOTNET_CLI_TELEMETRY_OPTOUT 환경 변수를 ‘1’ 또는 'true'로 설정하여 원격 분석을 옵트아웃할 수 있습니다.
+
+.NET Core CLI 도구 원격 분석에 대한 자세한 내용은 https://aka.ms/dotnet-cli-telemetry에서 확인할 수 있습니다.</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-te
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">구성 중...
--------------------
-초기에 로컬 패키지 캐시를 채우고, 복원 속도를 개선하고, 오프라인 액세스를 사용하도록 설정하기 위한 명령을 실행하고 있습니다. 완료하는 데 최대 1분이 소요되며 한 번만 실행됩니다.</target>
+--------------
+로컬 패키지 캐시를 채워 복원 속도를 개선하고 오프라인 액세스를 사용하도록 설정하기 위한 명령을 실행하고 있습니다. 완료하는 데 최대 1분이 소요되며 한 번만 실행됩니다.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">'{0}' 폴더를 수정하는 데 필요한 사용 권한이 거부되었습니다.
 
 이 오류를 해결하기 위한 옵션을 다음과 같습니다.
----------------------
+----------------------------------------
 1. 높은 액세스 권한으로 이 명령을 다시 실행합니다.
-2. 환경 변수 DOTNET_SKIP_FIRST_TIME_EXPERIENCE를 true로 설정하여 첫 실행 경험을 사용하지 않습니다.
+2. 환경 변수 DOTNET_SKIP_FIRST_TIME_EXPERIENCE를 true로 설정하여 첫 번째 실행 환경을 사용하지 않습니다.
 3. .NET Core SDK를 보호되지 않은 위치로 복사한 후 이 위치에서 사용합니다.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+설치된 ASP.NET Core HTTPS 개발 인증서. 자세한 내용은 https://go.microsoft.com/fwlink/?linkid=84805을(를) 참조하세요.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf
index e2d132a85..bb510b666 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">.NET Core — Zapraszamy!
 ---------------------
-Więcej informacji o programie .NET Core znajdziesz na stronie https://aka.ms/dotnet-docs. Aby wyświetlić dostępne polecenia, użyj polecenia dotnet --help lub przejdź na stronę https://aka.ms/dotnet-cli-docs.
+Więcej informacji o programie .NET Core: https://aka.ms/dotnet-docs
+Aby wyświetlić dostępne polecenia, użyj polecenia „dotnet --help” lub przejdź na stronę: https://aka.ms/dotnet-cli-docs
 
 Telemetria
---------------
-Narzędzia programu .NET Core zbierają dane dotyczące użycia w celu ulepszenia Twojego środowiska pracy. Dane te są anonimowe i nie obejmują argumentów wiersza polecenia. Zbiera je firma Microsoft i udostępnia społeczności.
-Z telemetrii można zrezygnować, ustawiając zmienną środowiskową DOTNET_CLI_TELEMETRY_OPTOUT na wartość 1 przy użyciu ulubionej powłoki.
-Więcej informacji na temat telemetrii narzędzi programu .NET Core możesz znaleźć na stronie https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+Narzędzia programu .NET Core zbierają dane użycia mające pomóc nam ulepszyć Twoje środowisko pracy. Dane te są anonimowe i nie obejmują argumentów wiersza polecenia. Zbiera je firma Microsoft i udostępnia społeczności. Z telemetrii możesz zrezygnować, ustawiając zmienną środowiskową DOTNET_CLI_TELEMETRY_OPTOUT na wartość „1” lub „true” przy użyciu ulubionej powłoki.
+
+Przeczytaj więcej na temat telemetrii narzędzi interfejsu wiersza polecenia programu .NET Core: https://aka.ms/dotnet-cli-telemetry.</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ Więcej informacji na temat telemetrii narzędzi programu .NET Core możesz znal
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Trwa konfigurowanie…
--------------------
-Wykonywane jest polecenie w celu wstępnego wypełnienia lokalnej pamięci podręcznej pakietów, poprawy szybkości przywracania i włączenia dostępu offline. Wykonanie tego polecenia jest jednorazowe i zajmie maksymalnie minutę.</target>
+--------------
+Wykonywane jest polecenie w celu wypełnienia lokalnej pamięci podręcznej pakietów, poprawy szybkości przywracania i włączenia dostępu offline. Wykonanie tego polecenia jest jednorazowe i zajmie maksymalnie minutę.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">Odmowa uprawnień do zmodyfikowania folderu „{0}”.
 
 Oto kilka opcji naprawiania tego błędu:
----------------------
+----------------------------------------
 1. Uruchom to polecenie ponownie z podwyższonym poziomem uprawnień.
 2. Wyłącz środowisko pierwszego uruchomienia, ustawiając dla zmiennej środowiskowej DOTNET_SKIP_FIRST_TIME_EXPERIENCE wartość true.
 3. Skopiuj zestaw .NET Core SDK do lokalizacji niechronionej i tam z niego korzystaj.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Zainstalowany certyfikat programistyczny HTTPS ASP.NET Core. Aby uzyskać więcej informacji, przejdź na adres https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf
index 0a789402b..d11e6847a 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">Bem-vindo ao .NET Core!
 ---------------------
-Saiba mais sobre o .NET Core em https://aka.ms/dotnet-docs. Use dotnet --help para ver os comandos disponíveis ou acesse https://aka.ms/dotnet-cli-docs.
+Saiba mais sobre o .NET Core em https://aka.ms/dotnet-docs
+Use 'dotnet --help' para ver os comandos disponíveis ou acesse: https://aka.ms/dotnet-cli-docs.
 
 Telemetria
---------------
-As ferramentas do .NET Core coletam dados de uso para melhorar sua experiência. Os dados são anônimos e não incluem argumentos de linha de comando. Os dados são coletados pela Microsoft e compartilhados com a comunidade.
-É possível recusar a telemetria ao configurar uma variável de ambiente DOTNET_CLI_TELEMETRY_OPTOUT como 1 usando seu shell favorito.
-Leia mais sobre a telemetria das ferramentas do .NET Core em https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+As ferramentas do .NET Core coletam dados de uso para melhorar sua experiência. Os dados são anônimos e não incluem argumentos de linha de comando. Os dados são coletados pela Microsoft e compartilhados com a comunidade. É possível recusar a telemetria ao configurar uma variável de ambiente DOTNET_CLI_TELEMETRY_OPTOUT como '1' usando seu shell favorito.
+
+Leia mais sobre a telemetria das ferramentas do .NET Core CLI: https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,30 +32,41 @@ Leia mais sobre a telemetria das ferramentas do .NET Core em https://aka.ms/dotn
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Configurando...
 -------------------
-Um comando está sendo executado para popular inicialmente o cache do pacote local, a fim de melhorar a velocidade de restauração e habilitar o acesso offline. Esse comando levará até um minuto para ser concluído e só ocorrerá uma vez.</target>
+Um comando está sendo executado para popular o cache do pacote local, a fim de melhorar a velocidade de restauração e habilitar o acesso offline. Esse comando levará até um minuto para ser concluído e só ocorrerá uma vez.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
     </source>
         <target state="translated">Permissão negada para modificar a pasta '{0}'.
 
-Aqui estão algumas opções para consertar este erro:
----------------------
-1. Execute este comando novamente com acesso elevado.
-2. Desabilite a primeira experiência de execução ao configurar a variável de ambiente DOTNET_SKIP_FIRST_TIME_EXPERIENCE como verdadeira.
-3. Copie o SDK do .NET Core para uma localização não protegida e use-o de lá.
-</target>
+Aqui estão algumas opções para corrigir este erro:
+----------------------------------------
+1. Execute o comando novamente com acesso elevado.
+2. Desabilite a primeira experiência de execução ao configurar a variável de ambiente DOTNET_SKIP_FIRST_TIME_EXPERIENCE como true.
+3. Copie o SDK do .NET Core para um local não protegido e use-o de lá.
+    </target>
+        <note />
+      </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Certificado de desenvolvimento de HTTPS do ASP.NET Core instalado. Para obter mais informações, vá para https://go.microsoft.com/fwlink/?linkid=84805</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf
index 46ceb61ef..e6574a137 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
-        <target state="translated">Добро пожаловать в .NET Core!
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
+        <target state="translated">Вас приветствует .NET Core!
 ---------------------
-Дополнительные сведения о .NET Core можно получить по адресу https://aka.ms/dotnet-docs. Для просмотра доступных команд используйте dotnet --help или перейдите на страницу https://aka.ms/dotnet-cli-docs.
+Дополнительные сведения о .NET Core: https://aka.ms/dotnet-docs
+Для просмотра доступных команд используйте команду "dotnet --help" или перейдите на страницу https://aka.ms/dotnet-cli-docs
 
 Телеметрия
---------------
-Средства .NET Core собирают данные об использовании для улучшения взаимодействия с пользователем. Эти данные анонимны и не включают в себя аргументы командной строки. Сбор данных осуществляется корпорацией Майкрософт, которая предоставляет их сообществу.
-Вы можете явно отказаться от телеметрии, присвоив переменной среды DOTNET_CLI_TELEMETRY_OPTOUT значение 1 с помощью предпочитаемой оболочки.
-Дополнительные сведения о телеметрии в средствах .NET Core см. по адресу https://aka.ms/dotnet-cli-telemetry.</target>
+----------
+Средства .NET Core собирают данные об использовании для улучшения взаимодействия с пользователем. Эти данные анонимны и не включают в себя аргументы командной строки. Сбор данных осуществляется корпорацией Майкрософт, которая предоставляет их сообществу. Вы можете явно отказаться от телеметрии, присвоив переменной среды DOTNET_CLI_TELEMETRY_OPTOUT значение 1 или true с помощью предпочитаемой оболочки.
+
+Дополнительные сведения о телеметрии в средствах .NET Core: https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,32 +32,43 @@ You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-te
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Идет настройка...
--------------------
-Выполняется команда для изначального заполнения локального кэша пакетов, повышения скорости восстановления и обеспечения автономного доступа. Ее выполнение может занять до одной минуты и производится только раз.</target>
+---------------
+Выполняется команда для заполнения локального кэша пакетов, повышения скорости восстановления и обеспечения автономного доступа. Ее выполнение может занять до одной минуты и производится только один раз.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
     </source>
-        <target state="translated">Отменено разрешение на изменение папки "{0}".
+        <target state="translated">Отказано в разрешении на изменение папки "{0}".
 
 Ниже приведено несколько способов устранения этой ошибки.
----------------------
-1. Повторно выполните эту команду с правами повышенного доступа.
-2. Отключите возможность первого запуска, задав для переменной среды DOTNET_SKIP_FIRST_TIME_EXPERIENCE значение "true".
-3. Скопируйте пакет SDK для .NET Core в незащищенное расположение и используйте его оттуда.
+----------------------------------------
+1. Повторите эту команду с правами повышенного доступа.
+2. Отключите функциональность первого запуска, задав для переменной среды DOTNET_SKIP_FIRST_TIME_EXPERIENCE значение true.
+3. Скопируйте пакет SDK для .NET Core в незащищенное расположение и используйте его оттуда.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+Установлен сертификат для HTTPS-разработки на ASP.NET Core. Дополнительные сведения: https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf
index b5762bc81..226a088d1 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">.NET Core’a Hoş Geldiniz!
 ---------------------
-.NET Core hakkında daha fazla bilgi için bkz. https://aka.ms/dotnet-docs. Kullanılabilir komutları görmek için dotnet --help komutunu kullanın veya https://aka.ms/dotnet-cli-docs adresine gidin.
+.NET Core hakkında daha fazla bilgi için bkz. https://aka.ms/dotnet-docs
+Kullanılabilir komutları görmek için 'dotnet --help' komutunu kullanın veya https://aka.ms/dotnet-cli-docs adresine gidin.
 
 Telemetri
---------------
-.NET Core araçları, deneyiminizi iyileştirmek için kullanım verileri toplar. Veriler anonimdir ve komut satırı bağımsız değişkenlerini içermez. Veriler Microsoft tarafından toplanır ve topluluk ile paylaşılır.
-Sık kullandığınız kabuk aracılığıyla DOTNET_CLI_TELEMETRY_OPTOUT ortam değişkenini 1 değerine ayarlayarak telemetri toplanmasını geri çevirebilirsiniz.
-.NET Core araçları telemetrisi hakkında daha faza bilgi için bkz. https://aka.ms/dotnet-cli-telemetry.</target>
+---------
+.NET Core araçları, deneyiminizi iyileştirmemize yardımcı olmak için kullanım verileri toplar. Veriler anonimdir ve komut satırı bağımsız değişkenlerini içermez. Veriler Microsoft tarafından toplanır ve topluluk ile paylaşılır. Sık kullandığınız kabuk aracılığıyla DOTNET_CLI_TELEMETRY_OPTOUT ortam değişkenini '1' veya 'true' değerine ayarlayarak telemetri toplanmasını geri çevirebilirsiniz.
+
+.NET Core CLI Araçları telemetrisi hakkında daha faza bilgi için bkz. https://aka.ms/dotnet-cli-telemetry.</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ Sık kullandığınız kabuk aracılığıyla DOTNET_CLI_TELEMETRY_OPTOUT ortam
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">Yapılandırılıyor...
--------------------
-Yerel paket önbelleğinizi başlangıçta doldurmak, geri yükleme hızını artırmak ve çevrimdışı erişimi etkinleştirmek için bir komut çalıştırılıyor. Bu komutun tamamlanması yaklaşık bir dakika sürer ve bu işlem yalnızca bir kez gerçekleştirilir.</target>
+--------------
+Geri yükleme hızını artırmak ve çevrimdışı erişimi etkinleştirmek için yerel paket önbelleğinizi doldurmak amacıyla bir komut çalıştırılıyor. Bu komut yaklaşık bir dakikada tamamlanır ve yalnızca bir kez çalıştırılır.</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">'{0}' klasörünü değiştirme izni verilmedi.
 
 Bu hatayı düzeltmek için bazı seçenekler:
----------------------
+----------------------------------------
 1. Bu komutu yükseltilmiş erişim ile yeniden çalıştırın.
 2. DOTNET_SKIP_FIRST_TIME_EXPERIENCE ortam değişkenini true olarak ayarlayarak ilk çalıştırma deneyimini devre dışı bırakın.
 3. .NET Core SDK’sını korumasız bir konuma kopyalayarak oradan kullanın.
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+ASP.NET Core HTTPS geliştirme sertifikası yüklendi. Daha fazla bilgi için bkz. https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.xlf
index 64e3c6463..9d5a25e5b 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.xlf
@@ -6,17 +6,18 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
 
 Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf
index 7c5bfae32..658777121 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">欢迎使用 .NET Core!
 ---------------------
-若要详细了解 .NET Core,请访问 https://aka.ms/dotnet-docs。使用 dotnet --help 查看可用的命令或转到 https://aka.ms/dotnet-cli-docs。
+若要详细了解 NET Core: https://aka.ms/dotnet-docs
+请使用 “dotnet --help”查看可用的命令或访问: https://aka.ms/dotnet-cli-docs
 
 遥测
---------------
-.NET Core 收集使用情况数据,以便改善用户体验。数据是匿名的且不包含命令行参数。数据由 Microsoft 收集,并与社区共享。
-可选择使用你最喜爱的 shell 将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 1,从而退出遥测。
-若要深入了解 .NET Core 工具遥测,请访问 https://aka.ms/dotnet-cli-telemetry。</target>
+---------
+.NET Core 工具收集用法数据,以便帮助改善用户体验。数据是匿名的,且不包括命令行参数。数据由 Microsoft 收集并与社区共享。可使用喜欢的 shell 将环境变量 DOTNET_CLI_TELEMETRY_OPTOUT 设置为 “1” 或 “true”,从而选择推出遥测。
+
+若要深入了解 .NET Core CLI 工具遥测,请访问 https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,18 +32,18 @@ You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-te
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">正在配置...
--------------------
-正在运行一项命令,以初步填充本地包缓存,从而提高还原速度并启用脱机访问。此命令最长需要一分钟才能完成,且仅可运行一次。</target>
+--------------
+正在运行一项命令来填充本地包缓存,进而加快还原速度并实现脱机访问。此命令最多需要一分钟即可完成且仅运行一次。</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
@@ -49,13 +51,24 @@ Here are some options to fix this error:
         <target state="translated">修改“{0}”文件夹的权限被拒绝。
 
 以下是修复该错误的选项:
----------------------
+----------------------------------------
 1. 以提升的访问权限重新运行该命令。
 2. 通过将环境变量 DOTNET_SKIP_FIRST_TIME_EXPERIENCE 设置为 true,禁用首次运行体验。
 3. 将 .NET Core SDK 复制到未受保护的位置并从该位置使用。
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+安装 ASP.NET Core HTTPS 开发证书。有关详细信息,请转到 https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf
index 5efc8642e..29c171d68 100644
--- a/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf
@@ -5,22 +5,24 @@
       <trans-unit id="FirstTimeWelcomeMessage">
         <source>Welcome to .NET Core!
 ---------------------
-Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
+Learn more about .NET Core: https://aka.ms/dotnet-docs
+Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 
 Telemetry
---------------
-The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include command-line arguments. The data is collected by Microsoft and shared with the community.
-You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
-You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.</source>
+---------
+The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
+
+Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry</source>
         <target state="translated">歡迎使用 .NET Core!
 ---------------------
-深入了解 .NET Core @ https://aka.ms/dotnet-docs。使用 dotnet --help 可查看可用的命令,或前往 https://aka.ms/dotnet-cli-docs。
+深入了解 .NET Core: https://aka.ms/dotnet-docs
+使用 'dotnet --help' 查看可用的命令,或瀏覽: https://aka.ms/dotnet-cli-docs
 
 遙測
---------------
-.NET Core 工具會收集使用方式資料,以改善您的體驗。資料為匿名形式,且不含命令列引數。資料由 Microsoft 收集並會與社群共用。
-使用您慣用的殼層,將 DOTNET_CLI_TELEMETRY_OPTOUT 環境變數設定為 1,即可退出遙測。
-您可深入閱讀 .NET Core 工具遙測 @ https://aka.ms/dotnet-cli-telemetry。</target>
+---------
+.NET Core 工具會收集使用方式資料,有助我們改善您的體驗。資料為匿名提供,且不含命令列引數。Microsoft 會收集資料並與社群共用。使用慣用的殼層,將 DOTNET_CLI_TELEMETRY_OPTOUT 環境變數設定為 '1' 或 'true' 即可退出遙測。
+
+閱讀更多 .NET Core CLI 工具遙測的相關內容: https://aka.ms/dotnet-cli-telemetry</target>
         <note />
       </trans-unit>
       <trans-unit id="FailedToPrimeCacheError">
@@ -30,32 +32,43 @@ You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-te
       </trans-unit>
       <trans-unit id="NugetCachePrimeMessage">
         <source>Configuring...
--------------------
-A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.</source>
+--------------
+A command is running to populate your local package cache to improve restore speed and enable offline access. This command takes up to one minute to complete and only runs once.</source>
         <target state="translated">正在設定...
--------------------
-執行命令以初步填入您的本機套件快取,以改善還原速度並允許離線存取。此命令最長需要一分鐘的時間才可完成,且只會進行一次。</target>
+--------------
+正在執行命令以填入您的本機套件快取,以改善還原速度並允許離線存取。此命令需要最長一分鐘的時間才能完成,且只會執行一次。</target>
         <note />
       </trans-unit>
       <trans-unit id="UnauthorizedAccessMessage">
         <source>Permission denied to modify the '{0}' folder.
 
 Here are some options to fix this error:
----------------------
+----------------------------------------
 1. Re-run this command with elevated access.
 2. Disabled the first run experience by setting the environment variable DOTNET_SKIP_FIRST_TIME_EXPERIENCE to true.
 3. Copy the .NET Core SDK to a non-protected location and use it from there.
     </source>
-        <target state="translated">權限無法修改 '{0}' 資料夾。
+        <target state="translated">無權修改 '{0}' 資料夾。
 
-以下為修正此錯誤的一些選項:
----------------------
-1. 利用較高的存取權再次執行此命令。
-2. 將環境變數 DOTNET_SKIP_FIRST_TIME_EXPERIENCE 設定為 true,停用第一次的執行體驗。
-3. 將 .NET Core SDK 複製到不受保護的位置,並於該處使用此 SDK。
+您可以使用下列選項修正這項錯誤:
+----------------------------------------
+1. 以較高的存取權重新執行此命令。
+2. 將環境變數 DOTNET_SKIP_FIRST_TIME_EXPERIENCE 設為 true,以停用第一次的執行體驗。
+3. 將 .NET Core SDK 複製到不受保護的位置,並於該處使用。
     </target>
         <note />
       </trans-unit>
+      <trans-unit id="AspNetCertificateInstalled">
+        <source>ASP.NET Core
+------------
+Successfully installed the ASP.NET Core HTTPS Development Certificate.
+To trust the certificate (Windows and macOS only) first install the dev-certs tool by running 'dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final' and then run 'dotnet-dev-certs https --trust'.
+For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.</source>
+        <target state="needs-review-translation">ASP.NET Core
+------------
+已安裝 ASP.NET Core HTTPS 開發憑證。如需詳細資訊,請前往 https://go.microsoft.com/fwlink/?linkid=84805</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.InternalAbstractions/DirectoryPath.cs b/src/Microsoft.DotNet.InternalAbstractions/DirectoryPath.cs
new file mode 100644
index 000000000..40e898d3e
--- /dev/null
+++ b/src/Microsoft.DotNet.InternalAbstractions/DirectoryPath.cs
@@ -0,0 +1,47 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+
+namespace Microsoft.Extensions.EnvironmentAbstractions
+{
+    public struct DirectoryPath
+    {
+        public string Value { get; }
+
+        public DirectoryPath(string value)
+        {
+            Value = value;
+        }
+
+        public DirectoryPath WithSubDirectories(params string[] paths)
+        {
+            string[] insertValueInFront = new string[paths.Length + 1];
+            insertValueInFront[0] = Value;
+            Array.Copy(paths, 0, insertValueInFront, 1, paths.Length);
+
+            return new DirectoryPath(Path.Combine(insertValueInFront));
+        }
+
+        public FilePath WithFile(string fileName)
+        {
+            return new FilePath(Path.Combine(Value, fileName));
+        }
+
+        public string ToQuotedString()
+        {
+            return $"\"{Value}\"";
+        }
+
+        public override string ToString()
+        {
+            return ToQuotedString();
+        }
+
+        public DirectoryPath GetParentPath()
+        {
+            return new DirectoryPath(Directory.GetParent(Path.GetFullPath(Value)).FullName);
+        }
+    }
+}
diff --git a/src/Microsoft.DotNet.InternalAbstractions/FilePath.cs b/src/Microsoft.DotNet.InternalAbstractions/FilePath.cs
new file mode 100644
index 000000000..9dbbf8c83
--- /dev/null
+++ b/src/Microsoft.DotNet.InternalAbstractions/FilePath.cs
@@ -0,0 +1,32 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.IO;
+
+namespace Microsoft.Extensions.EnvironmentAbstractions
+{
+    public struct FilePath
+    {
+        public string Value { get; }
+
+        public FilePath(string value)
+        {
+            Value = value;
+        }
+
+        public string ToQuotedString()
+        {
+            return $"\"{Value}\"";
+        }
+
+        public override string ToString()
+        {
+            return ToQuotedString();
+        }
+
+        public DirectoryPath GetDirectoryPath()
+        {
+            return new DirectoryPath(Path.GetDirectoryName(Value));
+        }
+    }
+}
diff --git a/src/Microsoft.DotNet.InternalAbstractions/Microsoft.DotNet.InternalAbstractions.csproj b/src/Microsoft.DotNet.InternalAbstractions/Microsoft.DotNet.InternalAbstractions.csproj
index a5c6d9d6a..c4c930565 100644
--- a/src/Microsoft.DotNet.InternalAbstractions/Microsoft.DotNet.InternalAbstractions.csproj
+++ b/src/Microsoft.DotNet.InternalAbstractions/Microsoft.DotNet.InternalAbstractions.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <Description>Abstractions for making code that uses file system and environment testable.</Description>
diff --git a/src/Microsoft.DotNet.InternalAbstractions/Properties/Properties.cs b/src/Microsoft.DotNet.InternalAbstractions/Properties/Properties.cs
index 1ab5c59fd..4b08b51db 100644
--- a/src/Microsoft.DotNet.InternalAbstractions/Properties/Properties.cs
+++ b/src/Microsoft.DotNet.InternalAbstractions/Properties/Properties.cs
@@ -6,6 +6,7 @@ using System.Runtime.CompilerServices;
 
 [assembly: AssemblyMetadataAttribute("Serviceable", "True")]
 [assembly: InternalsVisibleTo("Microsoft.Extensions.DependencyModel, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("dotnet, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("Microsoft.DotNet.Tools.Tests.Utilities, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("Microsoft.Extensions.DependencyModel.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("Microsoft.DotNet.Configurer, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
@@ -13,3 +14,4 @@ using System.Runtime.CompilerServices;
 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
 [assembly: InternalsVisibleTo("dotnet-test.UnitTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100039ac461fa5c82c7dd2557400c4fd4e9dcdf7ac47e3d572548c04cd4673e004916610f4ea5cbf86f2b1ca1cb824f2a7b3976afecfcf4eb72d9a899aa6786effa10c30399e6580ed848231fec48374e41b3acf8811931343fc2f73acf72dae745adbcb7063cc4b50550618383202875223fc75401351cd89c44bf9b50e7fa3796")]
 [assembly: InternalsVisibleTo("Microsoft.DotNet.Tools.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.DotNet.ShellShim.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Microsoft.DotNet.MSBuildSdkResolver/Interop.NETStandard.cs b/src/Microsoft.DotNet.MSBuildSdkResolver/Interop.NETStandard.cs
index 74abc2a61..b672a5dfb 100644
--- a/src/Microsoft.DotNet.MSBuildSdkResolver/Interop.NETStandard.cs
+++ b/src/Microsoft.DotNet.MSBuildSdkResolver/Interop.NETStandard.cs
@@ -1,10 +1,10 @@
 // Copyright (c) .NET Foundation and contributors. All rights reserved.
 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
-// NOTE: Currently, only the NET46 build ships (with Visual Studio/desktop msbuild), 
-// but the netstandard1.5 adaptation here acts a proof-of-concept for cross-platform 
+// NOTE: the NET46 build ships with Visual Studio/desktop msbuild on Windows. 
+// The netstandard1.5 adaptation here acts a proof-of-concept for cross-platform 
 // portability of the underlying hostfxr API and gives us build and test coverage 
-// on non-Windows machines.
+// on non-Windows machines. It also ships with msbuild on Mono.
 #if NETSTANDARD1_5
 
 using System;
diff --git a/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj
index f804fa356..205a6a28b 100644
--- a/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj
+++ b/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <Version>$(SdkVersion)</Version>
@@ -24,7 +23,7 @@
     <PackageReference Include="NETStandard.Library" Version="1.6.0" />
   </ItemGroup>
 
-  <Target Name="ResolveHostfxrCopyLocalContent" Condition="'$(TargetFramework)' == 'net46'" DependsOnTargets="ResolvePackageDependenciesForBuild" BeforeTargets="AssignTargetPaths">
+  <Target Name="ResolveHostfxrCopyLocalContent" Condition="'$(TargetFramework)' == 'net46'" DependsOnTargets="RunResolvePackageDependencies" BeforeTargets="AssignTargetPaths">
     <ItemGroup>
       <Content Include="@(FileDefinitions->'%(ResolvedPath)')" Condition="'%(FileDefinitions.Path)' == 'runtimes/win-x86/native/hostfxr.dll'">
         <Link>x86/hostfxr.dll</Link>
diff --git a/src/Microsoft.DotNet.TestFramework/Properties/AssemblyInfo.cs b/src/Microsoft.DotNet.TestFramework/Properties/AssemblyInfo.cs
deleted file mode 100644
index 110018e7f..000000000
--- a/src/Microsoft.DotNet.TestFramework/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System.Reflection;
-
-[assembly: AssemblyMetadataAttribute("Serviceable", "True")]
diff --git a/src/dotnet/AspNetCoreCertificateGenerator.cs b/src/dotnet/AspNetCoreCertificateGenerator.cs
new file mode 100644
index 000000000..d0fcf0a9a
--- /dev/null
+++ b/src/dotnet/AspNetCoreCertificateGenerator.cs
@@ -0,0 +1,16 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.AspNetCore.DeveloperCertificates.XPlat;
+using Microsoft.DotNet.Configurer;
+
+namespace Microsoft.DotNet.Cli
+{
+    public class AspNetCoreCertificateGenerator : IAspNetCoreCertificateGenerator
+    {
+        public void GenerateAspNetCoreDevelopmentCertificate()
+        {
+            CertificateGenerator.GenerateAspNetHttpsCertificate();
+        }
+    }
+}
diff --git a/src/dotnet/BuiltInCommandsCatalog.cs b/src/dotnet/BuiltInCommandsCatalog.cs
index 25c69fdbd..dd2c242d6 100644
--- a/src/dotnet/BuiltInCommandsCatalog.cs
+++ b/src/dotnet/BuiltInCommandsCatalog.cs
@@ -20,6 +20,7 @@ using Microsoft.DotNet.Tools.Store;
 using Microsoft.DotNet.Tools.Test;
 using Microsoft.DotNet.Tools.VSTest;
 using System.Collections.Generic;
+using Microsoft.DotNet.Tools.Install;
 
 namespace Microsoft.DotNet.Cli
 {
@@ -144,10 +145,14 @@ namespace Microsoft.DotNet.Cli
             {
                 Command = ParseCommand.Run
             },
+            ["install"] = new BuiltInCommandMetadata
+            {
+                Command = InstallCommand.Run
+            },
             ["internal-reportinstallsuccess"] = new BuiltInCommandMetadata
             {
                 Command = InternalReportinstallsuccess.Run
             }
         };
     }
-}
\ No newline at end of file
+}
diff --git a/src/dotnet/BundledTargetFramework.cs b/src/dotnet/BundledTargetFramework.cs
new file mode 100644
index 000000000..e819a613a
--- /dev/null
+++ b/src/dotnet/BundledTargetFramework.cs
@@ -0,0 +1,21 @@
+using System.Reflection;
+using System.Runtime.Versioning;
+using NuGet.Frameworks;
+
+namespace Microsoft.DotNet.Cli
+{
+    internal static class BundledTargetFramework
+    {
+        public static string GetTargetFrameworkMoniker()
+        {
+            TargetFrameworkAttribute targetFrameworkAttribute = typeof(BundledTargetFramework)
+                .GetTypeInfo()
+                .Assembly
+                .GetCustomAttribute<TargetFrameworkAttribute>();
+
+            return NuGetFramework
+                .Parse(targetFrameworkAttribute.FrameworkName)
+                .GetShortFolderName();
+        }
+    }
+}
diff --git a/src/dotnet/CommonLocalizableStrings.resx b/src/dotnet/CommonLocalizableStrings.resx
index d165ca59e..8a236f571 100644
--- a/src/dotnet/CommonLocalizableStrings.resx
+++ b/src/dotnet/CommonLocalizableStrings.resx
@@ -345,9 +345,6 @@
   <data name="SolutionDoesNotExist" xml:space="preserve">
     <value>Specified solution file {0} does not exist, or there is no solution file in the directory.</value>
   </data>
-  <data name="ReferenceDoesNotExist" xml:space="preserve">
-    <value>Reference {0} does not exist.</value>
-  </data>
   <data name="ReferenceIsInvalid" xml:space="preserve">
     <value>Reference `{0}` is invalid.</value>
   </data>
@@ -384,6 +381,9 @@
   <data name="ProjectAddedToTheSolution" xml:space="preserve">
     <value>Project `{0}` added to the solution.</value>
   </data>
+  <data name="ProjectRemovedFromTheSolution" xml:space="preserve">
+    <value>Project `{0}` removed from the solution.</value>
+  </data>
   <data name="SolutionAlreadyContainsProject" xml:space="preserve">
     <value>Solution {0} already contains project {1}.</value>
   </data>
@@ -520,4 +520,74 @@
   <data name="NoRestoreDescription" xml:space="preserve">
     <value>Does not do an implicit restore when executing the command.</value>
   </data>
+  <data name="CannotBeNullOrWhitespace" xml:space="preserve">
+    <value>Cannot be null or whitespace.</value>
+  </data>
+  <data name="ContainInvalidCharacters" xml:space="preserve">
+    <value>Contains one or more invalid characters: {0}</value>
+  </data>
+  <data name="NuGetConfigurationFileDoesNotExist" xml:space="preserve">
+    <value>NuGet configuration file {0} does not exist.</value>
+  </data>
+  <data name="ToolSettingInvalidRunner" xml:space="preserve">
+    <value>The tool's settings file has non "dotnet" as runner.</value>
+  </data>
+  <data name="ToolSettingMoreThanOneCommand" xml:space="preserve">
+    <value>The tool's settings file has more than one command defined.</value>
+  </data>
+  <data name="ToolSettingsContainError" xml:space="preserve">
+    <value>The tool's settings file contains error.
+{0}</value>
+  </data>
+  <data name="ToolSettingsInvalidXml" xml:space="preserve">
+    <value>The tool's settings file is invalid xml.
+{0}</value>
+  </data>
+  <data name="EnvironmentPathLinuxManualInstruction" xml:space="preserve">
+    <value>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</value>
+  </data>
+  <data name="EnvironmentPathLinuxNeedLogout" xml:space="preserve">
+    <value>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</value>
+  </data>
+  <data name="EnvironmentPathOSXManualInstruction" xml:space="preserve">
+    <value>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</value>
+  </data>
+  <data name="EnvironmentPathOSXNeedReopen" xml:space="preserve">
+    <value>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</value>
+  </data>
+  <data name="EnvironmentPathWindowsManualInstruction" xml:space="preserve">
+    <value>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</value>
+  </data>
+  <data name="EnvironmentPathWindowsNeedReopen" xml:space="preserve">
+    <value>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</value>
+  </data>
+  <data name="FailInstallToolPermission" xml:space="preserve">
+    <value>Failed to change permission:
+Error: {0}
+Output: {1}</value>
+  </data>
+  <data name="FailInstallToolSameName" xml:space="preserve">
+    <value>Failed to install tool {0}. A command with the same name already exists.</value>
+  </data>
+  <data name="ToolPackageMissingEntryPointFile" xml:space="preserve">
+    <value>Package '{0}' is missing entry point file {1}.</value>
+  </data>
+  <data name="ToolPackageMissingSettingsFile" xml:space="preserve">
+    <value>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/dotnet/HelpException.cs b/src/dotnet/HelpException.cs
index 98f2eb6f7..f1f9eb5b4 100644
--- a/src/dotnet/HelpException.cs
+++ b/src/dotnet/HelpException.cs
@@ -6,7 +6,6 @@ namespace Microsoft.DotNet.Cli
     /// 
     /// <summary>Allows control flow to be interrupted in order to display help in the console.</summary>
     ///
-    [Obsolete("This is intended to facilitate refactoring during parser replacement and should not be used after that work is done.")]
     public class HelpException : Exception
     {
         public HelpException(string message) : base(message)
diff --git a/src/dotnet/MsbuildProject.cs b/src/dotnet/MsbuildProject.cs
index 860d38799..34055cacc 100644
--- a/src/dotnet/MsbuildProject.cs
+++ b/src/dotnet/MsbuildProject.cs
@@ -256,7 +256,7 @@ namespace Microsoft.DotNet.Tools
 
             string fullPath = Path.GetFullPath(reference);
             ret.Add(fullPath);
-            ret.Add(PathUtility.GetRelativePath(ProjectDirectory, fullPath));
+            ret.Add(Path.GetRelativePath(ProjectDirectory, fullPath));
 
             return ret;
         }
diff --git a/src/dotnet/Parser.cs b/src/dotnet/Parser.cs
index 5f5bdd6c8..07639b3ab 100644
--- a/src/dotnet/Parser.cs
+++ b/src/dotnet/Parser.cs
@@ -19,7 +19,7 @@ namespace Microsoft.DotNet.Cli
         private static void ConfigureCommandLineLocalizedStrings()
         {
             DefaultHelpViewText.AdditionalArgumentsSection =
-                $"{UsageCommandsAdditionalArgsHeader}:{NewLine}  {LocalizableStrings.RunCommandAdditionalArgsHelpText}";
+                $"{UsageCommandsAdditionalArgsHeader}{NewLine}  {LocalizableStrings.RunCommandAdditionalArgsHelpText}";
             DefaultHelpViewText.ArgumentsSection.Title = UsageArgumentsHeader;
             DefaultHelpViewText.CommandsSection.Title = UsageCommandsHeader;
             DefaultHelpViewText.OptionsSection.Title = UsageOptionsHeader;
@@ -55,9 +55,10 @@ namespace Microsoft.DotNet.Cli
                                     Create.Command("vstest", ""),
                                     CompleteCommandParser.Complete(),
                                     InternalReportinstallsuccessCommandParser.InternalReportinstallsuccess(),
+                                    InstallCommandParser.Install(),
                                     CommonOptions.HelpOption(),
                                     Create.Option("--info", ""),
                                     Create.Option("-d", ""),
                                     Create.Option("--debug", "")));
     }
-}
\ No newline at end of file
+}
diff --git a/src/dotnet/Program.cs b/src/dotnet/Program.cs
index 6fb3c6512..1e83488be 100644
--- a/src/dotnet/Program.cs
+++ b/src/dotnet/Program.cs
@@ -4,15 +4,19 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.InteropServices;
 using System.Text;
 using Microsoft.DotNet.Cli.CommandLine;
 using Microsoft.DotNet.Cli.Telemetry;
 using Microsoft.DotNet.Cli.Utils;
 using Microsoft.DotNet.Configurer;
 using Microsoft.DotNet.PlatformAbstractions;
+using Microsoft.DotNet.ShellShim;
 using Microsoft.DotNet.Tools.Help;
+using Microsoft.Extensions.EnvironmentAbstractions;
 using NuGet.Frameworks;
 using Command = Microsoft.DotNet.Cli.Utils.Command;
+using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment;
 
 namespace Microsoft.DotNet.Cli
 {
@@ -77,22 +81,24 @@ namespace Microsoft.DotNet.Cli
         {
             // CommandLineApplication is a bit restrictive, so we parse things ourselves here. Individual apps should use CLA.
 
-            bool? verbose = null;
             var success = true;
             var command = string.Empty;
             var lastArg = 0;
-            var cliFallbackFolderPathCalculator = new CliFallbackFolderPathCalculator();
+            var cliFallbackFolderPathCalculator = new CliFolderPathCalculator();
             TopLevelCommandParserResult topLevelCommandParserResult = TopLevelCommandParserResult.Empty;
+
             using (INuGetCacheSentinel nugetCacheSentinel = new NuGetCacheSentinel(cliFallbackFolderPathCalculator))
             using (IFirstTimeUseNoticeSentinel disposableFirstTimeUseNoticeSentinel =
                 new FirstTimeUseNoticeSentinel(cliFallbackFolderPathCalculator))
             {
                 IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel = disposableFirstTimeUseNoticeSentinel;
+                IAspNetCertificateSentinel aspNetCertificateSentinel = new AspNetCertificateSentinel(cliFallbackFolderPathCalculator);
                 for (; lastArg < args.Length; lastArg++)
                 {
                     if (IsArg(args[lastArg], "d", "diagnostics"))
                     {
-                        verbose = true;
+                        Environment.SetEnvironmentVariable(CommandContext.Variables.Verbose, bool.TrueString);
+                        CommandContext.SetVerbose(true);
                     }
                     else if (IsArg(args[lastArg], "version"))
                     {
@@ -111,7 +117,7 @@ namespace Microsoft.DotNet.Cli
                         HelpCommand.PrintHelp();
                         return 0;
                     }
-                    else if (args[lastArg].StartsWith("-"))
+                    else if (args[lastArg].StartsWith("-", StringComparison.OrdinalIgnoreCase))
                     {
                         Reporter.Error.WriteLine($"Unknown option: {args[lastArg]}");
                         success = false;
@@ -120,22 +126,26 @@ namespace Microsoft.DotNet.Cli
                     {
                         // It's the command, and we're done!
                         command = args[lastArg];
-
                         if (string.IsNullOrEmpty(command))
                         {
                             command = "help";
                         }
 
-                        topLevelCommandParserResult = new TopLevelCommandParserResult(args[lastArg]);
+                        topLevelCommandParserResult = new TopLevelCommandParserResult(command);
+                        var hasSuperUserAccess = false;
                         if (IsDotnetBeingInvokedFromNativeInstaller(topLevelCommandParserResult))
                         {
+                            aspNetCertificateSentinel = new NoOpAspNetCertificateSentinel();
                             firstTimeUseNoticeSentinel = new NoOpFirstTimeUseNoticeSentinel();
+                            hasSuperUserAccess = true;
                         }
 
                         ConfigureDotNetForFirstTimeUse(
                             nugetCacheSentinel,
                             firstTimeUseNoticeSentinel,
-                            cliFallbackFolderPathCalculator);
+                            aspNetCertificateSentinel,
+                            cliFallbackFolderPathCalculator,
+                            hasSuperUserAccess);
 
                         break;
                     }
@@ -159,9 +169,8 @@ namespace Microsoft.DotNet.Cli
                 ? Enumerable.Empty<string>()
                 : args.Skip(lastArg + 1).ToArray();
 
-            if (verbose.HasValue)
+            if (CommandContext.IsVerbose())
             {
-                Environment.SetEnvironmentVariable(CommandContext.Variables.Verbose, verbose.ToString());
                 Console.WriteLine($"Telemetry is: {(telemetryClient.Enabled ? "Enabled" : "Disabled")}");
             }
 
@@ -170,7 +179,12 @@ namespace Microsoft.DotNet.Cli
             int exitCode;
             if (BuiltInCommandsCatalog.Commands.TryGetValue(topLevelCommandParserResult.Command, out var builtIn))
             {
-                TelemetryEventEntry.SendFiltered(Parser.Instance.ParseFrom($"dotnet {topLevelCommandParserResult.Command}", appArgs.ToArray()));
+                var parseResult = Parser.Instance.ParseFrom($"dotnet {topLevelCommandParserResult.Command}", appArgs.ToArray());
+                if (!parseResult.Errors.Any())
+                {
+                    TelemetryEventEntry.SendFiltered(parseResult);
+                }
+
                 exitCode = builtIn.Command(appArgs.ToArray());
             }
             else
@@ -193,24 +207,33 @@ namespace Microsoft.DotNet.Cli
         private static void ConfigureDotNetForFirstTimeUse(
             INuGetCacheSentinel nugetCacheSentinel,
             IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel,
-            CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator)
+            IAspNetCertificateSentinel aspNetCertificateSentinel,
+            CliFolderPathCalculator cliFolderPathCalculator,
+            bool hasSuperUserAccess)
         {
+            var environmentProvider = new EnvironmentProvider();
+
             using (PerfTrace.Current.CaptureTiming())
             {
                 var nugetPackagesArchiver = new NuGetPackagesArchiver();
-                var environmentProvider = new EnvironmentProvider();
+                var environmentPath =
+                    EnvironmentPathFactory.CreateEnvironmentPath(cliFolderPathCalculator, hasSuperUserAccess, environmentProvider);
                 var commandFactory = new DotNetCommandFactory(alwaysRunOutOfProc: true);
                 var nugetCachePrimer = new NuGetCachePrimer(
                     nugetPackagesArchiver,
                     nugetCacheSentinel,
-                    cliFallbackFolderPathCalculator);
+                    cliFolderPathCalculator);
+                var aspnetCertificateGenerator = new AspNetCoreCertificateGenerator();
                 var dotnetConfigurer = new DotnetFirstTimeUseConfigurer(
                     nugetCachePrimer,
                     nugetCacheSentinel,
                     firstTimeUseNoticeSentinel,
+                    aspNetCertificateSentinel,
+                    aspnetCertificateGenerator,
                     environmentProvider,
                     Reporter.Output,
-                    cliFallbackFolderPathCalculator.CliFallbackFolderPath);
+                    cliFolderPathCalculator.CliFallbackFolderPath,
+                    environmentPath);
 
                 dotnetConfigurer.Configure();
             }
@@ -261,7 +284,8 @@ namespace Microsoft.DotNet.Cli
 
         private static bool IsArg(string candidate, string shortName, string longName)
         {
-            return (shortName != null && candidate.Equals("-" + shortName)) || (longName != null && candidate.Equals("--" + longName));
+            return (shortName != null && candidate.Equals("-" + shortName, StringComparison.OrdinalIgnoreCase)) ||
+                   (longName != null && candidate.Equals("--" + longName, StringComparison.OrdinalIgnoreCase));
         }
 
         private static string GetDisplayRid(DotnetVersionFile versionFile)
diff --git a/src/dotnet/ProjectInstanceExtensions.cs b/src/dotnet/ProjectInstanceExtensions.cs
index f437572c5..fdfd41b38 100644
--- a/src/dotnet/ProjectInstanceExtensions.cs
+++ b/src/dotnet/ProjectInstanceExtensions.cs
@@ -4,6 +4,7 @@
 using Microsoft.Build.Execution;
 using Microsoft.DotNet.Cli.Sln.Internal;
 using System;
+using System.Collections.Generic;
 using System.Linq;
 
 namespace Microsoft.DotNet.Tools.Common
@@ -45,5 +46,25 @@ namespace Microsoft.DotNet.Tools.Common
 
             return projectTypeGuid;
         }
+
+        public static IEnumerable<string> GetPlatforms(this ProjectInstance projectInstance)
+        {
+            return (projectInstance.GetPropertyValue("Platforms") ?? "")
+                .Split(
+                    new char[] { ';' },
+                    StringSplitOptions.RemoveEmptyEntries)
+                .Where(p => !string.IsNullOrWhiteSpace(p))
+                .DefaultIfEmpty("AnyCPU");
+        }
+
+        public static IEnumerable<string> GetConfigurations(this ProjectInstance projectInstance)
+        {
+            return (projectInstance.GetPropertyValue("Configurations") ?? "Debug;Release")
+                .Split(
+                    new char[] { ';' },
+                    StringSplitOptions.RemoveEmptyEntries)
+                .Where(c => !string.IsNullOrWhiteSpace(c))
+                .DefaultIfEmpty("Debug");
+        }
     }
 }
diff --git a/src/dotnet/Properties/AssemblyInfo.cs b/src/dotnet/Properties/AssemblyInfo.cs
index d7ae131d6..249576dc2 100644
--- a/src/dotnet/Properties/AssemblyInfo.cs
+++ b/src/dotnet/Properties/AssemblyInfo.cs
@@ -17,3 +17,5 @@ using System.Runtime.CompilerServices;
 [assembly: InternalsVisibleTo("dotnet-sln-remove.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("dotnet-msbuild.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
 [assembly: InternalsVisibleTo("dotnet-run.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.DotNet.ToolPackage.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.DotNet.ShellShim.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/dotnet/ShellShim/DoNothingEnvironmentPath.cs b/src/dotnet/ShellShim/DoNothingEnvironmentPath.cs
new file mode 100644
index 000000000..336abab29
--- /dev/null
+++ b/src/dotnet/ShellShim/DoNothingEnvironmentPath.cs
@@ -0,0 +1,22 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using Microsoft.DotNet.Cli.Utils;
+
+namespace Microsoft.DotNet.ShellShim
+{
+    public class DoNothingEnvironmentPath : IEnvironmentPath
+    {
+        public void AddPackageExecutablePathToUserPath()
+        {
+        }
+
+        public void PrintAddPathInstructionIfPathDoesNotExist()
+        {
+        }
+    }
+}
diff --git a/src/dotnet/ShellShim/EnvironmentPathFactory.cs b/src/dotnet/ShellShim/EnvironmentPathFactory.cs
new file mode 100644
index 000000000..a60a4ba86
--- /dev/null
+++ b/src/dotnet/ShellShim/EnvironmentPathFactory.cs
@@ -0,0 +1,64 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Xml.Xsl;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Configurer;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ShellShim
+{
+    internal static class EnvironmentPathFactory
+    {
+        public static IEnvironmentPath CreateEnvironmentPath(
+            CliFolderPathCalculator cliFolderPathCalculator = null,
+            bool hasSuperUserAccess = false,
+            IEnvironmentProvider environmentProvider = null)
+        {
+            if (cliFolderPathCalculator == null)
+            {
+                cliFolderPathCalculator = new CliFolderPathCalculator();
+            }
+
+            if (environmentProvider == null)
+            {
+                environmentProvider = new EnvironmentProvider();
+            }
+
+            IEnvironmentPath environmentPath = new DoNothingEnvironmentPath();
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                environmentPath = new WindowsEnvironmentPath(
+                    cliFolderPathCalculator.ToolsShimPath,
+                    Reporter.Output);
+            }
+            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && hasSuperUserAccess)
+            {
+                environmentPath = new LinuxEnvironmentPath(
+                    cliFolderPathCalculator.ToolsShimPathInUnix,
+                    Reporter.Output,
+                    environmentProvider, new FileWrapper());
+            }
+            else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) && hasSuperUserAccess)
+            {
+                environmentPath = new OSXEnvironmentPath(
+                    executablePath: cliFolderPathCalculator.ToolsShimPathInUnix,
+                    reporter: Reporter.Output,
+                    environmentProvider: environmentProvider,
+                    fileSystem: new FileWrapper());
+            }
+
+            return environmentPath;
+        }
+
+        public static IEnvironmentPathInstruction CreateEnvironmentPathInstruction(
+            CliFolderPathCalculator cliFolderPathCalculator = null,
+            IEnvironmentProvider environmentProvider = null)
+        {
+            return CreateEnvironmentPath(cliFolderPathCalculator, true, environmentProvider);
+        }
+    }
+}
diff --git a/src/dotnet/ShellShim/LinuxEnvironmentPath.cs b/src/dotnet/ShellShim/LinuxEnvironmentPath.cs
new file mode 100644
index 000000000..dcea206a4
--- /dev/null
+++ b/src/dotnet/ShellShim/LinuxEnvironmentPath.cs
@@ -0,0 +1,84 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Linq;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Configurer;
+using Microsoft.DotNet.Tools;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ShellShim
+{
+    internal class LinuxEnvironmentPath : IEnvironmentPath
+    {
+        private readonly IFile _fileSystem;
+        private readonly IEnvironmentProvider _environmentProvider;
+        private readonly IReporter _reporter;
+        private const string PathName = "PATH";
+        private readonly BashPathUnderHomeDirectory _packageExecutablePath;
+
+        private readonly string _profiledDotnetCliToolsPath
+            = Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_LINUX_PROFILED_PATH")
+              ?? @"/etc/profile.d/dotnet-cli-tools-bin-path.sh";
+
+        internal LinuxEnvironmentPath(
+            BashPathUnderHomeDirectory packageExecutablePath,
+            IReporter reporter,
+            IEnvironmentProvider environmentProvider,
+            IFile fileSystem)
+        {
+            _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
+            _environmentProvider
+                = environmentProvider ?? throw new ArgumentNullException(nameof(environmentProvider));
+            _reporter
+                = reporter ?? throw new ArgumentNullException(nameof(reporter));
+            _packageExecutablePath = packageExecutablePath;
+        }
+
+        public void AddPackageExecutablePathToUserPath()
+        {
+            if (PackageExecutablePathExists())
+            {
+                return;
+            }
+
+            var script = $"export PATH=\"$PATH:{_packageExecutablePath.PathWithDollar}\"";
+            _fileSystem.WriteAllText(_profiledDotnetCliToolsPath, script);
+        }
+
+        private bool PackageExecutablePathExists()
+        {
+            var environmentVariable = _environmentProvider
+                .GetEnvironmentVariable(PathName);
+
+            if (environmentVariable == null)
+            {
+                return false;
+            }
+
+            return environmentVariable
+                .Split(':').Contains(_packageExecutablePath.Path);
+        }
+
+        public void PrintAddPathInstructionIfPathDoesNotExist()
+        {
+            if (!PackageExecutablePathExists())
+            {
+                if (_fileSystem.Exists(_profiledDotnetCliToolsPath))
+                {
+                    _reporter.WriteLine(
+                        CommonLocalizableStrings.EnvironmentPathLinuxNeedLogout);
+                }
+                else
+                {
+                    // similar to https://code.visualstudio.com/docs/setup/mac
+                    _reporter.WriteLine(
+                        string.Format(
+                            CommonLocalizableStrings.EnvironmentPathLinuxManualInstruction,
+                            _packageExecutablePath.Path, _packageExecutablePath.Path));
+                }
+            }
+        }
+    }
+}
diff --git a/src/dotnet/ShellShim/OsxEnvironmentPath.cs b/src/dotnet/ShellShim/OsxEnvironmentPath.cs
new file mode 100644
index 000000000..965a14453
--- /dev/null
+++ b/src/dotnet/ShellShim/OsxEnvironmentPath.cs
@@ -0,0 +1,84 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Linq;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Configurer;
+using Microsoft.DotNet.Tools;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ShellShim
+{
+    internal class OSXEnvironmentPath : IEnvironmentPath
+    {
+        private const string PathName = "PATH";
+        private readonly BashPathUnderHomeDirectory _packageExecutablePath;
+        private readonly IFile _fileSystem;
+        private readonly IEnvironmentProvider _environmentProvider;
+        private readonly IReporter _reporter;
+
+        private static readonly string PathDDotnetCliToolsPath
+            = Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_OSX_PATHSD_PATH")
+              ?? @"/etc/paths.d/dotnet-cli-tools";
+
+        public OSXEnvironmentPath(
+            BashPathUnderHomeDirectory executablePath,
+            IReporter reporter,
+            IEnvironmentProvider environmentProvider,
+            IFile fileSystem
+        )
+        {
+            _packageExecutablePath = executablePath;
+            _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
+            _environmentProvider
+                = environmentProvider ?? throw new ArgumentNullException(nameof(environmentProvider));
+            _reporter
+                = reporter ?? throw new ArgumentNullException(nameof(reporter));
+        }
+
+        public void AddPackageExecutablePathToUserPath()
+        {
+            if (PackageExecutablePathExists())
+            {
+                return;
+            }
+
+            var script = $"{_packageExecutablePath.PathWithTilde}";
+            _fileSystem.WriteAllText(PathDDotnetCliToolsPath, script);
+        }
+
+        private bool PackageExecutablePathExists()
+        {
+            var environmentVariable = _environmentProvider.GetEnvironmentVariable(PathName);
+
+            if (environmentVariable == null)
+            {
+                return false;
+            }
+
+            return environmentVariable.Split(':').Contains(_packageExecutablePath.PathWithTilde)
+                || environmentVariable.Split(':').Contains(_packageExecutablePath.Path);
+        }
+
+        public void PrintAddPathInstructionIfPathDoesNotExist()
+        {
+            if (!PackageExecutablePathExists())
+            {
+                if (_fileSystem.Exists(PathDDotnetCliToolsPath))
+                {
+                    _reporter.WriteLine(
+                        CommonLocalizableStrings.EnvironmentPathOSXNeedReopen);
+                }
+                else
+                {
+                    // similar to https://code.visualstudio.com/docs/setup/mac
+                    _reporter.WriteLine(
+                        string.Format(
+                            CommonLocalizableStrings.EnvironmentPathOSXManualInstruction,
+                            _packageExecutablePath.Path, _packageExecutablePath.Path));
+                }
+            }
+        }
+    }
+}
diff --git a/src/dotnet/ShellShim/ShellShimMaker.cs b/src/dotnet/ShellShim/ShellShimMaker.cs
new file mode 100644
index 000000000..fe435ac0c
--- /dev/null
+++ b/src/dotnet/ShellShim/ShellShimMaker.cs
@@ -0,0 +1,120 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Xml.Linq;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Tools;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ShellShim
+{
+    public class ShellShimMaker
+    {
+        private const string LauncherExeResourceName = "Microsoft.DotNet.Tools.Launcher.Executable";
+        private const string LauncherConfigResourceName = "Microsoft.DotNet.Tools.Launcher.Config";
+
+        private readonly string _pathToPlaceShim;
+
+        public ShellShimMaker(string pathToPlaceShim)
+        {
+            _pathToPlaceShim =
+                pathToPlaceShim ?? throw new ArgumentNullException(nameof(pathToPlaceShim));
+        }
+
+        public void CreateShim(string packageExecutablePath, string shellCommandName)
+        {
+            FilePath shimPath = GetShimPath(shellCommandName);
+
+            if (!Directory.Exists(shimPath.GetDirectoryPath().Value))
+            {
+                Directory.CreateDirectory(shimPath.GetDirectoryPath().Value);
+            }
+
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                CreateConfigFile(shimPath.Value + ".config", entryPoint: packageExecutablePath, runner: "dotnet");
+                using (var shim = File.Create(shimPath.Value))
+                using (var exe = typeof(ShellShimMaker).Assembly.GetManifestResourceStream(LauncherExeResourceName))
+                {
+                    exe.CopyTo(shim);
+                }
+            }
+            else
+            {
+                var packageExecutable = new FilePath(packageExecutablePath);
+
+                var script = new StringBuilder();
+                script.AppendLine("#!/bin/sh");
+                script.AppendLine($"dotnet {packageExecutable.ToQuotedString()} \"$@\"");
+
+                File.WriteAllText(shimPath.Value, script.ToString());
+
+                SetUserExecutionPermissionToShimFile(shimPath);
+            }
+        }
+
+        public void EnsureCommandNameUniqueness(string shellCommandName)
+        {
+            if (File.Exists(Path.Combine(_pathToPlaceShim, shellCommandName)))
+            {
+                throw new GracefulException(
+                    string.Format(CommonLocalizableStrings.FailInstallToolSameName,
+                        shellCommandName));
+            }
+        }
+
+        internal void CreateConfigFile(string outputPath, string entryPoint, string runner)
+        {
+            XDocument config;
+            using (var resource = typeof(ShellShimMaker).Assembly.GetManifestResourceStream(LauncherConfigResourceName))
+            {
+                config = XDocument.Load(resource);
+            }
+
+            var appSettings = config.Descendants("appSettings").First();
+            appSettings.Add(new XElement("add", new XAttribute("key", "entryPoint"), new XAttribute("value", entryPoint)));
+            appSettings.Add(new XElement("add", new XAttribute("key", "runner"), new XAttribute("value", runner ?? string.Empty)));
+            config.Save(outputPath);
+        }
+
+        public void Remove(string shellCommandName)
+        {
+            File.Delete(GetShimPath(shellCommandName).Value);
+        }
+
+        private FilePath GetShimPath(string shellCommandName)
+        {
+            var scriptPath = Path.Combine(_pathToPlaceShim, shellCommandName);
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                scriptPath += ".exe";
+            }
+
+            return new FilePath(scriptPath);
+        }
+
+        private static void SetUserExecutionPermissionToShimFile(FilePath scriptPath)
+        {
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                return;
+
+            CommandResult result = new CommandFactory()
+                .Create("chmod", new[] { "u+x", scriptPath.Value })
+                .CaptureStdOut()
+                .CaptureStdErr()
+                .Execute();
+
+            if (result.ExitCode != 0)
+            {
+                throw new GracefulException(
+                    string.Format(CommonLocalizableStrings.FailInstallToolPermission, result.StdErr,
+                        result.StdOut));
+            }
+        }
+    }
+}
diff --git a/src/dotnet/ShellShim/WindowsEnvironmentPath.cs b/src/dotnet/ShellShim/WindowsEnvironmentPath.cs
new file mode 100644
index 000000000..3ad46b55e
--- /dev/null
+++ b/src/dotnet/ShellShim/WindowsEnvironmentPath.cs
@@ -0,0 +1,79 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Linq;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Tools;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ShellShim
+{
+    internal class WindowsEnvironmentPath : IEnvironmentPath
+    {
+        private readonly IReporter _reporter;
+        private const string PathName = "PATH";
+        private readonly string _packageExecutablePath;
+
+        public WindowsEnvironmentPath(
+            string packageExecutablePath, IReporter reporter)
+        {
+            _packageExecutablePath
+                = packageExecutablePath ?? throw new ArgumentNullException(nameof(packageExecutablePath));
+            _reporter
+                = reporter ?? throw new ArgumentNullException(nameof(reporter));
+        }
+
+        public void AddPackageExecutablePathToUserPath()
+        {
+            if (PackageExecutablePathExists())
+            {
+                return;
+            }
+
+            var existingUserEnvPath = Environment.GetEnvironmentVariable(PathName, EnvironmentVariableTarget.User);
+
+            Environment.SetEnvironmentVariable(
+                PathName,
+                $"{existingUserEnvPath};{_packageExecutablePath}",
+                EnvironmentVariableTarget.User);
+        }
+
+        private bool PackageExecutablePathExists()
+        {
+            return EnvironmentVariableConatinsPackageExecutablePath(Environment.GetEnvironmentVariable(PathName, EnvironmentVariableTarget.User))
+                || EnvironmentVariableConatinsPackageExecutablePath(Environment.GetEnvironmentVariable(PathName, EnvironmentVariableTarget.Machine))
+                || EnvironmentVariableConatinsPackageExecutablePath(Environment.GetEnvironmentVariable(PathName, EnvironmentVariableTarget.Process));
+        }
+
+        private bool EnvironmentVariableConatinsPackageExecutablePath(string environmentVariable)
+        {
+            if (environmentVariable == null)
+            {
+                return false;
+            }
+
+            return environmentVariable.Split(';').Contains(_packageExecutablePath);
+        }
+
+        public void PrintAddPathInstructionIfPathDoesNotExist()
+        {
+            if (!PackageExecutablePathExists())
+            {
+                if (Environment.GetEnvironmentVariable(PathName, EnvironmentVariableTarget.User).Split(';')
+                    .Contains(_packageExecutablePath))
+                {
+                    _reporter.WriteLine(
+                        CommonLocalizableStrings.EnvironmentPathWindowsNeedReopen);
+                }
+                else
+                {
+                    _reporter.WriteLine(
+                        string.Format(
+                            CommonLocalizableStrings.EnvironmentPathWindowsManualInstruction,
+                            _packageExecutablePath, _packageExecutablePath));
+                }
+            }
+        }
+    }
+}
diff --git a/src/dotnet/SlnFileExtensions.cs b/src/dotnet/SlnFileExtensions.cs
index 24848dffa..e1d91c224 100644
--- a/src/dotnet/SlnFileExtensions.cs
+++ b/src/dotnet/SlnFileExtensions.cs
@@ -23,7 +23,7 @@ namespace Microsoft.DotNet.Tools.Common
                 throw new ArgumentException();
             }
 
-            var relativeProjectPath = PathUtility.GetRelativePath(
+            var relativeProjectPath = Path.GetRelativePath(
                 PathUtility.EnsureTrailingSlash(slnFile.BaseDirectory),
                 fullProjectPath);
 
@@ -59,7 +59,16 @@ namespace Microsoft.DotNet.Tools.Common
                     FilePath = relativeProjectPath
                 };
 
-                slnFile.AddDefaultBuildConfigurations(slnProject);
+                // NOTE: The order you create the sections determines the order they are written to the sln
+                // file. In the case of an empty sln file, in order to make sure the solution configurations
+                // section comes first we need to add it first. This doesn't affect correctness but does
+                // stop VS from re-ordering things later on. Since we are keeping the SlnFile class low-level
+                // it shouldn't care about the VS implementation details. That's why we handle this here.
+                slnFile.AddDefaultBuildConfigurations();
+
+                slnFile.MapSolutionConfigurationsToProject(
+                    projectInstance,
+                    slnFile.ProjectConfigurationsSection.GetOrCreatePropertySet(slnProject.Id));
 
                 slnFile.AddSolutionFolders(slnProject);
 
@@ -70,11 +79,13 @@ namespace Microsoft.DotNet.Tools.Common
             }
         }
 
-        public static void AddDefaultBuildConfigurations(this SlnFile slnFile, SlnProject slnProject)
+        private static void AddDefaultBuildConfigurations(this SlnFile slnFile)
         {
-            if (slnProject == null)
+            var configurationsSection = slnFile.SolutionConfigurationsSection;
+
+            if (!configurationsSection.IsEmpty)
             {
-                throw new ArgumentException();
+                return;
             }
 
             var defaultConfigurations = new List<string>()
@@ -87,57 +98,108 @@ namespace Microsoft.DotNet.Tools.Common
                 "Release|x86",
             };
 
-            // NOTE: The order you create the sections determines the order they are written to the sln
-            // file. In the case of an empty sln file, in order to make sure the solution configurations
-            // section comes first we need to add it first. This doesn't affect correctness but does 
-            // stop VS from re-ordering things later on. Since we are keeping the SlnFile class low-level
-            // it shouldn't care about the VS implementation details. That's why we handle this here.
-            AddDefaultSolutionConfigurations(defaultConfigurations, slnFile.SolutionConfigurationsSection);
-            AddDefaultProjectConfigurations(
-                defaultConfigurations,
-                slnFile.ProjectConfigurationsSection.GetOrCreatePropertySet(slnProject.Id));
-        }
-
-        private static void AddDefaultSolutionConfigurations(
-            List<string> defaultConfigurations,
-            SlnPropertySet solutionConfigs)
-        {
             foreach (var config in defaultConfigurations)
             {
-                if (!solutionConfigs.ContainsKey(config))
+                configurationsSection[config] = config;
+            }
+        }
+
+        private static void MapSolutionConfigurationsToProject(
+            this SlnFile slnFile,
+            ProjectInstance projectInstance,
+            SlnPropertySet solutionProjectConfigs)
+        {
+            var (projectConfigurations, defaultProjectConfiguration) = GetKeysDictionary(projectInstance.GetConfigurations());
+            var (projectPlatforms, defaultProjectPlatform) = GetKeysDictionary(projectInstance.GetPlatforms());
+
+            foreach (var solutionConfigKey in slnFile.SolutionConfigurationsSection.Keys)
+            {
+                var projectConfigKey = MapSolutionConfigKeyToProjectConfigKey(
+                    solutionConfigKey,
+                    projectConfigurations,
+                    defaultProjectConfiguration,
+                    projectPlatforms,
+                    defaultProjectPlatform);
+                if (projectConfigKey == null)
                 {
-                    solutionConfigs[config] = config;
+                    continue;
+                }
+
+                var activeConfigKey = $"{solutionConfigKey}.ActiveCfg";
+                if (!solutionProjectConfigs.ContainsKey(activeConfigKey))
+                {
+                    solutionProjectConfigs[activeConfigKey] = projectConfigKey;
+                }
+
+                var buildKey = $"{solutionConfigKey}.Build.0";
+                if (!solutionProjectConfigs.ContainsKey(buildKey))
+                {
+                    solutionProjectConfigs[buildKey] = projectConfigKey;
                 }
             }
         }
 
-        private static void AddDefaultProjectConfigurations(
-            List<string> defaultConfigurations,
-            SlnPropertySet projectConfigs)
+        private static (Dictionary<string, string> Keys, string DefaultKey) GetKeysDictionary(IEnumerable<string> keys)
         {
-            foreach (var config in defaultConfigurations)
-            {
-                var activeCfgKey = $"{config}.ActiveCfg";
-                if (!projectConfigs.ContainsKey(activeCfgKey))
-                {
-                    projectConfigs[activeCfgKey] = config;
-                }
+            // A dictionary mapping key -> key is used instead of a HashSet so the original case of the key can be retrieved from the set
+            var dictionary = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
 
-                var build0Key = $"{config}.Build.0";
-                if (!projectConfigs.ContainsKey(build0Key))
-                {
-                    projectConfigs[build0Key] = config;
-                }
+            foreach (var key in keys)
+            {
+                dictionary[key] = key;
             }
+
+            return (dictionary, keys.FirstOrDefault());
         }
 
-        public static void AddSolutionFolders(this SlnFile slnFile, SlnProject slnProject)
+        private static string GetMatchingProjectKey(IDictionary<string, string> projectKeys, string solutionKey)
         {
-            if (slnProject == null)
+            string projectKey;
+            if (projectKeys.TryGetValue(solutionKey, out projectKey))
             {
-                throw new ArgumentException();
+                return projectKey;
             }
 
+            var keyWithoutWhitespace = String.Concat(solutionKey.Where(c => !Char.IsWhiteSpace(c)));
+            if (projectKeys.TryGetValue(keyWithoutWhitespace, out projectKey))
+            {
+                return projectKey;
+            }
+
+            return null;
+        }
+
+        private static string MapSolutionConfigKeyToProjectConfigKey(
+            string solutionConfigKey,
+            Dictionary<string, string> projectConfigurations,
+            string defaultProjectConfiguration,
+            Dictionary<string, string> projectPlatforms,
+            string defaultProjectPlatform)
+        {
+            var pair = solutionConfigKey.Split(new char[] {'|'}, 2);
+            if (pair.Length != 2)
+            {
+                return null;
+            }
+
+            var projectConfiguration = GetMatchingProjectKey(projectConfigurations, pair[0]) ?? defaultProjectConfiguration;
+            if (projectConfiguration == null)
+            {
+                return null;
+            }
+
+            var projectPlatform = GetMatchingProjectKey(projectPlatforms, pair[1]) ?? defaultProjectPlatform;
+            if (projectPlatform == null)
+            {
+                return null;
+            }
+
+            // VS stores "Any CPU" platform in the solution regardless of how it is named at the project level
+            return $"{projectConfiguration}|{(projectPlatform == "AnyCPU" ? "Any CPU" : projectPlatform)}";
+        }
+
+        private static void AddSolutionFolders(this SlnFile slnFile, SlnProject slnProject)
+        {
             var solutionFolders = slnProject.GetSolutionFoldersFromProject();
 
             if (solutionFolders.Any())
@@ -221,7 +283,7 @@ namespace Microsoft.DotNet.Tools.Common
             if (projectsToRemove.Count == 0)
             {
                 Reporter.Output.WriteLine(string.Format(
-                    CommonLocalizableStrings.ProjectReferenceCouldNotBeFound,
+                    CommonLocalizableStrings.ProjectNotFoundInTheSolution,
                     projectPath));
             }
             else
@@ -244,7 +306,23 @@ namespace Microsoft.DotNet.Tools.Common
 
                     slnFile.Projects.Remove(slnProject);
                     Reporter.Output.WriteLine(
-                        string.Format(CommonLocalizableStrings.ProjectReferenceRemoved, slnProject.FilePath));
+                        string.Format(CommonLocalizableStrings.ProjectRemovedFromTheSolution, slnProject.FilePath));
+                }
+
+                foreach (var project in slnFile.Projects)
+                {
+                    var dependencies = project.Dependencies;
+                    if (dependencies == null)
+                    {
+                        continue;
+                    }
+
+                    dependencies.SkipIfEmpty = true;
+
+                    foreach (var removed in projectsToRemove)
+                    {
+                        dependencies.Properties.Remove(removed.Id);
+                    }
                 }
 
                 projectRemoved = true;
diff --git a/src/dotnet/Telemetry/TelemetryCommonProperties.cs b/src/dotnet/Telemetry/TelemetryCommonProperties.cs
index a14c5cf84..6cbf02b47 100644
--- a/src/dotnet/Telemetry/TelemetryCommonProperties.cs
+++ b/src/dotnet/Telemetry/TelemetryCommonProperties.cs
@@ -8,6 +8,8 @@ using Microsoft.DotNet.PlatformAbstractions;
 using System.IO;
 using Microsoft.DotNet.Configurer;
 using System.Linq;
+using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment;
+using RuntimeInformation = System.Runtime.InteropServices.RuntimeInformation;
 
 namespace Microsoft.DotNet.Cli.Telemetry
 {
@@ -24,7 +26,7 @@ namespace Microsoft.DotNet.Cli.Telemetry
             _hasher = hasher ?? Sha256Hasher.Hash;
             _getMACAddress = getMACAddress ?? MacAddressGetter.GetMacAddress;
             _dockerContainerDetector = dockerContainerDetector ?? new DockerContainerDetectorForTelemetry();
-            _userLevelCacheWriter = userLevelCacheWriter ?? new UserLevelCacheWriter(new CliFallbackFolderPathCalculator());
+            _userLevelCacheWriter = userLevelCacheWriter ?? new UserLevelCacheWriter(new CliFolderPathCalculator());
         }
 
         private readonly IDockerContainerDetector _dockerContainerDetector;
@@ -40,6 +42,8 @@ namespace Microsoft.DotNet.Cli.Telemetry
         private const string CurrentPathHash = "Current Path Hash";
         private const string MachineId = "Machine ID";
         private const string DockerContainer = "Docker Container";
+        private const string KernelVersion = "Kernel Version";
+
         private const string TelemetryProfileEnvironmentVariable = "DOTNET_CLI_TELEMETRY_PROFILE";
         private const string CannotFindMacAddress = "Unknown";
 
@@ -57,7 +61,8 @@ namespace Microsoft.DotNet.Cli.Telemetry
                 {TelemetryProfile, Environment.GetEnvironmentVariable(TelemetryProfileEnvironmentVariable)},
                 {DockerContainer, _userLevelCacheWriter.RunWithCache(IsDockerContainerCacheKey, () => _dockerContainerDetector.IsDockerContainer().ToString("G") )},
                 {CurrentPathHash, _hasher(_getCurrentDirectory())},
-                {MachineId, _userLevelCacheWriter.RunWithCache(MachineIdCacheKey, GetMachineId)}
+                {MachineId, _userLevelCacheWriter.RunWithCache(MachineIdCacheKey, GetMachineId)},
+                {KernelVersion, GetKernelVersion()}
             };
         }
 
@@ -73,5 +78,44 @@ namespace Microsoft.DotNet.Cli.Telemetry
                 return Guid.NewGuid().ToString();
             }
         }
+
+        /// <summary>
+        /// Returns a string identifying the OS kernel.
+        /// For Unix this currently comes from "uname -srv".
+        /// For Windows this currently comes from RtlGetVersion().
+        ///
+        /// Here are some example values:
+        ///
+        ///     Alpine.36        Linux 4.9.60-linuxkit-aufs #1 SMP Mon Nov 6 16:00:12 UTC 2017
+        ///     Centos.73        Linux 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017
+        ///     Debian.87        Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07)
+        ///     Debian.90        Linux 4.9.0-2-amd64 #1 SMP Debian 4.9.18-1 (2017-03-30)
+        ///     fedora.25        Linux 4.11.3-202.fc25.x86_64 #1 SMP Mon Jun 5 16:38:21 UTC 2017
+        ///     Fedora.26        Linux 4.14.15-200.fc26.x86_64 #1 SMP Wed Jan 24 04:26:15 UTC 2018
+        ///     Fedora.27        Linux 4.14.14-300.fc27.x86_64 #1 SMP Fri Jan 19 13:19:54 UTC 2018
+        ///     OpenSuse.423     Linux 4.4.104-39-default #1 SMP Thu Jan 4 08:11:03 UTC 2018 (7db1912)
+        ///     RedHat.69        Linux 2.6.32-696.20.1.el6.x86_64 #1 SMP Fri Jan 12 15:07:59 EST 2018
+        ///     RedHat.72        Linux 3.10.0-514.21.1.el7.x86_64 #1 SMP Sat Apr 22 02:41:35 EDT 2017
+        ///     RedHat.73        Linux 3.10.0-514.21.1.el7.x86_64 #1 SMP Sat Apr 22 02:41:35 EDT 2017
+        ///     SLES.12          Linux 4.4.103-6.38-default #1 SMP Mon Dec 25 20:44:33 UTC 2017 (e4b9067)
+        ///     suse.422         Linux 4.4.49-16-default #1 SMP Sun Feb 19 17:40:35 UTC 2017 (70e9954)
+        ///     Ubuntu.1404      Linux 3.19.0-65-generic #73~14.04.1-Ubuntu SMP Wed Jun 29 21:05:22 UTC 2016
+        ///     Ubuntu.1604      Linux 4.13.0-1005-azure #7-Ubuntu SMP Mon Jan 8 21:37:36 UTC 2018
+        ///     Ubuntu.1604.WSL  Linux 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014
+        ///     Ubuntu.1610      Linux 4.8.0-45-generic #48-Ubuntu SMP Fri Mar 24 11:46:39 UTC 2017
+        ///     Ubuntu.1704      Linux 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:04:57 UTC 2017
+        ///     Ubuntu.1710      Linux 4.13.0-25-generic #29-Ubuntu SMP Mon Jan 8 21:14:41 UTC 2018
+        ///     OSX1012          Darwin 16.7.0 Darwin Kernel Version 16.7.0: Thu Jan 11 22:59:40 PST 2018; root:xnu-3789.73.8~1/RELEASE_X86_64
+        ///     OSX1013          Darwin 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64
+        ///     Windows.10       Microsoft Windows 10.0.14393
+        ///     Windows.10.Core  Microsoft Windows 10.0.14393
+        ///     Windows.10.Nano  Microsoft Windows 10.0.14393
+        ///     Windows.7        Microsoft Windows 6.1.7601 S
+        ///     Windows.81       Microsoft Windows 6.3.9600
+        /// </summary>
+        private static string GetKernelVersion()
+        {
+            return RuntimeInformation.OSDescription;
+        }
     }
 }
diff --git a/src/dotnet/ToolPackage/IPackageToProjectFileAdder.cs b/src/dotnet/ToolPackage/IPackageToProjectFileAdder.cs
new file mode 100644
index 000000000..cdde79c06
--- /dev/null
+++ b/src/dotnet/ToolPackage/IPackageToProjectFileAdder.cs
@@ -0,0 +1,12 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal interface IPackageToProjectFileAdder
+    {
+        void Add(FilePath projectPath, string packageId);
+    }
+}
diff --git a/src/dotnet/ToolPackage/IProjectRestorer.cs b/src/dotnet/ToolPackage/IProjectRestorer.cs
new file mode 100644
index 000000000..a20a2c18f
--- /dev/null
+++ b/src/dotnet/ToolPackage/IProjectRestorer.cs
@@ -0,0 +1,16 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal interface IProjectRestorer
+    {
+        void Restore(
+            FilePath projectPath,
+            DirectoryPath assetJsonOutput, 
+            FilePath? nugetconfig,
+            string source);
+    }
+}
diff --git a/src/dotnet/ToolPackage/LockFileMatchChecker.cs b/src/dotnet/ToolPackage/LockFileMatchChecker.cs
new file mode 100644
index 000000000..efa4af6b6
--- /dev/null
+++ b/src/dotnet/ToolPackage/LockFileMatchChecker.cs
@@ -0,0 +1,57 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.Linq;
+using NuGet.ProjectModel;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class LockFileMatcher
+    {
+        /// <summary>
+        /// Check if LockFileItem matches the targetRelativeFilePath.
+        /// The path in LockFileItem is in pattern tools/TFM/RID/my/tool.dll. Tools/TFM/RID is selected by NuGet.
+        /// And there will be only one TFM/RID combination.
+        /// When "my/tools.dll" part matches exactly with the targetRelativeFilePath, return true.
+        /// </summary>
+        /// <param name="lockFileItem">LockFileItem from asset.json restored from temp project</param>
+        /// <param name="targetRelativeFilePath">file path relative to tools/TFM/RID</param>
+        internal static bool MatchesFile(LockFileItem lockFileItem, string targetRelativeFilePath)
+        {
+            string[] pathInLockFilePathInArray = SplitPathByDirectorySeparator(lockFileItem.Path);
+            string[] entryPointPathInArray = SplitPathByDirectorySeparator(targetRelativeFilePath);
+
+            return entryPointPathInArray.Length >= 1
+                   && PathInLockFileDirectoriesStartWithToolsAndFollowsTwoSubFolder()
+                   && SubPathMatchesTargetFilePath();
+
+            bool SubPathMatchesTargetFilePath()
+            {
+                string[] pathAfterToolsTfmRid = pathInLockFilePathInArray.Skip(3).ToArray();
+                return !pathAfterToolsTfmRid
+                    .Where((directoryOnEveryLevel, i) => directoryOnEveryLevel != entryPointPathInArray[i])
+                    .Any();
+            }
+
+            bool PathInLockFileDirectoriesStartWithToolsAndFollowsTwoSubFolder()
+            {
+                if (pathInLockFilePathInArray.Length - entryPointPathInArray.Length != 3)
+                {
+                    return false;
+                }
+
+                if (pathInLockFilePathInArray[0] != "tools")
+                {
+                    return false;
+                }
+
+                return true;
+            }
+
+            string[] SplitPathByDirectorySeparator(string path)
+            {
+                return path.Split('\\', '/');
+            }
+        }
+    }
+}
diff --git a/src/dotnet/ToolPackage/PackageObtainException.cs b/src/dotnet/ToolPackage/PackageObtainException.cs
new file mode 100644
index 000000000..b165e0e5d
--- /dev/null
+++ b/src/dotnet/ToolPackage/PackageObtainException.cs
@@ -0,0 +1,22 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class PackageObtainException : Exception
+    {
+        public PackageObtainException()
+        {
+        }
+
+        public PackageObtainException(string message) : base(message)
+        {
+        }
+
+        public PackageObtainException(string message, Exception innerException) : base(message, innerException)
+        {
+        }
+    }
+}
diff --git a/src/dotnet/ToolPackage/PackageVersion.cs b/src/dotnet/ToolPackage/PackageVersion.cs
new file mode 100644
index 000000000..d66748ad1
--- /dev/null
+++ b/src/dotnet/ToolPackage/PackageVersion.cs
@@ -0,0 +1,28 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.IO;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class PackageVersion
+    {
+        public PackageVersion(string packageVersion)
+        {
+            if (packageVersion == null)
+            {
+                Value = Path.GetRandomFileName();
+                IsPlaceholder = true;
+            }
+            else
+            {
+                Value = packageVersion;
+                IsPlaceholder = false;
+            }
+        }
+
+        public bool IsPlaceholder { get; }
+        public string Value { get; }
+        public bool IsConcreteValue => !IsPlaceholder;
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolConfiguration.cs b/src/dotnet/ToolPackage/ToolConfiguration.cs
new file mode 100644
index 000000000..83862c38b
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolConfiguration.cs
@@ -0,0 +1,48 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using Microsoft.DotNet.Tools;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class ToolConfiguration
+    {
+        public ToolConfiguration(
+            string commandName,
+            string toolAssemblyEntryPoint)
+        {
+            if (string.IsNullOrWhiteSpace(commandName))
+            {
+                throw new ArgumentNullException(nameof(commandName), CommonLocalizableStrings.CannotBeNullOrWhitespace);
+            }
+
+            EnsureNoInvalidFilenameCharacters(commandName, nameof(toolAssemblyEntryPoint));
+
+            if (string.IsNullOrWhiteSpace(toolAssemblyEntryPoint))
+            {
+                throw new ArgumentNullException(nameof(toolAssemblyEntryPoint), CommonLocalizableStrings.CannotBeNullOrWhitespace);
+            }
+
+            CommandName = commandName;
+            ToolAssemblyEntryPoint = toolAssemblyEntryPoint;
+        }
+
+        private void EnsureNoInvalidFilenameCharacters(string commandName, string nameOfParam)
+        {
+            char[] invalidCharactors = Path.GetInvalidFileNameChars();
+            if (commandName.IndexOfAny(invalidCharactors) != -1)
+            {
+                throw new ArgumentException(
+                    paramName: nameof(nameOfParam),
+                    message: string.Format(CommonLocalizableStrings.ContainInvalidCharacters,
+                        new string(invalidCharactors)));
+            }
+        }
+
+
+        public string CommandName { get; }
+        public string ToolAssemblyEntryPoint { get; }
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolConfigurationAndExecutablePath.cs b/src/dotnet/ToolPackage/ToolConfigurationAndExecutablePath.cs
new file mode 100644
index 000000000..b191155b2
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolConfigurationAndExecutablePath.cs
@@ -0,0 +1,22 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class ToolConfigurationAndExecutablePath
+    {
+        public ToolConfigurationAndExecutablePath(
+            ToolConfiguration toolConfiguration,
+            FilePath executable)
+        {
+            Configuration = toolConfiguration;
+            Executable = executable;
+        }
+
+        public ToolConfiguration Configuration { get; }
+
+        public FilePath Executable { get; }
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolConfigurationDeserialization/DotNetCliTool.cs b/src/dotnet/ToolPackage/ToolConfigurationDeserialization/DotNetCliTool.cs
new file mode 100644
index 000000000..91fd9fde4
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolConfigurationDeserialization/DotNetCliTool.cs
@@ -0,0 +1,13 @@
+using System.Diagnostics;
+using System.Xml.Serialization;
+
+namespace Microsoft.DotNet.ToolPackage.ToolConfigurationDeserialization
+{
+    [DebuggerStepThrough]
+    [XmlRoot(Namespace = "", IsNullable = false)]
+    public class DotNetCliTool
+    {
+        [XmlArrayItem("Command", IsNullable = false)]
+        public DotNetCliToolCommand[] Commands { get; set; }
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolConfigurationDeserialization/DotNetCliToolCommand.cs b/src/dotnet/ToolPackage/ToolConfigurationDeserialization/DotNetCliToolCommand.cs
new file mode 100644
index 000000000..84b6ffb44
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolConfigurationDeserialization/DotNetCliToolCommand.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Diagnostics;
+using System.Xml.Serialization;
+
+namespace Microsoft.DotNet.ToolPackage.ToolConfigurationDeserialization
+{
+    [Serializable]
+    [DebuggerStepThrough]
+    [XmlType(AnonymousType = true)]
+    public class DotNetCliToolCommand
+    {
+        [XmlAttribute]
+        public string Name { get; set; }
+
+        [XmlAttribute]
+        public string EntryPoint { get; set; }
+
+        [XmlAttribute]
+        public string Runner { get; set; }
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolConfigurationDeserializer.cs b/src/dotnet/ToolPackage/ToolConfigurationDeserializer.cs
new file mode 100644
index 000000000..4938111f2
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolConfigurationDeserializer.cs
@@ -0,0 +1,63 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+using Microsoft.DotNet.ToolPackage.ToolConfigurationDeserialization;
+using Microsoft.DotNet.Tools;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal static class ToolConfigurationDeserializer
+    {
+        public static ToolConfiguration Deserialize(string pathToXml)
+        {
+            var serializer = new XmlSerializer(typeof(DotNetCliTool));
+
+            DotNetCliTool dotNetCliTool;
+
+            using (var fs = new FileStream(pathToXml, FileMode.Open))
+            {
+                var reader = XmlReader.Create(fs);
+
+                try
+                {
+                    dotNetCliTool = (DotNetCliTool)serializer.Deserialize(reader);
+                }
+                catch (InvalidOperationException e) when (e.InnerException is XmlException)
+                {
+                    throw new ToolConfigurationException(
+                        string.Format(CommonLocalizableStrings.ToolSettingsInvalidXml, e.InnerException.Message));
+                }
+            }
+
+            if (dotNetCliTool.Commands.Length != 1)
+            {
+                throw new ToolConfigurationException(
+                    CommonLocalizableStrings.ToolSettingMoreThanOneCommand);
+            }
+
+            if (dotNetCliTool.Commands[0].Runner != "dotnet")
+            {
+                throw new ToolConfigurationException(
+                    CommonLocalizableStrings.ToolSettingInvalidRunner);
+            }
+
+            var commandName = dotNetCliTool.Commands[0].Name;
+            var toolAssemblyEntryPoint = dotNetCliTool.Commands[0].EntryPoint;
+
+            try
+            {
+                return new ToolConfiguration(commandName, toolAssemblyEntryPoint);
+            }
+            catch (ArgumentException e)
+            {
+                throw new ToolConfigurationException(
+                    string.Format(CommonLocalizableStrings.ToolSettingsContainError,
+                    e.Message));
+            }
+        }
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolConfigurationException.cs b/src/dotnet/ToolPackage/ToolConfigurationException.cs
new file mode 100644
index 000000000..97c49b421
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolConfigurationException.cs
@@ -0,0 +1,14 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class ToolConfigurationException : ArgumentException
+    {
+        public ToolConfigurationException(string message) : base(message)
+        {
+        }
+    }
+}
diff --git a/src/dotnet/ToolPackage/ToolPackageObtainer.cs b/src/dotnet/ToolPackage/ToolPackageObtainer.cs
new file mode 100644
index 000000000..151fe83e7
--- /dev/null
+++ b/src/dotnet/ToolPackage/ToolPackageObtainer.cs
@@ -0,0 +1,242 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Xml.Linq;
+using Microsoft.DotNet.Tools;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Configurer;
+using Microsoft.Extensions.EnvironmentAbstractions;
+using NuGet.ProjectModel;
+
+namespace Microsoft.DotNet.ToolPackage
+{
+    internal class ToolPackageObtainer
+    {
+        private readonly Lazy<string> _bundledTargetFrameworkMoniker;
+        private readonly Func<FilePath> _getTempProjectPath;
+        private readonly IPackageToProjectFileAdder _packageToProjectFileAdder;
+        private readonly IProjectRestorer _projectRestorer;
+        private readonly DirectoryPath _toolsPath;
+        private readonly DirectoryPath _offlineFeedPath;
+
+        public ToolPackageObtainer(
+            DirectoryPath toolsPath,
+            DirectoryPath offlineFeedPath,
+            Func<FilePath> getTempProjectPath,
+            Lazy<string> bundledTargetFrameworkMoniker,
+            IPackageToProjectFileAdder packageToProjectFileAdder,
+            IProjectRestorer projectRestorer
+        )
+        {
+            _getTempProjectPath = getTempProjectPath;
+            _bundledTargetFrameworkMoniker = bundledTargetFrameworkMoniker;
+            _projectRestorer = projectRestorer ?? throw new ArgumentNullException(nameof(projectRestorer));
+            _packageToProjectFileAdder = packageToProjectFileAdder ??
+                                         throw new ArgumentNullException(nameof(packageToProjectFileAdder));
+            _toolsPath = toolsPath;
+            _offlineFeedPath = offlineFeedPath;
+        }
+
+        public ToolConfigurationAndExecutablePath ObtainAndReturnExecutablePath(
+            string packageId,
+            string packageVersion = null,
+            FilePath? nugetconfig = null,
+            string targetframework = null,
+            string source = null)
+        {
+            if (packageId == null)
+            {
+                throw new ArgumentNullException(nameof(packageId));
+            }
+
+            if (nugetconfig != null)
+            {
+                if (!File.Exists(nugetconfig.Value.Value))
+                {
+                    throw new PackageObtainException(
+                        string.Format(CommonLocalizableStrings.NuGetConfigurationFileDoesNotExist,
+                            Path.GetFullPath(nugetconfig.Value.Value)));
+                }
+            }
+
+            if (targetframework == null)
+            {
+                targetframework = _bundledTargetFrameworkMoniker.Value;
+            }
+
+            var packageVersionOrPlaceHolder = new PackageVersion(packageVersion);
+
+            DirectoryPath toolDirectory =
+                CreateIndividualToolVersionDirectory(packageId, packageVersionOrPlaceHolder);
+
+            FilePath tempProjectPath = CreateTempProject(
+                packageId,
+                packageVersionOrPlaceHolder,
+                targetframework,
+                toolDirectory);
+
+            if (packageVersionOrPlaceHolder.IsPlaceholder)
+            {
+                InvokeAddPackageRestore(
+                    nugetconfig,
+                    tempProjectPath,
+                    packageId);
+            }
+
+            _projectRestorer.Restore(tempProjectPath, toolDirectory, nugetconfig, source);
+
+            if (packageVersionOrPlaceHolder.IsPlaceholder)
+            {
+                var concreteVersion =
+                    new DirectoryInfo(
+                        Directory.GetDirectories(
+                            toolDirectory.WithSubDirectories(packageId).Value).Single()).Name;
+                DirectoryPath versioned =
+                    toolDirectory.GetParentPath().WithSubDirectories(concreteVersion);
+
+                MoveToVersionedDirectory(versioned, toolDirectory);
+
+                toolDirectory = versioned;
+                packageVersion = concreteVersion;
+            }
+
+            LockFile lockFile = new LockFileFormat()
+                .ReadWithLock(toolDirectory.WithFile("project.assets.json").Value)
+                .Result;
+
+            LockFileItem dotnetToolSettings = FindAssetInLockFile(lockFile, "DotnetToolSettings.xml", packageId);
+
+            if (dotnetToolSettings == null)
+            {
+                throw new PackageObtainException(
+                    string.Format(CommonLocalizableStrings.ToolPackageMissingSettingsFile, packageId));
+            }
+
+            FilePath toolConfigurationPath =
+                toolDirectory
+                    .WithSubDirectories(packageId, packageVersion)
+                    .WithFile(dotnetToolSettings.Path);
+
+            ToolConfiguration toolConfiguration =
+                ToolConfigurationDeserializer.Deserialize(toolConfigurationPath.Value);
+
+            var entryPointFromLockFile =
+                FindAssetInLockFile(lockFile, toolConfiguration.ToolAssemblyEntryPoint, packageId);
+
+            if (entryPointFromLockFile == null)
+            {
+                throw new PackageObtainException(string.Format(CommonLocalizableStrings.ToolPackageMissingEntryPointFile,
+                    packageId, toolConfiguration.ToolAssemblyEntryPoint));
+            }
+
+            return new ToolConfigurationAndExecutablePath(
+                toolConfiguration,
+                toolDirectory.WithSubDirectories(
+                        packageId,
+                        packageVersion)
+                    .WithFile(entryPointFromLockFile.Path));
+        }
+
+        private static LockFileItem FindAssetInLockFile(
+            LockFile lockFile,
+            string targetRelativeFilePath, string packageId)
+        {
+            return lockFile
+                .Targets?.SingleOrDefault(t => t.RuntimeIdentifier != null)
+                ?.Libraries?.SingleOrDefault(l => l.Name == packageId)
+                ?.ToolsAssemblies
+                ?.SingleOrDefault(t => LockFileMatcher.MatchesFile(t, targetRelativeFilePath));
+        }
+
+        private static void MoveToVersionedDirectory(
+            DirectoryPath versioned,
+            DirectoryPath temporary)
+        {
+            if (Directory.Exists(versioned.Value))
+            {
+                Directory.Delete(versioned.Value, recursive: true);
+            }
+
+            Directory.Move(temporary.Value, versioned.Value);
+        }
+
+        private FilePath CreateTempProject(
+            string packageId,
+            PackageVersion packageVersion,
+            string targetframework,
+            DirectoryPath individualToolVersion)
+        {
+            FilePath tempProjectPath = _getTempProjectPath();
+            if (Path.GetExtension(tempProjectPath.Value) != "csproj")
+            {
+                tempProjectPath = new FilePath(Path.ChangeExtension(tempProjectPath.Value, "csproj"));
+            }
+
+            EnsureDirectoryExists(tempProjectPath.GetDirectoryPath());
+            var tempProjectContent = new XDocument(
+                new XElement("Project",
+                    new XAttribute("Sdk", "Microsoft.NET.Sdk"),
+                    new XElement("PropertyGroup",
+                        new XElement("TargetFramework", targetframework),
+                        new XElement("RestorePackagesPath", individualToolVersion.Value), // tool package will restore to tool folder
+                        new XElement("RestoreProjectStyle", "DotnetToolReference"), // without it, project cannot reference tool package
+                        new XElement("RestoreRootConfigDirectory", Directory.GetCurrentDirectory()), // config file probing start directory
+                        new XElement("DisableImplicitFrameworkReferences", "true"), // no Microsoft.NETCore.App in tool folder
+                        new XElement("RestoreFallbackFolders", "clear"), // do not use fallbackfolder, tool package need to be copied to tool folder
+                        new XElement("RestoreAdditionalProjectSources", // use fallbackfolder as feed to enable offline
+                            Directory.Exists(_offlineFeedPath.Value) ? _offlineFeedPath.Value : string.Empty),
+                        new XElement("RestoreAdditionalProjectFallbackFolders", string.Empty), // block other
+                        new XElement("RestoreAdditionalProjectFallbackFoldersExcludes", string.Empty),  // block other
+                        new XElement("DisableImplicitNuGetFallbackFolder","true")  // disable SDK side implicit NuGetFallbackFolder
+                    ),
+                    packageVersion.IsConcreteValue
+                        ? new XElement("ItemGroup",
+                            new XElement("PackageReference",
+                                new XAttribute("Include", packageId),
+                                new XAttribute("Version", packageVersion.Value)
+                            ))
+                        : null));
+
+            File.WriteAllText(tempProjectPath.Value,
+                tempProjectContent.ToString());
+
+            return tempProjectPath;
+        }
+
+        private void InvokeAddPackageRestore(
+            FilePath? nugetconfig,
+            FilePath tempProjectPath,
+            string packageId)
+        {
+            if (nugetconfig != null)
+            {
+                File.Copy(
+                    nugetconfig.Value.Value,
+                    tempProjectPath
+                        .GetDirectoryPath()
+                        .WithFile("nuget.config")
+                        .Value);
+            }
+
+            _packageToProjectFileAdder.Add(tempProjectPath, packageId);
+        }
+
+        private DirectoryPath CreateIndividualToolVersionDirectory(
+            string packageId,
+            PackageVersion packageVersion)
+        {
+            DirectoryPath individualTool = _toolsPath.WithSubDirectories(packageId);
+            DirectoryPath individualToolVersion = individualTool.WithSubDirectories(packageVersion.Value);
+            EnsureDirectoryExists(individualToolVersion);
+            return individualToolVersion;
+        }
+
+        private static void EnsureDirectoryExists(DirectoryPath path)
+        {
+            if (!Directory.Exists(path.Value))
+            {
+                Directory.CreateDirectory(path.Value);
+            }
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.resx b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.resx
index c18e94039..61a8f320f 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.resx
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.resx
@@ -162,4 +162,7 @@
   <data name="CmdPackageDirectory" xml:space="preserve">
     <value>PACKAGE_DIRECTORY</value>
   </data>
+  <data name="CmdDGFileIOException" xml:space="preserve">
+    <value>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs
index a72a413a1..c0af31625 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs
@@ -66,8 +66,18 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference
 
             if (!_appliedCommand.HasOption("no-restore"))
             {
-                // Create a Dependency Graph file for the project
-                tempDgFilePath = Path.GetTempFileName();
+                
+                try
+                {
+                    // Create a Dependency Graph file for the project
+                    tempDgFilePath = Path.GetTempFileName();
+                }
+                catch (IOException ioex)
+                {
+                    // Catch IOException from Path.GetTempFileName() and throw a graceful exception to the user.
+                    throw new GracefulException(string.Format(LocalizableStrings.CmdDGFileIOException, projectFilePath), ioex);
+                }
+                
                 GetProjectDependencyGraph(projectFilePath, tempDgFilePath);
             }
 
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.cs.xlf
index 11241842a..7bf5ba37e 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.cs.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.cs.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Nejde generovat dočasný soubor pro projekt {0}. Není možné přidat odkaz na balíček. Vyprázdněte prosím dočasný adresář a zkuste to znovu.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.de.xlf
index 2ccf2d7be..a3819b522 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.de.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.de.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Für das Projekt "{0}" kann keine temporäre Datei generiert werden. Ein Paketverweis kann nicht hinzugefügt werden. Löschen Sie das temporäre Verzeichnis, und versuchen Sie es noch mal.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.es.xlf
index 54fcd62ea..c41a33d7e 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.es.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.es.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">No se puede generar un archivo temporal para el proyecto "{0}". No se puede agregar la referencia del paquete. Borre el directorio temporal e inténtelo de nuevo.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.fr.xlf
index a3bbfa6a5..20aaf258b 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.fr.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Impossible de générer un fichier temporaire pour le projet '{0}'. Impossible d'ajouter une référence de package. Effacez le répertoire temporaire et réessayez.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.it.xlf
index 8292d3314..5d766aa6f 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.it.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.it.xlf
@@ -77,6 +77,11 @@
         <target state="translated">NOME_PACCHETTO</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Non è possibile generare un file temporaneo per il progetto '{0}'. Non è possibile aggiungere il riferimento al pacchetto. Cancellare la directory temp e riprovare.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ja.xlf
index 7170969df..23c9ffef3 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ja.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ja.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">プロジェクト '{0}' の一時ファイルを生成できません。パッケージ参照を追加できません。一時ディレクトリをクリアして、もう一度お試しください。</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ko.xlf
index d60e087eb..8fddbafc9 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ko.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ko.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">'{0}' 프로젝트에 대한 임시 파일을 생성할 수 없습니다. 패키지 참조를 추가할 수 없습니다. 임시 디렉터리를 지우고 다시 시도하세요.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pl.xlf
index 80aaba9ee..f467d471d 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pl.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pl.xlf
@@ -77,6 +77,11 @@
         <target state="translated">NAZWA_PAKIETU</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Nie można wygenerować pliku tymczasowego dla projektu „{0}”. Nie można dodać odwołania do pakietu. Wyczyść katalog tymczasowy i spróbuj ponownie.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pt-BR.xlf
index f99ea83f1..360290b87 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.pt-BR.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Não é possível gerar um arquivo temporário para o projeto '{0}'. Não é possível adicionar a referência do pacote. Limpe i diretório temporário e tente novamente.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ru.xlf
index 3f749fa66..7d0c40669 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ru.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.ru.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">Не удалось создать временный файл для проекта "{0}". Невозможно добавить ссылку на пакет. Очистите временный каталог и повторите попытку.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.tr.xlf
index 3b3214f1c..8ea87e4b9 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.tr.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.tr.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">'{0}' projesi için bir geçici dosya oluşturulamıyor. Paket başvurusu eklenemiyor. Lütfen geçici dizini temizleyin ve yeniden deneyin.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hans.xlf
index 288e9561f..07edbef80 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hans.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">未能为项目“{0}”生成临时文件。无法添加包引用。请清除临时目录,再重试。</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hant.xlf
index 320a7ccd8..284fbabf6 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/xlf/LocalizableStrings.zh-Hant.xlf
@@ -77,6 +77,11 @@
         <target state="translated">PACKAGE_NAME</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdDGFileIOException">
+        <source>Unable to generate a temporary file for project '{0}'. Cannot add package reference. Please clear the temp directory and try again.</source>
+        <target state="translated">無法產生專案 '{0}' 的暫存檔案。無法新增套件參考。請清除暫存目錄並再試一次。</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-reference/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-reference/Program.cs
index 72498b37f..31d1f716f 100644
--- a/src/dotnet/commands/dotnet-add/dotnet-add-reference/Program.cs
+++ b/src/dotnet/commands/dotnet-add/dotnet-add-reference/Program.cs
@@ -45,9 +45,9 @@ namespace Microsoft.DotNet.Tools.Add.ProjectToProjectReference
 
             var frameworkString = _appliedCommand.ValueOrDefault<string>("framework");
 
-            PathUtility.EnsureAllPathsExist(_appliedCommand.Arguments, CommonLocalizableStrings.ReferenceDoesNotExist);
+            PathUtility.EnsureAllPathsExist(_appliedCommand.Arguments, CommonLocalizableStrings.CouldNotFindProjectOrDirectory, true);
             List<MsbuildProject> refs = _appliedCommand.Arguments
-                                                       .Select((r) => MsbuildProject.FromFile(projects, r))
+                                                       .Select((r) => MsbuildProject.FromFileOrDirectory(projects, r))
                                                        .ToList();
 
             if (frameworkString == null)
@@ -90,9 +90,10 @@ namespace Microsoft.DotNet.Tools.Add.ProjectToProjectReference
                 }
             }
 
-            var relativePathReferences = _appliedCommand.Arguments.Select((r) =>
-                                                                              PathUtility.GetRelativePath(msbuildProj.ProjectDirectory, Path.GetFullPath(r)))
-                                                        .ToList();
+            var relativePathReferences = refs.Select((r) =>
+                                                        Path.GetRelativePath(
+                                                            msbuildProj.ProjectDirectory,
+                                                            r.ProjectRootElement.FullPath)).ToList();
 
             int numberOfAddedReferences = msbuildProj.AddProjectToProjectReferences(
                 frameworkString,
diff --git a/src/dotnet/commands/dotnet-help/HelpCommand.cs b/src/dotnet/commands/dotnet-help/HelpCommand.cs
index 799ba9314..2398e11b1 100644
--- a/src/dotnet/commands/dotnet-help/HelpCommand.cs
+++ b/src/dotnet/commands/dotnet-help/HelpCommand.cs
@@ -102,7 +102,8 @@ namespace Microsoft.DotNet.Tools.Help
         {
             if (BuiltInCommandsCatalog.Commands.TryGetValue(
                 _appliedOption.Arguments.Single(),
-                out BuiltInCommandMetadata builtIn))
+                out BuiltInCommandMetadata builtIn) &&
+                !string.IsNullOrEmpty(builtIn.DocLink))
             {
                 var process = ConfigureProcess(builtIn.DocLink);
                 process.Start();
diff --git a/src/dotnet/commands/dotnet-help/HelpUsageText.cs b/src/dotnet/commands/dotnet-help/HelpUsageText.cs
index 68c637f06..51688af71 100644
--- a/src/dotnet/commands/dotnet-help/HelpUsageText.cs
+++ b/src/dotnet/commands/dotnet-help/HelpUsageText.cs
@@ -27,6 +27,9 @@ path-to-application:
   nuget            {LocalizableStrings.NugetDefinition}
   msbuild          {LocalizableStrings.MsBuildDefinition}
   vstest           {LocalizableStrings.VsTestDefinition}
+  store            {LocalizableStrings.StoreDefinition}
+  install          {LocalizableStrings.InstallDefinition}
+  help             {LocalizableStrings.HelpDefinition}
 
 {LocalizableStrings.CommonOptions}:
   -v|--verbosity        {CommonLocalizableStrings.VerbosityOptionDescription}
@@ -37,6 +40,8 @@ path-to-application:
 sdk-options:
   --version        {LocalizableStrings.SDKVersionCommandDefinition}
   --info           {LocalizableStrings.SDKInfoCommandDefinition}
+  --list-sdks      {LocalizableStrings.SDKListSdksCommandDefinition}
+  --list-runtimes  {LocalizableStrings.SDKListRuntimesCommandDefinition}
   -d|--diagnostics {LocalizableStrings.SDKDiagnosticsCommandDefinition}
 
 runtime-options:
diff --git a/src/dotnet/commands/dotnet-help/LocalizableStrings.resx b/src/dotnet/commands/dotnet-help/LocalizableStrings.resx
index 5552d40c5..a8fded7b1 100644
--- a/src/dotnet/commands/dotnet-help/LocalizableStrings.resx
+++ b/src/dotnet/commands/dotnet-help/LocalizableStrings.resx
@@ -180,6 +180,9 @@
   <data name="MigrateDefinition" xml:space="preserve">
     <value>Migrates a project.json based project to a msbuild based project.</value>
   </data>
+  <data name="StoreDefinition" xml:space="preserve">
+    <value>Stores the specified assemblies in the runtime store.</value>
+  </data>
   <data name="ProjectModificationCommands" xml:space="preserve">
     <value>Project modification commands</value>
   </data>
@@ -234,6 +237,12 @@
   <data name="SDKInfoCommandDefinition" xml:space="preserve">
     <value>Display .NET Core information.</value>
   </data>
+  <data name="SDKListSdksCommandDefinition" xml:space="preserve">
+    <value>Display the installed SDKs.</value>
+  </data>
+  <data name="SDKListRuntimesCommandDefinition" xml:space="preserve">
+    <value>Display the installed runtimes.</value>
+  </data>
   <data name="SDKDiagnosticsCommandDefinition" xml:space="preserve">
     <value>Enable diagnostic output.</value>
   </data>
@@ -256,6 +265,9 @@
     <value>Roll forward on no candidate shared framework is enabled.</value>
   </data>
   <data name="AdditionalDeps" xml:space="preserve">
-    <value>Path to additonal deps.json file.</value>
+    <value>Path to additional deps.json file.</value>
   </data>
-</root>
\ No newline at end of file
+  <data name="InstallDefinition" xml:space="preserve">
+    <value>Installs an item into the development environment.</value>
+  </data>
+</root>
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.cs.xlf
index 86d28776a..1fb918e20 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.cs.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.cs.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Zobrazí informace o rozhraní .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Povolí diagnostický výstup.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Cesta k dodatečnému souboru deps.json.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Ukládá zadaná nastavení do úložiště runtime.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.de.xlf
index 419026640..abe8ca5e0 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.de.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.de.xlf
@@ -197,6 +197,16 @@
         <target state="translated">.NET Core-Informationen anzeigen.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Diagnoseausgabe aktivieren.</target>
@@ -233,8 +243,18 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
-        <target state="translated">Pfad zur zusätzlichen "deps.json"-Datei.</target>
+        <source>Path to additional deps.json file.</source>
+        <target state="translated">Pfad zur zusätzlichen Datei "deps.json".</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Speichert die angegebenen Assemblys im Laufzeitspeicher.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.es.xlf
index a4ae3a445..4e2c38024 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.es.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.es.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Muestra la información de .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Habilita la salida de diagnóstico.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Ruta de acceso al archivo deps.json adicional.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Almacena los ensamblados especificados en el almacén del tiempo de ejecución.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.fr.xlf
index 62ac2526e..02402ccd8 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.fr.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Affichez les informations sur .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Activez la sortie des diagnostics.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Chemin du fichier deps.json supplémentaire.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Stocke les assemblys spécifiés dans le magasin de runtimes.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.it.xlf
index 5e5d2bd4f..637855a3b 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.it.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.it.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Visualizza le informazioni su .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Abilita l'output di diagnostica.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Percorso del file deps.json aggiuntivo.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Memorizza gli assembly specificati nell'archivio di runtime.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ja.xlf
index d26220439..00024f552 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ja.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ja.xlf
@@ -197,6 +197,16 @@
         <target state="translated">.NET Core 情報を表示します。</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">診断出力を有効にします。</target>
@@ -233,8 +243,18 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
-        <target state="translated">追加 deps.json ファイルへのパス。</target>
+        <source>Path to additional deps.json file.</source>
+        <target state="translated">追加の deps.json ファイルへのパス。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">指定されたアセンブリを実行時ストアに格納します。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ko.xlf
index e31fcdf82..ee370d0a4 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ko.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ko.xlf
@@ -197,6 +197,16 @@
         <target state="translated">.NET Core 정보를 표시합니다.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">진단 출력을 사용합니다.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">추가 deps.json 파일의 경로입니다.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">지정된 어셈블리를 런타임 저장소에 저장합니다.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pl.xlf
index 66792532c..a1e190326 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pl.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pl.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Wyświetl informacje o programie .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Włącz diagnostyczne dane wyjściowe.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Ścieżka do dodatkowego pliku deps.json.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Przechowuje określone zestawy w magazynie środowiska uruchomieniowego.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pt-BR.xlf
index 738bb3734..07da2c572 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.pt-BR.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Exibir informações do .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Habilitar saída de diagnóstico.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Caminho para o arquivo deps.json adicional.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Armazena os assemblies especificados no repositório de tempo de execução.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ru.xlf
index a4ce7b230..7bca9053d 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ru.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.ru.xlf
@@ -197,6 +197,16 @@
         <target state="translated">Отображение сведений о .NET Core.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Включение выходных данных диагностики.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Путь к дополнительному файлу deps.json.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Он сохраняет указанные сборки в хранилище среды выполнения.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.tr.xlf
index 55ef67760..7cf185f5d 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.tr.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.tr.xlf
@@ -197,6 +197,16 @@
         <target state="translated">.NET Core bilgilerini gösterir.</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">Tanılama çıkışını etkinleştirir.</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">Ek deps.json dosyasının yolu.</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">Belirtilen bütünleştirilmiş kodları çalışma zamanı deposunda depolar.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.xlf
index dcb4ed353..8bb895ffe 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.xlf
@@ -163,6 +163,16 @@
         <source>Display .NET Core information.</source>
         <note></note>
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <note></note>
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hans.xlf
index b2d8cfd42..e42cfcaec 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hans.xlf
@@ -197,6 +197,16 @@
         <target state="translated">显示 .NET Core 信息。</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">启用诊断输出。</target>
@@ -233,8 +243,18 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
-        <target state="translated">其他 deps.json 文件的路径。</target>
+        <source>Path to additional deps.json file.</source>
+        <target state="translated">指向其他 deps.json 文件的路径。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">在运行时存储中存储指定的程序集。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hant.xlf
index 19f53ffe6..37c8943cf 100644
--- a/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-help/xlf/LocalizableStrings.zh-Hant.xlf
@@ -197,6 +197,16 @@
         <target state="translated">顯示 .NET Core 資訊。</target>
         <note />
       </trans-unit>
+      <trans-unit id="SDKListSdksCommandDefinition">
+        <source>Display the installed SDKs.</source>
+        <target state="new">Display the installed SDKs.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SDKListRuntimesCommandDefinition">
+        <source>Display the installed runtimes.</source>
+        <target state="new">Display the installed runtimes.</target>
+        <note />
+      </trans-unit>
       <trans-unit id="SDKDiagnosticsCommandDefinition">
         <source>Enable diagnostic output.</source>
         <target state="translated">啟用診斷輸出。</target>
@@ -233,10 +243,20 @@
         <note />
       </trans-unit>
       <trans-unit id="AdditionalDeps">
-        <source>Path to additonal deps.json file.</source>
+        <source>Path to additional deps.json file.</source>
         <target state="translated">其他 deps.json 檔案的路徑。</target>
         <note />
       </trans-unit>
+      <trans-unit id="StoreDefinition">
+        <source>Stores the specified assemblies in the runtime store.</source>
+        <target state="translated">將指定組件儲存到執行階段存放區中。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallDefinition">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/InstallCommand.cs b/src/dotnet/commands/dotnet-install/InstallCommand.cs
new file mode 100644
index 000000000..11e823484
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/InstallCommand.cs
@@ -0,0 +1,35 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Cli.CommandLine;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Tools.Install.Tool;
+
+namespace Microsoft.DotNet.Tools.Install
+{
+    public class InstallCommand : DotNetTopLevelCommandBase
+    {
+        protected override string CommandName => "install";
+        protected override string FullCommandNameLocalized => LocalizableStrings.InstallFullCommandNameLocalized;
+        protected override string ArgumentName => Constants.ProjectArgumentName;
+        protected override string ArgumentDescriptionLocalized => CommonLocalizableStrings.ArgumentsProjectDescription;
+
+        internal override Dictionary<string, Func<AppliedOption, CommandBase>> SubCommands =>
+            new Dictionary<string, Func<AppliedOption, CommandBase>>
+            {
+                ["tool"] =
+                appliedOption => new InstallToolCommand(
+                    appliedOption["tool"],
+                    ParseResult)
+            };
+
+        public static int Run(string[] args)
+        {
+            var command = new InstallCommand();
+            return command.RunCommand(args);
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-install/InstallCommandParser.cs b/src/dotnet/commands/dotnet-install/InstallCommandParser.cs
new file mode 100644
index 000000000..1d235f31d
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/InstallCommandParser.cs
@@ -0,0 +1,21 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.DotNet.Cli.CommandLine;
+using LocalizableStrings = Microsoft.DotNet.Tools.Install.LocalizableStrings;
+
+namespace Microsoft.DotNet.Cli
+{
+    internal static class InstallCommandParser
+    {
+        public static Command Install()
+        {
+            return Create.Command(
+                "install",
+                LocalizableStrings.CommandDescription,
+                Accept.NoArguments(),
+                CommonOptions.HelpOption(),
+                InstallToolCommandParser.InstallTool());
+        }
+    }
+}
diff --git a/src/Microsoft.DotNet.Archive/LocalizableStrings.resx b/src/dotnet/commands/dotnet-install/LocalizableStrings.resx
similarity index 96%
rename from src/Microsoft.DotNet.Archive/LocalizableStrings.resx
rename to src/dotnet/commands/dotnet-install/LocalizableStrings.resx
index 9f9b5a9e7..f2b812cd0 100644
--- a/src/Microsoft.DotNet.Archive/LocalizableStrings.resx
+++ b/src/dotnet/commands/dotnet-install/LocalizableStrings.resx
@@ -117,10 +117,10 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="Expanding" xml:space="preserve">
-    <value>Expanding</value>
+  <data name="InstallFullCommandNameLocalized" xml:space="preserve">
+    <value>.NET Install Command</value>
   </data>
-  <data name="Decompressing" xml:space="preserve">
-    <value>Decompressing</value>
+  <data name="CommandDescription" xml:space="preserve">
+    <value>Installs an item into the development environment.</value>
   </data>
 </root>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/InstallToolCommand.cs b/src/dotnet/commands/dotnet-install/dotnet-install-tool/InstallToolCommand.cs
new file mode 100644
index 000000000..7a689f9f1
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/InstallToolCommand.cs
@@ -0,0 +1,126 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using System.Linq;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Cli.CommandLine;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Configurer;
+using Microsoft.DotNet.ShellShim;
+using Microsoft.DotNet.ToolPackage;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.Tools.Install.Tool
+{
+    public class InstallToolCommand : CommandBase
+    {
+        private static string _packageId;
+        private static string _packageVersion;
+        private static string _configFilePath;
+        private static string _framework;
+        private static string _source;
+        private static bool _global;
+
+        public InstallToolCommand(
+            AppliedOption appliedCommand,
+            ParseResult parseResult)
+            : base(parseResult)
+        {
+            if (appliedCommand == null)
+            {
+                throw new ArgumentNullException(nameof(appliedCommand));
+            }
+
+            _packageId = appliedCommand.Arguments.Single();
+            _packageVersion = appliedCommand.ValueOrDefault<string>("version");
+            _configFilePath = appliedCommand.ValueOrDefault<string>("configfile");
+            _framework = appliedCommand.ValueOrDefault<string>("framework");
+            _source = appliedCommand.ValueOrDefault<string>("source");
+            _global = appliedCommand.ValueOrDefault<bool>("global");
+        }
+
+        public override int Execute()
+        {
+            if (!_global)
+            {
+                throw new GracefulException(LocalizableStrings.InstallToolCommandOnlySupportGlobal);
+            }
+
+            var cliFolderPathCalculator = new CliFolderPathCalculator();
+            var offlineFeedPath = new DirectoryPath(cliFolderPathCalculator.CliFallbackFolderPath);
+
+            var toolConfigurationAndExecutablePath = ObtainPackage(
+                executablePackagePath: new DirectoryPath(cliFolderPathCalculator.ToolsPackagePath),
+                offlineFeedPath: offlineFeedPath);
+
+            var shellShimMaker = new ShellShimMaker(cliFolderPathCalculator.ToolsShimPath);
+            var commandName = toolConfigurationAndExecutablePath.Configuration.CommandName;
+            shellShimMaker.EnsureCommandNameUniqueness(commandName);
+
+            shellShimMaker.CreateShim(
+                toolConfigurationAndExecutablePath.Executable.Value,
+                commandName);
+
+            EnvironmentPathFactory
+                .CreateEnvironmentPathInstruction()
+                .PrintAddPathInstructionIfPathDoesNotExist();
+
+            Reporter.Output.WriteLine(
+                string.Format(LocalizableStrings.InstallationSucceeded, commandName));
+
+            return 0;
+        }
+
+        private static ToolConfigurationAndExecutablePath ObtainPackage(
+            DirectoryPath executablePackagePath,
+            DirectoryPath offlineFeedPath)
+        {
+            try
+            {
+                FilePath? configFile = null;
+                if (_configFilePath != null)
+                {
+                    configFile = new FilePath(_configFilePath);
+                }
+
+                var toolPackageObtainer =
+                    new ToolPackageObtainer(
+                        executablePackagePath,
+                        offlineFeedPath,
+                        () => new DirectoryPath(Path.GetTempPath())
+                            .WithSubDirectories(Path.GetRandomFileName())
+                            .WithFile(Path.GetRandomFileName() + ".csproj"),
+                        new Lazy<string>(BundledTargetFramework.GetTargetFrameworkMoniker),
+                        new PackageToProjectFileAdder(),
+                        new ProjectRestorer());
+
+                return toolPackageObtainer.ObtainAndReturnExecutablePath(
+                    packageId: _packageId,
+                    packageVersion: _packageVersion,
+                    nugetconfig: configFile,
+                    targetframework: _framework,
+                    source: _source);
+            }
+
+            catch (PackageObtainException ex)
+            {
+                throw new GracefulException(
+                    message:
+                    string.Format(LocalizableStrings.InstallFailedNuget,
+                        ex.Message),
+                    innerException: ex);
+            }
+            catch (ToolConfigurationException ex)
+            {
+                throw new GracefulException(
+                    message:
+                    string.Format(
+                        LocalizableStrings.InstallFailedPackage,
+                        ex.Message),
+                    innerException: ex);
+            }
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/InstallToolCommandParser.cs b/src/dotnet/commands/dotnet-install/dotnet-install-tool/InstallToolCommandParser.cs
new file mode 100644
index 000000000..6422517d9
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/InstallToolCommandParser.cs
@@ -0,0 +1,42 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.DotNet.Cli.CommandLine;
+using LocalizableStrings = Microsoft.DotNet.Tools.Install.Tool.LocalizableStrings;
+
+namespace Microsoft.DotNet.Cli
+{
+    internal static class InstallToolCommandParser
+    {
+        public static Command InstallTool()
+        {
+            return Create.Command("tool",
+                LocalizableStrings.CommandDescription,
+                Accept.ExactlyOneArgument(errorMessage: o => LocalizableStrings.SpecifyExactlyOnePackageId)
+                    .With(name: LocalizableStrings.PackageIdArgumentName,
+                          description: LocalizableStrings.PackageIdArgumentDescription),
+                Create.Option(
+                    "-g|--global",
+                    LocalizableStrings.GlobalOptionDescription,
+                    Accept.NoArguments()),
+                Create.Option(
+                    "--version",
+                    LocalizableStrings.VersionOptionDescription,
+                    Accept.ExactlyOneArgument()),
+                Create.Option(
+                    "--configfile",
+                    LocalizableStrings.ConfigFileOptionDescription,
+                    Accept.ExactlyOneArgument()),
+                Create.Option(
+                    "--source",
+                    LocalizableStrings.SourceOptionDescription,
+                    Accept.ExactlyOneArgument()
+                        .With(name: LocalizableStrings.SourceOptionName)),
+                Create.Option(
+                    "-f|--framework",
+                    LocalizableStrings.FrameworkOptionDescription,
+                    Accept.ExactlyOneArgument()),
+                CommonOptions.HelpOption());
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/LocalizableStrings.resx b/src/dotnet/commands/dotnet-install/dotnet-install-tool/LocalizableStrings.resx
new file mode 100644
index 000000000..d689f4b11
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/LocalizableStrings.resx
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="PackageIdArgumentName" xml:space="preserve">
+    <value>PACKAGE_ID</value>
+  </data>
+  <data name="PackageIdArgumentDescription" xml:space="preserve">
+    <value>NuGet Package Id of the tool to install.</value>
+  </data>
+  <data name="SpecifyExactlyOnePackageId" xml:space="preserve">
+    <value>Please specify one tool Package Id to install.</value>
+  </data>
+  <data name="VersionOptionDescription" xml:space="preserve">
+    <value>Version of the tool package in NuGet.</value>
+  </data>
+  <data name="SourceOptionDescription" xml:space="preserve">
+    <value>Specifies a NuGet package source to use during installation.</value>
+  </data>
+  <data name="SourceOptionName" xml:space="preserve">
+    <value>SOURCE</value>
+  </data>
+  <data name="CommandDescription" xml:space="preserve">
+    <value>Installs a tool for use on the command line.</value>
+  </data>
+  <data name="ConfigFileOptionDescription" xml:space="preserve">
+    <value>The NuGet configuration file to use.</value>
+  </data>
+  <data name="FrameworkOptionDescription" xml:space="preserve">
+    <value>The target framework to install the tool for.</value>
+  </data>
+  <data name="FailedToAddPackage" xml:space="preserve">
+    <value>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</value>
+  </data>
+  <data name="FailedToRestorePackage" xml:space="preserve">
+    <value>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</value>
+  </data>
+  <data name="InstallFailedNuget" xml:space="preserve">
+    <value>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</value>
+  </data>
+  <data name="InstallFailedPackage" xml:space="preserve">
+    <value>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</value>
+  </data>
+  <data name="InstallationSucceeded" xml:space="preserve">
+    <value>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</value>
+  </data>
+  <data name="GlobalOptionDescription" xml:space="preserve">
+    <value>Install user wide.</value>
+  </data>
+  <data name="InstallFullCommandNameLocalized" xml:space="preserve">
+    <value>.NET Install Command</value>
+  </data>
+  <data name="InstallToolCommandOnlySupportGlobal" xml:space="preserve">
+    <value>The --global switch (-g) is currently required because only user wide tools are supported.</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/PackageToProjectFileAdder.cs b/src/dotnet/commands/dotnet-install/dotnet-install-tool/PackageToProjectFileAdder.cs
new file mode 100644
index 000000000..d66061a81
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/PackageToProjectFileAdder.cs
@@ -0,0 +1,47 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.ToolPackage;
+using Microsoft.DotNet.Tools;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.Tools.Install.Tool
+{
+    internal class PackageToProjectFileAdder : IPackageToProjectFileAdder
+    {
+        public void Add(FilePath projectPath, string packageId)
+        {
+            if (packageId == null)
+            {
+                throw new ArgumentNullException(nameof(packageId));
+            }
+
+            var argsToPassToRestore = new List<string>
+            {
+                projectPath.Value,
+                "package",
+                packageId,
+                "--no-restore"
+            };
+
+            var command = new DotNetCommandFactory(alwaysRunOutOfProc: true)
+                .Create(
+                    "add",
+                    argsToPassToRestore)
+                .CaptureStdOut()
+                .CaptureStdErr();
+
+            var result = command.Execute();
+            if (result.ExitCode != 0)
+            {
+                throw new PackageObtainException(
+                    string.Format(
+                        LocalizableStrings.FailedToAddPackage,
+                        result.StartInfo.WorkingDirectory, result.StartInfo.Arguments, result.StdErr, result.StdOut));
+            }
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/ProjectRestorer.cs b/src/dotnet/commands/dotnet-install/dotnet-install-tool/ProjectRestorer.cs
new file mode 100644
index 000000000..1419e0e38
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/ProjectRestorer.cs
@@ -0,0 +1,72 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Tools;
+using Microsoft.DotNet.ToolPackage;
+using Microsoft.DotNet.PlatformAbstractions;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.Tools.Install.Tool
+{
+    internal class ProjectRestorer : IProjectRestorer
+    {
+        public void Restore(
+            FilePath projectPath,
+            DirectoryPath assetJsonOutput,
+            FilePath? nugetconfig,
+            string source = null)
+        {
+            var argsToPassToRestore = new List<string>();
+
+            argsToPassToRestore.Add(projectPath.Value);
+            if (nugetconfig != null)
+            {
+                argsToPassToRestore.Add("--configfile");
+                argsToPassToRestore.Add(nugetconfig.Value.Value);
+            }
+
+            if (source != null)
+            {
+                argsToPassToRestore.Add("--source");
+                argsToPassToRestore.Add(source);
+            }
+
+            argsToPassToRestore.AddRange(new List<string>
+            {
+                "--runtime",
+                GetRuntimeIdentifierWithMacOsHighSierraFallback(),
+                $"/p:BaseIntermediateOutputPath={assetJsonOutput.ToQuotedString()}"
+            });
+
+            var command = new DotNetCommandFactory(alwaysRunOutOfProc: true)
+                .Create("restore", argsToPassToRestore)
+                .CaptureStdOut()
+                .CaptureStdErr();
+
+            var result = command.Execute();
+            if (result.ExitCode != 0)
+            {
+                throw new PackageObtainException(
+                    string.Format(
+                        LocalizableStrings.FailedToRestorePackage,
+                        result.StartInfo.WorkingDirectory, result.StartInfo.Arguments, result.StdErr, result.StdOut));
+            }
+        }
+
+        // walk around for https://github.com/dotnet/corefx/issues/26488
+        // fallback osx.10.13 to osx
+        private static string GetRuntimeIdentifierWithMacOsHighSierraFallback()
+        {
+            if (RuntimeEnvironment.GetRuntimeIdentifier() == "osx.10.13-x64")
+            {
+                return "osx-x64";
+            }
+
+            return RuntimeEnvironment.GetRuntimeIdentifier();
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.cs.xlf
new file mode 100644
index 000000000..0904e75e8
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.cs.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="cs" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.de.xlf
new file mode 100644
index 000000000..87144c359
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.de.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="de" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.es.xlf
new file mode 100644
index 000000000..7449fa3ef
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.es.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="es" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.fr.xlf
new file mode 100644
index 000000000..789a063c5
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.fr.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="fr" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.it.xlf
new file mode 100644
index 000000000..b6ef111ac
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.it.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="it" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ja.xlf
new file mode 100644
index 000000000..d5f88a8f6
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ja.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="ja" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ko.xlf
new file mode 100644
index 000000000..2cf8b32f8
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ko.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="ko" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.pl.xlf
new file mode 100644
index 000000000..c6f63ffda
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.pl.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="pl" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.pt-BR.xlf
new file mode 100644
index 000000000..61cfe82c1
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.pt-BR.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="pt-BR" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ru.xlf
new file mode 100644
index 000000000..6c4047fab
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.ru.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="ru" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.tr.xlf
new file mode 100644
index 000000000..61059f22b
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.tr.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="tr" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.zh-Hans.xlf
new file mode 100644
index 000000000..e51c1c828
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.zh-Hans.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="zh-Hans" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.zh-Hant.xlf
new file mode 100644
index 000000000..c74ff695d
--- /dev/null
+++ b/src/dotnet/commands/dotnet-install/dotnet-install-tool/xlf/LocalizableStrings.zh-Hant.xlf
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
+  <file datatype="xml" source-language="en" target-language="zh-Hant" original="../LocalizableStrings.resx">
+    <body>
+      <trans-unit id="SourceOptionDescription">
+        <source>Specifies a NuGet package source to use during installation.</source>
+        <target state="new">Specifies a NuGet package source to use during installation.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SourceOptionName">
+        <source>SOURCE</source>
+        <target state="new">SOURCE</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallationSucceeded">
+        <source>
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</source>
+        <target state="new">
+The installation succeeded. If there are no further instructions, you can type the following command in shell directly to invoke: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToAddPackage">
+        <source>Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to add package.
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailedToRestorePackage">
+        <source>Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</source>
+        <target state="new">Failed to restore package. 
+WorkingDirectory: {0}
+Arguments: {1}
+Output: {2}{3}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedNuget">
+        <source>Install failed. Failed to download package:
+NuGet returned:
+
+{0}</source>
+        <target state="new">Install failed. Failed to download package:
+NuGet returned:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFailedPackage">
+        <source>Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</source>
+        <target state="new">Install failed. The settings file in the tool's NuGet package is not valid. Please contact the owner of the NuGet package.
+The error was:
+
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentDescription">
+        <source>NuGet Package Id of the tool to install.</source>
+        <target state="new">NuGet Package Id of the tool to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CommandDescription">
+        <source>Installs a tool for use on the command line.</source>
+        <target state="new">Installs a tool for use on the command line.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ConfigFileOptionDescription">
+        <source>The NuGet configuration file to use.</source>
+        <target state="new">The NuGet configuration file to use.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FrameworkOptionDescription">
+        <source>The target framework to install the tool for.</source>
+        <target state="new">The target framework to install the tool for.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="VersionOptionDescription">
+        <source>Version of the tool package in NuGet.</source>
+        <target state="new">Version of the tool package in NuGet.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="PackageIdArgumentName">
+        <source>PACKAGE_ID</source>
+        <target state="new">PACKAGE_ID</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="SpecifyExactlyOnePackageId">
+        <source>Please specify one tool Package Id to install.</source>
+        <target state="new">Please specify one tool Package Id to install.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="GlobalOptionDescription">
+        <source>Install user wide.</source>
+        <target state="new">Install user wide.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="InstallToolCommandOnlySupportGlobal">
+        <source>The --global switch (-g) is currently required because only user wide tools are supported.</source>
+        <target state="new">The --global switch (-g) is currently required because only user wide tools are supported.</target>
+        <note />
+      </trans-unit>
+    </body>
+  </file>
+</xliff>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.cs.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.cs.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.cs.xlf
index 50f4e8538..bb384516d 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.cs.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.cs.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="cs" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Rozbalení</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Dekomprese</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.de.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.de.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.de.xlf
index 137ac4d1e..f8ec0ecae 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.de.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.de.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="de" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Aufklappen</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Dekomprimieren</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.es.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.es.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.es.xlf
index 0fd56bad0..3fc8d1535 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.es.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.es.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="es" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Expandiendo</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Descomprimiendo</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.fr.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.fr.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.fr.xlf
index c39aba992..ab8c7f1ed 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.fr.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="fr" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Développement</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Décompression</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.it.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.it.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.it.xlf
index be414bd1a..9177f06f6 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.it.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.it.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="it" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Espansione</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Decompressione</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ja.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ja.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ja.xlf
index f70a95565..ed919e45f 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ja.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ja.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="ja" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">展開中</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">圧縮解除中</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ko.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ko.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ko.xlf
index bf7de8172..5cb49a7d2 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ko.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ko.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="ko" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">확장하는 중</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">압축을 푸는 중</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.pl.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.pl.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.pl.xlf
index 9772365f1..0901ecbb6 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.pl.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.pl.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="pl" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Rozwijanie</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Dekompresja</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.pt-BR.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.pt-BR.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.pt-BR.xlf
index 1b3fad0d8..4470800f4 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.pt-BR.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="pt-BR" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Expandindo</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Descompactando</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ru.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ru.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ru.xlf
index 2a8c6091d..7513958c2 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.ru.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.ru.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="ru" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Идет расширение</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Идет извлечение</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.tr.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.tr.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.tr.xlf
index f1fde5d99..1c365d715 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.tr.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.tr.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="tr" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">Genişletme</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">Daraltma</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.zh-Hans.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.zh-Hans.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.zh-Hans.xlf
index 65ab99d0b..425012172 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.zh-Hans.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="zh-Hans" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">正在扩展</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">正在解压缩</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.zh-Hant.xlf
similarity index 56%
rename from src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.zh-Hant.xlf
rename to src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.zh-Hant.xlf
index b5c24cae7..61c3b4237 100644
--- a/src/Microsoft.DotNet.Archive/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-install/xlf/LocalizableStrings.zh-Hant.xlf
@@ -2,14 +2,14 @@
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
   <file datatype="xml" source-language="en" target-language="zh-Hant" original="../LocalizableStrings.resx">
     <body>
-      <trans-unit id="Expanding">
-        <source>Expanding</source>
-        <target state="translated">正在展開</target>
+      <trans-unit id="InstallFullCommandNameLocalized">
+        <source>.NET Install Command</source>
+        <target state="new">.NET Install Command</target>
         <note />
       </trans-unit>
-      <trans-unit id="Decompressing">
-        <source>Decompressing</source>
-        <target state="translated">正在解壓縮</target>
+      <trans-unit id="CommandDescription">
+        <source>Installs an item into the development environment.</source>
+        <target state="new">Installs an item into the development environment.</target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/dotnet/commands/dotnet-list/dotnet-list-reference/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-list/dotnet-list-reference/xlf/LocalizableStrings.zh-Hant.xlf
index 757921e30..4d3f67289 100644
--- a/src/dotnet/commands/dotnet-list/dotnet-list-reference/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-list/dotnet-list-reference/xlf/LocalizableStrings.zh-Hant.xlf
@@ -16,7 +16,7 @@
         <source>There are no {0} references in project {1}.
 {0} is the type of the item being requested (project, package, p2p) and {1} is the object operated on (a project file or a solution file). </source>
         <target state="translated">專案 {1} 中沒有任何 {0} 參考。
-{0} 是所要求項目的類型 (專案、套件、p2p),而 {1} 是操作的物件 (專案檔或方案檔)。</target>
+{0} 是所要求項目的類型 (專案、套件、p2p),而 {1} 是操作的物件 (專案檔或方案檔)。 </target>
         <note />
       </trans-unit>
     </body>
diff --git a/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs b/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs
index 4140990d9..2ec0e183c 100644
--- a/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs
+++ b/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs
@@ -28,11 +28,12 @@ namespace Microsoft.DotNet.Tools.MSBuild
                 try
                 {
                     Type loggerType = typeof(MSBuildLogger);
+                    Type forwardingLoggerType = typeof(MSBuildForwardingLogger);
 
                     return argsToForward
                         .Concat(new[]
                         {
-                            $"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}"
+                            $"/distributedlogger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}*{forwardingLoggerType.FullName},{forwardingLoggerType.GetTypeInfo().Assembly.Location}"
                         });
                 }
                 catch (Exception)
diff --git a/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingLogger.cs b/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingLogger.cs
new file mode 100644
index 000000000..0f47594c6
--- /dev/null
+++ b/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingLogger.cs
@@ -0,0 +1,36 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Build.Framework;
+
+namespace Microsoft.DotNet.Tools.MSBuild
+{
+    public sealed class MSBuildForwardingLogger : IForwardingLogger
+    {
+        public LoggerVerbosity Verbosity { get; set; }
+
+        public string Parameters { get; set; }
+
+        public IEventRedirector BuildEventRedirector { get; set; }
+
+        public int NodeId { get; set; }
+
+        public void Initialize(IEventSource eventSource)
+        {
+            // Only forward telemetry events
+            if (eventSource is IEventSource2 eventSource2)
+            {
+                eventSource2.TelemetryLogged += (sender, args) => BuildEventRedirector.ForwardEvent(args);
+            }
+        }
+
+        public void Initialize(IEventSource eventSource, int nodeCount)
+        {
+            Initialize(eventSource);
+        }
+
+        public void Shutdown()
+        {
+        }
+    }
+}
diff --git a/src/dotnet/commands/dotnet-msbuild/MSBuildLogger.cs b/src/dotnet/commands/dotnet-msbuild/MSBuildLogger.cs
index 1a6433f90..b6340265f 100644
--- a/src/dotnet/commands/dotnet-msbuild/MSBuildLogger.cs
+++ b/src/dotnet/commands/dotnet-msbuild/MSBuildLogger.cs
@@ -11,10 +11,10 @@ using System.Collections.Generic;
 
 namespace Microsoft.DotNet.Tools.MSBuild
 {
-    public sealed class MSBuildLogger : Logger
+    public sealed class MSBuildLogger : INodeLogger
     {
         private readonly IFirstTimeUseNoticeSentinel _sentinel =
-            new FirstTimeUseNoticeSentinel(new CliFallbackFolderPathCalculator());
+            new FirstTimeUseNoticeSentinel(new CliFolderPathCalculator());
         private readonly ITelemetry _telemetry;
         private const string NewEventName = "msbuild";
         private const string TargetFrameworkTelemetryEventName = "targetframeworkeval";
@@ -38,7 +38,12 @@ namespace Microsoft.DotNet.Tools.MSBuild
             }
         }
 
-        public override void Initialize(IEventSource eventSource)
+        public void Initialize(IEventSource eventSource, int nodeCount)
+        {
+            Initialize(eventSource);
+        }
+
+        public void Initialize(IEventSource eventSource)
         {
             try
             {
@@ -76,7 +81,7 @@ namespace Microsoft.DotNet.Tools.MSBuild
             FormatAndSend(_telemetry, args);
         }
 
-        public override void Shutdown()
+        public void Shutdown()
         {
             try
             {
@@ -86,8 +91,10 @@ namespace Microsoft.DotNet.Tools.MSBuild
             {
                 // Exceptions during telemetry shouldn't cause anything else to fail
             }
-
-            base.Shutdown();
         }
+
+        public LoggerVerbosity Verbosity { get; set; }
+
+        public string Parameters { get; set; }
     }
 }
diff --git a/src/dotnet/commands/dotnet-new/NewCommandShim.cs b/src/dotnet/commands/dotnet-new/NewCommandShim.cs
index 4b92bdaa8..8c0c2acd4 100644
--- a/src/dotnet/commands/dotnet-new/NewCommandShim.cs
+++ b/src/dotnet/commands/dotnet-new/NewCommandShim.cs
@@ -32,7 +32,7 @@ namespace Microsoft.DotNet.Tools.New
             var sessionId =
                 Environment.GetEnvironmentVariable(MSBuildForwardingApp.TelemetrySessionIdEnvironmentVariableName);
             var telemetry =
-                new Telemetry(new FirstTimeUseNoticeSentinel(new CliFallbackFolderPathCalculator()), sessionId);
+                new Telemetry(new FirstTimeUseNoticeSentinel(new CliFolderPathCalculator()), sessionId);
             var logger = new TelemetryLogger(null);
 
             if (telemetry.Enabled)
diff --git a/src/dotnet/commands/dotnet-pack/LocalizableStrings.resx b/src/dotnet/commands/dotnet-pack/LocalizableStrings.resx
index d297d15e2..58ac50f04 100644
--- a/src/dotnet/commands/dotnet-pack/LocalizableStrings.resx
+++ b/src/dotnet/commands/dotnet-pack/LocalizableStrings.resx
@@ -130,7 +130,7 @@
     <value>Directory in which to place built packages.</value>
   </data>
   <data name="CmdNoBuildOptionDescription" xml:space="preserve">
-    <value>Skip building the project prior to packing. By default, the project will be built.</value>
+    <value>Do not build project before packing.  Implies --no-restore.</value>
   </data>
   <data name="CmdIncludeSymbolsDescription" xml:space="preserve">
     <value>Include packages with symbols in addition to regular packages in output directory.</value>
diff --git a/src/dotnet/commands/dotnet-pack/PackCommand.cs b/src/dotnet/commands/dotnet-pack/PackCommand.cs
index a781fe254..6aa36b73e 100644
--- a/src/dotnet/commands/dotnet-pack/PackCommand.cs
+++ b/src/dotnet/commands/dotnet-pack/PackCommand.cs
@@ -43,7 +43,7 @@ namespace Microsoft.DotNet.Tools.Pack
 
             msbuildArgs.AddRange(parsedPack.Arguments);
 
-            bool noRestore = parsedPack.HasOption("--no-restore");
+            bool noRestore = parsedPack.HasOption("--no-restore") || parsedPack.HasOption("--no-build");
 
             return new PackCommand(
                 msbuildArgs,
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.cs.xlf
index 85c8ccece..8a2eda177 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.cs.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.cs.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Přeskočí sestavení projektu, dokud ho nezabalíte. Projekt se sestaví automaticky.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Nesestavujte projekt, dokud ho nezabalíte. Implikuje možnost --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.de.xlf
index 9a72dc7b1..ce9f591a6 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.de.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.de.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Hiermit wird das Projekt nicht vor dem Packen erstellt. Standardmäßig wird das Projekt erstellt.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Erstellt das Projekt nicht vor dem Packen. Impliziert "--no-restore".</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.es.xlf
index 46223a4b2..2764082d2 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.es.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.es.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Omita la compilación del proyecto antes de empaquetar. El proyecto se compilará de manera predeterminada.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">No compile el proyecto antes de empaquetarlo. Implica la no restauración.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.fr.xlf
index e30934547..4da09abb1 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.fr.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Ignorez la génération du projet avant la compression. Par défaut, le projet est généré.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Ne pas générer le projet avant la compression. Implique --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.it.xlf
index d6fde8790..6d20f4d2b 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.it.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.it.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Consente di ignorare la compilazione del progetto prima di creare il pacchetto. Per impostazione predefinita, il progetto verrà compilato.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Non compila il progetto prima della creazione del pacchetto. Implica --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ja.xlf
index 32500da1a..d3846e90f 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ja.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ja.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">パッキングの前に、プロジェクトの構築をスキップします。既定では、プロジェクトは構築されます。</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">パックする前にプロジェクトをビルドしないでください。  暗示 --復元なし。</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ko.xlf
index 134bb3f08..c2f20394c 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ko.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ko.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">압축하기 전에 프로젝트를 빌드하지 않습니다. 기본적으로 프로젝트가 빌드됩니다.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">압축하기 전에 프로젝트를 빌드하지 않습니다. 복원 없음을 의미합니다.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pl.xlf
index 65a8a64ab..d566ce9c9 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pl.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pl.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Pomiń kompilację projektu przed pakowaniem. Domyślnie projekt zostanie skompilowany.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Nie kompiluj projektu przed pakowaniem. Powoduje przyjęcie, że podano parametr --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pt-BR.xlf
index fd7dd4b59..5450f87e7 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.pt-BR.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Ignorar a compilação do projeto antes do empacotamento. Por padrão, o projeto será compilado.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Não compile o projeto antes de empacotar. Implica em --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ru.xlf
index 36c29f987..caaa7f7e2 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ru.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.ru.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Пропуск сборки проекта перед упаковкой. По умолчанию выполняется сборка проекта.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Не собирать проекты перед упаковкой. Подразумевает --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.tr.xlf
index 0e6d13a56..f44aa5037 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.tr.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.tr.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">Projeyi paketlemeden önce derlemeyi atlayın. Varsayılan olarak, proje derlenir.</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">Paketlemeden önce projeyi derlemeyin. --no-restore anlamına gelir.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hans.xlf
index e45821421..00852ea3a 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hans.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">在打包之前跳过生成项目。默认情况下,将生成项目。</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">打包之前不要生成项目。Implies --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hant.xlf
index 4f8d86032..96d6ab934 100644
--- a/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-pack/xlf/LocalizableStrings.zh-Hant.xlf
@@ -23,8 +23,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildOptionDescription">
-        <source>Skip building the project prior to packing. By default, the project will be built.</source>
-        <target state="translated">在封裝前跳過建置專案。預設會建置專案。</target>
+        <source>Do not build project before packing.  Implies --no-restore.</source>
+        <target state="translated">請勿在封裝前建置專案。  這意味著 --沒有還原。</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdIncludeSymbolsDescription">
diff --git a/src/dotnet/commands/dotnet-remove/dotnet-remove-reference/Program.cs b/src/dotnet/commands/dotnet-remove/dotnet-remove-reference/Program.cs
index e813dda3a..4f8fabb61 100644
--- a/src/dotnet/commands/dotnet-remove/dotnet-remove-reference/Program.cs
+++ b/src/dotnet/commands/dotnet-remove/dotnet-remove-reference/Program.cs
@@ -2,6 +2,7 @@
 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
 using System;
+using System.IO;
 using System.Linq;
 using Microsoft.Build.Evaluation;
 using Microsoft.DotNet.Cli;
@@ -42,10 +43,22 @@ namespace Microsoft.DotNet.Tools.Remove.ProjectToProjectReference
         public override int Execute()
         {
             var msbuildProj = MsbuildProject.FromFileOrDirectory(new ProjectCollection(), _fileOrDirectory);
+            var references = _appliedCommand.Arguments.Select(p => {
+                var fullPath = Path.GetFullPath(p);
+                if (!Directory.Exists(fullPath))
+                {
+                    return p;
+                }
+
+                return Path.GetRelativePath(
+                    msbuildProj.ProjectRootElement.FullPath,
+                    MsbuildProject.GetProjectFileFromDirectory(fullPath).FullName
+                );
+            });
 
             int numberOfRemovedReferences = msbuildProj.RemoveProjectToProjectReferences(
                 _appliedCommand.ValueOrDefault<string>("framework"),
-                _appliedCommand.Arguments);
+                references);
 
             if (numberOfRemovedReferences != 0)
             {
diff --git a/src/dotnet/commands/dotnet-run/LocalizableStrings.resx b/src/dotnet/commands/dotnet-run/LocalizableStrings.resx
index a939d42a8..c9676caa0 100644
--- a/src/dotnet/commands/dotnet-run/LocalizableStrings.resx
+++ b/src/dotnet/commands/dotnet-run/LocalizableStrings.resx
@@ -124,14 +124,11 @@
     <value>Command used to run .NET apps</value>
   </data>
   <data name="CommandOptionNoBuildDescription" xml:space="preserve">
-    <value>Skip building the project prior to running. By default, the project will be built.</value>
+    <value>Do not build project before running.  Implies --no-restore.</value>
   </data>
   <data name="CommandOptionFrameworkDescription" xml:space="preserve">
     <value>Build and run the app using the specified framework. The framework has to be specified in the project file. </value>
   </data>
-  <data name="CommandOptionNoBuild" xml:space="preserve">
-    <value>Do not build the project before running.</value>
-  </data>
   <data name="CommandOptionProjectDescription" xml:space="preserve">
     <value>The path to the project file to run (defaults to the current directory if there is only one project).</value>
   </data>
diff --git a/src/dotnet/commands/dotnet-run/RunCommand.cs b/src/dotnet/commands/dotnet-run/RunCommand.cs
index e4af4a2a0..8534c39d1 100644
--- a/src/dotnet/commands/dotnet-run/RunCommand.cs
+++ b/src/dotnet/commands/dotnet-run/RunCommand.cs
@@ -146,17 +146,16 @@ namespace Microsoft.DotNet.Tools.Run
 
         private void EnsureProjectIsBuilt()
         {
-            List<string> buildArgs = new List<string>();
-
-            buildArgs.Add(Project);
-
-            buildArgs.Add("/nologo");
-            buildArgs.Add("/verbosity:quiet");
-
-            buildArgs.AddRange(RestoreArgs);
+            var restoreArgs = GetRestoreArguments();
 
             var buildResult =
-                new RestoringCommand(buildArgs, RestoreArgs, new [] { Project }, NoRestore).Execute();
+                new RestoringCommand(
+                    restoreArgs.Prepend(Project),
+                    restoreArgs,
+                    new [] { Project },
+                    NoRestore
+                ).Execute();
+
             if (buildResult != 0)
             {
                 Reporter.Error.WriteLine();
@@ -164,6 +163,23 @@ namespace Microsoft.DotNet.Tools.Run
             }
         }
 
+        private List<string> GetRestoreArguments()
+        {
+            List<string> args = new List<string>()
+            {
+                "/nologo"
+            };
+
+            if (!RestoreArgs.Any(a => a.StartsWith("/verbosity:")))
+            {
+                args.Add("/verbosity:quiet");
+            }
+
+            args.AddRange(RestoreArgs);
+
+            return args;
+        }
+
         private ICommand GetRunCommand()
         {
             var globalProperties = new Dictionary<string, string>
diff --git a/src/dotnet/commands/dotnet-run/RunCommandParser.cs b/src/dotnet/commands/dotnet-run/RunCommandParser.cs
index a89a4dc3d..7ed8e64b2 100644
--- a/src/dotnet/commands/dotnet-run/RunCommandParser.cs
+++ b/src/dotnet/commands/dotnet-run/RunCommandParser.cs
@@ -26,7 +26,7 @@ namespace Microsoft.DotNet.Cli
                         project: o.SingleArgumentOrDefault("--project"),
                         launchProfile: o.SingleArgumentOrDefault("--launch-profile"),
                         noLaunchProfile: o.HasOption("--no-launch-profile"),
-                        noRestore: o.HasOption("--no-restore"),
+                        noRestore: o.HasOption("--no-restore") || o.HasOption("--no-build"),
                         restoreArgs: o.OptionValuesToBeForwarded(),
                         args: o.Arguments
                     )),
@@ -51,7 +51,8 @@ namespace Microsoft.DotNet.Cli
                         "--no-build",
                         LocalizableStrings.CommandOptionNoBuildDescription,
                         Accept.NoArguments()),
-                    CommonOptions.NoRestoreOption()
+                    CommonOptions.NoRestoreOption(),
+                    CommonOptions.VerbosityOption()
                 });
     }
 }
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.cs.xlf
index ac8c36c54..7921611af 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.cs.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.cs.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Před spuštěním vynechá sestavení projektu. Standardně se projekt sestaví.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Před spuštěním nesestavovat projekt</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Nesestavujte projekt, dokud ho nespustíte. Implikuje možnost --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.de.xlf
index 6cd88af92..918f86aba 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.de.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.de.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Überspringen Sie die Erstellung des Projekts vor dem Ausführen. Das Projekt wird standardmäßig erstellt.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Erstellen Sie das Projekt nicht vor dem Ausführen.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Erstellt das Projekt nicht vor der Ausführung. Impliziert "--no-restore".</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.es.xlf
index 5b7eae94b..06be95c0f 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.es.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.es.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Omite la compilación del proyecto antes de ejecutarlo. El proyecto se compilará de manera predeterminada.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">No se compila el proyecto antes de ejecutarlo.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">No compile el proyecto antes de ejecutarlo. Implica la no restauración.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.fr.xlf
index 6c1b28f07..e5028e467 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.fr.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Ignorez la génération du projet avant l'exécution. Par défaut, le projet est généré.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Ne générez pas le projet avant l'exécution.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Ne pas générer le projet avant l’exécution. Implique --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.it.xlf
index 2d180a233..27460ddb1 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.it.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.it.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Consente di ignorare la compilazione del progetto prima dell'esecuzione. Per impostazione predefinita, il progetto verrà compilato.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Non compilare il progetto prima dell'esecuzione.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Non compila il progetto prima dell'esecuzione. Implica --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ja.xlf
index dee300d42..d5e10fb6b 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ja.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ja.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">実行の前に、プロジェクトのビルドをスキップします。既定では、プロジェクトはビルドされます。</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">実行する前にプロジェクトをビルドしません。</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">実行する前にプロジェクトをビルドしないでください。  暗示 --復元なし。</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ko.xlf
index b3e5d55c4..78399d299 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ko.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ko.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">실행하기 전에 프로젝트를 빌드하지 않습니다. 기본적으로 프로젝트가 빌드됩니다.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">실행하기 전에 프로젝트를 빌드하지 않습니다.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">실행하기 전에 프로젝트를 빌드하지 않습니다. 복원 없음을 의미합니다.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pl.xlf
index 768e31fd1..1fcd0af95 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pl.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pl.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Pomiń kompilację projektu przed uruchomieniem. Domyślnie projekt zostanie skompilowany.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Nie kompiluj projektu przed uruchomieniem.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Nie kompiluj projektu przed uruchomieniem. Powoduje przyjęcie, że podano parametr --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pt-BR.xlf
index f398083f8..f0d20689f 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.pt-BR.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Ignorar a compilação do projeto antes da execução. Por padrão, o projeto será compilado.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Não compilar o projeto antes da execução.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Não compile o projeto antes de executar. Implica em --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ru.xlf
index cb41939f1..695981188 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ru.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.ru.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Пропуск сборки проекта перед запуском. По умолчанию выполняется сборка проекта.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Не выполнять сборку проекта перед запуском.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Не собирать проекты перед запуском. Подразумевает --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.tr.xlf
index c38bf1e18..13ec9a55a 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.tr.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.tr.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">Projeyi çalıştırmadan önce derlemeyi atlayın. Varsayılan olarak, proje derlenir.</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">Projeyi çalıştırmadan önce derleme.</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">Çalıştırmadan önce projeyi derlemeyin. --no-restore anlamına gelir.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hans.xlf
index 9775bb8bd..b7708e348 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hans.xlf
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">在运行之前跳过项目生成操作。将默认生成项目。</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">运行之前不要生成项目。</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">运行之前不要生成项目。Implies --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hant.xlf
index 6c88ba3c0..2eb38479c 100644
--- a/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-run/xlf/LocalizableStrings.zh-Hant.xlf
@@ -14,7 +14,7 @@
       </trans-unit>
       <trans-unit id="CommandOptionFrameworkDescription">
         <source>Build and run the app using the specified framework. The framework has to be specified in the project file. </source>
-        <target state="translated">使用指定的架構建置及執行應用程式。架構必須在專案檔中指定。</target>
+        <target state="translated">使用指定的架構建置及執行應用程式。架構必須在專案檔中指定。 </target>
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionProjectDescription">
@@ -33,13 +33,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CommandOptionNoBuildDescription">
-        <source>Skip building the project prior to running. By default, the project will be built.</source>
-        <target state="translated">在執行之前跳過建置該專案。根據預設,將會建置該專案。</target>
-        <note />
-      </trans-unit>
-      <trans-unit id="CommandOptionNoBuild">
-        <source>Do not build the project before running.</source>
-        <target state="translated">請勿在執行之前建置專案。</target>
+        <source>Do not build project before running.  Implies --no-restore.</source>
+        <target state="translated">請勿在執行前建置專案。  這意味著 --沒有還原。</target>
         <note />
       </trans-unit>
       <trans-unit id="RunCommandExceptionUnableToRunSpecifyFramework">
diff --git a/src/dotnet/commands/dotnet-sln/add/Program.cs b/src/dotnet/commands/dotnet-sln/add/Program.cs
index 9ce0a7d09..d49398ba1 100644
--- a/src/dotnet/commands/dotnet-sln/add/Program.cs
+++ b/src/dotnet/commands/dotnet-sln/add/Program.cs
@@ -40,11 +40,14 @@ namespace Microsoft.DotNet.Tools.Sln.Add
                 throw new GracefulException(CommonLocalizableStrings.SpecifyAtLeastOneProjectToAdd);
             }
 
-            PathUtility.EnsureAllPathsExist(_appliedCommand.Arguments, CommonLocalizableStrings.ProjectDoesNotExist);
+            PathUtility.EnsureAllPathsExist(_appliedCommand.Arguments, CommonLocalizableStrings.CouldNotFindProjectOrDirectory, true);
 
-            var fullProjectPaths = _appliedCommand.Arguments
-                                                  .Select(Path.GetFullPath)
-                                                  .ToList();
+            var fullProjectPaths = _appliedCommand.Arguments.Select(p => {
+                var fullPath = Path.GetFullPath(p);
+                return Directory.Exists(fullPath) ?
+                    MsbuildProject.GetProjectFileFromDirectory(fullPath).FullName :
+                    fullPath;
+            }).ToList();
 
             var preAddProjectCount = slnFile.Projects.Count;
 
diff --git a/src/dotnet/commands/dotnet-sln/remove/Program.cs b/src/dotnet/commands/dotnet-sln/remove/Program.cs
index ce2b88703..4952b7c24 100644
--- a/src/dotnet/commands/dotnet-sln/remove/Program.cs
+++ b/src/dotnet/commands/dotnet-sln/remove/Program.cs
@@ -40,11 +40,16 @@ namespace Microsoft.DotNet.Tools.Sln.Remove
         {
             SlnFile slnFile = SlnFileFactory.CreateFromFileOrDirectory(_fileOrDirectory);
 
-            var relativeProjectPaths = _appliedCommand.Arguments.Select(p =>
-                                                                            PathUtility.GetRelativePath(
-                                                                                PathUtility.EnsureTrailingSlash(slnFile.BaseDirectory),
-                                                                                Path.GetFullPath(p)))
-                                                      .ToList();
+            var baseDirectory = PathUtility.EnsureTrailingSlash(slnFile.BaseDirectory);
+            var relativeProjectPaths = _appliedCommand.Arguments.Select(p => {
+                var fullPath = Path.GetFullPath(p);
+                return Path.GetRelativePath(
+                    baseDirectory,
+                    Directory.Exists(fullPath) ?
+                        MsbuildProject.GetProjectFileFromDirectory(fullPath).FullName :
+                        fullPath
+                );
+            });
 
             bool slnChanged = false;
             foreach (var path in relativeProjectPaths)
diff --git a/src/dotnet/commands/dotnet-test/LocalizableStrings.resx b/src/dotnet/commands/dotnet-test/LocalizableStrings.resx
index 1ff6b6d07..8d336388a 100644
--- a/src/dotnet/commands/dotnet-test/LocalizableStrings.resx
+++ b/src/dotnet/commands/dotnet-test/LocalizableStrings.resx
@@ -162,7 +162,9 @@
   </data>
   <data name="CmdLoggerDescription" xml:space="preserve">
     <value>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</value>
   </data>
   <data name="CmdConfiguration" xml:space="preserve">
@@ -191,7 +193,7 @@
                                         Logs are written to the provided file.</value>
   </data>
   <data name="CmdNoBuildDescription" xml:space="preserve">
-    <value>Do not build project before testing.</value>
+    <value>Do not build project before testing.  Implies --no-restore.</value>
   </data>
   <data name="CmdResultsDirectoryDescription" xml:space="preserve">
     <value>The directory where the test results are going to be placed. The specified directory will be created if it does not exist.
@@ -216,4 +218,7 @@ RunSettings arguments:
     <value>Enables data collector for the test run.
                                         More info here : https://aka.ms/vstest-collect</value>
   </data>
+  <data name="CmdBlameDescription" xml:space="preserve">
+    <value>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/Program.cs b/src/dotnet/commands/dotnet-test/Program.cs
index d714d2f9e..69c7739f6 100644
--- a/src/dotnet/commands/dotnet-test/Program.cs
+++ b/src/dotnet/commands/dotnet-test/Program.cs
@@ -70,7 +70,7 @@ namespace Microsoft.DotNet.Tools.Test
                 }
             }
 
-            bool noRestore = parsedTest.HasOption("--no-restore");
+            bool noRestore = parsedTest.HasOption("--no-restore") || parsedTest.HasOption("--no-build");
 
             return new TestCommand(
                 msbuildArgs,
diff --git a/src/dotnet/commands/dotnet-test/TestCommandParser.cs b/src/dotnet/commands/dotnet-test/TestCommandParser.cs
index 5afd91272..d6dc05df8 100644
--- a/src/dotnet/commands/dotnet-test/TestCommandParser.cs
+++ b/src/dotnet/commands/dotnet-test/TestCommandParser.cs
@@ -85,6 +85,11 @@ namespace Microsoft.DotNet.Cli
                         Accept.OneOrMoreArguments()
                               .With(name: LocalizableStrings.cmdCollectFriendlyName)
                               .ForwardAsSingle(o => $"/p:VSTestCollect=\"{string.Join(";", o.Arguments)}\"")),
+                  Create.Option(
+                        "--blame",
+                        LocalizableStrings.CmdBlameDescription,
+                        Accept.NoArguments()
+                              .ForwardAsSingle(o => "/p:VSTestBlame=true")),
                   CommonOptions.NoRestoreOption(),
                   CommonOptions.VerbosityOption());
 
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.cs.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.cs.xlf
index f5d414b52..28ebec810 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.cs.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.cs.xlf
@@ -73,10 +73,14 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
         <target state="translated">Zadejte protokolovací nástroj pro výsledky testů. 
-                                        Příklad: --logger "trx[;LogFileName=&lt;Standardně se nastaví jedinečný název souboru&gt;]"
+                                        Příklady:
+                                        Protokol ve formátu trx s použitím jedinečného názvu souboru: --logger trx
+                                        Protokol ve formátu trx s použitím zadaného názvu souboru: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         Další informace o podpoře argumentů protokolovacího nástroje: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Nesestavujte projekt dříve, než ho otestujete.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Nesestavujte projekt, dokud ho neotestujete. Implikuje možnost --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ Argumenty RunSettings:
                                         Další informace: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Spustí test v režimu blame. Tato možnost je užitečná pro izolování problematického testu, který způsobuje chybové ukončení hostitele testů. V aktuálním adresáři se vytvoří výstupní soubor Sequence.xml, do kterého se zaznamená pořadí provádění testů před chybovým ukončením.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.de.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.de.xlf
index ee42ac82e..4c5780e86 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.de.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.de.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">Geben Sie eine Protokollierung für Testergebnisse an. 
-                                        Beispiel: --logger "trx[;LogFileName=&lt;Standardmäßig der eindeutige Dateiname&gt;]"
-                                        Weitere Informationen zur Unterstützung von Protokollierungsargumenten: https://aka.ms/vstest-report</target>
+        <target state="translated">Geben Sie einen Protokollierer für Testergebnisse an.
+                                        Beispiele:
+                                        Protokoll im TRX-Format mit eindeutigem Dateinamen: --logger trx
+                                        Protokoll im TRX-Format mit angegebenem Dateinamen: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        Weitere Informationen zur Unterstützung von Argumenten des Protokollierers finden Sie unter: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Erstellen Sie das Projekt nicht vor dem Testen.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Erstellt das Projekt nicht vor dem Testen. Impliziert "--no-restore".</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings-Argumente:
                                         Weitere Informationen finden Sie hier: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Führt den Test im Modus "Verantwortung zuweisen" aus. Diese Option hilft bei der Isolierung des problematischen Tests, der den Absturz des Testhosts verursacht. Im aktuellen Verzeichnis wird eine Ausgabedatei "Sequence.xml" erstellt, in der die Reihenfolge der Testausführung vor dem Absturz erfasst wird.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.es.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.es.xlf
index d50458ccc..0b5356630 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.es.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.es.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">Especifica un registrador para los resultados de prueba.
-                                        Ejemplo: --logger "trx[;LogFileName=&lt;Adopta como valor predeterminado un nombre de archivo único&gt;]"
-                                        Más información sobre la compatibilidad con los argumentos de registrador: https://aka.ms/vstest-report</target>
+        <target state="translated">Especifique un registrador para los resultados de la prueba.
+                                        Ejemplo:
+                                        Inicie sesión en formato trx mediante un nombre de archivo único: --logger trx
+                                        Inicie sesión en formato trx mediante el nombre de archivo especificado: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        Más informacióin sobre la compatibilidad de los argumentos del registrador: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">El proyecto no se compila antes de probarlo.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">No compile el proyecto antes de probarlo. Implica la no restauración.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ Argumentos RunSettings:
                                         Más información aquí: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Ejecuta la prueba en modo de culpa. Esta opción es útil para aislar la prueba problemática que provoca el bloqueo del host de prueba. Crea un archivo de salida en el directorio actual como "Sequence.xml" que captura el orden de ejecución de la prueba antes del bloqueo.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.fr.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.fr.xlf
index 488c2a39a..52a8bd6ea 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.fr.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">Spécifiez un enregistreur d'événements pour les résultats des tests.
-                                        Exemple : --logger "trx[;LogFileName=&lt;Nom de fichier unique par défaut&gt;]"
-                                        En savoir plus sur la prise en charge des arguments de l'enregistreur d'événements : https://aka.ms/vstest-report</target>
+        <target state="translated">Spécifiez un journal pour les résultats de test.
+                                        Exemples :
+                                        Journal au format trx avec un nom de fichier unique : --logger trx
+                                        Journal au format trx avec le nom de fichier spécifié : --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        Informations supplémentaires sur la prise en charge des arguments de journal :https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Ne générez pas le projet avant les tests.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Ne pas générer le projet avant le test. Implique --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ Arguments de RunSettings :
                                         Plus d'informations ici : https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Exécute le test en mode blame (responsabilité). Cette option permet d'isoler le test problématique qui est à l'origine d'un incident sur l'hôte de test. Elle crée dans le répertoire actif un fichier de sortie nommé "Sequence.xml", qui capture l'ordre d'exécution du test avant l'incident.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.it.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.it.xlf
index 6baa3d8a9..9c6459245 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.it.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.it.xlf
@@ -73,10 +73,14 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
         <target state="translated">Consente di specificare un logger per i risultati dei test.
-                                        Esempio: --logger "trx[;LogFileName=&lt;l'impostazione predefinita è un nome file univoco&gt;]"
+                                        Esempi:
+                                        Log in formato trx con nome file univoco: --logger trx
+                                        Log in formato trx con il nome file specificato: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         Per altre informazioni sul supporto degli argomenti del logger, vedere: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Il progetto non viene compilato prima del test.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Non compila il progetto prima del test. Implica --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ Argomenti di RunSettings:
                                         Per altre informazioni, vedere: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Esegue il test in modalità di segnalazione errore. Questa opzione è utile per isolare il test problematico che causa l'arresto anomalo dell'host dei test. Crea nella directory corrente un file di output denominato "Sequence.xml", in cui viene acquisito l'ordine di esecuzione del test prima dell'arresto anomalo.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ja.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ja.xlf
index 18139bb2a..c5f65dcd6 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ja.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ja.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
         <target state="translated">テスト結果のロガーを指定します。
-                                        例: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
-                                        ロガー引数サポートの詳細:https://aka.ms/vstest-report</target>
+                                        例:
+                                        一意のファイル名を使用して trx 形式でログインします: --ロガー trx
+                                        指定されたファイル名を使用して trx 形式でログインします: --ロガー "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        ロガーの引数の詳細情報: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">テストする前にプロジェクトを構築しないでください。</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">テストする前にプロジェクトをビルドしないでください。  暗示 --復元なし。</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings 引数:
                                         詳細情報: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">変更履歴モードでテストを実行します。このオプションは、テスト ホストのクラッシュの原因となる問題のあるテストを分離する場合に役立ちます。現在のディレクトリに、クラッシュする前のテスト実行順序を示す出力ファイル "Sequence.xml" が作成されます。</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ko.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ko.xlf
index 76e80193b..a44de0285 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ko.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ko.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">테스트 결과에 대해 로거를 지정합니다. 
-                                        예: --logger "trx[;LogFileName=&lt;고유한 파일 이름을 기본값으로 설정&gt;]"
-                                        로거 인수 지원에 대한 추가 정보: https://aka.ms/vstest-report</target>
+        <target state="translated">테스트 결과에 대해 로거를 지정합니다.
+                                        예:
+                                        고유한 파일 이름을 사용하여 trx 형식으로 로그인: --logger trx
+                                        지정된 파일 이름을 사용하여 trx 형식으로 로그인: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        로거 인수에 대한 자세한 내용은 support:https://aka.ms/vstest-report를 참조하세요.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">테스트하기 전에 프로젝트를 빌드하지 않습니다.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">테스트하기 전에 프로젝트를 빌드하지 않습니다. 복원 없음을 의미합니다.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings 인수:
                                         자세한 정보: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">테스트를 원인 모드로 실행합니다. 이 옵션은 테스트 호스트 크래시를 유발하는 문제 있는 테스트를 격리하는 데 유용합니다. 이 경우 현재 디렉터리에 "Sequence.xml"이라는 출력 파일을 만들며, 이 파일에는 크래시 이전의 테스트 실행 순서가 캡처됩니다.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pl.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pl.xlf
index eb78cae41..67654d0c8 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pl.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pl.xlf
@@ -62,7 +62,7 @@
       <trans-unit id="CmdTestAdapterPathDescription">
         <source>Use custom adapters from the given path in the test run.
                                         Example: --test-adapter-path &lt;PATH_TO_ADAPTER&gt;</source>
-        <target state="translated">Zastosuj niestandardowe adaptery z danej ścieżki podczas uruchomienia testu.
+        <target state="translated">Zastosuj niestandardowe adaptery z danej ścieżki podczas przebiegu testu.
                                         Przykład: --test-adapter-path &lt;ŚCIEŻKA_DO_ADAPTERA&gt;</target>
         <note />
       </trans-unit>
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">Określ rejestrator wyników testów.
-                                        Przykład: --logger "trx[;LogFileName=&lt;domyślnie jest to unikatowa nazwa pliku&gt;]"
-                                        Więcej informacji o obsłudze argumentów rejestratora: https://aka.ms/vstest-report</target>
+        <target state="translated">Określ rejestrator dla wyników testów.
+                                        Przykłady:
+                                        Rejestrowanie w formacie trx z użyciem unikatowej nazwy pliku: --logger trx
+                                        Rejestrowanie w formacie trx z użyciem wskazanej nazwy pliku: --logger "trx;LogFileName=&lt;WynikiTestu.trx&gt;"
+                                        Więcej informacji o obsłudze argumentów rejestratora:https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Nie kompiluj projektu przed przeprowadzeniem testów.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Nie kompiluj projektu przed testowaniem. Powoduje przyjęcie, że podano parametr --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -169,10 +173,15 @@ Argumenty RunSettings:
       <trans-unit id="cmdCollectDescription">
         <source>Enables data collector for the test run.
                                         More info here : https://aka.ms/vstest-collect</source>
-        <target state="translated">Włącza moduł zbierający dane dotyczące uruchomienia testu.
+        <target state="translated">Włącza moduł zbierający dane dotyczące przebiegu testu.
                                         Więcej informacji można znaleźć tutaj: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Uruchamia test w trybie Blame. Ta opcja jest przydatna przy izolowaniu problematycznego testu powodującego awarię hosta testów. Tworzy w bieżącym katalogu plik wyjściowy „Sequence.xml”, który przechwytuje kolejność wykonywania testu przed awarią.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pt-BR.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pt-BR.xlf
index 24ab9fbb7..a233ca607 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.pt-BR.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
         <target state="translated">Especifique um agente para os resultados de teste.
-                                        Exemplo: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
-                                        Mais informações sobre suporte a argumentos de agente: https://aka.ms/vstest-report</target>
+                                        Exemplos:
+                                        Log no formato trx usando uma nome de arquivo exclusivo: --logger trx
+                                        Log no formato trx usando o nome de arquivo especificado: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        Mais informações sobre os argumentos do agente support:https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Não compile o projeto antes de testar.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Não compile o projeto antes de testar. Implica em --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ Argumentos RunSettings:
                                         Mais informações aqui: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Executa o teste em modo de acusação. Essa opção é útil para isolar o teste problemático, causando uma falha no host de teste. Cria um arquivo de saída no diretório atual como "Sequence.xml", que captura a ordem de execução do teste antes da falha.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ru.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ru.xlf
index 977af9974..374524a7e 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ru.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.ru.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
         <target state="translated">Укажите средство ведения журнала для результатов теста.
-                                        Пример: --logger "trx[;LogFileName=&lt;по умолчанию используется уникальное имя файла&gt;]"
-                                        Дополнительные сведения о поддержке аргументов средства ведения журнала: https://aka.ms/vstest-report</target>
+                                        Примеры
+                                        Журнал TRX с уникальным именем файла: --logger trx
+                                        Журнал TRX с заданным именем файла: --logger "trx;LogFileName=&lt;результаты_теста.trx&gt;"
+                                        Дополнительно об аргументах средства ведения журнала: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Не выполнять сборку проектов перед тестированием.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Не собирать проекты перед тестированием. Подразумевает --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings arguments:
                                         Дополнительные сведения: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Запускает тест в режиме обвинения. Этот параметр нужен, чтобы изолировать проблемный тест, вызывающий сбой хоста для тестов. Он создает в текущем каталоге файл выходных данных (Sequence.xml), в котором записывается порядок выполнения теста перед сбоем.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.tr.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.tr.xlf
index a6d961ac2..5c96ff885 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.tr.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.tr.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">Test sonuçları için bir günlükçü belirtin. 
-                                        Örnek: --logger "trx[;LogFileName=&lt;Varsayılan olarak benzersiz dosya adı kullanılır&gt;]"
-                                        Günlükçü bağımsız değişkenleri desteği hakkında daha fazla bilgi: https://aka.ms/vstest-report</target>
+        <target state="translated">Test sonuçları için bir günlükçü belirtin.
+                                        Örnekler:
+                                        Benzersiz dosya adı kullanarak trx biçiminde günlük kaydı: --logger trx
+                                        Belirtilen dosya adını kullanarak trx biçiminde günlük kaydı: --logger "trx;LogFileName=&lt;TestSonuçları.trx&gt;"
+                                        Günlükçü bağımsız değişkenleri desteği hakkında daha fazla bilgi:https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">Projeyi derlemeden önce test edin.</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">Test etmeden önce projeyi derlemeyin. --no-restore anlamına gelir.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings bağımsız değişkenleri:
                                         Daha fazla bilgi için bkz. https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">Testi blame modunda çalıştırır. Bu seçenek, test konağının kilitlenmesine neden olan sorunlu testi belirlemek için kullanışlıdır. Geçerli dizinde testin kilitlenmeden önceki yürütme sırasını yakalayan "Sequence.xml" adlı bir çıkış dosyası oluşturur.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hans.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hans.xlf
index 0f365ad49..0e5969c11 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hans.xlf
@@ -73,11 +73,15 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
-        <target state="translated">指定测试结果的记录器。
-                                        示例: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
-                                        有关记录器参数的详细信息,请访问 support:https://aka.ms/vstest-report</target>
+        <target state="translated">为测试结果指定一个记录器。
+                                        示例:
+                                        使用唯一文件名按 trx 格式进行记录: --logger trx
+                                        使用指定的文件名按 trx 格式进行记录: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
+                                        有关记录器参数支持的详细信息,请访问: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdConfiguration">
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">测试之前不要生成项目。</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">测试之前不要生成项目。Implies --no-restore.</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings 参数:
                                         有关详细信息,请访问: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">在追责模式下运行测试。此选项有助于隔离有问题的测试,以免导致测试主机崩溃。它会在当前目录中创建一个输出文件 "Sequence.xml",用于在崩溃之前捕获测试的执行顺序。</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hant.xlf b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hant.xlf
index e3af79f81..718d08ca1 100644
--- a/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/commands/dotnet-test/xlf/LocalizableStrings.zh-Hant.xlf
@@ -73,10 +73,14 @@
       </trans-unit>
       <trans-unit id="CmdLoggerDescription">
         <source>Specify a logger for test results.
-                                        Example: --logger "trx[;LogFileName=&lt;Defaults to unique file name&gt;]"
+                                        Examples:
+                                        Log in trx format using a unqiue file name: --logger trx
+                                        Log in trx format using the specified file name: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         More info on logger arguments support:https://aka.ms/vstest-report</source>
         <target state="translated">指定測試結果的記錄器。
-                                        範例: --logger "trx[;LogFileName=&lt;預設為唯一的檔案名稱&gt;]"
+                                        範例:
+                                        使用唯一的檔案名稱以 trx 格式記錄: --logger trx
+                                        使用指定的檔案名稱以 trx 格式記錄: --logger "trx;LogFileName=&lt;TestResults.trx&gt;"
                                         記錄器引數支援的詳細資訊: https://aka.ms/vstest-report</target>
         <note />
       </trans-unit>
@@ -123,8 +127,8 @@
         <note />
       </trans-unit>
       <trans-unit id="CmdNoBuildDescription">
-        <source>Do not build project before testing.</source>
-        <target state="translated">請勿在測試前建置專案。</target>
+        <source>Do not build project before testing.  Implies --no-restore.</source>
+        <target state="translated">請勿在測試前建置專案。  這意味著 --沒有還原。</target>
         <note />
       </trans-unit>
       <trans-unit id="CmdTestAdapterPath">
@@ -173,6 +177,11 @@ RunSettings 引數:
                                         如需詳細資訊,請參閱: https://aka.ms/vstest-collect</target>
         <note />
       </trans-unit>
+      <trans-unit id="CmdBlameDescription">
+        <source>Runs the test in blame mode. This option is helpful in isolating the problematic test causing test host crash. It creates an output file in the current directory as "Sequence.xml", that captures the order of execution of test before the crash.</source>
+        <target state="translated">在 Blame 模式中執行測試。此選項有助於隔離造成測試主機損毀的問題測試。其會在目前的目錄中建立 "Sequence.xml" 這樣的輸出檔案,以擷取損毀前執行測試的順序。</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/dotnet.csproj b/src/dotnet/dotnet.csproj
index 928a17ccb..0b640f004 100644
--- a/src/dotnet/dotnet.csproj
+++ b/src/dotnet/dotnet.csproj
@@ -1,14 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   <PropertyGroup>
     <Version>$(SdkVersion)</Version>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <AssemblyName>dotnet</AssemblyName>
     <OutputType>Exe</OutputType>
     <AssemblyOriginatorKeyFile>../../tools/Key.snk</AssemblyOriginatorKeyFile>
     <SignAssembly>true</SignAssembly>
     <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
-    <AssetTargetFallback>$(AssetTargetFallback);dotnet5.4</AssetTargetFallback>
+    <AssetTargetFallback>dotnet5.4</AssetTargetFallback>
     <RootNamespace>Microsoft.DotNet.Cli</RootNamespace>
   </PropertyGroup>
   <ItemGroup>
@@ -24,6 +23,8 @@
     <EmbeddedResource Update="**\dotnet-build\*.resx" Namespace="Microsoft.DotNet.Tools.Build" />
     <EmbeddedResource Update="**\dotnet-clean\*.resx" Namespace="Microsoft.DotNet.Tools.Clean" />
     <EmbeddedResource Update="**\dotnet-help\*.resx" Namespace="Microsoft.DotNet.Tools.Help" />
+    <EmbeddedResource Update="**\dotnet-install\*.resx" Namespace="Microsoft.DotNet.Tools.Install" />
+    <EmbeddedResource Update="**\dotnet-install\dotnet-install-tool\*.resx" Namespace="Microsoft.DotNet.Tools.Install.Tool" />
     <EmbeddedResource Update="**\dotnet-list\*.resx" Namespace="Microsoft.DotNet.Tools.List" />
     <EmbeddedResource Update="**\dotnet-list-proj\*.resx" Namespace="Microsoft.DotNet.Tools.List.ProjectsInSolution" />
     <EmbeddedResource Update="**\dotnet-list-reference\*.resx" Namespace="Microsoft.DotNet.Tools.List.ProjectToProjectReferences" />
@@ -44,7 +45,6 @@
   <ItemGroup>
     <ProjectReference Include="../Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj" />
     <ProjectReference Include="../Microsoft.DotNet.InternalAbstractions/Microsoft.DotNet.InternalAbstractions.csproj" />
-    <ProjectReference Include="../Microsoft.DotNet.Archive/Microsoft.DotNet.Archive.csproj" />
     <ProjectReference Include="../Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="../Microsoft.DotNet.Cli.Sln.Internal/Microsoft.DotNet.Cli.Sln.Internal.csproj" />
   </ItemGroup>
@@ -57,6 +57,7 @@
     <PackageReference Include="System.Diagnostics.TextWriterTraceListener" Version="4.3.0" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.3.0" />
     <PackageReference Include="System.Private.DataContractSerialization" Version="4.3.0" />
+    <PackageReference Include="Microsoft.AspNetCore.DeveloperCertificates.XPlat" Version="$(AspNetCoreVersion)" />
     <PackageReference Include="Microsoft.Win32.Registry" Version="4.3.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)" />
@@ -68,10 +69,12 @@
     <PackageReference Include="Microsoft.TemplateEngine.Cli.Localization" Version="$(MicrosoftTemplateEngineCliLocalizationPackageVersion)" />
     <PackageReference Include="Microsoft.TemplateEngine.Orchestrator.RunnableProjects" Version="$(MicrosoftTemplateEngineOrchestratorRunnableProjectsPackageVersion)" />
     <PackageReference Include="Microsoft.TemplateEngine.Utils" Version="$(MicrosoftTemplateEngineUtilsPackageVersion)" />
+    <PackageReference Include="Microsoft.DotNet.Archive" Version="$(MicrosoftDotNetArchivePackageVersion)" />
     <PackageReference Include="XliffTasks" Version="$(XliffTasksPackageVersion)" PrivateAssets="All" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="commands\dotnet-migrate\xlf" />
     <Folder Include="dotnet-complete\commands\" />
   </ItemGroup>
-</Project>
\ No newline at end of file
+  <Import Project="dotnet.win.targets" Condition="'$(OS)' == 'Windows_NT'" />
+</Project>
diff --git a/src/dotnet/dotnet.win.targets b/src/dotnet/dotnet.win.targets
new file mode 100644
index 000000000..d46555d09
--- /dev/null
+++ b/src/dotnet/dotnet.win.targets
@@ -0,0 +1,25 @@
+<!-- This file should only be used when building dotnet for windows. -->
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <!-- Only included to ensure this is built first. -->
+    <ProjectReference Include="..\tool_launcher\tool_launcher.csproj"
+      ReferenceOutputAssembly="false"
+      SkipGetTargetFrameworkProperties="true"
+      PrivateAssets="All" />
+  </ItemGroup>
+
+  <Target Name="EmbedDotnetLauncher" BeforeTargets="PrepareForBuild">
+    <MSBuild Projects="..\tool_launcher\tool_launcher.csproj" Targets="GetTargetPath" Properties="Configuration=$(Configuration)">
+      <Output TaskParameter="TargetOutputs" PropertyName="DotnetLauncherFullPath" />
+    </MSBuild>
+    <ItemGroup>
+      <EmbeddedResource Include="$(DotnetLauncherFullPath)" LogicalName="Microsoft.DotNet.Tools.Launcher.Executable" />
+      <EmbeddedResource Include="$(DotnetLauncherFullPath).config" LogicalName="Microsoft.DotNet.Tools.Launcher.Config" />
+    </ItemGroup>
+  </Target>
+
+</Project>
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.cs.xlf b/src/dotnet/xlf/CommonLocalizableStrings.cs.xlf
index 56caa7e29..fcff78d2f 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.cs.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.cs.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Aplikace</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">Odkaz na {0} neexistuje.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Odkaz na {0} byl přidán do projektu.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Při spuštění příkazu neprovede implicitní obnovení.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Projekt {0} byl z řešení odebrán.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.de.xlf b/src/dotnet/xlf/CommonLocalizableStrings.de.xlf
index b2c179985..777d128ea 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.de.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.de.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Anwendung</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">Der Verweis "{0}" ist nicht vorhanden.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Der Verweis "{0}" wurde dem Projekt hinzugefügt.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Führt beim Ausführen des Befehls keine implizite Wiederherstellung durch.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Das Projekt "{0}" wurde aus der Projektmappe entfernt.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.es.xlf b/src/dotnet/xlf/CommonLocalizableStrings.es.xlf
index f1a9c6402..082d2d6d0 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.es.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.es.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Aplicación</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">La referencia {0} no existe.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Se ha agregado la referencia "{0}" al proyecto.</target>
@@ -674,6 +669,134 @@
         <target state="translated">No realiza una restauración implícita al ejecutar el comando.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Se ha quitado el proyecto "{0}" de la solución.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.fr.xlf b/src/dotnet/xlf/CommonLocalizableStrings.fr.xlf
index b33c6611e..04790f3aa 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.fr.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.fr.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Application</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">La référence {0} n'existe pas.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Référence '{0}' ajoutée au projet.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Ne fait pas de restauration implicite durant l'exécution de la commande.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Projet '{0}' retiré de la solution.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.it.xlf b/src/dotnet/xlf/CommonLocalizableStrings.it.xlf
index b1714f3e5..2f43ff640 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.it.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.it.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Applicazione</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">Il riferimento {0} non esiste.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Il riferimento `{0}` è stato aggiunto al progetto.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Non esegue un ripristino implicito durante l'esecuzione del comando.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Il progetto `{0}` è stato rimosso dalla soluzione.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.ja.xlf b/src/dotnet/xlf/CommonLocalizableStrings.ja.xlf
index f95dbf451..b2648f41d 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.ja.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.ja.xlf
@@ -97,11 +97,6 @@
         <target state="translated">アプリケーション</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">参照 {0} は存在しません。</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">参照 `{0}` がプロジェクトに追加されました。</target>
@@ -674,6 +669,134 @@
         <target state="translated">コマンドを実行するときに暗黙的復元を行いません。</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">プロジェクト `{0}` がソリューションから削除されました。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.ko.xlf b/src/dotnet/xlf/CommonLocalizableStrings.ko.xlf
index 029bc8c0c..c8e626ebc 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.ko.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.ko.xlf
@@ -97,11 +97,6 @@
         <target state="translated">응용 프로그램</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">{0} 참조가 없습니다.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">프로젝트에 '{0}' 참조가 추가되었습니다.</target>
@@ -674,6 +669,134 @@
         <target state="translated">명령을 실행할 때 암시적 복원을 수행하지 않습니다.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">'{0}' 프로젝트가 솔루션에서 제거되었습니다.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.pl.xlf b/src/dotnet/xlf/CommonLocalizableStrings.pl.xlf
index 1db654dd8..866502ed7 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.pl.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.pl.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Aplikacja</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">Odwołanie {0} nie istnieje.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Do projektu zostało dodane odwołanie „{0}”.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Nie wykonuje niejawnego przywracania podczas wykonywania polecenia.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Projekt „{0}” został skasowany z rozwiązania.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf b/src/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf
index 89cc1e55d..d6590ff13 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Aplicativo</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">A referência {0} não existe.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">A referência ‘{0}’ foi adicionada ao projeto.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Não faz uma restauração implícita ao executar o comando.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">O projeto `{0}` foi removido da solução.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.ru.xlf b/src/dotnet/xlf/CommonLocalizableStrings.ru.xlf
index a63e439a0..0c8083046 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.ru.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.ru.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Приложение</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">Ссылка {0} не существует.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">Ссылка "{0}" добавлена в проект.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Не выполняет неявное восстановление при выполнении команды.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">Проект "{0}" удален из решения.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.tr.xlf b/src/dotnet/xlf/CommonLocalizableStrings.tr.xlf
index 6584fc018..f1ff54bfb 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.tr.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.tr.xlf
@@ -97,11 +97,6 @@
         <target state="translated">Uygulama</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">{0} başvurusu yok.</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">`{0}` başvurusu projeye eklendi.</target>
@@ -674,6 +669,134 @@
         <target state="translated">Komut yürütülürken örtük geri yükleme gerçekleştirmez.</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">`{0}` projesi çözümden kaldırıldı.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf b/src/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf
index 2fdb31f54..bbe34189e 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf
@@ -97,11 +97,6 @@
         <target state="translated">应用程序</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">引用 {0} 不存在。</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">已将引用“{0}”添加到项目。</target>
@@ -674,6 +669,134 @@
         <target state="translated">请勿在执行命令时进行隐式还原。</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">已从解决方案中移除项目“{0}”。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf b/src/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf
index 2e0845e40..314f986c0 100644
--- a/src/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf
+++ b/src/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf
@@ -97,11 +97,6 @@
         <target state="translated">應用程式</target>
         <note />
       </trans-unit>
-      <trans-unit id="ReferenceDoesNotExist">
-        <source>Reference {0} does not exist.</source>
-        <target state="translated">參考 {0} 不存在。</target>
-        <note />
-      </trans-unit>
       <trans-unit id="ReferenceAddedToTheProject">
         <source>Reference `{0}` added to the project.</source>
         <target state="translated">參考 `{0}` 已新增至專案。</target>
@@ -674,6 +669,134 @@
         <target state="translated">執行此命令時,請勿進行隱含還原。</target>
         <note />
       </trans-unit>
+      <trans-unit id="ProjectRemovedFromTheSolution">
+        <source>Project `{0}` removed from the solution.</source>
+        <target state="translated">專案 `{0}` 已從解決方案移除。</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="CannotBeNullOrWhitespace">
+        <source>Cannot be null or whitespace.</source>
+        <target state="new">Cannot be null or whitespace.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ContainInvalidCharacters">
+        <source>Contains one or more invalid characters: {0}</source>
+        <target state="new">Contains one or more invalid characters: {0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsInvalidXml">
+        <source>The tool's settings file is invalid xml.
+{0}</source>
+        <target state="new">The tool's settings file is invalid xml.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingInvalidRunner">
+        <source>The tool's settings file has non "dotnet" as runner.</source>
+        <target state="new">The tool's settings file has non "dotnet" as runner.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingMoreThanOneCommand">
+        <source>The tool's settings file has more than one command defined.</source>
+        <target state="new">The tool's settings file has more than one command defined.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolSettingsContainError">
+        <source>The tool's settings file contains error.
+{0}</source>
+        <target state="new">The tool's settings file contains error.
+{0}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="NuGetConfigurationFileDoesNotExist">
+        <source>NuGet configuration file {0} does not exist.</source>
+        <target state="new">NuGet configuration file {0} does not exist.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxNeedLogout">
+        <source>Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to logout or restart your session before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathLinuxManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash. You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen terminal before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathOSXManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+If you are using bash, You can do this by running the following command:
+
+cat &lt;&lt; EOF &gt;&gt; ~/.bash_profile
+# Add .NET Core SDK tools
+export PATH="$PATH:{1}"
+EOF</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolSameName">
+        <source>Failed to install tool {0}. A command with the same name already exists.</source>
+        <target state="new">Failed to install tool {0}. A command with the same name already exists.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="FailInstallToolPermission">
+        <source>Failed to change permission:
+Error: {0}
+Output: {1}</source>
+        <target state="new">Failed to change permission:
+Error: {0}
+Output: {1}</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsNeedReopen">
+        <source>Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</source>
+        <target state="new">Since you just installed the .NET Core SDK, you will need to reopen the Command Prompt window before running the tool you installed.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="EnvironmentPathWindowsManualInstruction">
+        <source>Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</source>
+        <target state="new">Cannot find the tools executable path. Please ensure {0} is added to your PATH.
+You can do this by running the following command:
+
+setx PATH "%PATH%;{1}"</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingEntryPointFile">
+        <source>Package '{0}' is missing entry point file {1}.</source>
+        <target state="new">Package '{0}' is missing entry point file {1}.</target>
+        <note />
+      </trans-unit>
+      <trans-unit id="ToolPackageMissingSettingsFile">
+        <source>Package '{0}' is missing tool settings file DotnetToolSettings.xml.</source>
+        <target state="new">Package '{0}' is missing tool settings file DotnetToolSettings.xml.</target>
+        <note />
+      </trans-unit>
     </body>
   </file>
 </xliff>
\ No newline at end of file
diff --git a/src/dotnet/xlf/LocalizableStrings.fr.xlf b/src/dotnet/xlf/LocalizableStrings.fr.xlf
index 58bc6888f..e684e24c4 100644
--- a/src/dotnet/xlf/LocalizableStrings.fr.xlf
+++ b/src/dotnet/xlf/LocalizableStrings.fr.xlf
@@ -375,7 +375,7 @@
       </trans-unit>
       <trans-unit id="FoundMoreThanOneSolutionIn">
         <source>Found more than one solution file in {0}. Please specify which one to use.</source>
-        <target state="translated">Plusieurs fichiers solution trouvés dans {0}. Spécifiez celui à utiliser.</target>
+        <target state="translated">Plusieurs fichiers solution trouvés dans {0}. Spécifiez celui qui doit être utilisé.</target>
         <note />
       </trans-unit>
       <trans-unit id="FoundInvalidSolution">
diff --git a/src/redist/redist.csproj b/src/redist/redist.csproj
index 3879fe674..c5e7c93aa 100644
--- a/src/redist/redist.csproj
+++ b/src/redist/redist.csproj
@@ -1,23 +1,21 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.tasks" />
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.tasks))\dir.tasks" />
   <Import Project="$(RepoRoot)/build/compile/LzmaArchive.targets" />
   <Import Project="$(RepoRoot)/build/MSBuildExtensions.targets" />
 
   <PropertyGroup>
     <VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
     <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
     <CopyBuildOutputToPublishDirectory>false</CopyBuildOutputToPublishDirectory>
-    <AssetTargetFallback>$(AssetTargetFallback);dotnet5.4</AssetTargetFallback>
+    <AssetTargetFallback>dotnet5.4</AssetTargetFallback>
     <PublishDir>$(SdkOutputDirectory)</PublishDir>
     <VersionSuffix>$(CommitCount)</VersionSuffix>
   </PropertyGroup>
 
   <ItemGroup>
     <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
-    <PackageReference Include="Microsoft.Build.Runtime" Version="$(MicrosoftBuildRuntimePackageVersion)" />
     <PackageReference Include="NuGet.Build.Tasks" Version="$(NuGetBuildTasksPackageVersion)" />
     <PackageReference Include="Microsoft.TestPlatform.CLI" Version="$(MicrosoftTestPlatformCLIPackageVersion)" />
     <PackageReference Include="Microsoft.TestPlatform.Build" Version="$(MicrosoftTestPlatformBuildPackageVersion)" />
@@ -29,7 +27,6 @@
 
   <ItemGroup>
     <ProjectReference Include="..\dotnet\dotnet.csproj" />
-    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\tool_msbuild\tool_msbuild.csproj" />
     <ProjectReference Include="..\tool_nuget\tool_nuget.csproj" />
   </ItemGroup>
@@ -40,15 +37,15 @@
     </Content>
   </ItemGroup>
 
-  <Target Name="PublishAspNetRuntimePackageStore"
+  <Target Name="PublishAspNetSharedFramework"
           AfterTargets="CrossgenPublishDir">
     <ItemGroup>
-      <AspNetRuntimePackageStore Remove="*" />
-      <AspNetRuntimePackageStore Include="$(AspNetRuntimePackageStorePublishDirectory)/**/*" />
+      <AspNetSharedFramework Remove="*" />
+      <AspNetSharedFramework Include="$(AspNetCoreSharedFxPublishDirectory)/**/*" />
     </ItemGroup>
 
-    <Copy SourceFiles="@(AspNetRuntimePackageStore)"
-          DestinationFiles="@(AspNetRuntimePackageStore->'$(OutputDirectory)/%(RecursiveDir)%(Filename)%(Extension)')" />
+    <Copy SourceFiles="@(AspNetSharedFramework)"
+          DestinationFiles="@(AspNetSharedFramework->'$(OutputDirectory)/%(RecursiveDir)%(Filename)%(Extension)')" />
   </Target>
 
   <Target Name="PublishSharedFramework"
@@ -72,7 +69,7 @@
 
   <Target Name="PublishRoslyn"
           BeforeTargets="Publish">
-          
+
     <ItemGroup>
       <RoslynBits Include="$(NuGetPackagesDir)/microsoft.netcore.compilers/$(MicrosoftNETCoreCompilersPackageVersion)/tools/**/*" />
     </ItemGroup>
@@ -80,6 +77,7 @@
     <ItemGroup>
       <RoslynRuntimeConfigs Include="$(RoslynDirectory)/bincore/csc.runtimeconfig.json" />
       <RoslynRuntimeConfigs Include="$(RoslynDirectory)/bincore/vbc.runtimeconfig.json" />
+      <RoslynRuntimeConfigs Include="$(RoslynDirectory)/bincore/VBCSCompiler.runtimeconfig.json" />
       <RoslynDeps Include="$(RoslynDirectory)/bincore/csc.deps.json" />
       <RoslynDeps Include="$(RoslynDirectory)/bincore/vbc.deps.json" />
       <RoslynFrameworkAssemblies Include="$(RoslynDirectory)/System.*.dll;$(RoslynDirectory)/runtimes/**/System.*.dll" Exclude="$(RoslynDirectory)/runtimes/**/System.IO.Pipes.AccessControl.dll"/>
@@ -98,8 +96,8 @@
 
   <Target Name="PublishFSharp"
           BeforeTargets="Publish">
-          
-    <DotNetPublish ToolPath="$(Stage0Directory)"
+
+    <DotNetPublish ToolPath="$(PreviousStageDirectory)"
                    Configuration="$(Configuration)"
                    ProjectPath="$(SrcDirectory)/tool_fsharp/tool_fsc.csproj" />
   </Target>
@@ -135,7 +133,7 @@
         <DestinationPath Condition="'%(MSBuildExtensionsContent.DestinationPath)' == ''">$(PublishDir)/%(MSBuildExtensionsContent.DeploymentSubpath)%(RecursiveDir)%(Filename)%(Extension)</DestinationPath>
       </MSBuildExtensionsContent>
     </ItemGroup>
-    
+
       <Copy SourceFiles="@(MSBuildExtensionsContent)"
             DestinationFiles="%(MSBuildExtensionsContent.DestinationPath)" />
 
@@ -178,7 +176,7 @@
           SdkLayoutDirectory=$(SdkOutputDirectory)/Sdks/%(BundledSdk.Identity);
           DependencyPackageName=%(BundledSdk.Identity);
           DependencyPackageVersion=%(BundledSdk.Version);
-          Stage0Directory=$(Stage0Directory)
+          PreviousStageDirectory=$(PreviousStageDirectory)
         </Properties>
       </SdksToBundle>
     </ItemGroup>
@@ -197,7 +195,7 @@
           TemplateLayoutDirectory=$(SdkOutputDirectory)/Templates;
           TemplatePackageName=%(BundledTemplate.Identity);
           TemplatePackageVersion=%(BundledTemplate.Version);
-          Stage0Directory=$(Stage0Directory)
+          PreviousStageDirectory=$(PreviousStageDirectory)
         </Properties>
       </TemplatesToBundle>
     </ItemGroup>
@@ -216,7 +214,7 @@
 
   <Target Name="CrossgenPublishDir"
           Condition=" '$(DISABLE_CROSSGEN)' == '' "
-          AfterTargets="GenerateCliRuntimeConfigurationFiles">
+          AfterTargets="PublishSdks">
     <ItemGroup>
       <RoslynFiles Include="$(PublishDir)Roslyn\bincore\**\*" />
       <FSharpFiles Include="$(PublishDir)FSharp\**\*" Exclude="$(PublishDir)FSharp\FSharp.Build.dll" />
@@ -225,13 +223,15 @@
       <!-- Removing Full CLR built TestHost assemblies from getting Crossgen as it is throwing error -->
       <RemainingFiles Remove="$(PublishDir)TestHost*\**\*" />
       <RemainingFiles Remove="$(PublishDir)Sdks\**\*" />
+      <RemainingFiles Remove="$(PublishDir)**\Microsoft.TestPlatform.Extensions.EventLogCollector.dll" />
+
+      <!-- Add back the .NET Core assemblies in the Sdks folder -->
+      <RemainingFiles Include="$(PublishDir)Sdks\Microsoft.NET.Sdk\tools\netcoreapp2.0\**\*" />
+      <RemainingFiles Include="$(PublishDir)Sdks\NuGet.Build.Tasks.Pack\CoreCLR\**\*" />
 
       <!-- Don't try to CrossGen .NET Framework support assemblies for .NET Standard -->
       <RemainingFiles Remove="$(PublishDir)Microsoft\Microsoft.NET.Build.Extensions\net*\**\*" />
 
-      <!-- Don't try to CrossGen tasks and supporting DLLs compiled for .NET Framework -->
-      <RemainingFiles Remove="$(PublishDir)Microsoft\Microsoft.NET.Build.Extensions\tools\net*\**\*" />
-
       <!-- Don't crossgen satellite assemblies -->
       <RoslynFiles Remove="$(PublishDir)Roslyn\bincore\**\*.resources.dll" />
       <FSharpFiles Remove="$(PublishDir)FSharp\**\*.resources.dll" />
@@ -254,11 +254,11 @@
       <RoslynTargets Include="%(RoslynFilesWithPEMarker.FullPath)" Condition=" '%(RoslynFilesWithPEMarker.IsPE)' == 'True' " />
       <FSharpTargets Include="%(FSharpFilesWithPEMarker.FullPath)" Condition=" '%(FSharpFilesWithPEMarker.IsPE)' == 'True' " />
       <RemainingTargets Include="%(RemainingFilesWithPEMarker.FullPath)" Condition=" '%(RemainingFilesWithPEMarker.IsPE)' == 'True' " />
- 
+
       <RoslynFolders Include="@(RoslynTargets-&gt;DirectoryName()-&gt;Distinct())" />
       <FSharpFolders Include="@(FSharpTargets-&gt;DirectoryName()-&gt;Distinct())" />
       <RemainingFolders Include="@(RemainingTargets-&gt;DirectoryName()-&gt;Distinct())" />
- 
+
       <!-- FSharp.Build.dll causes the FSharp folder to be included. Remove it, as we don't want other FSharp dlls being included in the crossgen. -->
       <RemainingFolders Remove="$(PublishDir)FSharp\**\*" />
     </ItemGroup>
@@ -283,7 +283,7 @@
         CreateSymbols="$(CreateCrossgenSymbols)"
         DiasymReaderPath="@(DiasymReaderPath)"
         PlatformAssemblyPaths="@(PlatformAssemblies);@(RoslynFolders);$(SharedFrameworkNameVersionPath)" />
- 
+
     <Crossgen
         SourceAssembly="%(FSharpTargets.FullPath)"
         DestinationPath="%(FSharpTargets.FullPath)"
@@ -293,7 +293,7 @@
         CreateSymbols="$(CreateCrossgenSymbols)"
         DiasymReaderPath="@(DiasymReaderPath)"
         PlatformAssemblyPaths="@(PlatformAssemblies);@(FSharpFolders);$(SharedFrameworkNameVersionPath)" />
- 
+
     <Crossgen
         SourceAssembly="%(RemainingTargets.FullPath)"
         DestinationPath="%(RemainingTargets.FullPath)"
@@ -308,7 +308,7 @@
   <Target Name="ChmodPublishDir"
           AfterTargets="CrossgenPublishDir"
           Condition=" '$(OSName)' != 'win' ">
-    
+
     <Exec Command="find $(SdkOutputDirectory) -type d -exec chmod 755 {} \;" />
     <Exec Command="find $(SdkOutputDirectory) -type f -exec chmod 644 {} \;" />
     <Chmod Mode="755" Glob="$(SdkOutputDirectory)/FSharp/RunFsc.sh" />
@@ -322,7 +322,7 @@
       <PdbsToMove Include="$(PublishDir)/**/*.ni.*.map" />
     </ItemGroup>
 
-    <Move SourceFiles="@(PdbsToMove)" 
+    <Move SourceFiles="@(PdbsToMove)"
           DestinationFiles="@(PdbsToMove->'$(SymbolsDirectory)/sdk/$(SdkVersion)/%(RecursiveDir)%(Filename)%(Extension)')" />
   </Target>
 
diff --git a/src/tool_fsharp/tool_fsc.csproj b/src/tool_fsharp/tool_fsc.csproj
index 9e55f68ab..ffc343e47 100644
--- a/src/tool_fsharp/tool_fsc.csproj
+++ b/src/tool_fsharp/tool_fsc.csproj
@@ -1,10 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.tasks" />
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.tasks))\dir.tasks" />
 
   <PropertyGroup>
     <VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
     <PublishDir>$(FSharpDirectory)</PublishDir>
     <VersionSuffix>$(CommitCount)</VersionSuffix>
@@ -36,10 +35,15 @@
                                  SectionName="%(AssetsToRemoveFromDeps.SectionName)"
                                  AssetPath="%(AssetsToRemoveFromDeps.Identity)" />
 
+    <!-- Deploy deps and runtime config for fsc.exe and fsi.exe.  Both apps have exactly the same dependencies so this is Ok -->
     <Copy SourceFiles="$(PublishDir)/$(TargetName).runtimeconfig.json;
                        $(PublishDir)/$(TargetName).deps.json;"
           DestinationFiles="$(PublishDir)/fsc.runtimeconfig.json;
                             $(PublishDir)/fsc.deps.json;"/>
+    <Copy SourceFiles="$(PublishDir)/$(TargetName).runtimeconfig.json;
+                       $(PublishDir)/$(TargetName).deps.json;"
+          DestinationFiles="$(PublishDir)/fsi.runtimeconfig.json;
+                            $(PublishDir)/fsi.deps.json;"/>
   </Target>
 
   <Target Name="RemoveFilesAfterPublish"
diff --git a/src/tool_launcher/Program.cs b/src/tool_launcher/Program.cs
new file mode 100644
index 000000000..5ecf92671
--- /dev/null
+++ b/src/tool_launcher/Program.cs
@@ -0,0 +1,116 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Configuration;
+using System.Diagnostics;
+using Microsoft.DotNet.Cli.Utils;
+
+namespace Microsoft.DotNet.Tools.Launcher
+{
+    /// <summary>
+    /// The app is simple shim into launching arbitrary command line processes.
+    /// It is configured via app settings .NET config file. (See app.config).
+    /// </summary>
+    /// <remarks>
+    /// Launching new processes using cmd.exe and .cmd files causes issues for long-running process
+    /// because CTRL+C always hangs on interrupt with the prompt "Terminate Y/N". This can lead to
+    /// orphaned processes.
+    /// </remarks>
+    class Program
+    {
+        private const string TRACE = "DOTNET_LAUNCHER_TRACE";
+        private const int ERR_FAILED = -1;
+        private static bool _trace;
+
+        public static int Main(string[] argsToForward)
+        {
+            bool.TryParse(Environment.GetEnvironmentVariable(TRACE), out _trace);
+
+            try
+            {
+                var appSettings = ConfigurationManager.AppSettings;
+
+                var entryPoint = appSettings["entryPoint"];
+                if (string.IsNullOrEmpty(entryPoint))
+                {
+                    LogError("The launcher must specify a non-empty appSetting value for 'entryPoint'.");
+                    return ERR_FAILED;
+                }
+
+                var exePath = entryPoint;
+                var runner = appSettings["runner"];
+
+                var args = new List<string>();
+
+                if (!string.IsNullOrEmpty(runner))
+                {
+                    args.Add(entryPoint);
+                    exePath = runner;
+                }
+
+                args.AddRange(argsToForward);
+
+                var argString = ArgumentEscaper.EscapeAndConcatenateArgArrayForProcessStart(args);
+
+                using (var process = new Process
+                {
+                    StartInfo =
+                    {
+                        FileName = exePath,
+                        Arguments = argString,
+                        CreateNoWindow = false,
+                        UseShellExecute = false,
+                    }
+                })
+                {
+                    LogTrace("Starting a new process.");
+                    LogTrace("filename = " + process.StartInfo.FileName);
+                    LogTrace("args = " + process.StartInfo.Arguments);
+                    LogTrace("cwd = " + process.StartInfo.WorkingDirectory);
+
+                    try
+                    {
+                        process.Start();
+                    }
+                    catch (Win32Exception ex)
+                    {
+                        LogTrace(ex.ToString());
+                        LogError($"Failed to start '{process.StartInfo.FileName}'. " + ex.Message);
+                        return ERR_FAILED;
+                    }
+
+                    process.WaitForExit();
+
+                    LogTrace("Exited code " + process.ExitCode);
+
+                    return process.ExitCode;
+                }
+            }
+            catch (Exception ex)
+            {
+                LogError("Unexpected error launching a new process. Run with the environment variable " + TRACE + "='true' for details.");
+                LogTrace(ex.ToString());
+                return ERR_FAILED;
+            }
+        }
+
+        private static void LogError(string message)
+        {
+            Console.ForegroundColor = ConsoleColor.Red;
+            Console.BackgroundColor = ConsoleColor.Black;
+            Console.Error.WriteLine("ERROR: " + message);
+            Console.ResetColor();
+        }
+
+        private static void LogTrace(string message)
+        {
+            if (!_trace)
+                return;
+
+            Console.ForegroundColor = ConsoleColor.DarkGray;
+            Console.BackgroundColor = ConsoleColor.Black;
+            Console.WriteLine("[dotnet-launcher] " + message);
+            Console.ResetColor();
+        }
+    }
+}
diff --git a/src/tool_launcher/app.config b/src/tool_launcher/app.config
new file mode 100644
index 000000000..14df07456
--- /dev/null
+++ b/src/tool_launcher/app.config
@@ -0,0 +1,19 @@
+<!--
+Generated by the .NET Core Command Line.
+-->
+<configuration>
+  <startup>
+    <supportedRuntime version="v2.0.50727" />
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+  </startup>
+  <appSettings>
+    <!--
+    To use this launcher, this value must be set. It is a file path or name of the new process being launched.
+    <add key="entryPoint" value="%entrypoint%" />
+
+    This value may also be set. It is an path to another executable used to launch the entry point.
+    It is treated as single argument.
+    <add key="runner" value="%runner%" />
+    -->
+  </appSettings>
+</configuration>
diff --git a/src/tool_launcher/tool_launcher.csproj b/src/tool_launcher/tool_launcher.csproj
new file mode 100644
index 000000000..26cd41b46
--- /dev/null
+++ b/src/tool_launcher/tool_launcher.csproj
@@ -0,0 +1,30 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <!-- Targets .NET Framework 3.5 because .NET Framework 4.5 is not bundled in Windows 7. -->
+    <TargetFramework>net35</TargetFramework>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <OutputType>exe</OutputType>
+    <IsPackable>false</IsPackable>
+    <AssemblyName>Microsoft.DotNet.Tools.Launcher</AssemblyName>
+    <Title>dotnet-tool-launcher</Title>
+    <Description>
+      A simple Windows-only shim for launching new processes.
+    </Description>
+  </PropertyGroup>
+
+  <!-- This project must not have any package references. It must be a standalone .exe file -->
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+
+  <!-- Workaround https://github.com/Microsoft/msbuild/issues/1333 -->
+  <PropertyGroup>
+    <FrameworkPathOverride>$(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client</FrameworkPathOverride>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="..\Microsoft.DotNet.Cli.Utils\ArgumentEscaper.cs" />
+  </ItemGroup>
+</Project>
diff --git a/src/tool_msbuild/tool_msbuild.csproj b/src/tool_msbuild/tool_msbuild.csproj
index 9a4974600..b65ced245 100644
--- a/src/tool_msbuild/tool_msbuild.csproj
+++ b/src/tool_msbuild/tool_msbuild.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
diff --git a/src/tool_nuget/tool_nuget.csproj b/src/tool_nuget/tool_nuget.csproj
index 9b373cb60..25941dfa8 100644
--- a/src/tool_nuget/tool_nuget.csproj
+++ b/src/tool_nuget/tool_nuget.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
diff --git a/test/ArgumentForwardingTests/ArgumentForwardingTests.csproj b/test/ArgumentForwardingTests/ArgumentForwardingTests.csproj
index fbafac34b..96d892b65 100644
--- a/test/ArgumentForwardingTests/ArgumentForwardingTests.csproj
+++ b/test/ArgumentForwardingTests/ArgumentForwardingTests.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
@@ -15,16 +14,17 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)"/>
   </ItemGroup>
 
   <Target Name="PrecompileScript" 
           BeforeTargets="Build" 
           Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
-    <Exec Command="$(DotnetInOutputDirectory) publish ../ArgumentsReflector/ArgumentsReflector.csproj --output $(MSBuildThisFileDirectory)/$(OutputPath)" />
+
+    <Exec Command="$(PreviousStageDotnet) publish ../ArgumentsReflector/ArgumentsReflector.csproj --output $(OutputPath)" />
   </Target>
 
 </Project>
diff --git a/test/ArgumentsReflector/ArgumentsReflector.csproj b/test/ArgumentsReflector/ArgumentsReflector.csproj
index 493f367fe..64dfde5ab 100644
--- a/test/ArgumentsReflector/ArgumentsReflector.csproj
+++ b/test/ArgumentsReflector/ArgumentsReflector.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
diff --git a/test/dir.props b/test/Directory.Build.props
similarity index 83%
rename from test/dir.props
rename to test/Directory.Build.props
index 8d5c8cc42..406c4f8c1 100644
--- a/test/dir.props
+++ b/test/Directory.Build.props
@@ -1,5 +1,5 @@
 <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\dir.props" />
+  <Import Project="..\Directory.Build.props" />
 
   <PropertyGroup>
     <DisableImplicitFrameworkReferences>false</DisableImplicitFrameworkReferences>
diff --git a/test/EndToEnd/EndToEnd.csproj b/test/EndToEnd/EndToEnd.csproj
index 8cb5233b6..87339ca25 100644
--- a/test/EndToEnd/EndToEnd.csproj
+++ b/test/EndToEnd/EndToEnd.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -22,10 +20,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
-    <PackageReference Include="xunit.netcore.extensions" Version="1.0.0-prerelease-00206" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/test/EndToEnd/GivenDotNetUsesMSBuild.cs b/test/EndToEnd/GivenDotNetUsesMSBuild.cs
index f714ee38c..9c79fb94e 100644
--- a/test/EndToEnd/GivenDotNetUsesMSBuild.cs
+++ b/test/EndToEnd/GivenDotNetUsesMSBuild.cs
@@ -19,7 +19,7 @@ namespace Microsoft.DotNet.Tests.EndToEnd
             {
                 string projectDirectory = directory.Path;
 
-                string newArgs = "console -f netcoreapp2.0 --debug:ephemeral-hive --no-restore";
+                string newArgs = "console -f netcoreapp2.1 --debug:ephemeral-hive --no-restore";
                 new NewCommandShim()
                     .WithWorkingDirectory(projectDirectory)
                     .Execute(newArgs)
@@ -112,7 +112,7 @@ namespace Microsoft.DotNet.Tests.EndToEnd
             new DotnetCommand(DotnetUnderTest.WithBackwardsCompatibleRuntimes)
                 .WithWorkingDirectory(testProjectDirectory)
                 .ExecuteWithCapturedOutput(
-                    $"-d dependency-tool-invoker -c {configuration} -f netcoreapp2.0 portable")
+                    $"-d dependency-tool-invoker -c {configuration} -f netcoreapp2.1 portable")
                 .Should().Pass()
                      .And.HaveStdOutContaining("Hello Portable World!");;
         }
diff --git a/test/Installer/Microsoft.DotNet.Cli.Msi.Tests/Microsoft.DotNet.Cli.Msi.Tests.csproj b/test/Installer/Microsoft.DotNet.Cli.Msi.Tests/Microsoft.DotNet.Cli.Msi.Tests.csproj
index e576ed679..17220aaf1 100644
--- a/test/Installer/Microsoft.DotNet.Cli.Msi.Tests/Microsoft.DotNet.Cli.Msi.Tests.csproj
+++ b/test/Installer/Microsoft.DotNet.Cli.Msi.Tests/Microsoft.DotNet.Cli.Msi.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>net46</TargetFramework>
     <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
@@ -17,8 +15,8 @@
 
   <ItemGroup>
     <PackageReference Include="NETStandard.Library" Version="1.6.0" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
-    <PackageReference Include="xunit.runner.console" Version="2.1.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
+    <PackageReference Include="xunit.runner.console" Version="2.2.0" />
     <PackageReference Include="Microsoft.Deployment.WindowsInstaller" Version="1.0.0" />
   </ItemGroup>
 
diff --git a/test/Installer/testmsi.ps1 b/test/Installer/testmsi.ps1
index 198999c78..47db57c58 100644
--- a/test/Installer/testmsi.ps1
+++ b/test/Installer/testmsi.ps1
@@ -3,7 +3,8 @@
 
 param(
     [string]$InputMsi,
-    [string]$DotnetDir
+    [string]$DotnetDir,
+    [string]$TestDir
 )
 
 . "$PSScriptRoot\..\..\scripts\common\_common.ps1"
@@ -37,7 +38,7 @@ if(!(Test-Path $inputMsi))
 
 $testName = "Microsoft.DotNet.Cli.Msi.Tests"
 $testProj="$PSScriptRoot\$testName\$testName.csproj"
-$testBin="$RepoRoot\artifacts\tests\$testName"
+$testBin="$TestDir\$testName"
 
 pushd "$DotnetDir"
 
diff --git a/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.csproj b/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.csproj
index 138cc5eea..1cf12c8d1 100644
--- a/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.csproj
+++ b/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -17,13 +15,13 @@
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
   </ItemGroup>
 
   <ItemGroup>
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="xunit" Version="2.2.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/test/Microsoft.DotNet.Cli.Tests.sln b/test/Microsoft.DotNet.Cli.Tests.sln
index c3d64f5d7..863d564db 100644
--- a/test/Microsoft.DotNet.Cli.Tests.sln
+++ b/test/Microsoft.DotNet.Cli.Tests.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26419.0
+VisualStudioVersion = 15.0.27004.2008
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{13B669BE-BB05-4DDF-9536-439F39A36129}") = "dotnet-add-reference.Tests", "dotnet-add-reference.Tests\dotnet-add-reference.Tests.csproj", "{AB63A3E5-76A3-4EE9-A380-8E0C7B7644DC}"
 EndProject
@@ -74,11 +74,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-store.Tests", "dotne
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-back-compat.Tests", "dotnet-back-compat.Tests\dotnet-back-compat.Tests.csproj", "{27351B2F-325B-4843-9F4C-BC53FD06A7B5}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnet-remove-package.Tests", "dotnet-remove-package.Tests\dotnet-remove-package.Tests.csproj", "{CF517B15-B307-4660-87D5-CC036ADECD4B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-remove-package.Tests", "dotnet-remove-package.Tests\dotnet-remove-package.Tests.csproj", "{CF517B15-B307-4660-87D5-CC036ADECD4B}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.MSBuildSdkResolver.Tests", "Microsoft.DotNet.MSBuildSdkResolver.Tests\Microsoft.DotNet.MSBuildSdkResolver.Tests.csproj", "{42A0CAB4-FFAD-47D4-9880-C0F4EDCF93DE}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnet-clean.Tests", "dotnet-clean.Tests\dotnet-clean.Tests.csproj", "{D9A582B8-1FE2-45D5-B139-0BA828FE3691}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-clean.Tests", "dotnet-clean.Tests\dotnet-clean.Tests.csproj", "{D9A582B8-1FE2-45D5-B139-0BA828FE3691}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.TestFramework", "Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj", "{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.ShellShim.Tests", "Microsoft.DotNet.ShellShim.Tests\Microsoft.DotNet.ShellShim.Tests.csproj", "{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.ToolPackage.Tests", "Microsoft.DotNet.ToolPackage.Tests\Microsoft.DotNet.ToolPackage.Tests.csproj", "{453C809B-40FC-4A93-93B8-DE449D48B9FF}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -488,16 +494,16 @@ Global
 		{27351B2F-325B-4843-9F4C-BC53FD06A7B5}.Release|x86.Build.0 = Release|Any CPU
 		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x64.ActiveCfg = Debug|x64
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x64.Build.0 = Debug|x64
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x86.ActiveCfg = Debug|x86
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x86.Build.0 = Debug|x86
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x64.Build.0 = Debug|Any CPU
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Debug|x86.Build.0 = Debug|Any CPU
 		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|Any CPU.Build.0 = Release|Any CPU
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x64.ActiveCfg = Release|x64
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x64.Build.0 = Release|x64
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x86.ActiveCfg = Release|x86
-		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x86.Build.0 = Release|x86
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x64.ActiveCfg = Release|Any CPU
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x64.Build.0 = Release|Any CPU
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x86.ActiveCfg = Release|Any CPU
+		{CF517B15-B307-4660-87D5-CC036ADECD4B}.Release|x86.Build.0 = Release|Any CPU
 		{42A0CAB4-FFAD-47D4-9880-C0F4EDCF93DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{42A0CAB4-FFAD-47D4-9880-C0F4EDCF93DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{42A0CAB4-FFAD-47D4-9880-C0F4EDCF93DE}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -512,16 +518,52 @@ Global
 		{42A0CAB4-FFAD-47D4-9880-C0F4EDCF93DE}.Release|x86.Build.0 = Release|Any CPU
 		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x64.ActiveCfg = Debug|x64
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x64.Build.0 = Debug|x64
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x86.ActiveCfg = Debug|x86
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x86.Build.0 = Debug|x86
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x64.Build.0 = Debug|Any CPU
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Debug|x86.Build.0 = Debug|Any CPU
 		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|Any CPU.Build.0 = Release|Any CPU
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x64.ActiveCfg = Release|x64
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x64.Build.0 = Release|x64
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x86.ActiveCfg = Release|x86
-		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x86.Build.0 = Release|x86
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x64.ActiveCfg = Release|Any CPU
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x64.Build.0 = Release|Any CPU
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x86.ActiveCfg = Release|Any CPU
+		{D9A582B8-1FE2-45D5-B139-0BA828FE3691}.Release|x86.Build.0 = Release|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Debug|x64.Build.0 = Debug|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Debug|x86.Build.0 = Debug|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Release|x64.ActiveCfg = Release|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Release|x64.Build.0 = Release|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Release|x86.ActiveCfg = Release|Any CPU
+		{D23AFC9C-8FD5-45DD-A84C-0E6528C42F0E}.Release|x86.Build.0 = Release|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Debug|x64.Build.0 = Debug|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Debug|x86.Build.0 = Debug|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Release|x64.ActiveCfg = Release|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Release|x64.Build.0 = Release|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Release|x86.ActiveCfg = Release|Any CPU
+		{1BBF0DFE-2138-4E29-BFA1-49A2F0B4C913}.Release|x86.Build.0 = Release|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Debug|x64.Build.0 = Debug|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Debug|x86.Build.0 = Debug|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Release|x64.ActiveCfg = Release|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Release|x64.Build.0 = Release|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Release|x86.ActiveCfg = Release|Any CPU
+		{453C809B-40FC-4A93-93B8-DE449D48B9FF}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -531,4 +573,7 @@ Global
 		{5767D8F0-4ED9-4083-8BDC-ED9E65AA86EF} = {15DDC326-69C3-4081-8AA1-B578B2BDE2C6}
 		{92BA9F90-E25B-4A1C-9598-2295D3DFC12F} = {BB393A93-1770-4753-B7D6-56F0DD378177}
 	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {7AF6777A-0133-453A-B302-FDD974B8F39C}
+	EndGlobalSection
 EndGlobal
diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs
index 109a449fc..a3f5976f5 100644
--- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs
+++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs
@@ -8,6 +8,7 @@ using Microsoft.DotNet.TestFramework;
 using Microsoft.DotNet.Tools.Test.Utilities;
 using NuGet.Frameworks;
 using Xunit;
+using Microsoft.DotNet.Tools.Tests.Utilities;
 
 namespace Microsoft.DotNet.Cli.Utils.Tests
 {
@@ -189,7 +190,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
                 .Should().Pass();
 
             var factory = new ProjectDependenciesCommandFactory(
-                FrameworkConstants.CommonFrameworks.NetCoreApp20,
+                NuGetFrameworks.NetCoreApp21,
                 configuration,
                 null,
                 null,
@@ -198,7 +199,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
             var command = factory.Create("dotnet-tool-with-output-name", null);
 
             command.CommandArgs.Should().Contain(
-                Path.Combine("toolwithoutputname", "1.0.0", "lib", "netcoreapp2.0", "dotnet-tool-with-output-name.dll"));
+                Path.Combine("toolwithoutputname", "1.0.0", "lib", "netcoreapp2.1", "dotnet-tool-with-output-name.dll"));
         }
     }
 }
diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs
index 74e4ec4e1..a7b6c402e 100644
--- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs
+++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs
@@ -11,6 +11,7 @@ using Microsoft.DotNet.TestFramework;
 using Microsoft.DotNet.Tools.Test.Utilities;
 using NuGet.Frameworks;
 using Xunit;
+using Microsoft.DotNet.Tools.Tests.Utilities;
 
 namespace Microsoft.DotNet.Cli.Utils.Tests
 {
@@ -47,7 +48,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
                 CommandName = "dotnet-portable",
                 Configuration = "Debug",
                 ProjectDirectory = MSBuildTestProjectInstance.Root.FullName,
-                Framework = FrameworkConstants.CommonFrameworks.NetCoreApp20
+                Framework = NuGetFrameworks.NetCoreApp21
             };
 
             var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
@@ -83,7 +84,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
                 CommandName = "dotnet-portable",
                 Configuration = "Debug",
                 ProjectDirectory = MSBuildTestProjectInstance.Root.FullName,
-                Framework = FrameworkConstants.CommonFrameworks.NetCoreApp20
+                Framework = NuGetFrameworks.NetCoreApp21
             };
 
             var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
@@ -109,7 +110,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
                 CommandName = "nonexistent-command",
                 CommandArguments = null,
                 ProjectDirectory = MSBuildTestProjectInstance.Root.FullName,
-                Framework = FrameworkConstants.CommonFrameworks.NetCoreApp20
+                Framework = NuGetFrameworks.NetCoreApp21
             };
 
             var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
@@ -135,7 +136,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
                 CommandName = "dotnet-portable",
                 Configuration = "Debug",
                 ProjectDirectory = testInstance.Root.FullName,
-                Framework = FrameworkConstants.CommonFrameworks.NetCoreApp20,
+                Framework = NuGetFrameworks.NetCoreApp21,
                 OutputPath = outputDir.FullName
             };
 
diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs
index 01967abfc..4b5a3874b 100644
--- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs
+++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs
@@ -12,13 +12,14 @@ using NuGet.Frameworks;
 using NuGet.ProjectModel;
 using NuGet.Versioning;
 using Xunit;
+using Microsoft.DotNet.Tools.Tests.Utilities;
 
 namespace Microsoft.DotNet.Tests
 {
     public class GivenAProjectToolsCommandResolver : TestBase
     {
         private static readonly NuGetFramework s_toolPackageFramework =
-            FrameworkConstants.CommonFrameworks.NetCoreApp20;
+            NuGetFrameworks.NetCoreApp21;
 
         private const string TestProjectName = "AppWithToolDependency";
 
@@ -303,7 +304,7 @@ namespace Microsoft.DotNet.Tests
 
             result.Should().NotBeNull();
 
-            result.Args.Should().Contain("--fx-version 2.0.5");
+            result.Args.Should().Contain("--fx-version 2.1.0");
         }
 
         [Fact]
@@ -369,7 +370,7 @@ namespace Microsoft.DotNet.Tests
                 "dotnet-fallbackfoldertool",
                 "1.0.0",
                 "lib",
-                "netcoreapp2.0",
+                "netcoreapp2.1",
                 "dotnet-fallbackfoldertool.dll"));
         }
 
diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/Microsoft.DotNet.Cli.Utils.Tests.csproj b/test/Microsoft.DotNet.Cli.Utils.Tests/Microsoft.DotNet.Cli.Utils.Tests.csproj
index 97c931472..d03b8c253 100644
--- a/test/Microsoft.DotNet.Cli.Utils.Tests/Microsoft.DotNet.Cli.Utils.Tests.csproj
+++ b/test/Microsoft.DotNet.Cli.Utils.Tests/Microsoft.DotNet.Cli.Utils.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -30,15 +28,16 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="NuGet.Versioning" Version="$(NuGetVersioningPackageVersion)" />
     <PackageReference Include="NuGet.Packaging" Version="$(NuGetPackagingPackageVersion)" />
     <PackageReference Include="NuGet.Frameworks" Version="$(NuGetFrameworksPackageVersion)" />
     <PackageReference Include="NuGet.ProjectModel" Version="$(NuGetProjectModelPackageVersion)" />
     <PackageReference Include="Moq" Version="4.7.25" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)" />
     <PackageReference Include="Microsoft.Build.Runtime" Version="$(MicrosoftBuildRuntimePackageVersion)" />
+    <PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
   </ItemGroup>
 </Project>
diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/PathUtilityTests.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/PathUtilityTests.cs
new file mode 100644
index 000000000..70e7768c7
--- /dev/null
+++ b/test/Microsoft.DotNet.Cli.Utils.Tests/PathUtilityTests.cs
@@ -0,0 +1,34 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.DotNet.Tools.Common;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using Xunit;
+
+namespace Microsoft.DotNet.Cli.Utils
+{
+    public class PathUtilityTests : TestBase
+    {
+        /// <summary>
+        /// Tests that PathUtility.GetRelativePath treats drive references as case insensitive on Windows.
+        /// </summary>
+        [WindowsOnlyFact]
+        public void GetRelativePathWithCaseInsensitiveDrives()
+        {
+            Assert.Equal(@"bar\", PathUtility.GetRelativePath(@"C:\foo\", @"C:\foo\bar\"));
+            Assert.Equal(@"Bar\Baz\", PathUtility.GetRelativePath(@"c:\foo\", @"C:\Foo\Bar\Baz\"));
+            Assert.Equal(@"baz\Qux\", PathUtility.GetRelativePath(@"C:\fOO\bar\", @"c:\foo\BAR\baz\Qux\"));
+            Assert.Equal(@"d:\foo\", PathUtility.GetRelativePath(@"C:\foo\", @"d:\foo\"));
+        }
+
+        /// <summary>
+        /// Tests that PathUtility.RemoveExtraPathSeparators works correctly with drive references on Windows.
+        /// </summary>
+        [WindowsOnlyFact]
+        public void RemoveExtraPathSeparatorsWithDrives()
+        {
+            Assert.Equal(@"c:\foo\bar\baz\", PathUtility.RemoveExtraPathSeparators(@"c:\\\foo\\\\bar\baz\\"));
+            Assert.Equal(@"D:\QUX\", PathUtility.RemoveExtraPathSeparators(@"D:\\\\\QUX\"));
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.Configurer.UnitTests/GivenADotnetFirstTimeUseConfigurer.cs b/test/Microsoft.DotNet.Configurer.UnitTests/GivenADotnetFirstTimeUseConfigurer.cs
index a9a0e904b..27b3247f4 100644
--- a/test/Microsoft.DotNet.Configurer.UnitTests/GivenADotnetFirstTimeUseConfigurer.cs
+++ b/test/Microsoft.DotNet.Configurer.UnitTests/GivenADotnetFirstTimeUseConfigurer.cs
@@ -18,16 +18,22 @@ namespace Microsoft.DotNet.Configurer.UnitTests
         private Mock<INuGetCachePrimer> _nugetCachePrimerMock;
         private Mock<INuGetCacheSentinel> _nugetCacheSentinelMock;
         private Mock<IFirstTimeUseNoticeSentinel> _firstTimeUseNoticeSentinelMock;
+        private Mock<IAspNetCertificateSentinel> _aspNetCertificateSentinelMock;
+        private Mock<IAspNetCoreCertificateGenerator> _aspNetCoreCertificateGeneratorMock;
         private Mock<IEnvironmentProvider> _environmentProviderMock;
         private Mock<IReporter> _reporterMock;
+        private Mock<IEnvironmentPath> _pathAdder;
 
         public GivenADotnetFirstTimeUseConfigurer()
         {
             _nugetCachePrimerMock = new Mock<INuGetCachePrimer>();
             _nugetCacheSentinelMock = new Mock<INuGetCacheSentinel>();
             _firstTimeUseNoticeSentinelMock = new Mock<IFirstTimeUseNoticeSentinel>();
+            _aspNetCertificateSentinelMock = new Mock<IAspNetCertificateSentinel>();
+            _aspNetCoreCertificateGeneratorMock = new Mock<IAspNetCoreCertificateGenerator>();
             _environmentProviderMock = new Mock<IEnvironmentProvider>();
             _reporterMock = new Mock<IReporter>();
+            _pathAdder = new Mock<IEnvironmentPath>();
 
             _environmentProviderMock
                 .Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
@@ -46,9 +52,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -68,9 +77,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -90,9 +102,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -109,9 +124,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -128,9 +146,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -146,9 +167,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -164,9 +188,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -185,9 +212,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -203,9 +233,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -222,9 +255,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -244,9 +280,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -258,6 +297,28 @@ namespace Microsoft.DotNet.Configurer.UnitTests
             _reporterMock.Verify(r => r.Write(It.IsAny<string>()), Times.Never);
         }
 
+        [Fact]
+        public void It_adds_executable_package_path_to_environment_path_when_the_first_notice_sentinel_does_not_exist()
+        {
+            _nugetCacheSentinelMock.Setup(n => n.Exists()).Returns(true);
+            _firstTimeUseNoticeSentinelMock.Setup(n => n.Exists()).Returns(false);
+
+            var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
+                _nugetCachePrimerMock.Object,
+                new FakeCreateWillExistNuGetCacheSentinel(false, true), 
+                new FakeCreateWillExistFirstTimeUseNoticeSentinel(false),
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
+                _environmentProviderMock.Object,
+                _reporterMock.Object,
+                CliFallbackFolderPath,
+                _pathAdder.Object);
+
+            dotnetFirstTimeUseConfigurer.Configure();
+            
+            _pathAdder.Verify(p => p.AddPackageExecutablePathToUserPath(), Times.AtLeastOnce);
+        }
+
         [Fact]
         public void It_prints_the_unauthorized_notice_if_the_cache_sentinel_reports_Unauthorized()
         {
@@ -267,9 +328,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
@@ -293,13 +357,171 @@ namespace Microsoft.DotNet.Configurer.UnitTests
                 _nugetCachePrimerMock.Object,
                 _nugetCacheSentinelMock.Object,
                 _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
                 _environmentProviderMock.Object,
                 _reporterMock.Object,
-                CliFallbackFolderPath);
+                CliFallbackFolderPath,
+                _pathAdder.Object);
 
             dotnetFirstTimeUseConfigurer.Configure();
 
             _nugetCachePrimerMock.Verify(r => r.PrimeCache(), Times.Never);
         }
+
+        [Fact]
+        public void It_does_not_generate_the_aspnet_https_development_certificate_if_the_sentinel_exists()
+        {
+            _aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(true);
+
+            var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
+                _nugetCachePrimerMock.Object,
+                _nugetCacheSentinelMock.Object,
+                _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
+                _environmentProviderMock.Object,
+                _reporterMock.Object,
+                CliFallbackFolderPath,
+                _pathAdder.Object);
+
+            dotnetFirstTimeUseConfigurer.Configure();
+
+            _reporterMock.Verify(r => r.WriteLine(It.Is<string>(str => str == LocalizableStrings.AspNetCertificateInstalled)), Times.Never);
+            _aspNetCoreCertificateGeneratorMock.Verify(s => s.GenerateAspNetCoreDevelopmentCertificate(), Times.Never);
+        }
+
+        [Fact]
+        public void It_does_not_generate_the_aspnet_https_development_certificate_when_the_user_has_set_the_DOTNET_SKIP_FIRST_TIME_EXPERIENCE_environment_variable()
+        {
+            _aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(false);
+            _environmentProviderMock
+                .Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
+                .Returns(true);
+
+            var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
+                _nugetCachePrimerMock.Object,
+                _nugetCacheSentinelMock.Object,
+                _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
+                _environmentProviderMock.Object,
+                _reporterMock.Object,
+                CliFallbackFolderPath,
+                _pathAdder.Object);
+
+            dotnetFirstTimeUseConfigurer.Configure();
+
+            _reporterMock.Verify(r => r.WriteLine(It.Is<string>(str => str == LocalizableStrings.AspNetCertificateInstalled)), Times.Never);
+            _aspNetCoreCertificateGeneratorMock.Verify(s => s.GenerateAspNetCoreDevelopmentCertificate(), Times.Never);
+        }
+
+        [Fact]
+        public void It_does_not_generate_the_aspnet_https_development_certificate_when_the_user_has_set_the_DOTNET_GENERATE_ASPNET_CERTIFICATE_environment_variable()
+        {
+            _aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(false);
+            _environmentProviderMock
+                .Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true))
+                .Returns(false);
+
+            var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
+                _nugetCachePrimerMock.Object,
+                _nugetCacheSentinelMock.Object,
+                _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
+                _environmentProviderMock.Object,
+                _reporterMock.Object,
+                CliFallbackFolderPath,
+                _pathAdder.Object);
+
+            dotnetFirstTimeUseConfigurer.Configure();
+
+            _reporterMock.Verify(r => r.WriteLine(It.Is<string>(str => str == LocalizableStrings.AspNetCertificateInstalled)), Times.Never);
+            _aspNetCoreCertificateGeneratorMock.Verify(s => s.GenerateAspNetCoreDevelopmentCertificate(), Times.Never);
+        }
+
+        [Fact]
+        public void It_generates_the_aspnet_https_development_certificate_if_the_sentinel_does_not_exist()
+        {
+            _aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(false);
+            _environmentProviderMock.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true))
+                .Returns(true);
+
+            var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
+                _nugetCachePrimerMock.Object,
+                _nugetCacheSentinelMock.Object,
+                _firstTimeUseNoticeSentinelMock.Object,
+                _aspNetCertificateSentinelMock.Object,
+                _aspNetCoreCertificateGeneratorMock.Object,
+                _environmentProviderMock.Object,
+                _reporterMock.Object,
+                CliFallbackFolderPath,
+                _pathAdder.Object);
+
+            dotnetFirstTimeUseConfigurer.Configure();
+
+            _reporterMock.Verify(r => r.WriteLine(It.Is<string>(str => str == LocalizableStrings.FirstTimeWelcomeMessage)));
+            _reporterMock.Verify(r => r.WriteLine(It.Is<string>(str => str == LocalizableStrings.NugetCachePrimeMessage)));
+            _reporterMock.Verify(r => r.WriteLine(It.Is<string>(str => str == LocalizableStrings.AspNetCertificateInstalled)));
+            _aspNetCoreCertificateGeneratorMock.Verify(s => s.GenerateAspNetCoreDevelopmentCertificate(), Times.Once);
+        }
+
+        private class FakeCreateWillExistFirstTimeUseNoticeSentinel : IFirstTimeUseNoticeSentinel
+        {
+            private bool _exists;
+
+            public FakeCreateWillExistFirstTimeUseNoticeSentinel(bool exists)
+            {
+                _exists = exists;
+            }
+
+            public void Dispose()
+            {
+            }
+
+            public bool Exists()
+            {
+                return _exists;
+            }
+
+            public void CreateIfNotExists()
+            {
+                _exists = true;
+            }
+        }
+
+        private class FakeCreateWillExistNuGetCacheSentinel : INuGetCacheSentinel
+        {
+            private bool _inProgressSentinelAlreadyExists;
+            private bool _exists;
+
+            public FakeCreateWillExistNuGetCacheSentinel(bool inProgressSentinelAlreadyExists, bool exists)
+            {
+                _inProgressSentinelAlreadyExists = inProgressSentinelAlreadyExists;
+                _exists = exists;
+            }
+
+            public void Dispose()
+            {
+            }
+
+            public bool InProgressSentinelAlreadyExists()
+            {
+                return _inProgressSentinelAlreadyExists;
+            }
+
+            public bool Exists()
+            {
+                return _exists;
+            }
+
+            public void CreateIfNotExists()
+            {
+                _exists = true;
+            }
+
+            public bool UnauthorizedAccess { get; set; }
+        }
     }
 }
diff --git a/test/Microsoft.DotNet.Configurer.UnitTests/GivenANuGetCachePrimer.cs b/test/Microsoft.DotNet.Configurer.UnitTests/GivenANuGetCachePrimer.cs
index f51fccb84..106afadac 100644
--- a/test/Microsoft.DotNet.Configurer.UnitTests/GivenANuGetCachePrimer.cs
+++ b/test/Microsoft.DotNet.Configurer.UnitTests/GivenANuGetCachePrimer.cs
@@ -26,7 +26,7 @@ namespace Microsoft.DotNet.Configurer.UnitTests
 
         private Mock<INuGetPackagesArchiver> _nugetPackagesArchiverMock;
         private Mock<INuGetCacheSentinel> _nugetCacheSentinel;
-        private CliFallbackFolderPathCalculator _cliFallbackFolderPathCalculator;
+        private CliFolderPathCalculator _cliFolderPathCalculator;
 
         public GivenANuGetCachePrimer()
         {
@@ -40,12 +40,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
 
             _nugetCacheSentinel = new Mock<INuGetCacheSentinel>();
 
-            _cliFallbackFolderPathCalculator = new CliFallbackFolderPathCalculator();
+            _cliFolderPathCalculator = new CliFolderPathCalculator();
 
             var nugetCachePrimer = new NuGetCachePrimer(
                 _nugetPackagesArchiverMock.Object,
                 _nugetCacheSentinel.Object,
-                _cliFallbackFolderPathCalculator,
+                _cliFolderPathCalculator,
                 _fileSystemMock.File);
 
             nugetCachePrimer.PrimeCache();
@@ -63,7 +63,7 @@ namespace Microsoft.DotNet.Configurer.UnitTests
             var nugetCachePrimer = new NuGetCachePrimer(
                 nugetPackagesArchiverMock.Object,
                 _nugetCacheSentinel.Object,
-                _cliFallbackFolderPathCalculator,
+                _cliFolderPathCalculator,
                 fileSystemMock.File);
 
             nugetCachePrimer.PrimeCache();
@@ -75,7 +75,7 @@ namespace Microsoft.DotNet.Configurer.UnitTests
         public void It_extracts_the_archive_to_the_fallback_folder()
         {
             _nugetPackagesArchiverMock.Verify(n =>
-                n.ExtractArchive(_cliFallbackFolderPathCalculator.CliFallbackFolderPath),
+                n.ExtractArchive(_cliFolderPathCalculator.CliFallbackFolderPath),
                 Times.Exactly(1));
         }
 
@@ -95,7 +95,7 @@ namespace Microsoft.DotNet.Configurer.UnitTests
             var nugetCachePrimer = new NuGetCachePrimer(
                 nugetPackagesArchiveMock.Object,
                 nugetCacheSentinel.Object,
-                _cliFallbackFolderPathCalculator,
+                _cliFolderPathCalculator,
                 _fileSystemMock.File);
 
             Action action = () => nugetCachePrimer.PrimeCache();
diff --git a/test/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs b/test/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs
new file mode 100644
index 000000000..a4d6eb558
--- /dev/null
+++ b/test/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs
@@ -0,0 +1,23 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using FluentAssertions;
+
+namespace Microsoft.DotNet.Configurer.UnitTests
+{
+    public class GivenAPathCalculator
+    {
+        [NonWindowsOnlyFact]
+        public void It_does_not_return_same_path_for_tools_package_and_tool_shim()
+        {
+            // shim name will conflict with the folder that is PackageId, if commandName and packageId are the same.
+            var cliFolderPathCalculator = new CliFolderPathCalculator();
+            cliFolderPathCalculator.ToolsPackagePath.Should().NotBe(cliFolderPathCalculator.ToolsShimPath);
+            cliFolderPathCalculator.ToolsPackagePath.Should().NotBe(cliFolderPathCalculator.ToolsShimPathInUnix.Path);
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.Configurer.UnitTests/Microsoft.DotNet.Configurer.UnitTests.csproj b/test/Microsoft.DotNet.Configurer.UnitTests/Microsoft.DotNet.Configurer.UnitTests.csproj
index d29825acd..a4a591438 100644
--- a/test/Microsoft.DotNet.Configurer.UnitTests/Microsoft.DotNet.Configurer.UnitTests.csproj
+++ b/test/Microsoft.DotNet.Configurer.UnitTests/Microsoft.DotNet.Configurer.UnitTests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -19,10 +17,11 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
     <PackageReference Include="Moq" Version="4.7.25" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
+    <PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
   </ItemGroup>
 </Project>
diff --git a/test/Microsoft.DotNet.MSBuildSdkResolver.Tests/Microsoft.DotNet.MSBuildSdkResolver.Tests.csproj b/test/Microsoft.DotNet.MSBuildSdkResolver.Tests/Microsoft.DotNet.MSBuildSdkResolver.Tests.csproj
index b009123c0..ddc1601cf 100644
--- a/test/Microsoft.DotNet.MSBuildSdkResolver.Tests/Microsoft.DotNet.MSBuildSdkResolver.Tests.csproj
+++ b/test/Microsoft.DotNet.MSBuildSdkResolver.Tests/Microsoft.DotNet.MSBuildSdkResolver.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <!-- https://github.com/dotnet/cli/issues/6672: Re-enable net461 as a TFM for tests. -->
     <TargetFrameworks>$(CliTargetFramework)</TargetFrameworks>
@@ -23,6 +21,7 @@
     <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="runtime.linux-x64.Microsoft.NETCore.DotNetHostResolver" Version="$(MicrosoftNETCoreDotNetHostResolverPackageVersion)" />
     <PackageReference Include="runtime.osx-x64.Microsoft.NETCore.DotNetHostResolver" Version="$(MicrosoftNETCoreDotNetHostResolverPackageVersion)" />
+    <PackageReference Include="runtime.alpine.3.6-x64.Microsoft.NETCore.DotNetHostResolver" Version="$(MicrosoftNETCoreDotNetHostResolverPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/FakeEnvironmentProvider.cs b/test/Microsoft.DotNet.ShellShim.Tests/FakeEnvironmentProvider.cs
new file mode 100644
index 000000000..e33918512
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/FakeEnvironmentProvider.cs
@@ -0,0 +1,48 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.DotNet.Cli.Utils;
+
+namespace Microsoft.DotNet.ShellShim.Tests
+{
+    internal class FakeEnvironmentProvider : IEnvironmentProvider
+    {
+        private readonly Dictionary<string, string> _environmentVariables;
+
+        public FakeEnvironmentProvider(Dictionary<string, string> environmentVariables)
+        {
+            _environmentVariables =
+                environmentVariables ?? throw new ArgumentNullException(nameof(environmentVariables));
+        }
+
+        public IEnumerable<string> ExecutableExtensions { get; }
+
+        public string GetCommandPath(string commandName, params string[] extensions)
+        {
+            throw new NotImplementedException();
+        }
+
+        public string GetCommandPathFromRootPath(string rootPath, string commandName, params string[] extensions)
+        {
+            throw new NotImplementedException();
+        }
+
+        public string GetCommandPathFromRootPath(string rootPath, string commandName,
+            IEnumerable<string> extensions)
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool GetEnvironmentVariableAsBool(string name, bool defaultValue)
+        {
+            throw new NotImplementedException();
+        }
+
+        public string GetEnvironmentVariable(string name)
+        {
+            return _environmentVariables.ContainsKey(name) ? _environmentVariables[name] : "";
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/FakeFile.cs b/test/Microsoft.DotNet.ShellShim.Tests/FakeFile.cs
new file mode 100644
index 000000000..bb9d46d6d
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/FakeFile.cs
@@ -0,0 +1,55 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Microsoft.Extensions.EnvironmentAbstractions;
+
+namespace Microsoft.DotNet.ShellShim.Tests
+{
+    internal class FakeFile : IFile
+    {
+        private Dictionary<string, string> _files;
+
+        public FakeFile(Dictionary<string, string> files)
+        {
+            _files = files;
+        }
+
+        public bool Exists(string path)
+        {
+            return _files.ContainsKey(path);
+        }
+
+        public string ReadAllText(string path)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Stream OpenRead(string path)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Stream OpenFile(string path, FileMode fileMode, FileAccess fileAccess, FileShare fileShare,
+            int bufferSize,
+            FileOptions fileOptions)
+        {
+            throw new NotImplementedException();
+        }
+
+
+        public void CreateEmptyFile(string path)
+        {
+            _files.Add(path, String.Empty);
+        }
+
+        public void WriteAllText(string path, string content)
+        {
+            _files[path] = content;
+        }
+
+        public static FakeFile Empty => new FakeFile(new Dictionary<string, string>());
+    }
+}
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/FakeReporter.cs b/test/Microsoft.DotNet.ShellShim.Tests/FakeReporter.cs
new file mode 100644
index 000000000..a75956df7
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/FakeReporter.cs
@@ -0,0 +1,28 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using Microsoft.DotNet.Cli.Utils;
+
+namespace Microsoft.DotNet.ShellShim.Tests
+{
+    internal class FakeReporter : IReporter
+    {
+        public string Message { get; private set; } = "";
+
+        public void WriteLine(string message)
+        {
+            Message = message;
+        }
+
+        public void WriteLine()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void Write(string message)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/LinuxEnvironmentPathTests.cs b/test/Microsoft.DotNet.ShellShim.Tests/LinuxEnvironmentPathTests.cs
new file mode 100644
index 000000000..e039e392b
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/LinuxEnvironmentPathTests.cs
@@ -0,0 +1,82 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using FluentAssertions;
+using Microsoft.DotNet.Configurer;
+using Microsoft.DotNet.Tools;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using Microsoft.Extensions.DependencyModel.Tests;
+using Xunit;
+
+namespace Microsoft.DotNet.ShellShim.Tests
+{
+    public class LinuxEnvironmentPathTests
+    {
+        [Fact]
+        public void GivenEnvironmentAndReporterItCanPrintOutInstructionToAddPath()
+        {
+            var fakeReporter = new FakeReporter();
+            var linuxEnvironmentPath = new LinuxEnvironmentPath(
+                new BashPathUnderHomeDirectory("/myhome", "executable/path"),
+                fakeReporter,
+                new FakeEnvironmentProvider(
+                    new Dictionary<string, string>
+                    {
+                        {"PATH", ""}
+                    }),
+                FakeFile.Empty);
+
+            linuxEnvironmentPath.PrintAddPathInstructionIfPathDoesNotExist();
+
+            // similar to https://code.visualstudio.com/docs/setup/mac
+            fakeReporter.Message.Should().Be(
+                string.Format(
+                    CommonLocalizableStrings.EnvironmentPathLinuxManualInstruction,
+                    "/myhome/executable/path", "/myhome/executable/path"));
+        }
+
+        [Fact]
+        public void GivenEnvironmentAndReporterItPrintsNothingWhenenvironmentExists()
+        {
+            var fakeReporter = new FakeReporter();
+            var linuxEnvironmentPath = new LinuxEnvironmentPath(
+                new BashPathUnderHomeDirectory("/myhome", "executable/path"),
+                fakeReporter,
+                new FakeEnvironmentProvider(
+                    new Dictionary<string, string>
+                    {
+                        {"PATH", @"/myhome/executable/path"}
+                    }),
+                FakeFile.Empty);
+
+            linuxEnvironmentPath.PrintAddPathInstructionIfPathDoesNotExist();
+
+            fakeReporter.Message.Should().BeEmpty();
+        }
+
+        [Fact]
+        public void GivenAddPackageExecutablePathToUserPathJustRunItPrintsInstructionToLogout()
+        {
+            var fakeReporter = new FakeReporter();
+            var linuxEnvironmentPath = new LinuxEnvironmentPath(
+                new BashPathUnderHomeDirectory("/myhome", "executable/path"),
+                fakeReporter,
+                new FakeEnvironmentProvider(
+                    new Dictionary<string, string>
+                    {
+                        {"PATH", @""}
+                    }),
+                FakeFile.Empty);
+            linuxEnvironmentPath.AddPackageExecutablePathToUserPath();
+
+            linuxEnvironmentPath.PrintAddPathInstructionIfPathDoesNotExist();
+
+            fakeReporter.Message.Should()
+                .Be(CommonLocalizableStrings.EnvironmentPathLinuxNeedLogout);
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/Microsoft.DotNet.ShellShim.Tests.csproj b/test/Microsoft.DotNet.ShellShim.Tests/Microsoft.DotNet.ShellShim.Tests.csproj
new file mode 100644
index 000000000..64fdac72b
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/Microsoft.DotNet.ShellShim.Tests.csproj
@@ -0,0 +1,25 @@
+<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <TargetFramework>$(CliTargetFramework)</TargetFramework>
+    <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
+    <AssemblyOriginatorKeyFile>../../tools/Key.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
+    <AssetTargetFallback>$(AssetTargetFallback);dotnet5.4;portable-net451+win8</AssetTargetFallback>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.Configurer\Microsoft.DotNet.Configurer.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.Tools.Tests.Utilities\Microsoft.DotNet.Tools.Tests.Utilities.csproj" />
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
+    <ProjectReference Include="..\..\src\dotnet\dotnet.csproj" />
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="FluentAssertions" Version="4.18.0" />
+    <PackageReference Include="Moq" Version="4.7.25" />
+    <PackageReference Include="xunit" Version="2.2.0" />
+    <PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
+  </ItemGroup>
+</Project>
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/OsxEnvironmentPathTests.cs b/test/Microsoft.DotNet.ShellShim.Tests/OsxEnvironmentPathTests.cs
new file mode 100644
index 000000000..230692608
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/OsxEnvironmentPathTests.cs
@@ -0,0 +1,83 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using FluentAssertions;
+using Microsoft.DotNet.Configurer;
+using Microsoft.DotNet.Tools;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using Microsoft.Extensions.DependencyModel.Tests;
+using Xunit;
+
+namespace Microsoft.DotNet.ShellShim.Tests
+{
+    public class OsxEnvironmentPathTests
+    {
+        [Fact]
+        public void GivenEnvironmentAndReporterItCanPrintOutInstructionToAddPath()
+        {
+            var fakeReporter = new FakeReporter();
+            var osxEnvironmentPath = new OSXEnvironmentPath(
+                new BashPathUnderHomeDirectory("/myhome", "executable/path"),
+                fakeReporter,
+                new FakeEnvironmentProvider(
+                    new Dictionary<string, string>
+                    {
+                        {"PATH", ""}
+                    }),
+                FakeFile.Empty);
+
+            osxEnvironmentPath.PrintAddPathInstructionIfPathDoesNotExist();
+
+            // similar to https://code.visualstudio.com/docs/setup/mac
+            fakeReporter.Message.Should().Be(
+                string.Format(
+                    CommonLocalizableStrings.EnvironmentPathOSXManualInstruction,
+                    "/myhome/executable/path", "/myhome/executable/path"));
+        }
+
+        [Theory]
+        [InlineData("/myhome/executable/path")]
+        [InlineData("~/executable/path")]
+        public void GivenEnvironmentAndReporterItPrintsNothingWhenenvironmentExists(string existingPath)
+        {
+            var fakeReporter = new FakeReporter();
+            var osxEnvironmentPath = new OSXEnvironmentPath(
+                new BashPathUnderHomeDirectory("/myhome", "executable/path"),
+                fakeReporter,
+                new FakeEnvironmentProvider(
+                    new Dictionary<string, string>
+                    {
+                        {"PATH", existingPath}
+                    }),
+                FakeFile.Empty);
+
+            osxEnvironmentPath.PrintAddPathInstructionIfPathDoesNotExist();
+
+            fakeReporter.Message.Should().BeEmpty();
+        }
+
+        [Fact]
+        public void GivenAddPackageExecutablePathToUserPathJustRunItPrintsInstructionToLogout()
+        {
+            var fakeReporter = new FakeReporter();
+            var osxEnvironmentPath = new OSXEnvironmentPath(
+                new BashPathUnderHomeDirectory("/myhome", "executable/path"),
+                fakeReporter,
+                new FakeEnvironmentProvider(
+                    new Dictionary<string, string>
+                    {
+                        {"PATH", @""}
+                    }),
+                FakeFile.Empty);
+            osxEnvironmentPath.AddPackageExecutablePathToUserPath();
+
+            osxEnvironmentPath.PrintAddPathInstructionIfPathDoesNotExist();
+
+            fakeReporter.Message.Should().Be(CommonLocalizableStrings.EnvironmentPathOSXNeedReopen);
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ShellShim.Tests/ShellShimMakerTests.cs b/test/Microsoft.DotNet.ShellShim.Tests/ShellShimMakerTests.cs
new file mode 100644
index 000000000..702bace71
--- /dev/null
+++ b/test/Microsoft.DotNet.ShellShim.Tests/ShellShimMakerTests.cs
@@ -0,0 +1,196 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Xml.Linq;
+using FluentAssertions;
+using Microsoft.DotNet.Cli.Utils;
+using Microsoft.DotNet.TestFramework;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace Microsoft.DotNet.ShellShim.Tests
+{
+    public class ShellShimMakerTests : TestBase
+    {
+        private readonly ITestOutputHelper _output;
+
+        public ShellShimMakerTests(ITestOutputHelper output)
+        {
+            _output = output;
+        }
+
+        [Theory]
+        [InlineData("my_native_app.exe", null)]
+        [InlineData("./my_native_app.js", "nodejs")]
+        [InlineData(@"C:\tools\my_native_app.dll", "dotnet")]
+        public void GivenAnRunnerOrEntryPointItCanCreateConfig(string entryPoint, string runner)
+        {
+            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                return;
+
+            var shellShimMaker = new ShellShimMaker(TempRoot.Root);
+
+            var tmpFile = Path.Combine(TempRoot.Root, Path.GetRandomFileName());
+
+            shellShimMaker.CreateConfigFile(tmpFile, entryPoint, runner);
+
+            new FileInfo(tmpFile).Should().Exist();
+
+            var generated = XDocument.Load(tmpFile);
+
+            generated.Descendants("appSettings")
+                .Descendants("add")
+                .Should()
+                .Contain(e => e.Attribute("key").Value == "runner" && e.Attribute("value").Value == (runner ?? string.Empty))
+                .And
+                .Contain(e => e.Attribute("key").Value == "entryPoint" && e.Attribute("value").Value == entryPoint);
+        }
+
+        [Fact]
+        public void GivenAnExecutablePathItCanGenerateShimFile()
+        {
+            var outputDll = MakeHelloWorldExecutableDll();
+
+            var shellShimMaker = new ShellShimMaker(TempRoot.Root);
+            var shellCommandName = nameof(ShellShimMakerTests) + Path.GetRandomFileName();
+
+            shellShimMaker.CreateShim(
+                outputDll.FullName,
+                shellCommandName);
+            var stdOut = ExecuteInShell(shellCommandName);
+
+            stdOut.Should().Contain("Hello World");
+        }
+
+        [Fact]
+        public void GivenAnExecutablePathDirectoryThatDoesNotExistItCanGenerateShimFile()
+        {
+            var outputDll = MakeHelloWorldExecutableDll();
+            var extraNonExistDirectory = Path.GetRandomFileName();
+            var shellShimMaker = new ShellShimMaker(Path.Combine(TempRoot.Root, extraNonExistDirectory));
+            var shellCommandName = nameof(ShellShimMakerTests) + Path.GetRandomFileName();
+
+            Action a = () => shellShimMaker.CreateShim(
+                outputDll.FullName,
+                shellCommandName);
+            a.ShouldNotThrow<DirectoryNotFoundException>();
+        }
+
+        [Theory]
+        [InlineData("arg1 arg2", new[] { "arg1", "arg2" })]
+        [InlineData(" \"arg1 with space\" arg2", new[] { "arg1 with space", "arg2" })]
+        [InlineData(" \"arg with ' quote\" ", new[] { "arg with ' quote" })]
+        public void GivenAShimItPassesThroughArguments(string arguments, string[] expectedPassThru)
+        {
+            var outputDll = MakeHelloWorldExecutableDll();
+
+            var shellShimMaker = new ShellShimMaker(TempRoot.Root);
+            var shellCommandName = nameof(ShellShimMakerTests) + Path.GetRandomFileName();
+
+            shellShimMaker.CreateShim(
+                outputDll.FullName,
+                shellCommandName);
+
+            var stdOut = ExecuteInShell(shellCommandName, arguments);
+
+            for (int i = 0; i < expectedPassThru.Length; i++)
+            {
+                stdOut.Should().Contain($"{i} = {expectedPassThru[i]}");
+            }
+        }
+
+        [Fact]
+        public void GivenAnExecutablePathWithExistingSameNameShimItThrows()
+        {
+            var shellCommandName = nameof(ShellShimMakerTests) + Path.GetRandomFileName();
+
+            MakeNameConflictingCommand(TempRoot.Root, shellCommandName);
+
+            var shellShimMaker = new ShellShimMaker(TempRoot.Root);
+
+            Action a = () => shellShimMaker.EnsureCommandNameUniqueness(shellCommandName);
+            a.ShouldThrow<GracefulException>()
+                .And.Message
+                .Should().Contain(
+                    $"Failed to install tool {shellCommandName}. A command with the same name already exists.");
+        }
+
+
+        [Fact]
+        public void GivenAnExecutablePathWithoutExistingSameNameShimItShouldNotThrow()
+        {
+            var shellCommandName = nameof(ShellShimMakerTests) + Path.GetRandomFileName();
+
+            var shellShimMaker = new ShellShimMaker(TempRoot.Root);
+
+            Action a = () => shellShimMaker.EnsureCommandNameUniqueness(shellCommandName);
+            a.ShouldNotThrow();
+        }
+
+        private static void MakeNameConflictingCommand(string pathToPlaceShim, string shellCommandName)
+        {
+            File.WriteAllText(Path.Combine(pathToPlaceShim, shellCommandName), string.Empty);
+        }
+
+        private string ExecuteInShell(string shellCommandName, string arguments = "")
+        {
+            ProcessStartInfo processStartInfo;
+
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                var file = Path.Combine(TempRoot.Root, shellCommandName + ".exe");
+                processStartInfo = new ProcessStartInfo
+                {
+                    FileName = file,
+                    UseShellExecute = false,
+                    Arguments = arguments,
+                };
+            }
+            else
+            {
+                processStartInfo = new ProcessStartInfo
+                {
+                    FileName = "sh",
+                    Arguments = shellCommandName + " " + arguments,
+                    UseShellExecute = false
+                };
+            }
+
+            _output.WriteLine($"Launching '{processStartInfo.FileName} {processStartInfo.Arguments}'");
+            processStartInfo.WorkingDirectory = TempRoot.Root;
+            processStartInfo.EnvironmentVariables["PATH"] = Path.GetDirectoryName(new Muxer().MuxerPath);
+
+            processStartInfo.ExecuteAndCaptureOutput(out var stdOut, out var stdErr);
+
+            stdErr.Should().BeEmpty();
+
+            return stdOut ?? "";
+        }
+
+        private static FileInfo MakeHelloWorldExecutableDll()
+        {
+            const string testAppName = "TestAppSimple";
+            const string emptySpaceToTestSpaceInPath = " ";
+            const string directoryNamePostFix = "Test";
+            TestAssetInstance testInstance = TestAssets.Get(testAppName)
+                .CreateInstance(testAppName + emptySpaceToTestSpaceInPath + directoryNamePostFix)
+                .UseCurrentRuntimeFrameworkVersion()
+                .WithRestoreFiles()
+                .WithBuildFiles();
+
+            var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
+
+            FileInfo outputDll = testInstance.Root.GetDirectory("bin", configuration)
+                .GetDirectories().Single()
+                .GetFile($"{testAppName}.dll");
+
+            return outputDll;
+        }
+    }
+}
diff --git a/src/Microsoft.DotNet.TestFramework/Extensions/DirectoryInfoExtensions.cs b/test/Microsoft.DotNet.TestFramework/Extensions/DirectoryInfoExtensions.cs
similarity index 100%
rename from src/Microsoft.DotNet.TestFramework/Extensions/DirectoryInfoExtensions.cs
rename to test/Microsoft.DotNet.TestFramework/Extensions/DirectoryInfoExtensions.cs
diff --git a/src/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj b/test/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj
similarity index 72%
rename from src/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj
rename to test/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj
index 4e9b4a96f..d9663e868 100644
--- a/src/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj
+++ b/test/Microsoft.DotNet.TestFramework/Microsoft.DotNet.TestFramework.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <Description>Microsoft.DotNet.TestFramework Class Library</Description>
@@ -8,10 +7,11 @@
     <AssemblyOriginatorKeyFile>../../tools/Key.snk</AssemblyOriginatorKeyFile>
     <SignAssembly>true</SignAssembly>
     <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
+    <NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
   </ItemGroup>
 
 </Project>
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Archive/Properties/AssemblyInfo.cs b/test/Microsoft.DotNet.TestFramework/Properties/AssemblyInfo.cs
similarity index 100%
rename from src/Microsoft.DotNet.Archive/Properties/AssemblyInfo.cs
rename to test/Microsoft.DotNet.TestFramework/Properties/AssemblyInfo.cs
diff --git a/src/Microsoft.DotNet.TestFramework/TestAssetInfo.cs b/test/Microsoft.DotNet.TestFramework/TestAssetInfo.cs
similarity index 70%
rename from src/Microsoft.DotNet.TestFramework/TestAssetInfo.cs
rename to test/Microsoft.DotNet.TestFramework/TestAssetInfo.cs
index f5ca0aebe..bec0b5729 100644
--- a/src/Microsoft.DotNet.TestFramework/TestAssetInfo.cs
+++ b/test/Microsoft.DotNet.TestFramework/TestAssetInfo.cs
@@ -15,13 +15,15 @@ namespace Microsoft.DotNet.TestFramework
 
         public string AssetName { get; private set; }
 
-        public FileInfo DotnetExeFile { get; private set; }
+        public FileInfo DotnetExeFile => _testAssets.DotnetCsprojExe;
 
-        public string ProjectFilePattern { get; private set; }
+        public string ProjectFilePattern => "*.csproj";
 
         public DirectoryInfo Root { get; private set; }
 
-        internal TestAssetInfo(DirectoryInfo root, string assetName, FileInfo dotnetExeFile, string projectFilePattern)
+        private TestAssets _testAssets { get; }
+
+        internal TestAssetInfo(DirectoryInfo root, string assetName, TestAssets testAssets)
         {
             if (root == null)
             {
@@ -33,23 +35,16 @@ namespace Microsoft.DotNet.TestFramework
                 throw new ArgumentException("Argument cannot be null or whitespace", nameof(assetName));
             }
 
-            if (dotnetExeFile == null)
+            if (testAssets == null)
             {
-                throw new ArgumentNullException(nameof(dotnetExeFile));
-            }
-
-            if (string.IsNullOrWhiteSpace(projectFilePattern))
-            {
-                throw new ArgumentException("Argument cannot be null or whitespace", nameof(projectFilePattern));
+                throw new ArgumentNullException(nameof(testAssets));
             }
 
             Root = root;
 
             AssetName = assetName;
 
-            DotnetExeFile = dotnetExeFile;
-
-            ProjectFilePattern = projectFilePattern;
+            _testAssets = testAssets;
         }
 
         public TestAssetInstance CreateInstance([CallerMemberName] string callingMethod = "", string identifier = "")
@@ -71,12 +66,7 @@ namespace Microsoft.DotNet.TestFramework
 
         private DirectoryInfo GetTestDestinationDirectory(string callingMethod, string identifier)
         {
-#if NET451
-            string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
-#else
-            string baseDirectory = AppContext.BaseDirectory;
-#endif
-            return new DirectoryInfo(Path.Combine(baseDirectory, callingMethod + identifier, AssetName));
+            return _testAssets.CreateTestDirectory(AssetName, callingMethod, identifier);
         }
 
         private void ThrowIfTestAssetDoesNotExist()
diff --git a/src/Microsoft.DotNet.TestFramework/TestAssetInstance.cs b/test/Microsoft.DotNet.TestFramework/TestAssetInstance.cs
similarity index 97%
rename from src/Microsoft.DotNet.TestFramework/TestAssetInstance.cs
rename to test/Microsoft.DotNet.TestFramework/TestAssetInstance.cs
index bf75f00c2..4d27d0fe7 100644
--- a/src/Microsoft.DotNet.TestFramework/TestAssetInstance.cs
+++ b/test/Microsoft.DotNet.TestFramework/TestAssetInstance.cs
@@ -51,7 +51,14 @@ namespace Microsoft.DotNet.TestFramework
 
             if (Root.Exists)
             {
-                Root.Delete(recursive: true);
+                try
+                {
+                    Root.Delete(recursive: true);
+                }
+                catch (IOException ex)
+                {
+                    throw new InvalidOperationException("Unable to delete directory: " + Root.FullName, ex);
+                }
             }
 
             Root.Create();
diff --git a/src/Microsoft.DotNet.TestFramework/TestAssetInventoryFiles.cs b/test/Microsoft.DotNet.TestFramework/TestAssetInventoryFiles.cs
similarity index 100%
rename from src/Microsoft.DotNet.TestFramework/TestAssetInventoryFiles.cs
rename to test/Microsoft.DotNet.TestFramework/TestAssetInventoryFiles.cs
diff --git a/src/Microsoft.DotNet.TestFramework/TestAssetKinds.cs b/test/Microsoft.DotNet.TestFramework/TestAssetKinds.cs
similarity index 100%
rename from src/Microsoft.DotNet.TestFramework/TestAssetKinds.cs
rename to test/Microsoft.DotNet.TestFramework/TestAssetKinds.cs
diff --git a/src/Microsoft.DotNet.TestFramework/TestAssets.cs b/test/Microsoft.DotNet.TestFramework/TestAssets.cs
similarity index 64%
rename from src/Microsoft.DotNet.TestFramework/TestAssets.cs
rename to test/Microsoft.DotNet.TestFramework/TestAssets.cs
index 0e47e3ba9..6d05788fd 100644
--- a/src/Microsoft.DotNet.TestFramework/TestAssets.cs
+++ b/test/Microsoft.DotNet.TestFramework/TestAssets.cs
@@ -17,13 +17,11 @@ namespace Microsoft.DotNet.TestFramework
 
         private FileInfo _dotnetCsprojExe;
 
-        private FileInfo _dotnetProjectJsonExe;
+        private string _testWorkingFolder;
 
-        private const string ProjectJsonSearchPattern = "project.json";
+        public FileInfo DotnetCsprojExe => _dotnetCsprojExe;
 
-        private const string CsprojSearchPattern = "*.csproj";
-
-        public TestAssets(DirectoryInfo assetsRoot, FileInfo dotnetCsprojExe, FileInfo dotnetProjectJsonExe)
+        public TestAssets(DirectoryInfo assetsRoot, FileInfo dotnetCsprojExe, string testWorkingFolder)
         {
             if (assetsRoot == null)
             {
@@ -35,11 +33,6 @@ namespace Microsoft.DotNet.TestFramework
                 throw new ArgumentNullException(nameof(dotnetCsprojExe));
             }
 
-            if (dotnetProjectJsonExe == null)
-            {
-                throw new ArgumentNullException(nameof(dotnetProjectJsonExe));
-            }
-            
             if (!assetsRoot.Exists)
             {
                 throw new DirectoryNotFoundException($"Directory not found at '{assetsRoot}'");
@@ -50,16 +43,10 @@ namespace Microsoft.DotNet.TestFramework
                 throw new FileNotFoundException("Csproj dotnet executable must exist", dotnetCsprojExe.FullName);
             }
 
-            if (!dotnetProjectJsonExe.Exists)
-            {
-                throw new FileNotFoundException("project.json dotnet executable must exist", dotnetProjectJsonExe.FullName);
-            }
-
             _root = assetsRoot;
 
             _dotnetCsprojExe = dotnetCsprojExe;
-
-            _dotnetProjectJsonExe = dotnetProjectJsonExe;
+            _testWorkingFolder = testWorkingFolder;
         }
 
         public TestAssetInfo Get(string name)
@@ -74,24 +61,7 @@ namespace Microsoft.DotNet.TestFramework
             return new TestAssetInfo(
                 assetDirectory, 
                 name, 
-                _dotnetCsprojExe,
-                CsprojSearchPattern);
-        }
-
-        public TestAssetInfo GetProjectJson(string name)
-        {
-            return GetProjectJson(TestAssetKinds.TestProjects, name);
-        }
-
-        public TestAssetInfo GetProjectJson(string kind, string name)
-        {
-            var assetDirectory = new DirectoryInfo(Path.Combine(_root.FullName, kind, name));
-
-            return new TestAssetInfo(
-                assetDirectory, 
-                name, 
-                _dotnetProjectJsonExe,
-                ProjectJsonSearchPattern);
+                this);
         }
 
         public DirectoryInfo CreateTestDirectory(string testProjectName = "temp", [CallerMemberName] string callingMethod = "", string identifier = "")
@@ -112,7 +82,10 @@ namespace Microsoft.DotNet.TestFramework
 #else
             string baseDirectory = AppContext.BaseDirectory;
 #endif
-            return Path.Combine(baseDirectory, callingMethod + identifier, testProjectName);
+            //  Find the name of the assembly the test comes from based on the the base directory and how the output path has been constructed
+            string testAssemblyName = new DirectoryInfo(baseDirectory).Parent.Parent.Name;
+
+            return Path.Combine(_testWorkingFolder, testAssemblyName, callingMethod + identifier, testProjectName);
         }
     }
 }
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsGolden.xml b/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsGolden.xml
new file mode 100644
index 000000000..cd4f20107
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsGolden.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DotNetCliTool>
+  <Commands>
+    <Command Name="sayhello" EntryPoint="console.dll" Runner="dotnet" />
+  </Commands>
+</DotNetCliTool>
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsMalformed.xml b/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsMalformed.xml
new file mode 100644
index 000000000..0aa8173ad
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsMalformed.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DotNetCliTool>
+  <Commands Malformed=""
+    <Command Name="sayhello" EntryPoint="console.dll" Runner="dotnet" />
+  </Commands>
+</DotNetCliTool>
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsMissing.xml b/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsMissing.xml
new file mode 100644
index 000000000..87134da29
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/DotnetToolSettingsMissing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DotNetCliTool>
+  <Commands>
+    <Command EntryPoint="console.dll" Runner="dotnet" />
+  </Commands>
+</DotNetCliTool>
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/LockFileMatcherTests.cs b/test/Microsoft.DotNet.ToolPackage.Tests/LockFileMatcherTests.cs
new file mode 100644
index 000000000..0a0a0cb03
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/LockFileMatcherTests.cs
@@ -0,0 +1,28 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using NuGet.ProjectModel;
+using Xunit;
+
+namespace Microsoft.DotNet.ToolPackage.Tests
+{
+    public class LockFileMatcherTests : TestBase
+    {
+
+        [Theory]
+        [InlineData("tools/netcoreapp1.1/any/tool.dll", "tool.dll", true)]
+        [InlineData(@"tools\netcoreapp1.1\any\subDirectory\tool.dll", "subDirectory/tool.dll", true)]
+        [InlineData("tools/netcoreapp1.1/win-x64/tool.dll", "tool.dll", true)]
+        [InlineData("tools/netcoreapp1.1/any/subDirectory/tool.dll", "subDirectory/tool.dll", true)]
+        [InlineData("libs/netcoreapp1.1/any/tool.dll", "tool.dll", false)]
+        [InlineData("tools/netcoreapp1.1/any/subDirectory/tool.dll", "tool.dll", false)]
+        [InlineData("tools/netcoreapp1.1/any/subDirectory/tool.dll", "subDirectory/subDirectory/subDirectory/subDirectory/subDirectory/tool.dll", false)]
+        public void MatchesEntryPointTests(string pathInLockFileItem, string targetRelativeFilePath, bool shouldMatch)
+        {
+            LockFileMatcher.MatchesFile(new LockFileItem(pathInLockFileItem), targetRelativeFilePath)
+                .Should().Be(shouldMatch);
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj b/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj
new file mode 100644
index 000000000..736655e5b
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj
@@ -0,0 +1,67 @@
+<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <TargetFramework>$(CliTargetFramework)</TargetFramework>
+    <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
+    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
+    <AssemblyOriginatorKeyFile>../../tools/Key.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
+    <AssetTargetFallback>$(AssetTargetFallback);dotnet5.4;portable-net451+win8</AssetTargetFallback>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\dotnet\dotnet.csproj" />
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.Configurer\Microsoft.DotNet.Configurer.csproj" />
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.Tools.Tests.Utilities\Microsoft.DotNet.Tools.Tests.Utilities.csproj" />
+    <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="FluentAssertions" Version="4.18.0" />
+    <PackageReference Include="Moq" Version="4.7.25" />
+    <PackageReference Include="xunit" Version="2.2.0" />
+    <PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Update="DotnetToolSettingsMissing.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="DotnetToolSettingsMalformed.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="DotnetToolSettingsGolden.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+
+    <Compile Remove="SampleGlobalTool/**" />
+    <Content Remove="SampleGlobalTool/**" />
+    <EmbeddedResource Remove="SampleGlobalTool/**" />
+    <None Remove="SampleGlobalTool/**" />
+  </ItemGroup>
+
+  <UsingTask TaskName="DownloadFile" AssemblyFile="$(CLIBuildDll)" />
+
+  <Target Name="CreateNupkgFromSource" BeforeTargets="Build">
+    <PropertyGroup>
+      <testAssetSourceRoot>$(BaseOutputPath)/TestAsset/SampleGlobalTool</testAssetSourceRoot>
+    </PropertyGroup>
+    <Copy SourceFiles="SampleGlobalTool/DotnetToolSettings.xml" DestinationFolder="$(testAssetSourceRoot)" />
+    <MSBuild BuildInParallel="False" Projects="SampleGlobalTool/consoledemo.csproj" Targets="Restore;Build;Publish" Properties="Configuration=Release;BaseOutputPath=$(testAssetSourceRoot)/bin/">
+    </MSBuild>
+    <MSBuild BuildInParallel="False" Projects="SampleGlobalTool/consoledemo.csproj" Targets="pack" Properties="Configuration=Release;NuspecFile=includepublish.nuspec;NuspecBasePath=$(testAssetSourceRoot);PackageOutputPath=$(OutputPath)/TestAssetLocalNugetFeed">
+    </MSBuild>
+  </Target>
+
+  <Target Name="DownloadTestAssetPackages" BeforeTargets="Build">
+    <PropertyGroup>
+      <!-- use a prerelease version that supports alpine -->
+      <PlatformsNupkgFileName>microsoft.netcore.platforms.2.1.0-preview1-26115-04.nupkg</PlatformsNupkgFileName>
+      <PlatformsNupkgUri>https://dotnet.myget.org/F/dotnet-core/api/v2/package/Microsoft.NETCore.Platforms/2.1.0-preview1-26115-04</PlatformsNupkgUri>
+    </PropertyGroup>
+
+    <DownloadFile Uri="$(PlatformsNupkgUri)"
+                  DestinationPath="$(OutputPath)/TestAssetLocalNugetFeed/$(PlatformsNupkgFileName)" />
+  </Target>
+
+</Project>
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/DotnetToolSettings.xml b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/DotnetToolSettings.xml
new file mode 100644
index 000000000..b9c18a1e7
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/DotnetToolSettings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DotNetCliTool>
+  <Commands>
+    <Command Name="demo" EntryPoint="consoledemo.dll" Runner="dotnet" />
+  </Commands>
+</DotNetCliTool>
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/Program.cs b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/Program.cs
new file mode 100644
index 000000000..1140102df
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/Program.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+
+namespace consoledemo
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            var greeting = "Hello World from Global Tool";
+            Console.WriteLine(greeting);
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/consoledemo.csproj b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/consoledemo.csproj
new file mode 100644
index 000000000..4e16cac58
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/consoledemo.csproj
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+     <AssemblyName>consoledemo</AssemblyName>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/includepublish.nuspec b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/includepublish.nuspec
new file mode 100644
index 000000000..26cbe3c39
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalTool/includepublish.nuspec
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+    <metadata>
+        <id>global.tool.console.demo</id>
+        <version>1.0.4</version>
+        <description>test app</description>
+        <authors>testauthor</authors>
+        <packageTypes>
+          <packageType name="DotnetTool" />
+        </packageTypes>
+      <dependencies>
+        <dependency id="Microsoft.NETCore.Platforms" version="2.1.0-preview1-26115-04" />
+      </dependencies>
+    </metadata>
+    <files>
+        <file src="bin\Release\netcoreapp2.1\publish\*.*" target="tools\netcoreapp2.1\any\" />
+        <file src="DotnetToolSettings.xml" target="tools\netcoreapp2.1\any\DotnetToolSettings.xml" />
+    </files>
+</package>
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/ToolConfigurationDeserializerTests.cs b/test/Microsoft.DotNet.ToolPackage.Tests/ToolConfigurationDeserializerTests.cs
new file mode 100644
index 000000000..0c739f674
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/ToolConfigurationDeserializerTests.cs
@@ -0,0 +1,53 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using FluentAssertions;
+using Microsoft.DotNet.Tools;
+using NuGet.Protocol.Core.Types;
+using Xunit;
+
+namespace Microsoft.DotNet.ToolPackage.Tests
+{
+    public class ToolConfigurationDeserializerTests
+    {
+        [Fact]
+        public void GivenXmlPathItShouldGetToolConfiguration()
+        {
+            ToolConfiguration toolConfiguration = ToolConfigurationDeserializer.Deserialize("DotnetToolSettingsGolden.xml");
+
+            toolConfiguration.CommandName.Should().Be("sayhello");
+            toolConfiguration.ToolAssemblyEntryPoint.Should().Be("console.dll");
+        }
+
+        [Fact]
+        public void GivenMalformedPathItThrows()
+        {
+            Action a = () => ToolConfigurationDeserializer.Deserialize("DotnetToolSettingsMalformed.xml");
+            a.ShouldThrow<ToolConfigurationException>()
+                .And.Message.Should()
+                .Contain(string.Format(CommonLocalizableStrings.ToolSettingsInvalidXml, string.Empty));
+        }
+
+        [Fact]
+        public void GivenMissingContentItThrows()
+        {
+            Action a = () => ToolConfigurationDeserializer.Deserialize("DotnetToolSettingsMissing.xml");
+            a.ShouldThrow<ToolConfigurationException>()
+                .And.Message.Should()
+                .Contain(string.Format(CommonLocalizableStrings.ToolSettingsContainError, string.Empty));
+        }
+
+        [Fact]
+        public void GivenInvalidCharAsFileNameItThrows()
+        {
+            Action a = () => new ToolConfiguration("na\0me", "my.dll");
+            a.ShouldThrow<ArgumentException>()
+                .And.Message.Should()
+                .Contain(string.Format(CommonLocalizableStrings.ContainInvalidCharacters, string.Empty));
+        }
+    }
+}
diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageObtainerTests.cs b/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageObtainerTests.cs
new file mode 100644
index 000000000..4e948966e
--- /dev/null
+++ b/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageObtainerTests.cs
@@ -0,0 +1,312 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using System.Reflection;
+using FluentAssertions;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using Microsoft.Extensions.EnvironmentAbstractions;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Tools.Install.Tool;
+using Xunit;
+
+namespace Microsoft.DotNet.ToolPackage.Tests
+{
+    public class ToolPackageObtainerTests : TestBase
+    {
+        [Fact]
+        public void GivenNugetConfigAndPackageNameAndVersionAndTargetFrameworkWhenCallItCanDownloadThePackage()
+        {
+            FilePath nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer =
+                ConstructDefaultPackageObtainer(toolsPath);
+            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath = packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                packageVersion: TestPackageVersion,
+                nugetconfig: nugetConfigPath,
+                targetframework: _testTargetframework);
+
+            var executable = toolConfigurationAndExecutablePath
+                .Executable;
+
+            File.Exists(executable.Value)
+                .Should()
+                .BeTrue(executable + " should have the executable");
+        }
+
+        [Fact]
+        public void GivenNoFeedItThrows()
+        {
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            ToolPackageObtainer packageObtainer =
+                ConstructDefaultPackageObtainer(toolsPath);
+
+            Action a = () => packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                packageVersion: TestPackageVersion,
+                targetframework: _testTargetframework);
+
+            a.ShouldThrow<PackageObtainException>();
+        }
+
+        [Fact]
+        public void GivenOfflineFeedWhenCallItCanDownloadThePackage()
+        {
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            ToolPackageObtainer packageObtainer =
+                new ToolPackageObtainer(
+                    toolsPath: new DirectoryPath(toolsPath),
+                    offlineFeedPath: new DirectoryPath(GetTestLocalFeedPath()),
+                    getTempProjectPath: GetUniqueTempProjectPathEachTest,
+                    bundledTargetFrameworkMoniker: new Lazy<string>(),
+                    packageToProjectFileAdder: new PackageToProjectFileAdder(),
+                    projectRestorer: new ProjectRestorer());
+
+            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath =
+                packageObtainer.ObtainAndReturnExecutablePath(
+                    packageId: TestPackageId,
+                    packageVersion: TestPackageVersion,
+                    targetframework: _testTargetframework);
+
+            var executable = toolConfigurationAndExecutablePath
+                .Executable;
+
+            File.Exists(executable.Value)
+                .Should()
+                .BeTrue(executable + " should have the executable");
+
+            executable.Value.Should().NotContain(GetTestLocalFeedPath(), "Executalbe should not be still in fallbackfolder");
+            executable.Value.Should().Contain(toolsPath, "Executalbe should be copied to tools Path");
+        }
+
+        [Fact]
+        public void GivenNugetConfigAndPackageNameAndVersionAndTargetFrameworkWhenCallItCreateAssetFile()
+        {
+            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer =
+                ConstructDefaultPackageObtainer(toolsPath);
+
+            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath = packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                packageVersion: TestPackageVersion,
+                nugetconfig: nugetConfigPath,
+                targetframework: _testTargetframework);
+
+            /*
+              From mytool.dll to project.assets.json
+               .dotnet/.tools/packageid/version/packageid/version/mytool.dll
+                      /dependency1 package id/
+                      /dependency2 package id/
+                      /project.assets.json
+             */
+            var assetJsonPath = toolConfigurationAndExecutablePath
+                .Executable
+                .GetDirectoryPath()
+                .GetParentPath()
+                .GetParentPath()
+                .GetParentPath()
+                .GetParentPath()
+                .GetParentPath()
+                .WithFile("project.assets.json").Value;
+
+            File.Exists(assetJsonPath)
+                .Should()
+                .BeTrue(assetJsonPath + " should be created");
+        }
+
+        [Fact]
+        public void GivenAllButNoNugetConfigFilePathItCanDownloadThePackage()
+        {
+            var uniqueTempProjectPath = GetUniqueTempProjectPathEachTest();
+            var tempProjectDirectory = uniqueTempProjectPath.GetDirectoryPath();
+            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            Directory.CreateDirectory(tempProjectDirectory.Value);
+
+            /*
+             * In test, we don't want NuGet to keep look up, so we point current directory to nugetconfig.
+             */
+
+            Directory.SetCurrentDirectory(nugetConfigPath.GetDirectoryPath().Value);
+
+            var packageObtainer =
+                new ToolPackageObtainer(
+                    new DirectoryPath(toolsPath),
+                    new DirectoryPath("no such path"),
+                    () => uniqueTempProjectPath,
+                    new Lazy<string>(),
+                    new PackageToProjectFileAdder(),
+                    new ProjectRestorer());
+            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath =
+                packageObtainer.ObtainAndReturnExecutablePath(
+                    packageId: TestPackageId,
+                    packageVersion: TestPackageVersion,
+                    targetframework: _testTargetframework);
+
+            var executable = toolConfigurationAndExecutablePath.Executable;
+
+            File.Exists(executable.Value)
+                .Should()
+                .BeTrue(executable + " should have the executable");
+        }
+
+        [Fact]
+        public void GivenAllButNoPackageVersionItCanDownloadThePackage()
+        {
+            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer =
+                ConstructDefaultPackageObtainer(toolsPath);
+            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath = packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                packageVersion: TestPackageVersion,
+                nugetconfig: nugetConfigPath,
+                targetframework: _testTargetframework);
+
+            var executable = toolConfigurationAndExecutablePath.Executable;
+
+            File.Exists(executable.Value)
+                .Should()
+                .BeTrue(executable + " should have the executable");
+        }
+
+        [Fact]
+        public void GivenAllButNoPackageVersionAndInvokeTwiceItShouldNotThrow()
+        {
+            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer =
+                ConstructDefaultPackageObtainer(toolsPath);
+
+            packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                nugetconfig: nugetConfigPath,
+                targetframework: _testTargetframework);
+
+            Action secondCall = () => packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                nugetconfig: nugetConfigPath,
+                targetframework: _testTargetframework);
+
+            secondCall.ShouldNotThrow();
+        }
+
+
+        [Fact]
+        public void GivenAllButNoTargetFrameworkItCanDownloadThePackage()
+        {
+            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer =
+                new ToolPackageObtainer(
+                    new DirectoryPath(toolsPath),
+                    new DirectoryPath("no such path"),
+                    GetUniqueTempProjectPathEachTest,
+                    new Lazy<string>(() => BundledTargetFramework.GetTargetFrameworkMoniker()),
+                    new PackageToProjectFileAdder(),
+                    new ProjectRestorer());
+            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath =
+                packageObtainer.ObtainAndReturnExecutablePath(
+                    packageId: TestPackageId,
+                    packageVersion: TestPackageVersion,
+                    nugetconfig: nugetConfigPath);
+
+            var executable = toolConfigurationAndExecutablePath.Executable;
+
+            File.Exists(executable.Value)
+                .Should()
+                .BeTrue(executable + " should have the executable");
+        }
+
+        [Fact]
+        public void GivenNonExistentNugetConfigFileItThrows()
+        {
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer =
+                ConstructDefaultPackageObtainer(toolsPath);
+            Action a = () => packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                packageVersion: TestPackageVersion,
+                nugetconfig: new FilePath("NonExistent.file"),
+                targetframework: _testTargetframework);
+
+            a.ShouldThrow<PackageObtainException>()
+                .And
+                .Message.Should().Contain("does not exist");
+        }
+
+        [Fact]
+        public void GivenASourceItCanObtainThePackageFromThatSource()
+        {
+            var toolsPath = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());
+
+            var packageObtainer = ConstructDefaultPackageObtainer(toolsPath);
+            var toolConfigurationAndExecutableDirectory = packageObtainer.ObtainAndReturnExecutablePath(
+                packageId: TestPackageId,
+                packageVersion: TestPackageVersion,
+                targetframework: _testTargetframework,
+                source: GetTestLocalFeedPath());
+
+            var executable = toolConfigurationAndExecutableDirectory.Executable;
+
+            File.Exists(executable.Value)
+                .Should()
+                .BeTrue(executable + " should have the executable");
+        }
+
+        private static readonly Func<FilePath> GetUniqueTempProjectPathEachTest = () =>
+        {
+            var tempProjectDirectory =
+                new DirectoryPath(Path.GetTempPath()).WithSubDirectories(Path.GetRandomFileName());
+            var tempProjectPath =
+                tempProjectDirectory.WithFile(Path.GetRandomFileName() + ".csproj");
+            return tempProjectPath;
+        };
+
+        private static ToolPackageObtainer ConstructDefaultPackageObtainer(string toolsPath)
+        {
+            return new ToolPackageObtainer(
+                new DirectoryPath(toolsPath),
+                new DirectoryPath("no such path"),
+                GetUniqueTempProjectPathEachTest,
+                new Lazy<string>(),
+                new PackageToProjectFileAdder(),
+                new ProjectRestorer());
+        }
+
+        private static FilePath WriteNugetConfigFileToPointToTheFeed()
+        {
+            var nugetConfigName = "nuget.config";
+
+            var tempPathForNugetConfigWithWhiteSpace =
+                Path.Combine(Path.GetTempPath(),
+                Path.GetRandomFileName() + " " + Path.GetRandomFileName());
+            Directory.CreateDirectory(tempPathForNugetConfigWithWhiteSpace);
+
+            NuGetConfig.Write(
+                directory: tempPathForNugetConfigWithWhiteSpace,
+                configname: nugetConfigName,
+                localFeedPath: GetTestLocalFeedPath());
+
+            return new FilePath(Path.GetFullPath(Path.Combine(tempPathForNugetConfigWithWhiteSpace, nugetConfigName)));
+        }
+
+        private static string GetTestLocalFeedPath() => Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestAssetLocalNugetFeed");
+
+        private readonly string _testTargetframework = BundledTargetFramework.GetTargetFrameworkMoniker();
+        private const string TestPackageVersion = "1.0.4";
+        private const string TestPackageId = "global.tool.console.demo";
+    }
+}
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/Assertions/CommandResultAssertions.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/Assertions/CommandResultAssertions.cs
index f8317f34a..bdb460302 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/Assertions/CommandResultAssertions.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/Assertions/CommandResultAssertions.cs
@@ -69,6 +69,13 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
             return new AndConstraint<CommandResultAssertions>(this);
         }
 
+        public AndConstraint<CommandResultAssertions> NotHaveStdOutContaining(string pattern)
+        {
+            Execute.Assertion.ForCondition(!_commandResult.StdOut.Contains(pattern))
+                .FailWith(AppendDiagnosticsTo($"The command output contained a result it should not have contained: {pattern}{Environment.NewLine}"));
+            return new AndConstraint<CommandResultAssertions>(this);
+        }
+
         public AndConstraint<CommandResultAssertions> HaveStdOutMatching(string pattern, RegexOptions options = RegexOptions.None)
         {
             Execute.Assertion.ForCondition(Regex.Match(_commandResult.StdOut, pattern, options).Success)
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/BuildPJCommand.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/BuildPJCommand.cs
deleted file mode 100644
index 6b05edfe8..000000000
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/BuildPJCommand.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System.IO;
-using Microsoft.DotNet.Cli.Utils;
-using NuGet.Frameworks;
-
-namespace Microsoft.DotNet.Tools.Test.Utilities
-{
-    public sealed class BuildPJCommand : TestCommand
-    {
-
-        private bool _captureOutput;
-
-        private string _configuration;
-
-        private NuGetFramework _framework;
-
-        private string _runtime;
-
-        private bool _noDependencies;
-
-        private DirectoryInfo _outputPath;
-        
-        private FileInfo _projectFile;
-
-        private DirectoryInfo _workingDirectory;
-
-        public BuildPJCommand()
-            : base(new RepoDirectoriesProvider().PjDotnet)
-        {
-        }
-
-        public override CommandResult Execute(string args = "")
-        {
-            args = $"build {GetNoDependencies()} {GetProjectFile()} {GetOutputPath()} {GetConfiguration()} {GetFramework()} {GetRuntime()} {args}";
-
-            if (_workingDirectory != null)
-            {
-                this.WithWorkingDirectory(_workingDirectory.FullName);
-            }
-            
-            if (_captureOutput)
-            {
-                return base.ExecuteWithCapturedOutput(args);
-            }
-            else
-            {
-                return base.Execute(args);
-            }
-        }
-
-        public override CommandResult ExecuteWithCapturedOutput(string args = "")
-        {
-            WithCapturedOutput();
-
-            return Execute(args);
-        }
-
-        public BuildPJCommand WithCapturedOutput()
-        {
-            _captureOutput = true;
-
-            return this;
-        }
-
-        public BuildPJCommand WithConfiguration(string configuration)
-        {
-            _configuration = configuration;
-
-            return this;
-        }
-
-        public BuildPJCommand WithFramework(NuGetFramework framework)
-        {
-            _framework = framework;
-
-            return this;
-        }
-
-        public BuildPJCommand WithRuntime(string runtime)
-        {
-            _runtime = runtime;
-
-            return this;
-        }
-
-        public BuildPJCommand WithNoDependencies()
-        {
-            _noDependencies = true;
-
-            return this;
-        }
-
-        public BuildPJCommand WithOutputPath(DirectoryInfo outputPath)
-        {
-            _outputPath = outputPath;
-
-            return this;
-        }
-
-        public BuildPJCommand WithProjectDirectory(DirectoryInfo projectDirectory)
-        {
-            _workingDirectory = projectDirectory;
-
-            return this;
-        }
-
-        public BuildPJCommand WithProjectFile(FileInfo projectFile)
-        {
-            _projectFile = projectFile;
-
-            return this;
-        }
-
-        public BuildPJCommand WithWorkingDirectory(DirectoryInfo workingDirectory)
-        {
-            _workingDirectory = workingDirectory;
-
-            return this;
-        }
-
-        private string GetConfiguration()
-        {
-            if (_configuration == null)
-            {
-                return null;
-            }
-
-            return $"--configuration {_configuration}";
-        }
-
-        private string GetFramework()
-        {
-            if (_framework == null)
-            {
-                return null;
-            }
-
-            return $"--framework {_framework.GetShortFolderName()}";
-        }
-
-        private string GetRuntime()
-        {
-            if (_runtime == null)
-            {
-                return null;
-            }
-
-            return $"--runtime {_runtime}";
-        }
-
-        private string GetNoDependencies()
-        {
-            if (!_noDependencies)
-            {
-                return null;
-            }
-
-            return "--no-dependencies";
-        }
-
-        private string GetOutputPath()
-        {
-            if (_outputPath == null)
-            {
-                return null;
-            }
-
-            return $"\"{_outputPath.FullName}\"";
-        }
-
-        private string GetProjectFile()
-        {
-            if (_projectFile == null)
-            {
-                return null;
-            }
-
-            return $"\"{_projectFile.FullName}\"";
-        }
-    }
-}
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/RestoreProjectJsonCommand.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/RestoreProjectJsonCommand.cs
deleted file mode 100644
index a54d89605..000000000
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/RestoreProjectJsonCommand.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using Microsoft.DotNet.Cli.Utils;
-
-namespace Microsoft.DotNet.Tools.Test.Utilities
-{
-    public sealed class RestoreProjectJsonCommand : TestCommand
-    {
-        public RestoreProjectJsonCommand()
-            : base(new RepoDirectoriesProvider().PjDotnet)
-        {
-        }
-
-        public override CommandResult Execute(string args="")
-        {
-            args = $"restore {args}";
-
-            return base.Execute(args);
-        }
-
-        public override CommandResult ExecuteWithCapturedOutput(string args = "")
-        {
-            args = $"restore {args}";
-            return base.ExecuteWithCapturedOutput(args);
-        }
-    }
-}
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/TestCommand.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/TestCommand.cs
index 03ee56d6c..b8f3ca9cc 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/TestCommand.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/Commands/TestCommand.cs
@@ -238,6 +238,9 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
                 psi.Environment[item.Key] = item.Value;
 #endif
             }
+
+            //  Flow the TEST_PACKAGES environment variable to the child process
+            psi.Environment["TEST_PACKAGES"] = System.Environment.GetEnvironmentVariable("TEST_PACKAGES");
         }
 
         private void AddWorkingDirectoryTo(ProcessStartInfo psi)
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/EnvironmentInfo.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/EnvironmentInfo.cs
index 2f50d2e4e..51e2cfd06 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/EnvironmentInfo.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/EnvironmentInfo.cs
@@ -14,6 +14,8 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
                 switch (rid)
                 {
                     case "fedora.24-x64":
+                    case "rhel.6-x64":
+                    case "alpine.3.6-x64":
                     case "opensuse.42.1-x64":
                     case "ubuntu.16.10-x64":
                     case "linux-x64":
@@ -25,6 +27,17 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
                 switch (rid)
                 {
                     case "linux-x64":
+                    case "rhel.6-x64":
+                    case "alpine.3.6-x64":
+                        return false;
+                }
+            }
+            else if (framework == "netcoreapp2.0")
+            {
+                switch (rid)
+                {
+                    case "rhel.6-x64":
+                    case "alpine.3.6-x64":
                         return false;
                 }
             }
@@ -32,4 +45,4 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
             return true;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/Microsoft.DotNet.Tools.Tests.Utilities.csproj b/test/Microsoft.DotNet.Tools.Tests.Utilities/Microsoft.DotNet.Tools.Tests.Utilities.csproj
index 2ac3bfe37..903f12736 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/Microsoft.DotNet.Tools.Tests.Utilities.csproj
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/Microsoft.DotNet.Tools.Tests.Utilities.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <Description>Microsoft.DotNet.Tools.Tests.Utilities Class Library</Description>
     <TargetFramework>netstandard1.5</TargetFramework>
@@ -13,7 +11,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
   </ItemGroup>
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetConfig.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetConfig.cs
index f6f05bd51..356eab384 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetConfig.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetConfig.cs
@@ -23,5 +23,23 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
 
             File.WriteAllText(path, contents);
         }
+        
+        public static void Write(string directory, string configname, string localFeedPath)
+        {
+            const string template = @"<?xml version=""1.0"" encoding=""utf-8""?>
+<configuration>
+<packageSources>
+<!--To inherit the global NuGet package sources remove the <clear/> line below -->
+<clear />
+<add key=""Test Source"" value=""{0}"" />
+<add key=""api.nuget.org"" value=""https://api.nuget.org/v3/index.json"" />
+<add key=""dotnet-core"" value=""https://dotnet.myget.org/F/dotnet-core/api/v3/index.json"" />
+</packageSources>
+</configuration>";
+
+            var path = Path.Combine(directory, configname);
+
+            File.WriteAllText(path, string.Format(template, localFeedPath));
+        }
     }
 }
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetFrameworks.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetFrameworks.cs
new file mode 100644
index 000000000..c82d78051
--- /dev/null
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/NuGetFrameworks.cs
@@ -0,0 +1,14 @@
+using NuGet.Frameworks;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Microsoft.DotNet.Tools.Tests.Utilities
+{
+    //  This class is for frameworks that aren't yet in NuGet's FrameworkConstants.CommonFrameworks class
+    public static class NuGetFrameworks
+    {
+        public static readonly NuGetFramework NetCoreApp21
+                = new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCoreApp, new Version(2, 1, 0, 0));
+    }
+}
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/PeReaderUtils.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/PeReaderUtils.cs
index fc3d19587..73cb9e64f 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/PeReaderUtils.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/PeReaderUtils.cs
@@ -78,7 +78,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
         {
             // TODO: Nick Guerrera (Nick.Guerrera@microsoft.com) hacked this method for temporary use.
             // There is a blob decoder feature in progress but it won't ship in time for our milestone.
-            // Replace this method with the blob decoder feature when later it is availale.
+            // Replace this method with the blob decoder feature when later it is available.
 
             var signature = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor).Signature;
             var signatureReader = reader.GetBlobReader(signature);
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs
index 2f5e1e830..056b1c197 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs
@@ -20,7 +20,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
         private string _stage2Sdk;
         private string _stage2WithBackwardsCompatibleRuntimesDirectory;
         private string _testPackages;
-        private string _pjDotnet;
+        private string _testWorkingFolder;
 
         public static string RepoRoot
         {
@@ -37,9 +37,14 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
                 string directory = AppContext.BaseDirectory;
 #endif
 
-                while (!Directory.Exists(Path.Combine(directory, ".git")) && directory != null)
+                while (directory != null)
                 {
-                    directory = Directory.GetParent(directory).FullName;
+                    var gitDirOrFile = Path.Combine(directory, ".git");
+                    if (Directory.Exists(gitDirOrFile) || File.Exists(gitDirOrFile))
+                    {
+                        break;
+                    }
+                    directory = Directory.GetParent(directory)?.FullName;
                 }
 
                 if (directory == null)
@@ -58,7 +63,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
             {
                 if (string.IsNullOrEmpty(s_buildRid))
                 {
-                    var buildInfoPath = Path.Combine(RepoRoot, "artifacts", "obj", "BuildInfo.props");
+                    var buildInfoPath = Path.Combine(RepoRoot, "bin", "obj", "BuildInfo.props");
                     var root = XDocument.Load(buildInfoPath).Root;
                     var ns = root.Name.Namespace;
 
@@ -81,38 +86,46 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
         public string Artifacts => _artifacts;
         public string BuiltDotnet => _builtDotnet;
         public string NugetPackages => _nugetPackages;
-        public string PjDotnet => _pjDotnet;
         public string Stage2Sdk => _stage2Sdk;
         public string Stage2WithBackwardsCompatibleRuntimesDirectory => _stage2WithBackwardsCompatibleRuntimesDirectory;
         public string TestPackages => _testPackages;
+        public string TestWorkingFolder => _testWorkingFolder;
 
         public RepoDirectoriesProvider(
             string artifacts = null,
             string builtDotnet = null,
             string nugetPackages = null,
             string corehostPackages = null,
-            string corehostDummyPackages = null,
-            string pjDotnet = null)
+            string corehostDummyPackages = null)
         {
-            _artifacts = artifacts ?? Path.Combine(RepoRoot, "artifacts", BuildRid);
+            //  Ideally this wouldn't be hardcoded, so that you could use stage n to build stage n + 1, and then use stage n + 1 to run tests
+            int previousStage = 2;
+
+            _artifacts = artifacts ?? Path.Combine(RepoRoot,
+                                                   "bin",
+                                                   previousStage.ToString(),
+                                                   BuildRid);
             _builtDotnet = builtDotnet ?? Path.Combine(_artifacts, "intermediate", "sharedFrameworkPublish");
             _nugetPackages = nugetPackages ?? Path.Combine(RepoRoot, ".nuget", "packages");
-            _pjDotnet = pjDotnet ?? GetPjDotnetPath();
             _stage2Sdk = Directory
-                .EnumerateDirectories(Path.Combine(_artifacts, "stage2", "sdk"))
+                .EnumerateDirectories(Path.Combine(_artifacts, "dotnet", "sdk"))
                 .First(d => !d.Contains("NuGetFallbackFolder"));
 
             _stage2WithBackwardsCompatibleRuntimesDirectory =
-                Path.Combine(_artifacts, "stage2WithBackwardsCompatibleRuntimes");
-            _testPackages = Path.Combine(RepoRoot, "artifacts", "testpackages", "packages");
-        }
+                Path.Combine(_artifacts, "dotnetWithBackwardsCompatibleRuntimes");
 
-        private string GetPjDotnetPath()
-        {
-            return new DirectoryInfo(Path.Combine(RepoRoot, ".dotnet_stage0PJ"))
-                .GetDirectories().First()
-                .GetFiles("dotnet*").First()
-                .FullName;
+            _testPackages = Environment.GetEnvironmentVariable("TEST_PACKAGES");
+            if (string.IsNullOrEmpty(_testPackages))
+            {
+                throw new InvalidOperationException("TEST_PACKAGES environment variable not set");
+            }
+
+            _testWorkingFolder = Path.Combine(RepoRoot,
+                                              "bin",
+                                              (previousStage + 1).ToString(),
+                                              BuildRid,
+                                              "test");
+            
         }
     }
 }
diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs
index b377b4331..6c2c43346 100644
--- a/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs
+++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs
@@ -53,7 +53,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
                     s_testAssets = new TestAssets(
                         new DirectoryInfo(assetsRoot),
                         new FileInfo(new Muxer().MuxerPath),
-                        new FileInfo(new RepoDirectoriesProvider().PjDotnet)); 
+                        new RepoDirectoriesProvider().TestWorkingFolder); 
                 }
 
                 return s_testAssets;
diff --git a/test/MsBuildScript.Tests/runtests.target b/test/MsBuildScript.Tests/runtests.target
new file mode 100644
index 000000000..b7da47a1d
--- /dev/null
+++ b/test/MsBuildScript.Tests/runtests.target
@@ -0,0 +1,15 @@
+<Project DefaultTargets="RunMsBuildScriptTests">
+  <Import Project="../../dir.props" />
+  <Import Project="$(RepoRoot)/build/compile/LzmaArchive.targets" />
+
+  <UsingTask TaskName="DownloadFile" AssemblyFile="$(CLIBuildDll)" />
+  <UsingTask TaskName="EnsureFileExistsOnAzureBlobStorage" AssemblyFile="$(CLIBuildDll)" />
+
+  <Target Name="RunMsBuildScriptTests" DependsOnTargets="EnsureAllDependencyFilesExist"></Target>
+
+  <Target Name="EnsureAllDependencyFilesExist">
+    <EnsureFileExistsOnAzureBlobStorage Condition="'$(DownloadedAspNetCoreSharedFxInstallerFileName)' != ''" FileUrl="$(CoreSetupRootUrl)$(AspNetCoreVersion)/$(DownloadedAspNetCoreSharedFxInstallerFileName)" />
+    <EnsureFileExistsOnAzureBlobStorage Condition="'$(AspNetCoreSharedFxArchiveFileName)' != ''" FileUrl="$(CoreSetupRootUrl)$(AspNetCoreVersion)/$(AspNetCoreSharedFxArchiveFileName)" />
+    <EnsureFileExistsOnAzureBlobStorage Condition="'$(NugetPackagesArchiveName)' != ''" FileUrl="$(CoreSetupRootUrl)$(AspNetCoreVersion)/$(NugetPackagesArchiveName)" />
+  </Target>
+</Project>
diff --git a/test/Msbuild.Tests.Utilities/Msbuild.Tests.Utilities.csproj b/test/Msbuild.Tests.Utilities/Msbuild.Tests.Utilities.csproj
index ba6e65af5..f7382f72a 100644
--- a/test/Msbuild.Tests.Utilities/Msbuild.Tests.Utilities.csproj
+++ b/test/Msbuild.Tests.Utilities/Msbuild.Tests.Utilities.csproj
@@ -1,16 +1,17 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
     <AssemblyName>Msbuild.Tests.Utilities</AssemblyName>
     <AssetTargetFallback>$(AssetTargetFallback);dotnet5.4;portable-net451+win8</AssetTargetFallback>
+    <AssemblyOriginatorKeyFile>../../tools/Key.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
   </PropertyGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\Microsoft.DotNet.Tools.Tests.Utilities\Microsoft.DotNet.Tools.Tests.Utilities.csproj" />
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
@@ -19,7 +20,7 @@
   <ItemGroup>
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.3.0" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
     <PackageReference Include="Microsoft.DotNet.ProjectJsonMigration" Version="$(MicrosoftDotNetProjectJsonMigrationPackageVersion)" />
   </ItemGroup>
diff --git a/test/binding-redirects.Tests/NuGet.Config b/test/binding-redirects.Tests/NuGet.Config
deleted file mode 100644
index 507db39a6..000000000
--- a/test/binding-redirects.Tests/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="test-packages" value="../../artifacts/testpackages" />
-  </packageSources>
-</configuration>
diff --git a/test/binding-redirects.Tests/binding-redirects.Tests.csproj b/test/binding-redirects.Tests/binding-redirects.Tests.csproj
index 072bc6352..ef0b385bc 100644
--- a/test/binding-redirects.Tests/binding-redirects.Tests.csproj
+++ b/test/binding-redirects.Tests/binding-redirects.Tests.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
@@ -7,6 +6,7 @@
     <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
     <AssemblyName>binding-redirects.Tests</AssemblyName>
     <AssetTargetFallback>$(AssetTargetFallback);dotnet5.4;portable-net451+win8</AssetTargetFallback>
+    <RestoreAdditionalProjectSources>$(TestOutputDir)/packages</RestoreAdditionalProjectSources>
   </PropertyGroup>
 
   <ItemGroup>
@@ -15,8 +15,8 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/test/crossgen.Tests/crossgen.Tests.csproj b/test/crossgen.Tests/crossgen.Tests.csproj
index 3050759b4..2d02523a0 100644
--- a/test/crossgen.Tests/crossgen.Tests.csproj
+++ b/test/crossgen.Tests/crossgen.Tests.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
@@ -15,8 +14,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-add-package.Tests/GivenDotnetPackageAdd.cs b/test/dotnet-add-package.Tests/GivenDotnetPackageAdd.cs
index 356d86ce4..268c64f33 100644
--- a/test/dotnet-add-package.Tests/GivenDotnetPackageAdd.cs
+++ b/test/dotnet-add-package.Tests/GivenDotnetPackageAdd.cs
@@ -107,7 +107,7 @@ namespace Microsoft.DotNet.Cli.Package.Add.Tests
 
             var packageName = "Newtonsoft.Json";
             var packageVersion = "9.0.1";
-            var framework = "netcoreapp2.0";
+            var framework = "netcoreapp2.1";
             var cmd = new DotnetCommand()
                 .WithWorkingDirectory(projectDirectory)
                 .ExecuteWithCapturedOutput($"add package {packageName} --version {packageVersion} --framework {framework}");
diff --git a/test/dotnet-add-package.Tests/dotnet-add-package.Tests.csproj b/test/dotnet-add-package.Tests/dotnet-add-package.Tests.csproj
index 9dc27f338..4f943d535 100644
--- a/test/dotnet-add-package.Tests/dotnet-add-package.Tests.csproj
+++ b/test/dotnet-add-package.Tests/dotnet-add-package.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -17,14 +15,14 @@
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\..\src\dotnet\dotnet.csproj" />
   </ItemGroup>
 
   <ItemGroup>
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-add-reference.Tests/GivenDotnetAddReference.cs b/test/dotnet-add-reference.Tests/GivenDotnetAddReference.cs
index bbe339071..75269124f 100644
--- a/test/dotnet-add-reference.Tests/GivenDotnetAddReference.cs
+++ b/test/dotnet-add-reference.Tests/GivenDotnetAddReference.cs
@@ -559,7 +559,7 @@ Commands:
                 .WithProject(lib.CsProjName)
                 .Execute("\"IDoNotExist.csproj\"");
             cmd.Should().Fail();
-            cmd.StdErr.Should().Be(string.Format(CommonLocalizableStrings.ReferenceDoesNotExist, "IDoNotExist.csproj"));
+            cmd.StdErr.Should().Be(string.Format(CommonLocalizableStrings.CouldNotFindProjectOrDirectory, "IDoNotExist.csproj"));
             lib.CsProjContent().Should().BeEquivalentTo(contentBefore);
         }
 
@@ -575,7 +575,7 @@ Commands:
                 .WithProject(lib.CsProjPath)
                 .Execute($"\"{setup.ValidRefCsprojPath}\" \"IDoNotExist.csproj\"");
             cmd.Should().Fail();
-            cmd.StdErr.Should().Be(string.Format(CommonLocalizableStrings.ReferenceDoesNotExist, "IDoNotExist.csproj"));
+            cmd.StdErr.Should().Be(string.Format(CommonLocalizableStrings.CouldNotFindProjectOrDirectory, "IDoNotExist.csproj"));
             lib.CsProjContent().Should().BeEquivalentTo(contentBefore);
         }
 
@@ -661,7 +661,7 @@ Commands:
         [InlineData("nonexistingframeworkname")]
         public void WhenFrameworkSwitchIsNotMatchingAnyOfTargetedFrameworksItPrintsError(string framework)
         {
-            var setup = Setup();
+            var setup = Setup(framework);
             var lib = new ProjDir(setup.LibDir);
             var net45lib = new ProjDir(Path.Combine(setup.TestRoot, "Net45Lib"));
 
@@ -693,5 +693,55 @@ Commands:
             cmd.StdErr.Should().MatchRegex(" - net45");
             net45lib.CsProjContent().Should().BeEquivalentTo(csProjContent);
         }
+
+        [Fact]
+        public void WhenDirectoryContainingProjectIsGivenReferenceIsAdded()
+        {
+            var setup = Setup();
+            var lib = NewLibWithFrameworks(dir: setup.TestRoot);
+
+            var result = new AddReferenceCommand()
+                    .WithWorkingDirectory(setup.TestRoot)
+                    .WithProject(lib.CsProjPath)
+                    .Execute($"\"{Path.GetDirectoryName(setup.ValidRefCsprojPath)}\"");
+
+            result.Should().Pass();
+            result.StdOut.Should().Be(string.Format(CommonLocalizableStrings.ReferenceAddedToTheProject, @"ValidRef\ValidRef.csproj"));
+            result.StdErr.Should().BeEmpty();
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsNoProjectsItCancelsWholeOperation()
+        {
+            var setup = Setup();
+            var lib = NewLibWithFrameworks(dir: setup.TestRoot);
+
+            var reference = "Empty";
+            var result = new AddReferenceCommand()
+                    .WithWorkingDirectory(setup.TestRoot)
+                    .WithProject(lib.CsProjPath)
+                    .Execute(reference);
+
+            result.Should().Fail();
+            result.StdOut.Should().BeVisuallyEquivalentToIfNotLocalized(HelpText);
+            result.StdErr.Should().Be(string.Format(CommonLocalizableStrings.CouldNotFindAnyProjectInDirectory, reference));
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsMultipleProjectsItCancelsWholeOperation()
+        {
+            var setup = Setup();
+            var lib = NewLibWithFrameworks(dir: setup.TestRoot);
+
+            var reference = "MoreThanOne";
+            var result = new AddReferenceCommand()
+                    .WithWorkingDirectory(setup.TestRoot)
+                    .WithProject(lib.CsProjPath)
+                    .Execute(reference);
+
+            result.Should().Fail();
+            result.StdOut.Should().BeVisuallyEquivalentToIfNotLocalized(HelpText);
+            result.StdErr.Should().Be(string.Format(CommonLocalizableStrings.MoreThanOneProjectInDirectory, reference));
+        }
     }
 }
diff --git a/test/dotnet-add-reference.Tests/dotnet-add-reference.Tests.csproj b/test/dotnet-add-reference.Tests/dotnet-add-reference.Tests.csproj
index a023511e3..383c9edc1 100644
--- a/test/dotnet-add-reference.Tests/dotnet-add-reference.Tests.csproj
+++ b/test/dotnet-add-reference.Tests/dotnet-add-reference.Tests.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
@@ -20,10 +19,10 @@
   </ItemGroup>
   
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.3.0" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
     <PackageReference Include="Microsoft.DotNet.ProjectJsonMigration" Version="$(MicrosoftDotNetProjectJsonMigrationPackageVersion)" />
   </ItemGroup>
diff --git a/test/dotnet-back-compat.Tests/dotnet-back-compat.Tests.csproj b/test/dotnet-back-compat.Tests/dotnet-back-compat.Tests.csproj
index 6b380559f..24ec93b23 100644
--- a/test/dotnet-back-compat.Tests/dotnet-back-compat.Tests.csproj
+++ b/test/dotnet-back-compat.Tests/dotnet-back-compat.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -14,7 +12,7 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs b/test/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs
index febd7a9b3..26845ee01 100644
--- a/test/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs
+++ b/test/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs
@@ -29,7 +29,7 @@ namespace Microsoft.DotNet.Cli.Build.Tests
 
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
 
-            var outputDll = testInstance.Root.GetDirectory("bin", configuration, "netcoreapp2.0")
+            var outputDll = testInstance.Root.GetDirectory("bin", configuration, "netcoreapp2.1")
                 .GetFile($"{testAppName}.dll");
 
             var outputRunCommand = new DotnetCommand();
@@ -66,7 +66,7 @@ namespace Microsoft.DotNet.Cli.Build.Tests
 
             new BuildCommand()
                 .WithWorkingDirectory(projectDirectory)
-                .Execute("--framework netcoreapp2.0")
+                .Execute("--framework netcoreapp2.1")
                 .Should().Pass();
         }
 
@@ -93,7 +93,7 @@ namespace Microsoft.DotNet.Cli.Build.Tests
             string dir = "pkgs";
             string args = $"--packages {dir}";
 
-            string newArgs = $"console -f netcoreapp2.0 -o \"{rootPath}\" --debug:ephemeral-hive --no-restore";
+            string newArgs = $"console -f netcoreapp2.1 -o \"{rootPath}\" --debug:ephemeral-hive --no-restore";
             new NewCommandShim()
                 .WithWorkingDirectory(rootPath)
                 .Execute(newArgs)
@@ -115,7 +115,7 @@ namespace Microsoft.DotNet.Cli.Build.Tests
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
 
             var outputDll = Directory.EnumerateFiles(
-                Path.Combine(rootPath, "bin", configuration, "netcoreapp2.0"), "*.dll", 
+                Path.Combine(rootPath, "bin", configuration, "netcoreapp2.1"), "*.dll", 
                 SearchOption.TopDirectoryOnly)
                 .Single();
 
@@ -131,7 +131,7 @@ namespace Microsoft.DotNet.Cli.Build.Tests
         {
             var testAppName = "MSBuildTestApp";
             var testInstance = TestAssets.Get(testAppName)
-                .CreateInstance(testAppName)
+                .CreateInstance()
                 .WithSourceFiles()
                 .WithRestoreFiles();
 
diff --git a/test/dotnet-build.Tests/dotnet-build.Tests.csproj b/test/dotnet-build.Tests/dotnet-build.Tests.csproj
index 95f80d6bf..38d400107 100644
--- a/test/dotnet-build.Tests/dotnet-build.Tests.csproj
+++ b/test/dotnet-build.Tests/dotnet-build.Tests.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
@@ -14,9 +13,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 
 </Project>
diff --git a/test/dotnet-clean.Tests/GivenDotnetCleanCleansBuildArtifacts.cs b/test/dotnet-clean.Tests/GivenDotnetCleanCleansBuildArtifacts.cs
index 7ac4dd0e6..474a7f2b1 100644
--- a/test/dotnet-clean.Tests/GivenDotnetCleanCleansBuildArtifacts.cs
+++ b/test/dotnet-clean.Tests/GivenDotnetCleanCleansBuildArtifacts.cs
@@ -28,7 +28,7 @@ namespace Microsoft.DotNet.Cli.Clean.Tests
                 .Should().Pass();
 
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
-            var outputFolder = testInstance.Root.GetDirectory("bin", configuration, "netcoreapp2.0", "win7-x64");
+            var outputFolder = testInstance.Root.GetDirectory("bin", configuration, "netcoreapp2.1", "win7-x64");
 
             outputFolder.Should().NotBeEmpty();
 
diff --git a/test/dotnet-clean.Tests/dotnet-clean.Tests.csproj b/test/dotnet-clean.Tests/dotnet-clean.Tests.csproj
index 2cec39474..bc32725e5 100644
--- a/test/dotnet-clean.Tests/dotnet-clean.Tests.csproj
+++ b/test/dotnet-clean.Tests/dotnet-clean.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -14,9 +12,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 
 </Project>
diff --git a/test/dotnet-help.Tests/GivenThatIWantToShowHelpForDotnetCommand.cs b/test/dotnet-help.Tests/GivenThatIWantToShowHelpForDotnetCommand.cs
index 29c00b2fb..6cfb9a11b 100644
--- a/test/dotnet-help.Tests/GivenThatIWantToShowHelpForDotnetCommand.cs
+++ b/test/dotnet-help.Tests/GivenThatIWantToShowHelpForDotnetCommand.cs
@@ -38,6 +38,9 @@ SDK commands:
   nuget            Provides additional NuGet commands.
   msbuild          Runs Microsoft Build Engine (MSBuild).
   vstest           Runs Microsoft Test Execution Command Line Tool.
+  store            Stores the specified assemblies in the runtime store.
+  install          Installs an item into the development environment.
+  help             Show help.
 
 Common options:
   -v|--verbosity        Set the verbosity level of the command. Allowed values are q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic].
@@ -48,13 +51,15 @@ Run 'dotnet COMMAND --help' for more information on a command.
 sdk-options:
   --version        Display .NET Core SDK version.
   --info           Display .NET Core information.
+  --list-sdks      Display the installed SDKs.
+  --list-runtimes  Display the installed runtimes.
   -d|--diagnostics Enable diagnostic output.
 
 runtime-options:
   --additionalprobingpath <path>    Path containing probing policy and assemblies to probe for.
   --fx-version <version>            Version of the installed Shared Framework to use to run the application.
   --roll-forward-on-no-candidate-fx Roll forward on no candidate shared framework is enabled.
-  --additional-deps <path>          Path to additonal deps.json file.";
+  --additional-deps <path>          Path to additional deps.json file.";
 
         [Theory]
         [InlineData("--help")]
@@ -89,6 +94,19 @@ runtime-options:
           cmd.StdOut.Should().ContainVisuallySameFragmentIfNotLocalized(HelpText);
         }
 
+        [Theory]
+        [InlineData("complete")]
+        [InlineData("parse")]
+        public void WhenCommandWithoutDocLinkIsPassedToDotnetHelpItPrintsError(string command)
+        {
+          var cmd = new DotnetCommand()
+                .ExecuteWithCapturedOutput($"help {command}");
+
+          cmd.Should().Fail();
+          cmd.StdErr.Should().Contain(string.Format(Tools.Help.LocalizableStrings.CommandDoesNotExist, command));
+          cmd.StdOut.Should().ContainVisuallySameFragmentIfNotLocalized(HelpText);
+        }
+
         [WindowsOnlyFact]
         public void WhenRunOnWindowsDotnetHelpCommandShouldContainProperProcessInformation()
         {
diff --git a/test/dotnet-help.Tests/dotnet-help.Tests.csproj b/test/dotnet-help.Tests/dotnet-help.Tests.csproj
index 70ce3486e..0decf6e26 100644
--- a/test/dotnet-help.Tests/dotnet-help.Tests.csproj
+++ b/test/dotnet-help.Tests/dotnet-help.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -18,9 +16,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-list-reference.Tests/dotnet-list-reference.Tests.csproj b/test/dotnet-list-reference.Tests/dotnet-list-reference.Tests.csproj
index 32b249ed5..69c1fc8e1 100644
--- a/test/dotnet-list-reference.Tests/dotnet-list-reference.Tests.csproj
+++ b/test/dotnet-list-reference.Tests/dotnet-list-reference.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -19,9 +17,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
     <PackageReference Include="Microsoft.DotNet.ProjectJsonMigration" Version="$(MicrosoftDotNetProjectJsonMigrationPackageVersion)" />
   </ItemGroup>
diff --git a/test/dotnet-migrate.Tests/NuGet.tempaspnetpatch.config b/test/dotnet-migrate.Tests/NuGet.tempaspnetpatch.config
deleted file mode 100644
index 33b9693d5..000000000
--- a/test/dotnet-migrate.Tests/NuGet.tempaspnetpatch.config
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
-    <clear />
-    <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
-    <add key="DotnetCore" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
-    <add key="aspnet-final" value="https://dotnet.myget.org/F/aspnetcore-2-0-0-preview1-no-timestamp/api/v3/index.json" />
-    <add key="aspnet-release" value="https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json" />
-  </packageSources>
-</configuration>
\ No newline at end of file
diff --git a/test/dotnet-migrate.Tests/dotnet-migrate.Tests.csproj b/test/dotnet-migrate.Tests/dotnet-migrate.Tests.csproj
index 0bc0b107c..e2bce1d11 100644
--- a/test/dotnet-migrate.Tests/dotnet-migrate.Tests.csproj
+++ b/test/dotnet-migrate.Tests/dotnet-migrate.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -9,12 +7,6 @@
     <AssetTargetFallback>$(AssetTargetFallback);netstandardapp1.5;dotnet5.4;portable-net451+win8</AssetTargetFallback>
   </PropertyGroup>
 
-  <ItemGroup>
-    <Content Include="MSBuild.exe;MSBuild.exe.config;NuGet.tempaspnetpatch.config">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
-
   <ItemGroup>
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\Microsoft.DotNet.Tools.Tests.Utilities\Microsoft.DotNet.Tools.Tests.Utilities.csproj" />
@@ -23,11 +15,12 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
     <PackageReference Include="Moq" Version="4.7.25" />
     <PackageReference Include="Microsoft.DotNet.ProjectJsonMigration" Version="$(MicrosoftDotNetProjectJsonMigrationPackageVersion)" />
+    <PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs b/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs
index 52d776505..e4c789ede 100644
--- a/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs
+++ b/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs
@@ -138,7 +138,7 @@ namespace Microsoft.DotNet.Cli.MSBuild.Tests
                 allArgs.Should().NotBeNull();
 
                 allArgs.Should().Contain(
-                    value => value.IndexOf("/Logger", StringComparison.OrdinalIgnoreCase) >= 0,
+                    value => value.IndexOf("/distributedlogger", StringComparison.OrdinalIgnoreCase) >= 0,
                     "The MSBuild logger argument should be specified when telemetry is enabled.");
             }
         }
diff --git a/test/dotnet-msbuild.Tests/GivenDotnetPackInvocation.cs b/test/dotnet-msbuild.Tests/GivenDotnetPackInvocation.cs
index 74559a6fa..fa666f150 100644
--- a/test/dotnet-msbuild.Tests/GivenDotnetPackInvocation.cs
+++ b/test/dotnet-msbuild.Tests/GivenDotnetPackInvocation.cs
@@ -12,6 +12,7 @@ namespace Microsoft.DotNet.Cli.MSBuild.Tests
     public class GivenDotnetPackInvocation
     {
         const string ExpectedPrefix = "exec <msbuildpath> /m /v:m /restore /t:pack";
+        const string ExpectedNoBuildPrefix = "exec <msbuildpath> /m /v:m /t:pack";
 
         [Theory]
         [InlineData(new string[] { }, "")]
@@ -34,9 +35,10 @@ namespace Microsoft.DotNet.Cli.MSBuild.Tests
 
             var msbuildPath = "<msbuildpath>";
             var command = PackCommand.FromArgs(args, msbuildPath);
+            var expectedPrefix = args.FirstOrDefault() == "--no-build" ? ExpectedNoBuildPrefix : ExpectedPrefix;
 
             command.SeparateRestoreCommand.Should().BeNull();
-            command.GetProcessStartInfo().Arguments.Should().Be($"{ExpectedPrefix}{expectedAdditionalArgs}");
+            command.GetProcessStartInfo().Arguments.Should().Be($"{expectedPrefix}{expectedAdditionalArgs}");
         }
     }
 }
diff --git a/test/dotnet-msbuild.Tests/dotnet-msbuild.Tests.csproj b/test/dotnet-msbuild.Tests/dotnet-msbuild.Tests.csproj
index cc45fc290..9bd000d9f 100644
--- a/test/dotnet-msbuild.Tests/dotnet-msbuild.Tests.csproj
+++ b/test/dotnet-msbuild.Tests/dotnet-msbuild.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -18,8 +16,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-new.Tests/GivenThatIWantANewApp.cs b/test/dotnet-new.Tests/GivenThatIWantANewApp.cs
index 06d8b1b4d..b195d55bb 100644
--- a/test/dotnet-new.Tests/GivenThatIWantANewApp.cs
+++ b/test/dotnet-new.Tests/GivenThatIWantANewApp.cs
@@ -44,11 +44,13 @@ namespace Microsoft.DotNet.New.Tests
             var rootPath = TestAssets.CreateTestDirectory().FullName;
             var packagesDirectory = Path.Combine(rootPath, "packages");
 
+            var configFile = Path.Combine(RepoDirectoriesProvider.RepoRoot, "NuGet.Config");
+
             foreach (string cSharpTemplate in cSharpTemplates)
             {
                 var projectFolder = Path.Combine(rootPath, cSharpTemplate + "1");
                 Directory.CreateDirectory(projectFolder);
-                CreateAndRestoreNewProject(cSharpTemplate, projectFolder, packagesDirectory);
+                CreateAndRestoreNewProject(cSharpTemplate, projectFolder, packagesDirectory, configFile);
             }
 
             Directory.EnumerateFiles(packagesDirectory, $"*.nupkg", SearchOption.AllDirectories)
@@ -58,30 +60,31 @@ namespace Microsoft.DotNet.New.Tests
         private void CreateAndRestoreNewProject(
             string projectType,
             string projectFolder,
-            string packagesDirectory)
+            string packagesDirectory,
+            string configFile)
         {
-            var repoRootNuGetConfig = Path.Combine(RepoDirectoriesProvider.RepoRoot, "NuGet.Config");
-
             new NewCommand()
                 .WithWorkingDirectory(projectFolder)
                 .Execute($"{projectType} --debug:ephemeral-hive --no-restore")
                 .Should().Pass();
 
-            // https://github.com/dotnet/templating/issues/946 - remove DisableImplicitAssetTargetFallback once this is fixed.
             new RestoreCommand()
                 .WithWorkingDirectory(projectFolder)
-                .Execute($"--configfile {repoRootNuGetConfig} --packages {packagesDirectory} /p:DisableImplicitAssetTargetFallback=true")
+                .Execute($"--configfile {configFile} --packages {packagesDirectory}")
                 .Should().Pass();
         }
 
         [Theory]
-        [InlineData("console", "microsoft.netcore.app", "2.0.0")]
-        [InlineData("classlib", "netstandard.library", "2.0.1")]
-        public void NewProjectRestoresCorrectPackageVersion(string type, string packageName, string expectedVersion)
+        [InlineData("console", "microsoft.netcore.app")]
+        // re-enable when this bug is resolved: https://github.com/dotnet/cli/issues/7574
+        //[InlineData("classlib", "netstandard.library")]
+        public void NewProjectRestoresCorrectPackageVersion(string type, string packageName)
         {
             var rootPath = TestAssets.CreateTestDirectory(identifier: $"_{type}").FullName;
             var packagesDirectory = Path.Combine(rootPath, "packages");
             var projectName = "Project";
+            var expectedVersion = GetFrameworkPackageVersion();
+
             var repoRootNuGetConfig = Path.Combine(RepoDirectoriesProvider.RepoRoot, "NuGet.Config");
 
             new NewCommand()
@@ -97,6 +100,32 @@ namespace Microsoft.DotNet.New.Tests
             new DirectoryInfo(Path.Combine(packagesDirectory, packageName))
                 .Should().Exist()
                 .And.HaveDirectory(expectedVersion);
+
+            string GetFrameworkPackageVersion()
+            {
+                var dotnetDir = new FileInfo(DotnetUnderTest.FullName).Directory;
+                var sharedFxDir = dotnetDir
+                    .GetDirectory("shared", "Microsoft.NETCore.App")
+                    .EnumerateDirectories()
+                    .Single(d => d.Name.StartsWith("2.1.0"));
+
+                if (packageName == "microsoft.netcore.app")
+                {
+                    return sharedFxDir.Name;
+                }
+
+                var depsFile = Path.Combine(sharedFxDir.FullName, "Microsoft.NETCore.App.deps.json");
+                using (var stream = File.OpenRead(depsFile))
+                using (var reader = new DependencyContextJsonReader())
+                {
+                    var context = reader.Read(stream);
+                    var dependency = context
+                        .RuntimeLibraries
+                        .Single(library => string.Equals(library.Name, packageName, StringComparison.OrdinalIgnoreCase));
+
+                    return dependency.Version;
+                }
+            }
         }
     }
 }
diff --git a/test/dotnet-new.Tests/GivenThatIWantANewAppWithSpecifiedType.cs b/test/dotnet-new.Tests/GivenThatIWantANewAppWithSpecifiedType.cs
index 96bb47c51..5a080e772 100644
--- a/test/dotnet-new.Tests/GivenThatIWantANewAppWithSpecifiedType.cs
+++ b/test/dotnet-new.Tests/GivenThatIWantANewAppWithSpecifiedType.cs
@@ -16,29 +16,29 @@ namespace Microsoft.DotNet.New.Tests
     public class GivenThatIWantANewAppWithSpecifiedType : TestBase
     {
         [Theory]
-        [InlineData("C#", "console", false, false)]
-        [InlineData("C#", "classlib", false, false)]
-        [InlineData("C#", "mstest", false, false)]
-        [InlineData("C#", "xunit", false, false)]
-        [InlineData("C#", "web", false, false)]
-        [InlineData("C#", "mvc", false, false)]
-        [InlineData("C#", "webapi", false, false)]
-        [InlineData("C#", "angular", false, true)]
-        [InlineData("C#", "react", false, true)]
-        [InlineData("C#", "reactredux", false, true)]
-        [InlineData("F#", "console", false, false)]
-        [InlineData("F#", "classlib", false, false)]
-        [InlineData("F#", "mstest", false, false)]
-        [InlineData("F#", "xunit", false, false)]
-        [InlineData("F#", "mvc", true, false)]
-        [InlineData("VB", "console", false, false)]
-        [InlineData("VB", "classlib", false, false)]
-        [InlineData("VB", "mstest", false, false)]
-        [InlineData("VB", "xunit", false, false)]
+        [InlineData("C#", "console", false)]
+        [InlineData("C#", "classlib", false)]
+        [InlineData("C#", "mstest", false)]
+        [InlineData("C#", "xunit", false)]
+        [InlineData("C#", "web", false)]
+        [InlineData("C#", "mvc", false)]
+        [InlineData("C#", "webapi", false)]
+        [InlineData("C#", "angular", true)]
+        [InlineData("C#", "react", true)]
+        [InlineData("C#", "reactredux", true)]
+        [InlineData("F#", "console", false)]
+        // re-enable when this bug is resolved: https://github.com/dotnet/cli/issues/7574
+        //[InlineData("F#", "classlib", false)]
+        [InlineData("F#", "mstest", false)]
+        [InlineData("F#", "xunit", false)]
+        [InlineData("F#", "mvc", false)]
+        [InlineData("VB", "console", false)]
+        [InlineData("VB", "classlib", false)]
+        [InlineData("VB", "mstest", false)]
+        [InlineData("VB", "xunit", false)]
         public void TemplateRestoresAndBuildsWithoutWarnings(
             string language,
             string projectType,
-            bool useNuGetConfigForAspNet,
             bool skipSpaWebpackSteps)
         {
             string rootPath = TestAssets.CreateTestDirectory(identifier: $"{language}_{projectType}").FullName;
@@ -48,23 +48,18 @@ namespace Microsoft.DotNet.New.Tests
                 .Execute($"new {projectType} -lang {language} -o {rootPath} --debug:ephemeral-hive {noRestoreDirective}")
                 .Should().Pass();
 
-            if (useNuGetConfigForAspNet)
-            {
-                var configFile = new FileInfo(Path.Combine(rootPath, "..", "..", "..", "..", "..", "NuGet.tempaspnetpatch.config"));
-                File.Copy(configFile.FullName, Path.Combine(rootPath, "NuGet.Config"));
-            }
-
             if (skipSpaWebpackSteps)
             {
                 // Not all CI machines have Node installed, so the build would fail if we tried
                 // to run Webpack. Bypass this by making it appear that Webpack already ran.
                 Directory.CreateDirectory(Path.Combine(rootPath, "wwwroot", "dist"));
+                Directory.CreateDirectory(Path.Combine(rootPath, "ClientApp", "node_modules"));
+                Directory.CreateDirectory(Path.Combine(rootPath, "node_modules"));
             }
 
-            // https://github.com/dotnet/templating/issues/946 - remove DisableImplicitAssetTargetFallback once this is fixed.
             new TestCommand("dotnet")
                 .WithWorkingDirectory(rootPath)
-                .Execute($"restore /p:DisableImplicitAssetTargetFallback=true")
+                .Execute($"restore")
                 .Should().Pass();
 
             var buildResult = new TestCommand("dotnet")
diff --git a/test/dotnet-new.Tests/NuGet.tempaspnetpatch.config b/test/dotnet-new.Tests/NuGet.tempaspnetpatch.config
deleted file mode 100644
index 33b9693d5..000000000
--- a/test/dotnet-new.Tests/NuGet.tempaspnetpatch.config
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
-    <clear />
-    <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
-    <add key="DotnetCore" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
-    <add key="aspnet-final" value="https://dotnet.myget.org/F/aspnetcore-2-0-0-preview1-no-timestamp/api/v3/index.json" />
-    <add key="aspnet-release" value="https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json" />
-  </packageSources>
-</configuration>
\ No newline at end of file
diff --git a/test/dotnet-new.Tests/dotnet-new.Tests.csproj b/test/dotnet-new.Tests/dotnet-new.Tests.csproj
index 1d5513241..1d1a34da0 100644
--- a/test/dotnet-new.Tests/dotnet-new.Tests.csproj
+++ b/test/dotnet-new.Tests/dotnet-new.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -15,9 +13,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-nuget.UnitTests/dotnet-nuget.UnitTests.csproj b/test/dotnet-nuget.UnitTests/dotnet-nuget.UnitTests.csproj
index 842ad9f2b..5afbfd6dd 100644
--- a/test/dotnet-nuget.UnitTests/dotnet-nuget.UnitTests.csproj
+++ b/test/dotnet-nuget.UnitTests/dotnet-nuget.UnitTests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -16,9 +14,10 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Moq" Version="4.7.25" />
+    <PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0 " />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-pack.Tests/PackTests.cs b/test/dotnet-pack.Tests/PackTests.cs
index 32b940a45..1c24fa5c9 100644
--- a/test/dotnet-pack.Tests/PackTests.cs
+++ b/test/dotnet-pack.Tests/PackTests.cs
@@ -186,6 +186,25 @@ namespace Microsoft.DotNet.Tools.Pack.Tests
                 .Should().Pass();
         }
 
+        [Fact]
+        public void ItDoesNotImplicitlyBuildAProjectWhenPackagingWithTheNoBuildOption()
+        {
+            var testInstance = TestAssets.Get("TestAppSimple")
+                .CreateInstance()
+                .WithSourceFiles();
+
+            var result = new PackCommand()
+                .WithWorkingDirectory(testInstance.Root)
+                .ExecuteWithCapturedOutput("--no-build");
+
+            result.Should().Fail();
+            if (!DotnetUnderTest.IsLocalized())
+            {
+                result.Should().NotHaveStdOutContaining("Restore")
+                    .And.HaveStdOutContaining("project.assets.json");
+            }
+        }
+
         [Fact]
         public void ItDoesNotImplicitlyRestoreAProjectWhenPackagingWithTheNoRestoreOption()
         {
diff --git a/test/dotnet-pack.Tests/dotnet-pack.Tests.csproj b/test/dotnet-pack.Tests/dotnet-pack.Tests.csproj
index 98ab08de7..cc6655613 100644
--- a/test/dotnet-pack.Tests/dotnet-pack.Tests.csproj
+++ b/test/dotnet-pack.Tests/dotnet-pack.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -22,9 +20,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs b/test/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs
index 2db2018fa..aa705a0c2 100644
--- a/test/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs
+++ b/test/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs
@@ -33,11 +33,11 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
 
             new PublishCommand()
                 .WithWorkingDirectory(testProjectDirectory)
-                .Execute("--framework netcoreapp2.0")
+                .Execute("--framework netcoreapp2.1")
                 .Should().Pass();
 
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
-            var outputDll = Path.Combine(testProjectDirectory, "bin", configuration, "netcoreapp2.0", "publish", $"{testAppName}.dll");
+            var outputDll = Path.Combine(testProjectDirectory, "bin", configuration, "netcoreapp2.1", "publish", $"{testAppName}.dll");
 
             new DotnetCommand()
                 .ExecuteWithCapturedOutput(outputDll)
@@ -57,7 +57,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
 
             new PublishCommand()
                 .WithWorkingDirectory(testProjectDirectory)
-                .Execute("--framework netcoreapp2.0")
+                .Execute("--framework netcoreapp2.1")
                 .Should().Pass();
         }
 
@@ -74,7 +74,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
 
             new PublishCommand()
                 .WithWorkingDirectory(projectDirectory)
-                .Execute("--framework netcoreapp2.0")
+                .Execute("--framework netcoreapp2.1")
                 .Should().Pass();
         }
 
@@ -90,7 +90,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
 
             new PublishCommand()
                 .WithWorkingDirectory(testProjectDirectory)
-                .ExecuteWithCapturedOutput("--framework netcoreapp2.0 --no-restore")
+                .ExecuteWithCapturedOutput("--framework netcoreapp2.1 --no-restore")
                 .Should().Fail()
                 .And.HaveStdOutContaining("project.assets.json");
         }
@@ -110,7 +110,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
             var rid = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier();
 
             new PublishCommand()
-                .WithFramework("netcoreapp2.0")
+                .WithFramework("netcoreapp2.1")
                 .WithRuntime(rid)
                 .WithWorkingDirectory(testProjectDirectory)
                 .Execute()
@@ -119,7 +119,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
 
             var outputProgram = testProjectDirectory
-                .GetDirectory("bin", configuration, "netcoreapp2.0", rid, "publish", $"{testAppName}{Constants.ExeSuffix}")
+                .GetDirectory("bin", configuration, "netcoreapp2.1", rid, "publish", $"{testAppName}{Constants.ExeSuffix}")
                 .FullName;
 
             EnsureProgramIsRunnable(outputProgram);
@@ -185,7 +185,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
 
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
             return testProjectDirectory
-                    .GetDirectory("bin", configuration, "netcoreapp2.0", rid, "publish");
+                    .GetDirectory("bin", configuration, "netcoreapp2.1", rid, "publish");
         }
 
         private static void EnsureProgramIsRunnable(string path)
@@ -227,7 +227,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
             var configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
 
             var outputProgram = rootDir
-                .GetDirectory("bin", configuration, "netcoreapp2.0", "publish", $"{rootDir.Name}.dll")
+                .GetDirectory("bin", configuration, "netcoreapp2.1", "publish", $"{rootDir.Name}.dll")
                 .FullName;
 
             new TestCommand(outputProgram)
diff --git a/test/dotnet-publish.Tests/dotnet-publish.Tests.csproj b/test/dotnet-publish.Tests/dotnet-publish.Tests.csproj
index befc31f08..77012ff8d 100644
--- a/test/dotnet-publish.Tests/dotnet-publish.Tests.csproj
+++ b/test/dotnet-publish.Tests/dotnet-publish.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -21,8 +19,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-remove-package.Tests/dotnet-remove-package.Tests.csproj b/test/dotnet-remove-package.Tests/dotnet-remove-package.Tests.csproj
index 7b6cbba9e..de9cc38f1 100644
--- a/test/dotnet-remove-package.Tests/dotnet-remove-package.Tests.csproj
+++ b/test/dotnet-remove-package.Tests/dotnet-remove-package.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -19,9 +17,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
     <PackageReference Include="Microsoft.DotNet.ProjectJsonMigration" Version="$(MicrosoftDotNetProjectJsonMigrationPackageVersion)" />
diff --git a/test/dotnet-remove-reference.Tests/GivenDotnetRemoveP2P.cs b/test/dotnet-remove-reference.Tests/GivenDotnetRemoveP2P.cs
index 65da417b2..b557ff5df 100644
--- a/test/dotnet-remove-reference.Tests/GivenDotnetRemoveP2P.cs
+++ b/test/dotnet-remove-reference.Tests/GivenDotnetRemoveP2P.cs
@@ -506,5 +506,56 @@ Commands:
             csproj.NumberOfItemGroupsWithoutCondition().Should().Be(noCondBefore - 1);
             csproj.NumberOfProjectReferencesWithIncludeContaining(validref.Name).Should().Be(0);
         }
+
+        [Fact]
+        public void WhenDirectoryContainingProjectIsGivenReferenceIsRemoved()
+        {
+            var setup = Setup();
+            var lib = NewLibWithFrameworks(dir: setup.TestRoot);
+            var libref = AddLibRef(setup, lib);
+
+            var result = new RemoveReferenceCommand()
+                    .WithWorkingDirectory(setup.TestRoot)
+                    .WithProject(lib.CsProjPath)
+                    .Execute($"\"{libref.CsProjPath}\"");
+
+            result.Should().Pass();
+            result.StdOut.Should().Be(string.Format(CommonLocalizableStrings.ProjectReferenceRemoved, Path.Combine("Lib", setup.LibCsprojName)));
+            result.StdErr.Should().BeEmpty();
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsNoProjectsItCancelsWholeOperation()
+        {
+            var setup = Setup();
+            var lib = NewLibWithFrameworks(dir: setup.TestRoot);
+
+            var reference = "Empty";
+            var result = new RemoveReferenceCommand()
+                    .WithWorkingDirectory(setup.TestRoot)
+                    .WithProject(lib.CsProjPath)
+                    .Execute(reference);
+
+            result.Should().Fail();
+            result.StdOut.Should().BeVisuallyEquivalentToIfNotLocalized(HelpText);
+            result.StdErr.Should().Be(string.Format(CommonLocalizableStrings.CouldNotFindAnyProjectInDirectory, Path.Combine(setup.TestRoot, reference)));
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsMultipleProjectsItCancelsWholeOperation()
+        {
+            var setup = Setup();
+            var lib = NewLibWithFrameworks(dir: setup.TestRoot);
+
+            var reference = "MoreThanOne";
+            var result = new RemoveReferenceCommand()
+                    .WithWorkingDirectory(setup.TestRoot)
+                    .WithProject(lib.CsProjPath)
+                    .Execute(reference);
+
+            result.Should().Fail();
+            result.StdOut.Should().BeVisuallyEquivalentToIfNotLocalized(HelpText);
+            result.StdErr.Should().Be(string.Format(CommonLocalizableStrings.MoreThanOneProjectInDirectory, Path.Combine(setup.TestRoot, reference)));
+        }
     }
 }
diff --git a/test/dotnet-remove-reference.Tests/dotnet-remove-reference.Tests.csproj b/test/dotnet-remove-reference.Tests/dotnet-remove-reference.Tests.csproj
index 315b5a6ad..546a31006 100644
--- a/test/dotnet-remove-reference.Tests/dotnet-remove-reference.Tests.csproj
+++ b/test/dotnet-remove-reference.Tests/dotnet-remove-reference.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -19,9 +17,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
     <PackageReference Include="Microsoft.DotNet.ProjectJsonMigration" Version="$(MicrosoftDotNetProjectJsonMigrationPackageVersion)" />
diff --git a/test/dotnet-restore.Tests/dotnet-restore.Tests.csproj b/test/dotnet-restore.Tests/dotnet-restore.Tests.csproj
index a8be52dc0..1a8abd5e7 100644
--- a/test/dotnet-restore.Tests/dotnet-restore.Tests.csproj
+++ b/test/dotnet-restore.Tests/dotnet-restore.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -15,10 +13,10 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)" />
     <PackageReference Include="FluentAssertions" Version="4.18.0" />
   </ItemGroup>
diff --git a/test/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs b/test/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs
index 5fa67328e..35660db73 100644
--- a/test/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs
+++ b/test/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs
@@ -70,11 +70,30 @@ namespace Microsoft.DotNet.Cli.Run.Tests
 
             new RunCommand()
                 .WithWorkingDirectory(projectDirectory)
-                .ExecuteWithCapturedOutput("--framework netcoreapp2.0")
+                .ExecuteWithCapturedOutput("--framework netcoreapp2.1")
                 .Should().Pass()
                          .And.HaveStdOutContaining("This string came from the test library!");
         }
 
+        [Fact]
+        public void ItDoesNotImplicitlyBuildAProjectWhenRunningWithTheNoBuildOption()
+        {
+            var testAppName = "MSBuildTestApp";
+            var testInstance = TestAssets.Get(testAppName)
+                            .CreateInstance()
+                            .WithSourceFiles();
+
+            var result = new RunCommand()
+                .WithWorkingDirectory(testInstance.Root.FullName)
+                .ExecuteWithCapturedOutput("--no-build -v:m");
+
+            result.Should().Fail();
+            if (!DotnetUnderTest.IsLocalized())
+            {
+                result.Should().NotHaveStdOutContaining("Restore");
+            }
+        }
+
         [Fact]
         public void ItDoesNotImplicitlyRestoreAProjectWhenRunningWithTheNoRestoreOption()
         {
@@ -131,9 +150,9 @@ namespace Microsoft.DotNet.Cli.Run.Tests
 
             new RunCommand()
                 .WithWorkingDirectory(testProjectDirectory)
-                .ExecuteWithCapturedOutput("--framework netcoreapp2.0")
+                .ExecuteWithCapturedOutput("--framework netcoreapp2.1")
                 .Should().Pass()
-                         .And.HaveStdOutContaining("Hello World!");
+                         .And.HaveStdOut("Hello World!");
         }
 
         [Fact]
@@ -518,5 +537,27 @@ namespace Microsoft.DotNet.Cli.Run.Tests
                 .And.HaveStdOutContaining("(NO MESSAGE)")
                 .And.HaveStdErrContaining(string.Format(LocalizableStrings.RunCommandExceptionCouldNotApplyLaunchSettings, LocalizableStrings.DefaultLaunchProfileDisplayName, "").Trim());
         }
+
+        [Fact]
+        public void ItRunsWithTheSpecifiedVerbosity()
+        {
+            var testAppName = "MSBuildTestApp";
+            var testInstance = TestAssets.Get(testAppName)
+                            .CreateInstance()
+                            .WithSourceFiles();
+
+            var result = new RunCommand()
+                .WithWorkingDirectory( testInstance.Root.FullName)
+                .ExecuteWithCapturedOutput("-v:n");
+
+            result.Should().Pass()
+                .And.HaveStdOutContaining("Hello World!");
+
+            if (!DotnetUnderTest.IsLocalized())
+            {
+                result.Should().HaveStdOutContaining("Restore")
+                    .And.HaveStdOutContaining("CoreCompile");
+            }
+        }
     }
 }
diff --git a/test/dotnet-run.Tests/dotnet-run.Tests.csproj b/test/dotnet-run.Tests/dotnet-run.Tests.csproj
index efde5f7cf..67bb5e7d5 100644
--- a/test/dotnet-run.Tests/dotnet-run.Tests.csproj
+++ b/test/dotnet-run.Tests/dotnet-run.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -18,8 +16,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-sln-add.Tests/GivenDotnetSlnAdd.cs b/test/dotnet-sln-add.Tests/GivenDotnetSlnAdd.cs
index 3d245115f..bb50d5f5d 100644
--- a/test/dotnet-sln-add.Tests/GivenDotnetSlnAdd.cs
+++ b/test/dotnet-sln-add.Tests/GivenDotnetSlnAdd.cs
@@ -9,6 +9,7 @@ using Microsoft.DotNet.Tools.Test.Utilities;
 using System;
 using System.IO;
 using System.Linq;
+using System.Text;
 using Xunit;
 using Xunit.Abstractions;
 
@@ -80,16 +81,16 @@ Global
 		{7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.Build.0 = Release|x86
 		__LIB_PROJECT_GUID__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		__LIB_PROJECT_GUID__.Debug|Any CPU.Build.0 = Debug|Any CPU
-		__LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|x64
-		__LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|x64
-		__LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|x86
-		__LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|x86
+		__LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|Any CPU
 		__LIB_PROJECT_GUID__.Release|Any CPU.ActiveCfg = Release|Any CPU
 		__LIB_PROJECT_GUID__.Release|Any CPU.Build.0 = Release|Any CPU
-		__LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|x64
-		__LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|x64
-		__LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|x86
-		__LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|x86
+		__LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -116,16 +117,16 @@ Global
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		__LIB_PROJECT_GUID__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		__LIB_PROJECT_GUID__.Debug|Any CPU.Build.0 = Debug|Any CPU
-		__LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|x64
-		__LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|x64
-		__LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|x86
-		__LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|x86
+		__LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|Any CPU
 		__LIB_PROJECT_GUID__.Release|Any CPU.ActiveCfg = Release|Any CPU
 		__LIB_PROJECT_GUID__.Release|Any CPU.Build.0 = Release|Any CPU
-		__LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|x64
-		__LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|x64
-		__LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|x86
-		__LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|x86
+		__LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 EndGlobal
 ";
@@ -165,16 +166,16 @@ Global
 		{7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.Build.0 = Release|x86
 		__LIB_PROJECT_GUID__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		__LIB_PROJECT_GUID__.Debug|Any CPU.Build.0 = Debug|Any CPU
-		__LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|x64
-		__LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|x64
-		__LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|x86
-		__LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|x86
+		__LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|Any CPU
+		__LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|Any CPU
 		__LIB_PROJECT_GUID__.Release|Any CPU.ActiveCfg = Release|Any CPU
 		__LIB_PROJECT_GUID__.Release|Any CPU.Build.0 = Release|Any CPU
-		__LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|x64
-		__LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|x64
-		__LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|x86
-		__LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|x86
+		__LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|Any CPU
+		__LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -183,6 +184,141 @@ Global
 		__LIB_PROJECT_GUID__ = __SRC_FOLDER_GUID__
 	EndGlobalSection
 EndGlobal
+";
+
+        private const string ExpectedSlnFileAfterAddingProjectWithoutMatchingConfigs = @"
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26006.2
+MinimumVisualStudioVersion = 10.0.40219.1
+Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""ProjectWithoutMatchingConfigs"", ""ProjectWithoutMatchingConfigs\ProjectWithoutMatchingConfigs.csproj"", ""{C49B64DE-4401-4825-8A88-10DCB5950E57}""
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		Foo Bar|Any CPU = Foo Bar|Any CPU
+		Foo Bar|x64 = Foo Bar|x64
+		Foo Bar|x86 = Foo Bar|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Debug|x64.Build.0 = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Debug|x86.Build.0 = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Release|x64.ActiveCfg = Release|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Release|x64.Build.0 = Release|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Release|x86.ActiveCfg = Release|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Release|x86.Build.0 = Release|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Foo Bar|Any CPU.ActiveCfg = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Foo Bar|Any CPU.Build.0 = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Foo Bar|x64.ActiveCfg = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Foo Bar|x64.Build.0 = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Foo Bar|x86.ActiveCfg = Debug|Any CPU
+		{C49B64DE-4401-4825-8A88-10DCB5950E57}.Foo Bar|x86.Build.0 = Debug|Any CPU
+	EndGlobalSection
+EndGlobal
+";
+
+  private const string ExpectedSlnFileAfterAddingProjectWithMatchingConfigs = @"
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26006.2
+MinimumVisualStudioVersion = 10.0.40219.1
+Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""ProjectWithMatchingConfigs"", ""ProjectWithMatchingConfigs\ProjectWithMatchingConfigs.csproj"", ""{C9601CA2-DB64-4FB6-B463-368C7764BF0D}""
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		Foo Bar|Any CPU = Foo Bar|Any CPU
+		Foo Bar|x64 = Foo Bar|x64
+		Foo Bar|x86 = Foo Bar|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Debug|x64.ActiveCfg = Debug|x64
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Debug|x64.Build.0 = Debug|x64
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Debug|x86.ActiveCfg = Debug|x86
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Debug|x86.Build.0 = Debug|x86
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Release|x64.ActiveCfg = Release|x64
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Release|x64.Build.0 = Release|x64
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Release|x86.ActiveCfg = Release|x86
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Release|x86.Build.0 = Release|x86
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Foo Bar|Any CPU.ActiveCfg = FooBar|Any CPU
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Foo Bar|Any CPU.Build.0 = FooBar|Any CPU
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Foo Bar|x64.ActiveCfg = FooBar|x64
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Foo Bar|x64.Build.0 = FooBar|x64
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Foo Bar|x86.ActiveCfg = FooBar|x86
+		{C9601CA2-DB64-4FB6-B463-368C7764BF0D}.Foo Bar|x86.Build.0 = FooBar|x86
+	EndGlobalSection
+EndGlobal
+";
+
+    private const string ExpectedSlnFileAfterAddingProjectWithAdditionalConfigs = @"
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26006.2
+MinimumVisualStudioVersion = 10.0.40219.1
+Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""ProjectWithAdditionalConfigs"", ""ProjectWithAdditionalConfigs\ProjectWithAdditionalConfigs.csproj"", ""{A302325B-D680-4C0E-8680-7AE283981624}""
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		Foo Bar|Any CPU = Foo Bar|Any CPU
+		Foo Bar|x64 = Foo Bar|x64
+		Foo Bar|x86 = Foo Bar|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A302325B-D680-4C0E-8680-7AE283981624}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A302325B-D680-4C0E-8680-7AE283981624}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A302325B-D680-4C0E-8680-7AE283981624}.Debug|x64.ActiveCfg = Debug|x64
+		{A302325B-D680-4C0E-8680-7AE283981624}.Debug|x64.Build.0 = Debug|x64
+		{A302325B-D680-4C0E-8680-7AE283981624}.Debug|x86.ActiveCfg = Debug|x86
+		{A302325B-D680-4C0E-8680-7AE283981624}.Debug|x86.Build.0 = Debug|x86
+		{A302325B-D680-4C0E-8680-7AE283981624}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A302325B-D680-4C0E-8680-7AE283981624}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A302325B-D680-4C0E-8680-7AE283981624}.Release|x64.ActiveCfg = Release|x64
+		{A302325B-D680-4C0E-8680-7AE283981624}.Release|x64.Build.0 = Release|x64
+		{A302325B-D680-4C0E-8680-7AE283981624}.Release|x86.ActiveCfg = Release|x86
+		{A302325B-D680-4C0E-8680-7AE283981624}.Release|x86.Build.0 = Release|x86
+		{A302325B-D680-4C0E-8680-7AE283981624}.Foo Bar|Any CPU.ActiveCfg = FooBar|Any CPU
+		{A302325B-D680-4C0E-8680-7AE283981624}.Foo Bar|Any CPU.Build.0 = FooBar|Any CPU
+		{A302325B-D680-4C0E-8680-7AE283981624}.Foo Bar|x64.ActiveCfg = FooBar|x64
+		{A302325B-D680-4C0E-8680-7AE283981624}.Foo Bar|x64.Build.0 = FooBar|x64
+		{A302325B-D680-4C0E-8680-7AE283981624}.Foo Bar|x86.ActiveCfg = FooBar|x86
+		{A302325B-D680-4C0E-8680-7AE283981624}.Foo Bar|x86.Build.0 = FooBar|x86
+	EndGlobalSection
+EndGlobal
 ";
 
         [Theory]
@@ -359,6 +495,81 @@ EndGlobal
                 .Should().BeVisuallyEquivalentTo(expectedSlnContents);
         }
 
+        [Fact]
+        public void WhenDirectoryContainingProjectIsGivenProjectIsAdded()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojFiles")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput("sln add Lib");
+            cmd.Should().Pass();
+
+            var slnPath = Path.Combine(projectDirectory, "App.sln");
+            var expectedSlnContents = GetExpectedSlnContents(slnPath, ExpectedSlnFileAfterAddingLibProj);
+            File.ReadAllText(slnPath)
+                .Should().BeVisuallyEquivalentTo(expectedSlnContents);
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsNoProjectsItCancelsWholeOperation()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojFiles")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var slnFullPath = Path.Combine(projectDirectory, "App.sln");
+            var contentBefore = File.ReadAllText(slnFullPath);
+            var directoryToAdd = "Empty";
+
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln add {directoryToAdd}");
+            cmd.Should().Fail();
+            cmd.StdErr.Should().Be(
+                string.Format(
+                    CommonLocalizableStrings.CouldNotFindAnyProjectInDirectory,
+                    Path.Combine(projectDirectory, directoryToAdd)));
+
+            File.ReadAllText(slnFullPath)
+                .Should().BeVisuallyEquivalentTo(contentBefore);
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsMultipleProjectsItCancelsWholeOperation()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojFiles")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var slnFullPath = Path.Combine(projectDirectory, "App.sln");
+            var contentBefore = File.ReadAllText(slnFullPath);
+            var directoryToAdd = "Multiple";
+
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln add {directoryToAdd}");
+            cmd.Should().Fail();
+            cmd.StdErr.Should().Be(
+                string.Format(
+                    CommonLocalizableStrings.MoreThanOneProjectInDirectory,
+                    Path.Combine(projectDirectory, directoryToAdd)));
+
+            File.ReadAllText(slnFullPath)
+                .Should().BeVisuallyEquivalentTo(contentBefore);
+        }
+
         [Fact]
         public void WhenProjectDirectoryIsAddedSolutionFoldersAreNotCreated()
         {
@@ -479,6 +690,33 @@ EndGlobal
             cmd.StdErr.Should().BeEmpty();
         }
 
+        [Fact]
+        public void WhenProjectIsAddedSolutionHasUTF8BOM()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithEmptySln")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var projectToAdd = "Lib/Lib.csproj";
+            var projectPath = Path.Combine("Lib", "Lib.csproj");
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln App.sln add {projectToAdd}");
+            cmd.Should().Pass();
+
+            var preamble = Encoding.UTF8.GetPreamble();
+            preamble.Length.Should().Be(3);
+            using (var stream = new FileStream(Path.Combine(projectDirectory, "App.sln"), FileMode.Open))
+            {
+                var bytes = new byte[preamble.Length];
+                stream.Read(bytes, 0, bytes.Length);
+                bytes.Should().BeEquivalentTo(preamble);
+            }
+        }
+
         [Theory]
         [InlineData("TestAppWithSlnAndCsprojFiles")]
         [InlineData("TestAppWithSlnAndCsprojProjectGuidFiles")]
@@ -597,7 +835,7 @@ EndGlobal
                 .WithWorkingDirectory(projectDirectory)
                 .ExecuteWithCapturedOutput($"sln App.sln add {projectToAdd} idonotexist.csproj");
             cmd.Should().Fail();
-            cmd.StdErr.Should().Be(string.Format(CommonLocalizableStrings.ProjectDoesNotExist, "idonotexist.csproj"));
+            cmd.StdErr.Should().Be(string.Format(CommonLocalizableStrings.CouldNotFindProjectOrDirectory, "idonotexist.csproj"));
 
             File.ReadAllText(slnFullPath)
                 .Should().BeVisuallyEquivalentTo(contentBefore);
@@ -685,6 +923,69 @@ EndGlobal
             solutionFolderProjects.Count().Should().Be(1);
         }
 
+        [Fact]
+        public void WhenProjectWithoutMatchingConfigurationsIsAddedSolutionMapsToFirstAvailable()
+        {
+            var slnDirectory = TestAssets
+                .Get("TestAppWithSlnAndProjectConfigs")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var slnFullPath = Path.Combine(slnDirectory, "App.sln");
+
+            var result = new DotnetCommand()
+                .WithWorkingDirectory(slnDirectory)
+                .ExecuteWithCapturedOutput($"sln add ProjectWithoutMatchingConfigs");
+            result.Should().Pass();
+
+            File.ReadAllText(slnFullPath)
+                .Should().BeVisuallyEquivalentTo(ExpectedSlnFileAfterAddingProjectWithoutMatchingConfigs);
+        }
+
+        [Fact]
+        public void WhenProjectWithMatchingConfigurationsIsAddedSolutionMapsAll()
+        {
+            var slnDirectory = TestAssets
+                .Get("TestAppWithSlnAndProjectConfigs")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var slnFullPath = Path.Combine(slnDirectory, "App.sln");
+
+            var result = new DotnetCommand()
+                .WithWorkingDirectory(slnDirectory)
+                .ExecuteWithCapturedOutput($"sln add ProjectWithMatchingConfigs");
+            result.Should().Pass();
+
+            File.ReadAllText(slnFullPath)
+                .Should().BeVisuallyEquivalentTo(ExpectedSlnFileAfterAddingProjectWithMatchingConfigs);
+        }
+
+        [Fact]
+        public void WhenProjectWithAdditionalConfigurationsIsAddedSolutionDoesNotMapThem()
+        {
+            var slnDirectory = TestAssets
+                .Get("TestAppWithSlnAndProjectConfigs")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var slnFullPath = Path.Combine(slnDirectory, "App.sln");
+
+            var result = new DotnetCommand()
+                .WithWorkingDirectory(slnDirectory)
+                .ExecuteWithCapturedOutput($"sln add ProjectWithAdditionalConfigs");
+            result.Should().Pass();
+
+            File.ReadAllText(slnFullPath)
+                .Should().BeVisuallyEquivalentTo(ExpectedSlnFileAfterAddingProjectWithAdditionalConfigs);
+        }
+
         private string GetExpectedSlnContents(
             string slnPath,
             string slnTemplate,
diff --git a/test/dotnet-sln-add.Tests/dotnet-sln-add.Tests.csproj b/test/dotnet-sln-add.Tests/dotnet-sln-add.Tests.csproj
index 66b78a5f1..e9517ee27 100644
--- a/test/dotnet-sln-add.Tests/dotnet-sln-add.Tests.csproj
+++ b/test/dotnet-sln-add.Tests/dotnet-sln-add.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -17,14 +15,14 @@
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\..\src\dotnet\dotnet.csproj" />
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-sln-list.Tests/dotnet-sln-list.Tests.csproj b/test/dotnet-sln-list.Tests/dotnet-sln-list.Tests.csproj
index a315be891..add751ca9 100644
--- a/test/dotnet-sln-list.Tests/dotnet-sln-list.Tests.csproj
+++ b/test/dotnet-sln-list.Tests/dotnet-sln-list.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -17,13 +15,13 @@
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\..\src\dotnet\dotnet.csproj" />
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-sln-remove.Tests/GivenDotnetSlnRemove.cs b/test/dotnet-sln-remove.Tests/GivenDotnetSlnRemove.cs
index 78f64b25f..0b9ee7fa2 100644
--- a/test/dotnet-sln-remove.Tests/GivenDotnetSlnRemove.cs
+++ b/test/dotnet-sln-remove.Tests/GivenDotnetSlnRemove.cs
@@ -8,6 +8,7 @@ using Microsoft.DotNet.Tools.Test.Utilities;
 using System;
 using System.IO;
 using System.Linq;
+using System.Text;
 using Xunit;
 
 namespace Microsoft.DotNet.Cli.Sln.Remove.Tests
@@ -169,6 +170,42 @@ Global
 		{7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 EndGlobal
+";
+
+        private const string ExpectedSlnContentsAfterRemoveProjectWithDependencies = @"
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27110.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""App"", ""App\App.csproj"", ""{BB02B949-F6BD-4872-95CB-96A05B1FE026}""
+	ProjectSection(ProjectDependencies) = postProject
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6} = {D53E177A-8ECF-43D5-A01E-98B884D53CA6}
+	EndProjectSection
+EndProject
+Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""First"", ""First\First.csproj"", ""{D53E177A-8ECF-43D5-A01E-98B884D53CA6}""
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BB02B949-F6BD-4872-95CB-96A05B1FE026}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D53E177A-8ECF-43D5-A01E-98B884D53CA6}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {F6D9A973-1CFD-41C9-84F2-1471C0FE67DF}
+	EndGlobalSection
+EndGlobal
 ";
 
         [Theory]
@@ -331,7 +368,7 @@ EndGlobal
                 .WithWorkingDirectory(projectDirectory)
                 .ExecuteWithCapturedOutput("sln remove referenceDoesNotExistInSln.csproj");
             cmd.Should().Pass();
-            cmd.StdOut.Should().Be(string.Format(CommonLocalizableStrings.ProjectReferenceCouldNotBeFound, "referenceDoesNotExistInSln.csproj"));
+            cmd.StdOut.Should().Be(string.Format(CommonLocalizableStrings.ProjectNotFoundInTheSolution, "referenceDoesNotExistInSln.csproj"));
             File.ReadAllText(solutionPath)
                 .Should().BeVisuallyEquivalentTo(contentBefore);
         }
@@ -355,7 +392,7 @@ EndGlobal
                 .WithWorkingDirectory(projectDirectory)
                 .ExecuteWithCapturedOutput($"sln remove {projectToRemove}");
             cmd.Should().Pass();
-            cmd.StdOut.Should().Be(string.Format(CommonLocalizableStrings.ProjectReferenceRemoved, projectToRemove));
+            cmd.StdOut.Should().Be(string.Format(CommonLocalizableStrings.ProjectRemovedFromTheSolution, projectToRemove));
 
             slnFile = SlnFile.Read(solutionPath);
             slnFile.Projects.Count.Should().Be(1);
@@ -382,7 +419,7 @@ EndGlobal
                 .ExecuteWithCapturedOutput($"sln remove {projectToRemove}");
             cmd.Should().Pass();
 
-            string outputText = string.Format(CommonLocalizableStrings.ProjectReferenceRemoved, projectToRemove);
+            string outputText = string.Format(CommonLocalizableStrings.ProjectRemovedFromTheSolution, projectToRemove);
             outputText += Environment.NewLine + outputText;
             cmd.StdOut.Should().BeVisuallyEquivalentTo(outputText);
 
@@ -411,9 +448,9 @@ EndGlobal
                 .ExecuteWithCapturedOutput($"sln remove idontexist.csproj {projectToRemove} idontexisteither.csproj");
             cmd.Should().Pass();
 
-            string outputText = $@"{string.Format(CommonLocalizableStrings.ProjectReferenceCouldNotBeFound, "idontexist.csproj")}
-{string.Format(CommonLocalizableStrings.ProjectReferenceRemoved, projectToRemove)}
-{string.Format(CommonLocalizableStrings.ProjectReferenceCouldNotBeFound, "idontexisteither.csproj")}";
+            string outputText = $@"{string.Format(CommonLocalizableStrings.ProjectNotFoundInTheSolution, "idontexist.csproj")}
+{string.Format(CommonLocalizableStrings.ProjectRemovedFromTheSolution, projectToRemove)}
+{string.Format(CommonLocalizableStrings.ProjectNotFoundInTheSolution, "idontexisteither.csproj")}";
 
             cmd.StdOut.Should().BeVisuallyEquivalentTo(outputText);
 
@@ -446,6 +483,73 @@ EndGlobal
                 .Should().BeVisuallyEquivalentTo(ExpectedSlnContentsAfterRemove);
         }
 
+        [Fact]
+        public void WhenDirectoryContainingProjectIsGivenProjectIsRemoved()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojToRemove")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var solutionPath = Path.Combine(projectDirectory, "App.sln");
+            SlnFile slnFile = SlnFile.Read(solutionPath);
+            slnFile.Projects.Count.Should().Be(2);
+
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput("sln remove Lib");
+            cmd.Should().Pass();
+
+            File.ReadAllText(solutionPath)
+                .Should().BeVisuallyEquivalentTo(ExpectedSlnContentsAfterRemove);
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsNoProjectsItCancelsWholeOperation()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojToRemove")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+            var directoryToRemove = "Empty";
+
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln remove {directoryToRemove}");
+            cmd.Should().Fail();
+            cmd.StdErr.Should().Be(
+                string.Format(
+                    CommonLocalizableStrings.CouldNotFindAnyProjectInDirectory,
+                    Path.Combine(projectDirectory, directoryToRemove)));
+            cmd.StdOut.Should().BeVisuallyEquivalentToIfNotLocalized(HelpText);
+        }
+
+        [Fact]
+        public void WhenDirectoryContainsMultipleProjectsItCancelsWholeOperation()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojToRemove")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+            var directoryToRemove = "Multiple";
+
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln remove {directoryToRemove}");
+            cmd.Should().Fail();
+            cmd.StdErr.Should().Be(
+                string.Format(
+                    CommonLocalizableStrings.MoreThanOneProjectInDirectory,
+                    Path.Combine(projectDirectory, directoryToRemove)));
+            cmd.StdOut.Should().BeVisuallyEquivalentToIfNotLocalized(HelpText);
+        }
+
         [Fact]
         public void WhenReferenceIsRemovedSlnBuilds()
         {
@@ -487,6 +591,32 @@ EndGlobal
                 .Count().Should().Be(1, $"App {reasonString}");
         }
 
+        [Fact]
+        public void WhenProjectIsRemovedSolutionHasUTF8BOM()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnAndCsprojToRemove")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var projectToRemove = Path.Combine("Lib", "Lib.csproj");
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln App.sln remove {projectToRemove}");
+            cmd.Should().Pass();
+
+            var preamble = Encoding.UTF8.GetPreamble();
+            preamble.Length.Should().Be(3);
+            using (var stream = new FileStream(Path.Combine(projectDirectory, "App.sln"), FileMode.Open))
+            {
+                var bytes = new byte[preamble.Length];
+                stream.Read(bytes, 0, bytes.Length);
+                bytes.Should().BeEquivalentTo(preamble);
+            }
+        }
+
         [Fact]
         public void WhenFinalReferenceIsRemovedEmptySectionsAreRemoved()
         {
@@ -556,5 +686,27 @@ EndGlobal
             File.ReadAllText(solutionPath)
                 .Should().BeVisuallyEquivalentTo(ExpectedSlnContentsAfterRemoveLastNestedProj);
         }
+
+        [Fact]
+        public void WhenProjectIsRemovedThenDependenciesOnProjectAreAlsoRemoved()
+        {
+            var projectDirectory = TestAssets
+                .Get("TestAppWithSlnProjectDependencyToRemove")
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var solutionPath = Path.Combine(projectDirectory, "App.sln");
+
+            var projectToRemove = Path.Combine("Second", "Second.csproj");
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"sln remove {projectToRemove}");
+            cmd.Should().Pass();
+
+            File.ReadAllText(solutionPath)
+                .Should().BeVisuallyEquivalentTo(ExpectedSlnContentsAfterRemoveProjectWithDependencies);
+        }
     }
 }
diff --git a/test/dotnet-sln-remove.Tests/dotnet-sln-remove.Tests.csproj b/test/dotnet-sln-remove.Tests/dotnet-sln-remove.Tests.csproj
index 6c2176c9a..77c873927 100644
--- a/test/dotnet-sln-remove.Tests/dotnet-sln-remove.Tests.csproj
+++ b/test/dotnet-sln-remove.Tests/dotnet-sln-remove.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -17,13 +15,13 @@
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Sln.Internal\Microsoft.DotNet.Cli.Sln.Internal.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
     <ProjectReference Include="..\..\src\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj" />
-    <ProjectReference Include="..\..\src\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
+    <ProjectReference Include="..\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj" />
     <ProjectReference Include="..\..\src\dotnet\dotnet.csproj" />
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-store.Tests/GivenDotnetStoresAndPublishesProjects.cs b/test/dotnet-store.Tests/GivenDotnetStoresAndPublishesProjects.cs
index 00360f446..a0e95d8f9 100644
--- a/test/dotnet-store.Tests/GivenDotnetStoresAndPublishesProjects.cs
+++ b/test/dotnet-store.Tests/GivenDotnetStoresAndPublishesProjects.cs
@@ -13,7 +13,7 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
 {
     public class GivenDotnetStoresAndPublishesProjects : TestBase
     {
-        private static string _tfm = "netcoreapp2.0";
+        private static string _tfm = "netcoreapp2.1";
         private static string _frameworkVersion = TestAssetInstance.CurrentRuntimeFrameworkVersion;
         private static string _arch = RuntimeEnvironment.RuntimeArchitecture.ToLowerInvariant();
 
@@ -108,7 +108,8 @@ namespace Microsoft.DotNet.Cli.Publish.Tests
                     "    path: 'lib/netstandard1.3/NuGet.Configuration.dll'");
         }
 
-        [Fact]
+        //  Windows only for now due to https://github.com/dotnet/cli/issues/7501
+        [WindowsOnlyFact]
         public void ItPublishesAnAppWithMultipleProfiles()
         {
             var testAppName = "MultiDependentProject";
diff --git a/test/dotnet-store.Tests/dotnet-store.Tests.csproj b/test/dotnet-store.Tests/dotnet-store.Tests.csproj
index b3935c5cc..dca381c56 100644
--- a/test/dotnet-store.Tests/dotnet-store.Tests.csproj
+++ b/test/dotnet-store.Tests/dotnet-store.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -14,8 +12,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs
index 0a6e2e0fd..801879573 100644
--- a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs
+++ b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs
@@ -97,7 +97,7 @@ namespace Microsoft.DotNet.Cli.Test.Tests
 
             new DotnetTestCommand()
                .WithWorkingDirectory(projectDirectory)
-               .ExecuteWithCapturedOutput($"{TestBase.ConsoleLoggerOutputNormal} --framework netcoreapp2.0")
+               .ExecuteWithCapturedOutput($"{TestBase.ConsoleLoggerOutputNormal} --framework netcoreapp2.1")
                .Should().Pass();
         }
     }
diff --git a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs
index 050b547e1..3b06797aa 100644
--- a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs
+++ b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs
@@ -117,17 +117,18 @@ namespace Microsoft.DotNet.Cli.Test.Tests
             var testProjectDirectory = this.CopyAndRestoreVSTestDotNetCoreTestApp("5");
             string configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
             string expectedError = Path.Combine(testProjectDirectory, "bin",
-                                   configuration, "netcoreapp2.0", "VSTestCore.dll");
+                                   configuration, "netcoreapp2.1", "VSTestCore.dll");
             expectedError = "The test source file " + "\"" + expectedError + "\"" + " provided was not found.";
 
             // Call test
             CommandResult result = new DotnetTestCommand()
                                        .WithWorkingDirectory(testProjectDirectory)
-                                       .ExecuteWithCapturedOutput("--no-build");
+                                       .ExecuteWithCapturedOutput("--no-build -v:m");
 
             // Verify
             if (!DotnetUnderTest.IsLocalized())
             {
+                result.StdOut.Should().NotContain("Restore");
                 result.StdErr.Should().Contain(expectedError);
             }
 
diff --git a/test/dotnet-test.Tests/dotnet-test.Tests.csproj b/test/dotnet-test.Tests/dotnet-test.Tests.csproj
index fec1c07a6..fc0a3a72e 100644
--- a/test/dotnet-test.Tests/dotnet-test.Tests.csproj
+++ b/test/dotnet-test.Tests/dotnet-test.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -14,8 +12,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet-vstest.Tests/VSTestTests.cs b/test/dotnet-vstest.Tests/VSTestTests.cs
index d1de1e8e8..c6a7dd035 100644
--- a/test/dotnet-vstest.Tests/VSTestTests.cs
+++ b/test/dotnet-vstest.Tests/VSTestTests.cs
@@ -31,7 +31,7 @@ namespace Microsoft.DotNet.Cli.VSTest.Tests
                 .Should().Pass();
 
             var outputDll = testRoot
-                .GetDirectory("bin", configuration, "netcoreapp2.0")
+                .GetDirectory("bin", configuration, "netcoreapp2.1")
                 .GetFile($"{testAppName}.dll");
 
             var argsForVstest = $"\"{outputDll.FullName}\" --logger:console;verbosity=normal";
diff --git a/test/dotnet-vstest.Tests/dotnet-vstest.Tests.csproj b/test/dotnet-vstest.Tests/dotnet-vstest.Tests.csproj
index 5b89d32d0..5fa956cd6 100644
--- a/test/dotnet-vstest.Tests/dotnet-vstest.Tests.csproj
+++ b/test/dotnet-vstest.Tests/dotnet-vstest.Tests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -14,8 +12,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/test/dotnet.Tests/BundledTargetFramworkTests.cs b/test/dotnet.Tests/BundledTargetFramworkTests.cs
new file mode 100644
index 000000000..4f67d03fa
--- /dev/null
+++ b/test/dotnet.Tests/BundledTargetFramworkTests.cs
@@ -0,0 +1,39 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.IO;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using Xunit;
+using FluentAssertions;
+using NuGet.Frameworks;
+
+namespace Microsoft.DotNet.Tests
+{
+    public class BundledTargetFrameworkTests : TestBase
+    {
+        [Fact]
+        public void VersionCommandDisplaysCorrectVersion()
+        {
+            var filePath = Path.Combine(
+                AppContext.BaseDirectory,
+                "ExpectedTargetFrameworkMoniker.txt");
+            var targetFrameworkMoniker = GetTargetFrameworkMonikerFromFile(filePath);
+            var shortFolderName = NuGetFramework
+                .Parse(targetFrameworkMoniker)
+                .GetShortFolderName();
+            BundledTargetFramework
+                .GetTargetFrameworkMoniker()
+                .Should().Be(shortFolderName);
+        }
+
+        private static string GetTargetFrameworkMonikerFromFile(string versionFilePath)
+        {
+            using (var reader = new StreamReader(File.OpenRead(versionFilePath)))
+            {
+                return reader.ReadLine();
+            }
+        }
+    }
+}
diff --git a/test/dotnet.Tests/GivenThatICareAboutVBApps.cs b/test/dotnet.Tests/GivenThatICareAboutVBApps.cs
index 4b7d0186b..26fb40dd4 100644
--- a/test/dotnet.Tests/GivenThatICareAboutVBApps.cs
+++ b/test/dotnet.Tests/GivenThatICareAboutVBApps.cs
@@ -57,7 +57,7 @@ namespace Microsoft.DotNet.Tests
                 _testInstance.Root.FullName,
                 "bin",
                 configuration,
-                "netcoreapp2.0",
+                "netcoreapp2.1",
                 "publish",
                 "VBTestApp.dll");
 
diff --git a/test/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs b/test/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs
index 4fd1fb660..6f2b1db8f 100644
--- a/test/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs
+++ b/test/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs
@@ -28,6 +28,8 @@ namespace Microsoft.DotNet.Tests
             _testDirectory = TestAssets.CreateTestDirectory("Dotnet_first_time_experience_tests").FullName;
             var testNuGetHome = Path.Combine(_testDirectory, "nuget_home");
             var cliTestFallbackFolder = Path.Combine(testNuGetHome, ".dotnet", "NuGetFallbackFolder");
+            var profiled = Path.Combine(_testDirectory, "profile.d");
+            var pathsd = Path.Combine(_testDirectory, "paths.d");
 
             var command = new DotnetCommand()
                 .WithWorkingDirectory(_testDirectory);
@@ -35,6 +37,8 @@ namespace Microsoft.DotNet.Tests
             command.Environment["USERPROFILE"] = testNuGetHome;
             command.Environment["APPDATA"] = testNuGetHome;
             command.Environment["DOTNET_CLI_TEST_FALLBACKFOLDER"] = cliTestFallbackFolder;
+            command.Environment["DOTNET_CLI_TEST_LINUX_PROFILED_PATH"] = profiled;
+            command.Environment["DOTNET_CLI_TEST_OSX_PATHSD_PATH"] = pathsd;
             command.Environment["DOTNET_SKIP_FIRST_TIME_EXPERIENCE"] = "";
             command.Environment["SkipInvalidConfigurations"] = "true";
 
@@ -72,6 +76,15 @@ namespace Microsoft.DotNet.Tests
                 .And.NotContain("Restore completed in");
         }
 
+        [Fact]
+        public void ItShowsTheAspNetCertificateGenerationMessageToTheUser()
+        {
+            _firstDotnetVerbUseCommandResult.StdOut
+                .Should()
+                .ContainVisuallySameFragment(Configurer.LocalizableStrings.AspNetCertificateInstalled)
+                .And.NotContain("Restore completed in");
+        }
+
         [Fact]
         public void ItCreatesASentinelFileUnderTheNuGetCacheFolder()
         {
@@ -89,9 +102,19 @@ namespace Microsoft.DotNet.Tests
         }
 
         [Fact]
-        public void ItDoesNotCreateAFirstUseSentinelFileUnderTheDotDotNetFolderWhenInternalReportInstallSuccessIsInvoked()
+        public void ItCreatesAnAspNetCertificateSentinelFileUnderTheDotDotNetFolder()
+        {
+            _dotDotnetFolder
+                .Should()
+                .HaveFile($"{GetDotnetVersion()}.aspNetCertificateSentinel");
+        }
+
+        [Fact]
+        public void ItDoesNotCreateAFirstUseSentinelFileNorAnAspNetCertificateSentinelFileUnderTheDotDotNetFolderWhenInternalReportInstallSuccessIsInvoked()
         {
             var emptyHome = Path.Combine(_testDirectory, "empty_home");
+            var profiled = Path.Combine(_testDirectory, "profile.d");
+            var pathsd = Path.Combine(_testDirectory, "paths.d");
 
             var command = new DotnetCommand()
                 .WithWorkingDirectory(_testDirectory);
@@ -100,6 +123,8 @@ namespace Microsoft.DotNet.Tests
             command.Environment["APPDATA"] = emptyHome;
             command.Environment["DOTNET_CLI_TEST_FALLBACKFOLDER"] = _nugetFallbackFolder.FullName;
             command.Environment["DOTNET_SKIP_FIRST_TIME_EXPERIENCE"] = "";
+            command.Environment["DOTNET_CLI_TEST_LINUX_PROFILED_PATH"] = profiled;
+            command.Environment["DOTNET_CLI_TEST_OSX_PATHSD_PATH"] = pathsd;
             // Disable to prevent the creation of the .dotnet folder by optimizationdata.
             command.Environment["DOTNET_DISABLE_MULTICOREJIT"] = "true";
             command.Environment["SkipInvalidConfigurations"] = "true";
@@ -109,6 +134,7 @@ namespace Microsoft.DotNet.Tests
             var homeFolder = new DirectoryInfo(Path.Combine(emptyHome, ".dotnet"));
             string[] fileEntries = Directory.GetFiles(homeFolder.ToString());
             fileEntries.Should().OnlyContain(x => !x.Contains(".dotnetFirstUseSentinel"));
+            fileEntries.Should().OnlyContain(x => !x.Contains(".aspNetCertificateSentinel"));
         }
 
         [Fact]
@@ -116,6 +142,8 @@ namespace Microsoft.DotNet.Tests
         {
             var newHome = Path.Combine(_testDirectory, "new_home");
             var newHomeFolder = new DirectoryInfo(Path.Combine(newHome, ".dotnet"));
+            var profiled = Path.Combine(_testDirectory, "profile.d");
+            var pathsd = Path.Combine(_testDirectory, "paths.d");
 
             var command = new DotnetCommand()
                 .WithWorkingDirectory(_testDirectory);
@@ -123,6 +151,8 @@ namespace Microsoft.DotNet.Tests
             command.Environment["USERPROFILE"] = newHome;
             command.Environment["APPDATA"] = newHome;
             command.Environment["DOTNET_CLI_TEST_FALLBACKFOLDER"] = _nugetFallbackFolder.FullName;
+            command.Environment["DOTNET_CLI_TEST_LINUX_PROFILED_PATH"] = profiled;
+            command.Environment["DOTNET_CLI_TEST_OSX_PATHSD_PATH"] = pathsd;
             command.Environment["DOTNET_SKIP_FIRST_TIME_EXPERIENCE"] = "";
             command.Environment["SkipInvalidConfigurations"] = "true";
 
@@ -135,6 +165,34 @@ namespace Microsoft.DotNet.Tests
                 .ContainVisuallySameFragment(Configurer.LocalizableStrings.FirstTimeWelcomeMessage);
         }
 
+        [Fact]
+        public void ItShowsTheAspNetCertificateGenerationMessageWhenInvokingACommandAfterInternalReportInstallSuccessHasBeenInvoked()
+        {
+            var newHome = Path.Combine(_testDirectory, "aspnet_home");
+            var newHomeFolder = new DirectoryInfo(Path.Combine(newHome, ".dotnet"));
+            var profiled = Path.Combine(_testDirectory, "profile.d");
+            var pathsd = Path.Combine(_testDirectory, "paths.d");
+
+            var command = new DotnetCommand()
+                .WithWorkingDirectory(_testDirectory);
+            command.Environment["HOME"] = newHome;
+            command.Environment["USERPROFILE"] = newHome;
+            command.Environment["APPDATA"] = newHome;
+            command.Environment["DOTNET_CLI_TEST_FALLBACKFOLDER"] = _nugetFallbackFolder.FullName;
+            command.Environment["DOTNET_CLI_TEST_LINUX_PROFILED_PATH"] = profiled;
+            command.Environment["DOTNET_CLI_TEST_OSX_PATHSD_PATH"] = pathsd;
+            command.Environment["DOTNET_SKIP_FIRST_TIME_EXPERIENCE"] = "";
+            command.Environment["SkipInvalidConfigurations"] = "true";
+
+            command.ExecuteWithCapturedOutput("internal-reportinstallsuccess test").Should().Pass();
+
+            var result = command.ExecuteWithCapturedOutput("new --debug:ephemeral-hive");
+
+            result.StdOut
+                .Should()
+                .ContainVisuallySameFragment(Configurer.LocalizableStrings.AspNetCertificateInstalled);
+        }
+
         [Fact]
         public void ItRestoresTheNuGetPackagesToTheNuGetCacheFolder()
         {
diff --git a/test/dotnet.Tests/PackagedCommandTests.cs b/test/dotnet.Tests/PackagedCommandTests.cs
index 27c08b918..6e36eb87f 100644
--- a/test/dotnet.Tests/PackagedCommandTests.cs
+++ b/test/dotnet.Tests/PackagedCommandTests.cs
@@ -175,7 +175,7 @@ namespace Microsoft.DotNet.Tests
                                           ".tools",
                                           toolName);
 
-            //  Other tests may have restored the tool for netcoreapp2.0, so delete its tools folder
+            //  Other tests may have restored the tool for netcoreapp2.1, so delete its tools folder
             if (Directory.Exists(toolFolder))
             {
                 Directory.Delete(toolFolder, true);
@@ -246,8 +246,8 @@ namespace Microsoft.DotNet.Tests
                 .CreateInstance()
                 .WithSourceFiles()
                 .WithRestoreFiles();
-            
-            const string framework = ".NETCoreApp,Version=v2.0";
+
+            string framework = Tools.Tests.Utilities.NuGetFrameworks.NetCoreApp21.DotNetFrameworkName;
 
             new BuildCommand()
                 .WithProjectDirectory(testInstance.Root)
@@ -423,7 +423,7 @@ namespace Microsoft.DotNet.Tests
                 .WithRestoreFiles();
 
             var assetsFile = new DirectoryInfo(new RepoDirectoriesProvider().NugetPackages)
-                .GetDirectory(".tools", "dotnet-portable", "1.0.0", "netcoreapp2.0")
+                .GetDirectory(".tools", "dotnet-portable", "1.0.0", "netcoreapp2.1")
                 .GetFile("project.assets.json");
 
             var stopWatch = Stopwatch.StartNew();
diff --git a/test/dotnet.Tests/ParserTests/InstallToolParserTests.cs b/test/dotnet.Tests/ParserTests/InstallToolParserTests.cs
new file mode 100644
index 000000000..625f110c1
--- /dev/null
+++ b/test/dotnet.Tests/ParserTests/InstallToolParserTests.cs
@@ -0,0 +1,72 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.Linq;
+using FluentAssertions;
+using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Cli.CommandLine;
+using Xunit;
+using Xunit.Abstractions;
+using Parser = Microsoft.DotNet.Cli.Parser;
+
+namespace Microsoft.DotNet.Tests.ParserTests
+{
+    public class InstallToolParserTests
+    {
+        private readonly ITestOutputHelper output;
+
+        public InstallToolParserTests(ITestOutputHelper output)
+        {
+            this.output = output;
+        }
+
+        [Fact]
+        public void InstallGlobaltoolParserCanGetPackageIdAndPackageVersion()
+        {
+            var command = Parser.Instance;
+            var result = command.Parse("dotnet install tool -g console.test.app --version 1.0.1");
+
+            var parseResult = result["dotnet"]["install"]["tool"];
+
+            var packageId = parseResult.Arguments.Single();
+            var packageVersion = parseResult.ValueOrDefault<string>("version");
+
+            packageId.Should().Be("console.test.app");
+            packageVersion.Should().Be("1.0.1");
+        }
+
+        [Fact]
+        public void InstallGlobaltoolParserCanGetFollowingArguments()
+        {
+            var command = Parser.Instance;
+            var result =
+                command.Parse(
+                    @"dotnet install tool -g console.test.app --version 1.0.1 --framework netcoreapp2.0 --configfile C:\TestAssetLocalNugetFeed");
+
+            var parseResult = result["dotnet"]["install"]["tool"];
+
+            parseResult.ValueOrDefault<string>("configfile").Should().Be(@"C:\TestAssetLocalNugetFeed");
+            parseResult.ValueOrDefault<string>("framework").Should().Be("netcoreapp2.0");
+        }
+
+        [Fact]
+        public void InstallToolParserCanParseSourceOption()
+        {
+            const string expectedSourceValue = "TestSourceValue";
+
+            var result = Parser.Instance.Parse($"dotnet install tool -g --source {expectedSourceValue} console.test.app");
+
+            var appliedOptions = result["dotnet"]["install"]["tool"];
+            appliedOptions.ValueOrDefault<string>("source").Should().Be(expectedSourceValue);
+        }
+
+        [Fact]
+        public void InstallToolParserCanGetGlobalOption()
+        {
+            var result = Parser.Instance.Parse("dotnet install tool -g console.test.app");
+
+            var appliedOptions = result["dotnet"]["install"]["tool"];
+            appliedOptions.ValueOrDefault<bool>("global").Should().Be(true);
+        }
+    }
+}
diff --git a/test/dotnet.Tests/ParserTests/RunParserTests.cs b/test/dotnet.Tests/ParserTests/RunParserTests.cs
index 6fdee951b..b70e78c9a 100644
--- a/test/dotnet.Tests/ParserTests/RunParserTests.cs
+++ b/test/dotnet.Tests/ParserTests/RunParserTests.cs
@@ -20,7 +20,7 @@ namespace Microsoft.DotNet.Tests.ParserTests
         private readonly ITestOutputHelper output;
 
         [Fact]
-        public void RunParserCanGetArguementFromDoubleDash()
+        public void RunParserCanGetArgumentFromDoubleDash()
         {
             var runCommand = RunCommand.FromArgs(new[]{ "--", "foo" });
             runCommand.Args.Single().Should().Be("foo");
diff --git a/test/dotnet.Tests/TelemetryCommandTest.cs b/test/dotnet.Tests/TelemetryCommandTest.cs
index af231ecc7..3668dee1a 100644
--- a/test/dotnet.Tests/TelemetryCommandTest.cs
+++ b/test/dotnet.Tests/TelemetryCommandTest.cs
@@ -7,6 +7,7 @@ using Microsoft.DotNet.Cli.Telemetry;
 using Microsoft.DotNet.Cli.Utils;
 using Microsoft.DotNet.Tools.Test.Utilities;
 using System.Collections.Generic;
+using System;
 using Xunit;
 
 namespace Microsoft.DotNet.Tests
@@ -26,6 +27,22 @@ namespace Microsoft.DotNet.Tests
             TelemetryEventEntry.TelemetryFilter = new TelemetryFilter(Sha256Hasher.HashWithNormalizedCasing);
         }
 
+        [Fact]
+        public void NoTelemetryIfCommandIsInvalid()
+        {
+            string[] args = { "publish", "-r"};
+            Action a = () => { Cli.Program.ProcessArgs(args); };
+            a.ShouldNotThrow<ArgumentOutOfRangeException>();
+        }
+
+        [Fact]
+        public void NoTelemetryIfCommandIsInvalid2()
+        {
+            string[] args = { "restore", "-v" };
+            Action a = () => { Cli.Program.ProcessArgs(args); };
+            a.ShouldNotThrow<ArgumentOutOfRangeException>();
+        }
+
         [Fact]
         public void TopLevelCommandNameShouldBeSentToTelemetry()
         {
@@ -145,7 +162,9 @@ namespace Microsoft.DotNet.Tests
         public void DotnetNugetCommandFirstArgumentShouldBeSentToTelemetry()
         {
             const string argumentToSend = "push";
-            string[] args = { "nuget", argumentToSend, "aRoot" };
+
+            string[] args = { "nuget", argumentToSend };
+
             Cli.Program.ProcessArgs(args);
             _fakeTelemetry
                 .LogEntries.Should()
diff --git a/test/dotnet.Tests/TelemetryCommonPropertiesTests.cs b/test/dotnet.Tests/TelemetryCommonPropertiesTests.cs
index b30e59e9d..7c6c5484d 100644
--- a/test/dotnet.Tests/TelemetryCommonPropertiesTests.cs
+++ b/test/dotnet.Tests/TelemetryCommonPropertiesTests.cs
@@ -5,9 +5,11 @@ using FluentAssertions;
 using Microsoft.DotNet.Tools.Test.Utilities;
 using Xunit;
 using System;
+using System.Runtime.InteropServices;
 using Microsoft.DotNet.Cli;
 using Microsoft.DotNet.Cli.Telemetry;
 using Microsoft.DotNet.Configurer;
+using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment;
 
 namespace Microsoft.DotNet.Tests
 {
@@ -43,6 +45,13 @@ namespace Microsoft.DotNet.Tests
             Guid.TryParse(assignedMachineId, out var _).Should().BeTrue("it should be a guid");
         }
 
+        [Fact]
+        public void TelemetryCommonPropertiesShouldContainKernelVersion()
+        {
+            var unitUnderTest = new TelemetryCommonProperties(getMACAddress: () => null, userLevelCacheWriter: new NothingCache());
+            unitUnderTest.GetTelemetryCommonProperties()["Kernel Version"].Should().Be(RuntimeInformation.OSDescription);
+        }
+
         private class NothingCache : IUserLevelCacheWriter
         {
             public string RunWithCache(string cacheKey, Func<string> getValueToCache)
diff --git a/test/dotnet.Tests/VersionTest.cs b/test/dotnet.Tests/VersionTest.cs
index 0192f5fd8..3b0e1c92e 100644
--- a/test/dotnet.Tests/VersionTest.cs
+++ b/test/dotnet.Tests/VersionTest.cs
@@ -17,7 +17,7 @@ namespace Microsoft.DotNet.Tests
         [Fact]
         public void VersionCommandDisplaysCorrectVersion()
         {
-            var versionFilePath = Path.Combine(AppContext.BaseDirectory, ".version");
+            var versionFilePath = Path.Combine(AppContext.BaseDirectory, "ExpectedSdkVersion.txt");
             var version = GetVersionFromFile(versionFilePath);
 
             CommandResult result = new DotnetCommand()
@@ -31,14 +31,8 @@ namespace Microsoft.DotNet.Tests
         {
             using (var reader = new StreamReader(File.OpenRead(versionFilePath)))
             {
-                SkipCommit(reader);
                 return reader.ReadLine();
             }
         }
-
-        private void SkipCommit(StreamReader reader)
-        {
-            reader.ReadLine();
-        }
     }
 }
diff --git a/test/dotnet.Tests/dotnet.Tests.csproj b/test/dotnet.Tests/dotnet.Tests.csproj
index 2aa66d8e5..6095d1a0e 100644
--- a/test/dotnet.Tests/dotnet.Tests.csproj
+++ b/test/dotnet.Tests/dotnet.Tests.csproj
@@ -1,5 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
@@ -23,11 +22,52 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
     </Content>
-    <Content Include="..\..\artifacts\*\stage2\sdk\*\.version">
-      <Link>.version</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
   </ItemGroup>
+  
+  <Target Name="WriteExpectedVersion"
+          BeforeTargets="BeforeBuild"
+          DependsOnTargets="PrepareForBuild">
+
+    <PropertyGroup>
+      <ExpectedVersionFileInIntermediateFolder>$(IntermediateOutputPath)ExpectedSdkVersion.txt</ExpectedVersionFileInIntermediateFolder>
+      
+      <VersionFileContent>$(SdkVersion)</VersionFileContent>
+      <ExistingVersionFileContent Condition=" Exists('$(ExpectedVersionFileInIntermediateFolder)') ">
+        $([System.IO.File]::ReadAllText($(ExpectedVersionFileInIntermediateFolder)))
+      </ExistingVersionFileContent>
+
+      <ShouldOverwriteVersionFile>false</ShouldOverwriteVersionFile>
+      <ShouldOverwriteVersionFile
+        Condition=" '$(ExistingVersionFileContent.Trim())' != '$(VersionFileContent.Trim())' ">true</ShouldOverwriteVersionFile>
+    </PropertyGroup>
+    
+    <WriteLinesToFile File="$(ExpectedVersionFileInIntermediateFolder)"
+                      Lines="$(VersionFileContent)"
+                      Condition=" '$(ShouldOverwriteVersionFile)' == 'true' "
+                      Overwrite="true" />
+
+    <ItemGroup>
+      <Content Include="$(ExpectedVersionFileInIntermediateFolder)" CopyToOutputDirectory="PreserveNewest" />
+      <FileWrites Include="$(ExpectedVersionFileInIntermediateFolder)" />
+    </ItemGroup>
+  </Target>
+
+  <Target Name="WriteExpectedTargetFrameworkMoniker" BeforeTargets="BeforeBuild" DependsOnTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ExpectedTargetFrameworkMonikerFileInIntermediateFolder>$(IntermediateOutputPath)ExpectedTargetFrameworkMoniker.txt</ExpectedTargetFrameworkMonikerFileInIntermediateFolder>
+      <VersionFileContent>$(TargetFrameworkMoniker)</VersionFileContent>
+      <ExistingVersionFileContent Condition=" Exists('$(ExpectedTargetFrameworkMonikerFileInIntermediateFolder)') ">
+        $([System.IO.File]::ReadAllText($(ExpectedTargetFrameworkMonikerFileInIntermediateFolder)))
+      </ExistingVersionFileContent>
+      <ShouldOverwriteVersionFile>false</ShouldOverwriteVersionFile>
+      <ShouldOverwriteVersionFile Condition=" '$(ExistingVersionFileContent.Trim())' != '$(VersionFileContent.Trim())' ">true</ShouldOverwriteVersionFile>
+    </PropertyGroup>
+    <WriteLinesToFile File="$(ExpectedTargetFrameworkMonikerFileInIntermediateFolder)" Lines="$(VersionFileContent)" Condition=" '$(ShouldOverwriteVersionFile)' == 'true' " Overwrite="true" />
+    <ItemGroup>
+      <Content Include="$(ExpectedTargetFrameworkMonikerFileInIntermediateFolder)" CopyToOutputDirectory="PreserveNewest" />
+      <FileWrites Include="$(ExpectedTargetFrameworkMonikerFileInIntermediateFolder)" />
+    </ItemGroup>
+  </Target>
 
   <ItemGroup>
     <ProjectReference Include="..\Microsoft.DotNet.Tools.Tests.Utilities\Microsoft.DotNet.Tools.Tests.Utilities.csproj" />
@@ -37,10 +77,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
-    <PackageReference Include="xunit.netcore.extensions" Version="1.0.0-prerelease-00206" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="$(MicrosoftDotNetPlatformAbstractionsPackageVersion)" />
     <PackageReference Include="Microsoft.DotNet.Cli.CommandLine" Version="$(MicrosoftDotNetCliCommandLinePackageVersion)" />
   </ItemGroup>
diff --git a/test/msbuild.IntegrationTests/msbuild.IntegrationTests.csproj b/test/msbuild.IntegrationTests/msbuild.IntegrationTests.csproj
index cbec7422a..2ed80c69f 100644
--- a/test/msbuild.IntegrationTests/msbuild.IntegrationTests.csproj
+++ b/test/msbuild.IntegrationTests/msbuild.IntegrationTests.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>$(CliTargetFramework)</TargetFramework>
     <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
@@ -14,8 +12,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161024-02" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
-    <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
+    <PackageReference Include="xunit" Version="2.2.0" />
   </ItemGroup>
 </Project>
diff --git a/testAsset.props b/testAsset.props
index 4c05b30f1..b130414b8 100644
--- a/testAsset.props
+++ b/testAsset.props
@@ -1,3 +1,7 @@
 <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="build/DependencyVersions.props" />
+  <PropertyGroup>
+    <RestoreAdditionalProjectSources Condition="'$(TEST_PACKAGES)' != ''">$(TEST_PACKAGES)</RestoreAdditionalProjectSources>
+    <NoPackageAnalysis>true</NoPackageAnalysis>
+  </PropertyGroup>
 </Project>
diff --git a/tools/CrossGen.Dependencies/CrossGen.Dependencies.csproj b/tools/CrossGen.Dependencies/CrossGen.Dependencies.csproj
index 3e5f83352..161f48c70 100644
--- a/tools/CrossGen.Dependencies/CrossGen.Dependencies.csproj
+++ b/tools/CrossGen.Dependencies/CrossGen.Dependencies.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <RuntimeIdentifier>$(SharedFrameworkRid)</RuntimeIdentifier>
diff --git a/tools/Signing.Dependencies/Signing.Dependencies.csproj b/tools/Signing.Dependencies/Signing.Dependencies.csproj
index 55fef49e4..f4ae4c40e 100644
--- a/tools/Signing.Dependencies/Signing.Dependencies.csproj
+++ b/tools/Signing.Dependencies/Signing.Dependencies.csproj
@@ -1,6 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-
   <PropertyGroup>
     <TargetFramework>netcoreapp1.0</TargetFramework>
   </PropertyGroup>