diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000000000000000000000000000000000000..7ebee63d8a2335879b6b9d6534f5126988df1832
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,8 @@
+{
+  "files.associations": {
+    "*.json.in": "json"
+  },
+  "[json]": {
+    "editor.tabSize": 2
+  }
+}
diff --git a/Directory.Build.props b/Directory.Build.props
index 6e7ba7e87fef1caf92323f17a14de33c9dfe6d10..cc8828f5f6da179efbba916092c5b1d5bbfdc462 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,4 +1,3 @@
 <Project>
   <Import Project="version.props" />
-  <Import Project="TemplateDependencies.props" />
 </Project>
diff --git a/Directory.Build.targets b/Directory.Build.targets
index 246f7ac20c4b1e3b03766e15532514333edfd9d5..6902b49b990172e8bd7597e75cf2cad346542e23 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -1,4 +1,5 @@
 <Project>
   <Import Project="build\sources.props" />
+  <!-- This is imported at the bottom of the file so properties such as RuntimeFrameworkVersion can be set based on TargetFramework -->
   <Import Project="build\dependencies.props" />
 </Project>
diff --git a/NuGet.config b/NuGet.config
index 20060c934e4c6b0049a408c1216f4067064e9c38..e32bddfd514287b0b63cece097f11ecb1410ec64 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -2,7 +2,6 @@
 <configuration>
   <packageSources>
     <clear />
-    <add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json" />
-    <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
+    <!-- Restore sources should be defined in build/sources.props. -->
   </packageSources>
 </configuration>
diff --git a/TemplateDependencies.props b/TemplateDependencies.props
deleted file mode 100644
index 3b5eb2c53a942b265ab78ff50ab921c3950549ac..0000000000000000000000000000000000000000
--- a/TemplateDependencies.props
+++ /dev/null
@@ -1,30 +0,0 @@
-<Project>
-  <PropertyGroup>
-    <!--
-      These version strings are stamped into the template nupkg packages
-      when the template projects are packed. Plus these dependency versions
-      are used if you run the template projects directly from source.
-
-      If you add a new entry here, be sure to add a corresponding <Substitution>
-      item into ./src/Directory.Build.targets, otherwise your value won't be
-      stamped into the built template nupkg files.
-
-      Entries whose values are taken from @(PackageReference->...) are using
-      whatever version is present in the latest package lineup. These dynamic
-      values can be replaced by hardcoded values (e.g., '2.1.0') when we
-      branch for a release.
-    -->
-    <TemplateDep_Coherence_2_0>2.0.0</TemplateDep_Coherence_2_0>
-    <TemplateDep_Coherence_2_1>@(PackageReference->WithMetadataValue('Identity', 'Microsoft.AspNetCore')->Metadata('Version'))</TemplateDep_Coherence_2_1>
-    <TemplateDep_RuntimeFramework_2_1>2.1.0-preview1-26751</TemplateDep_RuntimeFramework_2_1>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <!--
-      These references are here only so that KoreBuild will locate the applicable
-      version in the current lineup and we can then access those versions in the
-      code above.
-    -->
-    <PackageReference Include="Microsoft.AspNetCore" />
-  </ItemGroup>
-</Project>
diff --git a/Templating.sln b/Templating.sln
index 1ef38de790d091897db01f0dd9719b516be5f91b..ac51ad6e8e01c8fdb695290e1624ea63c788984a 100644
--- a/Templating.sln
+++ b/Templating.sln
@@ -1,20 +1,16 @@
-
+
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26730.16
+VisualStudioVersion = 15.0.27004.2002
 MinimumVisualStudioVersion = 15.0.26124.0
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Test", "test\Templates.Test\Templates.Test.csproj", "{D43A4D24-D514-44C2-9438-54F6EDF58680}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.ItemTemplates", "src\Microsoft.DotNet.Web.ItemTemplates\Microsoft.DotNet.Web.ItemTemplates.csproj", "{ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.ProjectTemplates.1.x", "src\Microsoft.DotNet.Web.ProjectTemplates.1.x\Microsoft.DotNet.Web.ProjectTemplates.1.x.csproj", "{B8EB8821-9B58-465A-9693-5F9289AA7B29}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.ProjectTemplates.2.0", "src\Microsoft.DotNet.Web.ProjectTemplates.2.0\Microsoft.DotNet.Web.ProjectTemplates.2.0.csproj", "{62D00388-8824-4661-8CC8-8D8436FF97E6}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TemplatePackages", "TemplatePackages", "{0AD6E692-E423-408C-B523-DAFB19412E4B}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DependencyUpdater", "tools\DependencyUpdater\DependencyUpdater.csproj", "{15806338-550D-4418-99AE-42FDAE03808A}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SpaTemplates", "src\Microsoft.AspNetCore.SpaTemplates\Microsoft.AspNetCore.SpaTemplates.csproj", "{01E12D5E-8540-4BC8-9A54-41EDD55E762E}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.Spa.ProjectTemplates", "src\Microsoft.DotNet.Web.Spa.ProjectTemplates\Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj", "{402E62D1-7FD0-4E07-812C-0E385D98D6D9}"
@@ -23,7 +19,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.Client
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{973DC5B6-710B-4FC8-AF20-E94B93859DE8}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PullRequestSubmitter", "tools\PullRequestSubmitter\PullRequestSubmitter.csproj", "{AFF8B079-5BA1-4DA8-9EAF-BEC8414F889A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PullRequestSubmitter", "tools\PullRequestSubmitter\PullRequestSubmitter.csproj", "{AFF8B079-5BA1-4DA8-9EAF-BEC8414F889A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{68B3AFBD-1A32-41D0-9AA8-F1FFEA3BB5F9}"
+	ProjectSection(SolutionItems) = preProject
+		test\Directory.Build.targets = test\Directory.Build.targets
+		test\GenerateTestProps.targets = test\GenerateTestProps.targets
+		test\TemplateTests.props.in = test\TemplateTests.props.in
+	EndProjectSection
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -39,18 +42,10 @@ Global
 		{ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Release|Any CPU.Build.0 = Release|Any CPU
-		{B8EB8821-9B58-465A-9693-5F9289AA7B29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{B8EB8821-9B58-465A-9693-5F9289AA7B29}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{B8EB8821-9B58-465A-9693-5F9289AA7B29}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{B8EB8821-9B58-465A-9693-5F9289AA7B29}.Release|Any CPU.Build.0 = Release|Any CPU
 		{62D00388-8824-4661-8CC8-8D8436FF97E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{62D00388-8824-4661-8CC8-8D8436FF97E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{62D00388-8824-4661-8CC8-8D8436FF97E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{62D00388-8824-4661-8CC8-8D8436FF97E6}.Release|Any CPU.Build.0 = Release|Any CPU
-		{15806338-550D-4418-99AE-42FDAE03808A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{15806338-550D-4418-99AE-42FDAE03808A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{15806338-550D-4418-99AE-42FDAE03808A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{15806338-550D-4418-99AE-42FDAE03808A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{01E12D5E-8540-4BC8-9A54-41EDD55E762E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{01E12D5E-8540-4BC8-9A54-41EDD55E762E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{01E12D5E-8540-4BC8-9A54-41EDD55E762E}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -72,10 +67,9 @@ Global
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
+		{D43A4D24-D514-44C2-9438-54F6EDF58680} = {68B3AFBD-1A32-41D0-9AA8-F1FFEA3BB5F9}
 		{ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
-		{B8EB8821-9B58-465A-9693-5F9289AA7B29} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
 		{62D00388-8824-4661-8CC8-8D8436FF97E6} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
-		{15806338-550D-4418-99AE-42FDAE03808A} = {973DC5B6-710B-4FC8-AF20-E94B93859DE8}
 		{01E12D5E-8540-4BC8-9A54-41EDD55E762E} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
 		{402E62D1-7FD0-4E07-812C-0E385D98D6D9} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
 		{1731F6D9-1DFC-49D6-8F28-471194B1962C} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
diff --git a/build.ps1 b/build.ps1
index b7081bc1c24c2c992f0cb27d7b6ea5731f48a658..f2be7cbb7cc7b3ae2f7297c0044a5b07e0bb9d95 100644
--- a/build.ps1
+++ b/build.ps1
@@ -103,11 +103,11 @@ function Get-KoreBuild {
             }
         }
         catch {
-            remove-item -Recurse -Force $korebuildPath -ErrorAction Ignore
+            Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore
             throw
         }
         finally {
-            remove-item $tmpfile -ErrorAction Ignore
+            Remove-Item $tmpfile -ErrorAction Ignore
         }
     }
 
diff --git a/build.sh b/build.sh
old mode 100644
new mode 100755
diff --git a/build/FixPackageOutputDirs.targets b/build/FixPackageOutputDirs.targets
deleted file mode 100644
index bf6e3b7889fa526a95ee37ac4144e6025b821397..0000000000000000000000000000000000000000
--- a/build/FixPackageOutputDirs.targets
+++ /dev/null
@@ -1,33 +0,0 @@
-<Project>
-
-  <!--
-   The "Pack" target which emits .nupkg files to disk also holds a lock on those file
-   until the whole build process exits [1]. This makes it difficult to perform any
-   subsequent work on the package files, such as moving them or modifying their
-   contents. As a workaround, we cause the nupkgs to be written to a temporary
-   subdirectory, and then after they are emitted, our SubstituteProjectFileVariables
-   task writes its output to the original intended build directory.
-   
-   [1] The file locking might be a bug in the NuGet client code. For example, see
-   https://github.com/NuGet/NuGet.Client/blob/63e8539791d4f662efffceb2185ad4510396d76e/src/NuGet.Core/NuGet.Commands/CommandRunners/PackCommandRunner.cs#L135
-   It opens a "PackageArchiveReader" (which in turn uses File.Open to open a file
-   handle) after creating each package, but never close/disposes it.
-   -->
-
-  <PropertyGroup>
-    <PackageDependsOn>RedirectPackageOutputDir;$(PackageDependsOn);RestorePackageOutputDir</PackageDependsOn>
-  </PropertyGroup>
-
-  <Target Name="RedirectPackageOutputDir">
-    <PropertyGroup>
-      <OrigBuildDir>$(BuildDir)</OrigBuildDir>
-      <BuildDir>$(BuildDir)unversioned\</BuildDir>
-    </PropertyGroup>
-  </Target>
-
-  <Target Name="RestorePackageOutputDir">
-    <PropertyGroup>
-      <BuildDir>$(OrigBuildDir)</BuildDir>
-    </PropertyGroup>
-  </Target>
-</Project>
diff --git a/build/dependencies.props b/build/dependencies.props
index b0cfa47de749d5160d791b564b42627df8640ead..d6f86f2391f143e284fad25231bba082c70a2777 100644
--- a/build/dependencies.props
+++ b/build/dependencies.props
@@ -1,10 +1,37 @@
 <Project>
   <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+  </PropertyGroup>
+
+  <PropertyGroup Label="PackageVersions">
     <InternalAspNetCoreSdkPackageVersion>2.0.2-beta-15522</InternalAspNetCoreSdkPackageVersion>
+    <MicrosoftAspNetCoreAllPackageVersion>2.0.3-rtm-101</MicrosoftAspNetCoreAllPackageVersion>
+    <MicrosoftAspNetCoreAuthenticationCookiesPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreAuthenticationCookiesPackageVersion>
+    <MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion>
+    <MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion>
+    <MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion>
+    <MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion>
+    <MicrosoftAspNetCoreMvcPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreMvcPackageVersion>
+    <MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion>
+    <MicrosoftAspNetCorePackageVersion>2.0.1-rtm-101</MicrosoftAspNetCorePackageVersion>
+    <MicrosoftAspNetCoreSpaServicesPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreSpaServicesPackageVersion>
+    <MicrosoftAspNetCoreStaticFilesPackageVersion>2.0.1-rtm-101</MicrosoftAspNetCoreStaticFilesPackageVersion>
+    <MicrosoftAspNetCoreTestingPackageVersion>2.0.0</MicrosoftAspNetCoreTestingPackageVersion>
     <MicrosoftBuildFrameworkPackageVersion>15.3.409</MicrosoftBuildFrameworkPackageVersion>
     <MicrosoftBuildUtilitiesCorePackageVersion>15.3.409</MicrosoftBuildUtilitiesCorePackageVersion>
+    <MicrosoftEntityFrameworkCoreDesignPackageVersion>2.0.1-rtm-101</MicrosoftEntityFrameworkCoreDesignPackageVersion>
+    <MicrosoftEntityFrameworkCoreSqlitePackageVersion>2.0.1-rtm-101</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
+    <MicrosoftEntityFrameworkCoreSqlServerPackageVersion>2.0.1-rtm-101</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
+    <MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion>2.0.1-rtm-101</MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion>
+    <MicrosoftEntityFrameworkCoreToolsPackageVersion>2.0.1-rtm-101</MicrosoftEntityFrameworkCoreToolsPackageVersion>
+    <MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>2.0.0</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
+    <MicrosoftExtensionsSecretManagerToolsPackageVersion>2.0.0</MicrosoftExtensionsSecretManagerToolsPackageVersion>
     <MicrosoftNETTestSdkPackageVersion>15.3.0</MicrosoftNETTestSdkPackageVersion>
+    <MicrosoftVisualStudioWebBrowserLinkPackageVersion>2.0.1-rtm-101</MicrosoftVisualStudioWebBrowserLinkPackageVersion>
+    <MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion>2.0.1-rtm-101</MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion>
+    <MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion>2.0.1-rtm-101</MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion>
     <OctokitPackageVersion>0.26.0</OctokitPackageVersion>
+    <RuntimeFrameworkVersion Condition="'$(TargetFramework)' == 'netcoreapp2.0'">2.0.2-servicing-25728-02</RuntimeFrameworkVersion>
     <SeleniumFirefoxWebDriverPackageVersion>0.18.0</SeleniumFirefoxWebDriverPackageVersion>
     <SeleniumSupportPackageVersion>3.4.0</SeleniumSupportPackageVersion>
     <SeleniumWebDriverMicrosoftDriverPackageVersion>15.15063.0</SeleniumWebDriverMicrosoftDriverPackageVersion>
diff --git a/build/repo.targets b/build/repo.targets
index 22222379bbe8306559d280acc123527244a080b6..9c92670ce3c7eb150d5aa19b98437d988c1cdd62 100644
--- a/build/repo.targets
+++ b/build/repo.targets
@@ -1,6 +1,4 @@
 <Project>
-  <Import Project="FixPackageOutputDirs.targets" />
-
   <UsingTask
     TaskName="PullRequestSubmitter.PullRequestTask"
     AssemblyFile="$(MSBuildThisFileDirectory)..\tools\PullRequestSubmitter\bin\Release\netcoreapp2.0\PullRequestSubmitter.dll" />
@@ -30,5 +28,4 @@
       FileToUpdate="build/DependencyVersions.props"
       PropertyUpdates="@(PropertyUpdate)" />
   </Target>
-
 </Project>
diff --git a/build/sources.props b/build/sources.props
index 804940f029b90fdd15c65509576e5acb8c449d1a..8ab0fd1511044f1f79aa3909d2f787431a6b720d 100644
--- a/build/sources.props
+++ b/build/sources.props
@@ -1,7 +1,7 @@
 <Project>
   <Import Project="$(DotNetRestoreSourcePropsPath)" Condition="'$(DotNetRestoreSourcePropsPath)' != ''"/>
 
-  <PropertyGroup>
+  <PropertyGroup Label="RestoreSources">
     <RestoreSources>$(DotNetRestoreSources)</RestoreSources>
     <RestoreSources Condition="'$(DotNetBuildOffline)' != 'true' AND '$(AspNetUniverseBuildOffline)' != 'true' ">
       $(RestoreSources);
diff --git a/korebuild-lock.txt b/korebuild-lock.txt
index 2a51b344b6f0d7443f3ebdcdc60bfcd98d866807..7f216dfb7af40624b2301d243c377868c8a11898 100644
--- a/korebuild-lock.txt
+++ b/korebuild-lock.txt
@@ -1,2 +1,2 @@
-version:2.0.2-beta-15522
-commithash:f26cb086ebd8b5a187381bb9a431794f11d69025
+version:2.0.2-rc1-15526
+commithash:436afc3dc08f5e278431db807866cc5f032f4d7b
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index fcb57524762bb1e3af546b921669971d86d2c1c2..2197812159e1a050a93ac2050284f29fb7f5f4ee 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -2,31 +2,26 @@
   <Import Project="..\Directory.Build.props" />
 
   <PropertyGroup>
+    <EnableApiCheck>false</EnableApiCheck>
     <EnableDefaultItems>False</EnableDefaultItems>
     <GenerateAssemblyInfo>False</GenerateAssemblyInfo>
     <IncludeBuildOutput>False</IncludeBuildOutput>
     <IncludeSource>False</IncludeSource>
     <NoWarn>2008;8021</NoWarn>
-    <PackageVersion Condition="'$(VersionSuffix)' == ''">$(VersionPrefix)</PackageVersion>
-    <PackageVersion Condition="'$(VersionSuffix)' != ''">$(VersionPrefix)-$(VersionSuffix)</PackageVersion>
-    <PackageOutputPath Condition="'$(PackageOutputPath)' == ''">$(MSBuildThisFileDirectory)..\artifacts\build\unversioned\</PackageOutputPath>
-    <NuspecProperties>version=$(PackageVersion)</NuspecProperties>
-
-    <!--
-        These are not regular projects. They are just wrappers for the .nuspec files in each
-        of the template directories. The project files just provide a convenient way to package
-        the template .nupkgs from MSBuild.
+  </PropertyGroup>
 
-        As such, the projects don't have any dependencies and don't even produce any
-        .NET assemblies on build. So it's not relevant to participate in KoreBuild's lineup
-        system. The following line bypasses lineup verification.
-    -->
-    <KoreBuildRestoreTargetsImported>true</KoreBuildRestoreTargetsImported>
+  <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">
+    <!-- So you can make changes and re-run tests within VS without command-line builds -->
+    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
+    <PackageOutputPath>$(MSBuildThisFileDirectory)..\artifacts\build\</PackageOutputPath>
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="$(MSBuildThisFileDirectory)../tools/DependencyUpdater/DependencyUpdater.csproj" />
     <None Include="Content/**" />
   </ItemGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Internal.AspNetCore.Sdk" Version="$(InternalAspNetCoreSdkPackageVersion)" PrivateAssets="All" />
+  </ItemGroup>
+
 </Project>
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index b2edc5e72635cc8db7c0ea3bf80c3ff70543f98b..5fa67b0d3e8939c70cf2310abf2d10b771612803 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -1,26 +1,5 @@
 <Project>
   <Import Project="..\Directory.Build.targets" />
-
-  <!--
-    Once we've written each template .nupkg file, we modify the ASP.NET references
-    in its .csproj content files, injecting whatever version number exists in
-    the curent build context.
-  -->
-
-  <UsingTask
-    TaskName="DependencyUpdater.SubstituteProjectFileVariables"
-    AssemblyFile="$(MSBuildProjectDirectory)\$(OutputPath)DependencyUpdater.dll" />
-
-  <Target Name="InjectVersionsIntoProjectFilesInPackage" AfterTargets="Pack">
-    <ItemGroup>
-      <Substitution Include="TemplateDep_Coherence_2_0" Value="$(TemplateDep_Coherence_2_0)" />
-      <Substitution Include="TemplateDep_Coherence_2_1" Value="$(TemplateDep_Coherence_2_1)" />
-      <Substitution Include="TemplateDep_RuntimeFramework_2_1" Value="$(TemplateDep_RuntimeFramework_2_1)" />
-    </ItemGroup>
-    <SubstituteProjectFileVariables
-        NupkgFile="$(PackageOutputPath)$(MSBuildProjectName).$(PackageVersion).nupkg"
-        Substitutions="@(Substitution)"
-        OutDir="$(PackageOutputPath)..\" />
-  </Target>
-
+  <Import Project="GenerateContent.targets" />
+  <Import Project="SetPackageProperties.targets" />
 </Project>
diff --git a/src/GenerateContent.targets b/src/GenerateContent.targets
new file mode 100644
index 0000000000000000000000000000000000000000..96251c178bc69649efb1252aea010aff90892deb
--- /dev/null
+++ b/src/GenerateContent.targets
@@ -0,0 +1,29 @@
+<Project>
+  <!--
+    Generates content using MSBuild variables.
+  -->
+
+  <Target Name="_PrepareGeneratedContentFilesOutput">
+    <Error Text="You must set OutputPath on GenerateContent items." Condition="@(GeneratedContent->WithMetadataValue('OutputPath','')->Count()) != 0" />
+    <ItemGroup>
+      <GenerateContentInputs Include="$(MSBuildAllProjects);$(MSBuildProjectFullPath)" />
+      <GeneratedContentOutputs Include="%(GeneratedContent.OutputPath)" />
+    </ItemGroup>
+  </Target>
+
+  <Target Name="GenerateContent"
+          DependsOnTargets="_PrepareGeneratedContentFilesOutput"
+          BeforeTargets="CoreCompile"
+          Inputs="@(GeneratedContent);@(GenerateContentInputs)"
+          Outputs="@(GeneratedContentOutputs)">
+
+    <Sdk_GenerateFileFromTemplate
+      TemplateFile="%(GeneratedContent.Identity)"
+      Properties="%(GeneratedContent.Properties)"
+      OutputPath="%(GeneratedContent.OutputPath)">
+
+      <Output TaskParameter="OutputPath" ItemName="FileWrites" />
+      <Output TaskParameter="OutputPath" ItemName="Content" />
+    </Sdk_GenerateFileFromTemplate>
+  </Target>
+</Project>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/.gitignore b/src/Microsoft.AspNetCore.SpaTemplates/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3db277b523b848d8ad49376d883e20680c054142
--- /dev/null
+++ b/src/Microsoft.AspNetCore.SpaTemplates/.gitignore
@@ -0,0 +1,2 @@
+# This file is generated by the build
+content/*/.template.config/template.json
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/.template.config/template.json b/src/Microsoft.AspNetCore.SpaTemplates/Aurelia-CSharp.template.json.in
similarity index 52%
rename from src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/.template.config/template.json
rename to src/Microsoft.AspNetCore.SpaTemplates/Aurelia-CSharp.template.json.in
index 3b176af9f980644c7266c97e8b50de2301aabb3e..a817ec5344628450b49a35db9d856fc71f90456d 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/.template.config/template.json
+++ b/src/Microsoft.AspNetCore.SpaTemplates/Aurelia-CSharp.template.json.in
@@ -55,6 +55,60 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreSpaServicesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.SpaServices",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreSpaServicesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreSpaServicesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
   "tags": {
@@ -84,4 +138,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/.template.config/template.json b/src/Microsoft.AspNetCore.SpaTemplates/Knockout-CSharp.template.json.in
similarity index 52%
rename from src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/.template.config/template.json
rename to src/Microsoft.AspNetCore.SpaTemplates/Knockout-CSharp.template.json.in
index 9e821a4f558665f4a3cb98e5af48984ea5db7865..032f1e147eb1b873bf9b4fda4ebdd1aac2ff5f79 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/.template.config/template.json
+++ b/src/Microsoft.AspNetCore.SpaTemplates/Knockout-CSharp.template.json.in
@@ -55,6 +55,60 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreSpaServicesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.SpaServices",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreSpaServicesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreSpaServicesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
   "tags": {
@@ -84,4 +138,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.csproj b/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.csproj
index 456207cc1d53bf40baca0aabb73a40543a0baa35..4f06f6bdc5500ecf8a948e00c2617da7df2e4a3e 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.csproj
+++ b/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.csproj
@@ -1,10 +1,35 @@
-<Project Sdk="Microsoft.NET.Sdk">
-  <Import Project="..\Directory.Build.props" />
-  <Import Project="..\Directory.Build.targets" />
+<Project>
+  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <NuspecFile>Microsoft.AspNetCore.SpaTemplates.nuspec</NuspecFile>
   </PropertyGroup>
 
+  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
+
+  <!-- Set this last to ensure the properties get the final versions which may be overridden by CI. -->
+  <PropertyGroup>
+    <GeneratedContentProperties>
+      MicrosoftAspNetCoreAllPackageVersion=$(MicrosoftAspNetCoreAllPackageVersion);
+      MicrosoftAspNetCoreMvcPackageVersion=$(MicrosoftAspNetCoreMvcPackageVersion);
+      MicrosoftAspNetCorePackageVersion=$(MicrosoftAspNetCorePackageVersion);
+      MicrosoftAspNetCoreSpaServicesPackageVersion=$(MicrosoftAspNetCoreSpaServicesPackageVersion);
+      MicrosoftAspNetCoreStaticFilesPackageVersion=$(MicrosoftAspNetCoreStaticFilesPackageVersion);
+      MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion=$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion);
+    </GeneratedContentProperties>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <GeneratedContent Include="Aurelia-CSharp.template.json.in" OutputPath="content\Aurelia-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="Knockout-CSharp.template.json.in" OutputPath="content\Knockout-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="Vue-CSharp.template.json.in" OutputPath="content\Vue-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+  </ItemGroup>
+
 </Project>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.nuspec b/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.nuspec
index 4b4918b53b3834379d693697c69a2fa401351dc5..158ac8296cf0e4876b5ab58106d3b755ae0b8ad7 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.nuspec
+++ b/src/Microsoft.AspNetCore.SpaTemplates/Microsoft.AspNetCore.SpaTemplates.nuspec
@@ -17,9 +17,9 @@
     </packageTypes>
   </metadata>
   <files>
-    <file 
+    <file
       src="content/**/*"
-      exclude="**/node_modules/**;**/bin/**;**/obj/**;**/.vs/**;**/.vscode/**;**/ClientApp/dist/**;**/wwwroot/dist/**"
+      exclude="**/node_modules/**;**/bin/**;**/obj/**;**/.vs/**;**/.vscode/**;**/ClientApp/dist/**;**/wwwroot/dist/**;content/Directory.Build.*"
       target="Content" />
   </files>
 </package>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/.template.config/template.json b/src/Microsoft.AspNetCore.SpaTemplates/Vue-CSharp.template.json.in
similarity index 52%
rename from src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/.template.config/template.json
rename to src/Microsoft.AspNetCore.SpaTemplates/Vue-CSharp.template.json.in
index 6cb8810d647721d4c4c66ce6b5c6308b1d36c9cd..0b74a3035e7ccd8cbe7903ea32aa8bd4a8ac3c54 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/.template.config/template.json
+++ b/src/Microsoft.AspNetCore.SpaTemplates/Vue-CSharp.template.json.in
@@ -55,6 +55,60 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreSpaServicesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.SpaServices",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreSpaServicesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreSpaServicesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
   "tags": {
@@ -84,4 +138,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/AureliaSpa.csproj b/src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/AureliaSpa.csproj
index 22858ca3ba0c748ecb5a61acad9b085e032a4cae..555c8dac7f2fcdb0cab229707d24e84ea678c64f 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/AureliaSpa.csproj
+++ b/src/Microsoft.AspNetCore.SpaTemplates/content/Aurelia-CSharp/AureliaSpa.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -9,17 +9,17 @@
   </PropertyGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
 <!--/-:cnd:noEmit -->
@@ -54,4 +54,4 @@
     </ItemGroup>
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/Directory.Build.props b/src/Microsoft.AspNetCore.SpaTemplates/content/Directory.Build.props
similarity index 100%
rename from src/Microsoft.AspNetCore.SpaTemplates/Directory.Build.props
rename to src/Microsoft.AspNetCore.SpaTemplates/content/Directory.Build.props
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Directory.Build.targets b/src/Microsoft.AspNetCore.SpaTemplates/content/Directory.Build.targets
new file mode 100644
index 0000000000000000000000000000000000000000..0f803ab0e03f6eaef2acaa3f4727e2463fe919da
--- /dev/null
+++ b/src/Microsoft.AspNetCore.SpaTemplates/content/Directory.Build.targets
@@ -0,0 +1,7 @@
+<Project>
+    <Import Project="..\..\..\Directory.Build.targets" />
+    <!--
+        This file intentionally left mostly blank to ensure the template projects
+        are independent from the template package build config.
+    -->
+</Project>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/KnockoutSpa.csproj b/src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/KnockoutSpa.csproj
index 22858ca3ba0c748ecb5a61acad9b085e032a4cae..555c8dac7f2fcdb0cab229707d24e84ea678c64f 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/KnockoutSpa.csproj
+++ b/src/Microsoft.AspNetCore.SpaTemplates/content/Knockout-CSharp/KnockoutSpa.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -9,17 +9,17 @@
   </PropertyGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
 <!--/-:cnd:noEmit -->
@@ -54,4 +54,4 @@
     </ItemGroup>
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/VueSpa.csproj b/src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/VueSpa.csproj
index 22858ca3ba0c748ecb5a61acad9b085e032a4cae..555c8dac7f2fcdb0cab229707d24e84ea678c64f 100644
--- a/src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/VueSpa.csproj
+++ b/src/Microsoft.AspNetCore.SpaTemplates/content/Vue-CSharp/VueSpa.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -9,17 +9,17 @@
   </PropertyGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
 <!--/-:cnd:noEmit -->
@@ -54,4 +54,4 @@
     </ItemGroup>
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.1.x/Microsoft.DotNet.Web.ProjectTemplates.1.x.csproj b/src/Microsoft.DotNet.Web.ProjectTemplates.1.x/Microsoft.DotNet.Web.ProjectTemplates.1.x.csproj
index b454da4d8274c03e83b08f1b545e75ee05908bb0..d914719b008639c48348c39bfc8a8bbf988deb23 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.1.x/Microsoft.DotNet.Web.ProjectTemplates.1.x.csproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.1.x/Microsoft.DotNet.Web.ProjectTemplates.1.x.csproj
@@ -1,6 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
+  	<!-- Disable producing this package from the rel/2.0.x branch -->
+  	<IsPackable>false</IsPackable>
+
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <NuspecFile>Microsoft.DotNet.Web.ProjectTemplates.1.x.nuspec</NuspecFile>
   </PropertyGroup>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/.gitignore b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3db277b523b848d8ad49376d883e20680c054142
--- /dev/null
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/.gitignore
@@ -0,0 +1,2 @@
+# This file is generated by the build
+content/*/.template.config/template.json
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/EmptyWeb-CSharp.template.json.in
similarity index 77%
rename from src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/EmptyWeb-CSharp.template.json.in
index 19fe7c0241923398bad906ba81b94168a1bede2a..6b47a99ceefbfea25c704da561063b161045e1c3 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/EmptyWeb-CSharp.template.json.in
@@ -1,7 +1,10 @@
 {
   "$schema": "http://json.schemastore.org/template",
   "author": "Microsoft",
-  "classifications": ["Web", "Empty"],
+  "classifications": [
+    "Web",
+    "Empty"
+  ],
   "name": "ASP.NET Core Empty",
   "generatorVersions": "[1.0.0.0-*)",
   "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
@@ -16,16 +19,18 @@
   },
   "sourceName": "Company.WebApplication1",
   "preferNameDirectory": true,
-  "guids": [ "53bc9b9d-9d6a-45d4-8429-2a2761773502" ],
+  "guids": [
+    "53bc9b9d-9d6a-45d4-8429-2a2761773502"
+  ],
   "sources": [
     {
-       "modifiers": [
+      "modifiers": [
         {
           "condition": "(!IncludeLaunchSettings)",
           "exclude": [
             "Properties/launchSettings.json"
           ]
-        },
+        }
       ]
     }
   ],
@@ -105,16 +110,40 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
     }
   },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.csproj" } ],
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.csproj"
+    }
+  ],
   "defaultName": "WebApplication1",
   "postActions": [
     {
       "condition": "(!skipRestore)",
       "description": "Restore NuGet packages required by this project.",
       "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
+        {
+          "text": "Run 'dotnet restore'"
+        }
       ],
       "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
       "continueOnError": true
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/EmptyWeb-FSharp.template.json.in
similarity index 77%
rename from src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/EmptyWeb-FSharp.template.json.in
index 426f76bff29e69967bf8eef0a5997f1206717a97..33cfcbf8de61450a1dcf98fc632bc673ff694806 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/EmptyWeb-FSharp.template.json.in
@@ -1,6 +1,9 @@
 {
   "author": "Microsoft",
-  "classifications": ["Web", "Empty"],
+  "classifications": [
+    "Web",
+    "Empty"
+  ],
   "name": "ASP.NET Core Empty",
   "generatorVersions": "[1.0.0.0-*)",
   "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
@@ -49,16 +52,31 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
     }
   },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.fsproj" } ],
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.fsproj"
+    }
+  ],
   "defaultName": "WebApplication1",
   "postActions": [
     {
       "condition": "(!skipRestore)",
       "description": "Restore NuGet packages required by this project.",
       "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
+        {
+          "text": "Run 'dotnet restore'"
+        }
       ],
       "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
       "continueOnError": true
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.csproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.csproj
index 930797a86120cc7156b136b737a4894e081b85bc..04fbf2ea3c78f73548ea645b7eee2930619eade0 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.csproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.csproj
@@ -1,8 +1,62 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project>
+
+  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <NuspecFile>Microsoft.DotNet.Web.ProjectTemplates.2.0.nuspec</NuspecFile>
   </PropertyGroup>
 
+  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
+
+  <!-- Set this last to ensure the properties get the final versions which may be overridden by CI. -->
+  <PropertyGroup>
+    <GeneratedContentProperties>
+      MicrosoftAspNetCoreAllPackageVersion=$(MicrosoftAspNetCoreAllPackageVersion);
+      MicrosoftAspNetCoreAuthenticationCookiesPackageVersion=$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion);
+      MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion=$(MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion);
+      MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion=$(MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion);
+      MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion=$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion);
+      MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion=$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion);
+      MicrosoftAspNetCoreMvcPackageVersion=$(MicrosoftAspNetCoreMvcPackageVersion);
+      MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion=$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion);
+      MicrosoftAspNetCorePackageVersion=$(MicrosoftAspNetCorePackageVersion);
+      MicrosoftAspNetCoreStaticFilesPackageVersion=$(MicrosoftAspNetCoreStaticFilesPackageVersion);
+      MicrosoftEntityFrameworkCoreDesignPackageVersion=$(MicrosoftEntityFrameworkCoreDesignPackageVersion);
+      MicrosoftEntityFrameworkCoreSqlitePackageVersion=$(MicrosoftEntityFrameworkCoreSqlitePackageVersion);
+      MicrosoftEntityFrameworkCoreSqlServerPackageVersion=$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion);
+      MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion=$(MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion);
+      MicrosoftEntityFrameworkCoreToolsPackageVersion=$(MicrosoftEntityFrameworkCoreToolsPackageVersion);
+      MicrosoftExtensionsSecretManagerToolsPackageVersion=$(MicrosoftExtensionsSecretManagerToolsPackageVersion);
+      MicrosoftVisualStudioWebBrowserLinkPackageVersion=$(MicrosoftVisualStudioWebBrowserLinkPackageVersion);
+      MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion=$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion);
+      MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion=$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion);
+    </GeneratedContentProperties>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <GeneratedContent Include="EmptyWeb-CSharp.template.json.in" OutputPath="content\EmptyWeb-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="EmptyWeb-FSharp.template.json.in" OutputPath="content\EmptyWeb-FSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="RazorPagesWeb-CSharp.template.json.in" OutputPath="content\RazorPagesWeb-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="StarterWeb-CSharp.template.json.in" OutputPath="content\StarterWeb-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="StarterWeb-FSharp.template.json.in" OutputPath="content\StarterWeb-FSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="WebApi-CSharp.template.json.in" OutputPath="content\WebApi-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="WebApi-FSharp.template.json.in" OutputPath="content\WebApi-FSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+  </ItemGroup>
+
+
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.nuspec b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.nuspec
index 48b0ee9b00837d1b876515cf6c27b0913ab68a57..585220b6421c7d7fe14a443f55f0f882766d0154 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.nuspec
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/Microsoft.DotNet.Web.ProjectTemplates.2.0.nuspec
@@ -17,6 +17,9 @@
     </packageTypes>
   </metadata>
   <files>
-    <file src="content/**" target="" />
+    <file
+      src="content/**/*"
+      exclude="**/node_modules/**;**/bin/**;**/obj/**;**/.vs/**;**/.vscode/**;**/ClientApp/dist/**;**/wwwroot/dist/**;content/Directory.Build.*"
+      target="" />
   </files>
 </package>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/RazorPagesWeb-CSharp.template.json.in
similarity index 61%
rename from src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/RazorPagesWeb-CSharp.template.json.in
index d3b3ac6871c244016e00498498879f87309ca25c..dddc3bcd4f4678648cbe9509e72d6ff830284a73 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/RazorPagesWeb-CSharp.template.json.in
@@ -1,7 +1,11 @@
 {
   "$schema": "http://json.schemastore.org/template",
   "author": "Microsoft",
-  "classifications": [ "Web", "MVC", "Razor Pages" ],
+  "classifications": [
+    "Web",
+    "MVC",
+    "Razor Pages"
+  ],
   "name": "ASP.NET Core Web App",
   "generatorVersions": "[1.0.0.0-*)",
   "description": "A project template for creating an ASP.NET Core application with example ASP.NET Razor Pages content",
@@ -33,7 +37,9 @@
         },
         {
           "condition": "(!IndividualLocalAuth || UseLocalDB)",
-          "exclude": [ "app.db" ]
+          "exclude": [
+            "app.db"
+          ]
         },
         {
           "condition": "(!IndividualLocalAuth)",
@@ -345,16 +351,184 @@
       "type": "parameter",
       "datatype": "bool",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAuthenticationCookiesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Authentication.Cookies",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAuthenticationCookiesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreSqlitePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Sqlite",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreSqlitePackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreSqlitePackageVersion)"
+    },
+    "MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Identity.EntityFrameworkCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreSqlServerPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.SqlServer",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreSqlServerPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Authentication.OpenIdConnect",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebBrowserLinkPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.BrowserLink",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebBrowserLinkPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebBrowserLinkPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Design",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreDesignPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Design",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreDesignPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreDesignPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc.Razor.ViewCompilation",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Tools.DotNet",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion)"
+    },
+    "MicrosoftExtensionsSecretManagerToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.Extensions.SecretManager.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftExtensionsSecretManagerToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftExtensionsSecretManagerToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
     }
   },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.csproj" } ],
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.csproj"
+    }
+  ],
   "defaultName": "WebApplication1",
   "postActions": [
     {
       "condition": "(!skipRestore)",
       "description": "Restore NuGet packages required by this project.",
       "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
+        {
+          "text": "Run 'dotnet restore'"
+        }
       ],
       "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
       "continueOnError": true
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/StarterWeb-CSharp.template.json.in
similarity index 60%
rename from src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/StarterWeb-CSharp.template.json.in
index 2dd2838bc6a452b74af326e83b0ce85ab371eef5..68af40dee26e2b918723cd8c16e456e2651d3036 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/StarterWeb-CSharp.template.json.in
@@ -1,7 +1,10 @@
 {
   "$schema": "http://json.schemastore.org/template",
   "author": "Microsoft",
-  "classifications": ["Web", "MVC"],
+  "classifications": [
+    "Web",
+    "MVC"
+  ],
   "name": "ASP.NET Core Web App (Model-View-Controller)",
   "generatorVersions": "[1.0.0.0-*)",
   "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
@@ -33,7 +36,9 @@
         },
         {
           "condition": "(!IndividualAuth || UseLocalDB)",
-          "exclude": [ "app.db" ]
+          "exclude": [
+            "app.db"
+          ]
         },
         {
           "condition": "(!IndividualLocalAuth)",
@@ -339,16 +344,184 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAuthenticationCookiesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Authentication.Cookies",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAuthenticationCookiesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreSqlitePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Sqlite",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreSqlitePackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreSqlitePackageVersion)"
+    },
+    "MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Identity.EntityFrameworkCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreSqlServerPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.SqlServer",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreSqlServerPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Authentication.OpenIdConnect",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebBrowserLinkPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.BrowserLink",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebBrowserLinkPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebBrowserLinkPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Design",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreDesignPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Design",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreDesignPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreDesignPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc.Razor.ViewCompilation",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
+    },
+    "MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.EntityFrameworkCore.Tools.DotNet",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion}"
+      },
+      "replaces": "$(MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion)"
+    },
+    "MicrosoftExtensionsSecretManagerToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.Extensions.SecretManager.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftExtensionsSecretManagerToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftExtensionsSecretManagerToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
     }
   },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.csproj" } ],
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.csproj"
+    }
+  ],
   "defaultName": "WebApplication1",
   "postActions": [
     {
       "condition": "(!skipRestore)",
       "description": "Restore NuGet packages required by this project.",
       "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
+        {
+          "text": "Run 'dotnet restore'"
+        }
       ],
       "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
       "continueOnError": true
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/StarterWeb-FSharp.template.json.in b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/StarterWeb-FSharp.template.json.in
new file mode 100644
index 0000000000000000000000000000000000000000..13f61804b7c9745eda645823e8bd28bec4918540
--- /dev/null
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/StarterWeb-FSharp.template.json.in
@@ -0,0 +1,122 @@
+{
+  "$schema": "http://json.schemastore.org/template",
+  "author": "Microsoft",
+  "classifications": [
+    "Web",
+    "MVC"
+  ],
+  "name": "ASP.NET Core Web App (Model-View-Controller)",
+  "generatorVersions": "[1.0.0.0-*)",
+  "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
+  "groupIdentity": "Microsoft.Web.Mvc",
+  "precedence": "2000",
+  "identity": "Microsoft.Web.Mvc.FSharp.2.0",
+  "shortName": "mvc",
+  "thirdPartyNotices": "https://aka.ms/template-3pn",
+  "tags": {
+    "language": "F#",
+    "type": "project"
+  },
+  "sourceName": "Company.WebApplication1",
+  "preferNameDirectory": true,
+  "symbols": {
+    "TargetFrameworkOverride": {
+      "type": "parameter",
+      "description": "Overrides the target framework",
+      "replaces": "TargetFrameworkOverride",
+      "datatype": "string",
+      "defaultValue": ""
+    },
+    "Framework": {
+      "type": "parameter",
+      "description": "The target framework for the project.",
+      "datatype": "choice",
+      "choices": [
+        {
+          "choice": "netcoreapp2.0",
+          "description": "Target netcoreapp2.0"
+        }
+      ],
+      "replaces": "netcoreapp2.0",
+      "defaultValue": "netcoreapp2.0"
+    },
+    "copyrightYear": {
+      "type": "generated",
+      "generator": "now",
+      "replaces": "1975",
+      "parameters": {
+        "format": "yyyy"
+      }
+    },
+    "skipRestore": {
+      "type": "parameter",
+      "datatype": "bool",
+      "description": "If specified, skips the automatic restore of the project on create.",
+      "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc.Razor.ViewCompilation",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
+    }
+  },
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.fsproj"
+    }
+  ],
+  "defaultName": "WebApplication1",
+  "postActions": [
+    {
+      "condition": "(!skipRestore)",
+      "description": "Restore NuGet packages required by this project.",
+      "manualInstructions": [
+        {
+          "text": "Run 'dotnet restore'"
+        }
+      ],
+      "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+      "continueOnError": true
+    }
+  ]
+}
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/WebApi-CSharp.template.json.in
similarity index 77%
rename from src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/WebApi-CSharp.template.json.in
index 2e9b8c91985e5057322585003fc86ac177bf1da2..d0ee87b3b0fb2be81604e3def22f4110121f7d70 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/WebApi-CSharp.template.json.in
@@ -1,7 +1,10 @@
 {
   "$schema": "http://json.schemastore.org/template",
   "author": "Microsoft",
-  "classifications": ["Web", "WebAPI"],
+  "classifications": [
+    "Web",
+    "WebAPI"
+  ],
   "name": "ASP.NET Core Web API",
   "generatorVersions": "[1.0.0.0-*)",
   "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
@@ -260,16 +263,76 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftExtensionsSecretManagerToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.Extensions.SecretManager.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftExtensionsSecretManagerToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftExtensionsSecretManagerToolsPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Authentication.JwtBearer",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.csproj" } ],
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.csproj"
+    }
+  ],
   "defaultName": "WebApplication1",
   "postActions": [
     {
       "condition": "(!skipRestore)",
       "description": "Restore NuGet packages required by this project.",
       "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
+        {
+          "text": "Run 'dotnet restore'"
+        }
       ],
       "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
       "continueOnError": true
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/WebApi-FSharp.template.json.in
similarity index 61%
rename from src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/WebApi-FSharp.template.json.in
index 72d644ce6b5061141375065867b16260f92ed4d1..0bb2842f5dd2938d0e7f0ac47ed5522288309e56 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/WebApi-FSharp.template.json.in
@@ -1,6 +1,9 @@
 {
   "author": "Microsoft",
-  "classifications": ["Web", "WebAPI"],
+  "classifications": [
+    "Web",
+    "WebAPI"
+  ],
   "name": "ASP.NET Core Web API",
   "generatorVersions": "[1.0.0.0-*)",
   "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
@@ -49,16 +52,49 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.fsproj" } ],
+  "primaryOutputs": [
+    {
+      "path": "Company.WebApplication1.fsproj"
+    }
+  ],
   "defaultName": "WebApplication1",
   "postActions": [
     {
       "condition": "(!skipRestore)",
       "description": "Restore NuGet packages required by this project.",
       "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
+        {
+          "text": "Run 'dotnet restore'"
+        }
       ],
       "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
       "continueOnError": true
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Directory.Build.props b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/Directory.Build.props
similarity index 100%
rename from src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Directory.Build.props
rename to src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/Directory.Build.props
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/Directory.Build.targets b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/Directory.Build.targets
new file mode 100644
index 0000000000000000000000000000000000000000..0f803ab0e03f6eaef2acaa3f4727e2463fe919da
--- /dev/null
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/Directory.Build.targets
@@ -0,0 +1,7 @@
+<Project>
+    <Import Project="..\..\..\Directory.Build.targets" />
+    <!--
+        This file intentionally left mostly blank to ensure the template projects
+        are independent from the template package build config.
+    -->
+</Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/Company.WebApplication1.csproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/Company.WebApplication1.csproj
index 3e81d54ce6c436a12c491ab5a5210dcf4e64e28f..94f4de20f3bd902d49ac2650cf3a92e7cdea6adb 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/Company.WebApplication1.csproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-CSharp/Company.WebApplication1.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -10,10 +10,10 @@
   </ItemGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/Company.WebApplication1.fsproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/Company.WebApplication1.fsproj
index 601065ef09913b5b066b1828ee00d885178a0b7c..79cd0925c7b4a52ef19ce5f51ffa4d7f2e51f02e 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/Company.WebApplication1.fsproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/EmptyWeb-FSharp/Company.WebApplication1.fsproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -11,7 +11,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/Company.WebApplication1.csproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/Company.WebApplication1.csproj
index a5c5dc0f863d2c886a357675311ec9776f4e58de..f3789061b9e86a8bbb1e69ad25cf22da4ac1ca43 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/Company.WebApplication1.csproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/RazorPagesWeb-CSharp/Company.WebApplication1.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' != ''">TargetFrameworkOverride</TargetFramework>
@@ -10,29 +10,29 @@
     <None Update="app.db" CopyToOutputDirectory="PreserveNewest" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCoreToolsPackageVersion)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(OrganizationalAuth)' == 'True' OR '$(IndividualB2CAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(TemplateDep_Coherence_2_0)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' != 'True'" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(TemplateDep_Coherence_2_0)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' == 'True'" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.0" Condition="'$(UseBrowserLink)' == 'True'" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion)" Condition="'$(OrganizationalAuth)' == 'True' OR '$(IndividualB2CAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion)" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion)" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)" PrivateAssets="All" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="$(MicrosoftEntityFrameworkCoreDesignPackageVersion)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(MicrosoftEntityFrameworkCoreSqlitePackageVersion)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' != 'True'" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' == 'True'" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCoreToolsPackageVersion)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="$(MicrosoftVisualStudioWebBrowserLinkPackageVersion)" Condition="'$(UseBrowserLink)' == 'True'" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
   </ItemGroup>
   <ItemGroup Condition="'$(NoTools)' != 'True'">
-    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="$(MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion)" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="$(MicrosoftExtensionsSecretManagerToolsPackageVersion)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/Company.WebApplication1.csproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/Company.WebApplication1.csproj
index ec64c78381f71184ef21c524cf88b44abba18926..4e92c4268f2aeba8a3777b1a4cfcf804a4a97f6a 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/Company.WebApplication1.csproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-CSharp/Company.WebApplication1.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -15,31 +15,31 @@
   </ItemGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCoreToolsPackageVersion)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(OrganizationalAuth)' == 'True' OR '$(IndividualB2CAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(TemplateDep_Coherence_2_0)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' != 'True'" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(TemplateDep_Coherence_2_0)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' == 'True'" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.0" Condition="'$(UseBrowserLink)' == 'True'" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion)" Condition="'$(OrganizationalAuth)' == 'True' OR '$(IndividualB2CAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion)" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion)" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)" PrivateAssets="All" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="$(MicrosoftEntityFrameworkCoreDesignPackageVersion)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(MicrosoftEntityFrameworkCoreSqlitePackageVersion)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' != 'True'" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion)" Condition=" '$(IndividualLocalAuth)' == 'True' AND '$(UseLocalDB)' == 'True'" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCoreToolsPackageVersion)" PrivateAssets="All" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="$(MicrosoftVisualStudioWebBrowserLinkPackageVersion)" Condition="'$(UseBrowserLink)' == 'True'" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="$(MicrosoftVisualStudioWebCodeGenerationDesignPackageVersion)" PrivateAssets="All" Condition="'$(IndividualAuth)' == 'True'" />
   </ItemGroup>
 
   <ItemGroup Condition="'$(NoTools)' != 'True'">
-    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(IndividualLocalAuth)' == 'True'" />
-    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="$(MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion)" Condition="'$(IndividualLocalAuth)' == 'True'" />
+    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="$(MicrosoftExtensionsSecretManagerToolsPackageVersion)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/.template.config/template.json
deleted file mode 100644
index 55113d0eaafc763167b21aa3b2feb39146a0505a..0000000000000000000000000000000000000000
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/.template.config/template.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "$schema": "http://json.schemastore.org/template",
-  "author": "Microsoft",
-  "classifications": ["Web", "MVC"],
-  "name": "ASP.NET Core Web App (Model-View-Controller)",
-  "generatorVersions": "[1.0.0.0-*)",
-  "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
-  "groupIdentity": "Microsoft.Web.Mvc",
-  "precedence": "2000",
-  "identity": "Microsoft.Web.Mvc.FSharp.2.0",
-  "shortName": "mvc",
-  "thirdPartyNotices": "https://aka.ms/template-3pn",
-  "tags": {
-    "language": "F#",
-    "type": "project"
-  },
-  "sourceName": "Company.WebApplication1",
-  "preferNameDirectory": true,
-  "symbols":{
-    "TargetFrameworkOverride": {
-      "type": "parameter",
-      "description": "Overrides the target framework",
-      "replaces": "TargetFrameworkOverride",
-      "datatype": "string",
-      "defaultValue": ""
-    },
-    "Framework": {
-      "type": "parameter",
-      "description": "The target framework for the project.",
-      "datatype": "choice",
-      "choices": [
-        {
-          "choice": "netcoreapp2.0",
-          "description": "Target netcoreapp2.0"
-        }
-      ],
-      "replaces": "netcoreapp2.0",
-      "defaultValue": "netcoreapp2.0"
-    },
-    "copyrightYear": {
-      "type": "generated",
-      "generator": "now",
-      "replaces": "1975",
-      "parameters": {
-        "format": "yyyy"
-      }
-    },
-    "skipRestore": {
-      "type": "parameter",
-      "datatype": "bool",
-      "description": "If specified, skips the automatic restore of the project on create.",
-      "defaultValue": "false"
-    }
-  },
-  "primaryOutputs": [ { "path": "Company.WebApplication1.fsproj" } ],
-  "defaultName": "WebApplication1",
-  "postActions": [
-    {
-      "condition": "(!skipRestore)",
-      "description": "Restore NuGet packages required by this project.",
-      "manualInstructions": [
-        { "text": "Run 'dotnet restore'" }
-      ],
-      "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
-      "continueOnError": true
-    }
-  ]
-}
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/Company.WebApplication1.fsproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/Company.WebApplication1.fsproj
index fc425c316d227c397b8aa48ec376e3bbfc94ccf0..f8079c6135472c2695e842e71be145dfc019a76c 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/Company.WebApplication1.fsproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/StarterWeb-FSharp/Company.WebApplication1.fsproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -14,13 +14,13 @@
   </ItemGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="$(TemplateDep_Coherence_2_0)" PrivateAssets="All" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)" PrivateAssets="All" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/Company.WebApplication1.csproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/Company.WebApplication1.csproj
index d7e1265227cfd4330c12a7fc9ee4b5c3d3a452cf..bd4bd00f95030754a2fc39a340cb3bcc5812c838 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/Company.WebApplication1.csproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-CSharp/Company.WebApplication1.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -13,17 +13,17 @@
   </ItemGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(TemplateDep_Coherence_2_0)" Condition="'$(OrganizationalAuth)' == 'True' OR '$(IndividualB2CAuth)' == 'True'" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion)" Condition="'$(OrganizationalAuth)' == 'True' OR '$(IndividualB2CAuth)' == 'True'" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="$(MicrosoftExtensionsSecretManagerToolsPackageVersion)" Condition="'$(IndividualAuth)' == 'True' OR '$(OrganizationalAuth)' == 'True'" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/Company.WebApplication1.fsproj b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/Company.WebApplication1.fsproj
index 9bc32370d7399321ed657ab47f471bb0a9df1dd5..d7778a0e6894f29911dc23872cd3f03aa059c712 100644
--- a/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/Company.WebApplication1.fsproj
+++ b/src/Microsoft.DotNet.Web.ProjectTemplates.2.0/content/WebApi-FSharp/Company.WebApplication1.fsproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -12,11 +12,11 @@
   </ItemGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_0)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_0)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/.gitignore b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3db277b523b848d8ad49376d883e20680c054142
--- /dev/null
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/.gitignore
@@ -0,0 +1,2 @@
+# This file is generated by the build
+content/*/.template.config/template.json
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Angular-CSharp.template.json.in
similarity index 52%
rename from src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Angular-CSharp.template.json.in
index e6e58992d069f84ba052c9d1026935676be1b68c..2396b980d7b75c8a0654d2558f017ea3060e2255 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Angular-CSharp.template.json.in
@@ -55,6 +55,60 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreSpaServicesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.SpaServices",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreSpaServicesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreSpaServicesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
   "tags": {
@@ -84,4 +138,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Directory.Build.targets b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Directory.Build.targets
deleted file mode 100644
index fa98bfe80912db6064eb284cf5925b1751ed2554..0000000000000000000000000000000000000000
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Directory.Build.targets
+++ /dev/null
@@ -1,6 +0,0 @@
-<Project>
-    <!--
-        This file intentionally left blank to ensure the template projects
-        are independent from the template package build config.
-    -->
-</Project>
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj
index e4962abb4f863f219f16c9366b35075044f1b053..646231f310e2de51eaf48a6bbc57d284b34521d2 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj
@@ -1,10 +1,36 @@
-<Project Sdk="Microsoft.NET.Sdk">
-  <Import Project="..\Directory.Build.props" />
-  <Import Project="..\Directory.Build.targets" />
+<Project>
+
+  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
     <NuspecFile>Microsoft.DotNet.Web.Spa.ProjectTemplates.nuspec</NuspecFile>
   </PropertyGroup>
 
+  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
+
+  <!-- Set this last to ensure the properties get the final versions which may be overridden by CI. -->
+  <PropertyGroup>
+    <GeneratedContentProperties>
+      MicrosoftAspNetCoreAllPackageVersion=$(MicrosoftAspNetCoreAllPackageVersion);
+      MicrosoftAspNetCorePackageVersion=$(MicrosoftAspNetCorePackageVersion);
+      MicrosoftAspNetCoreMvcPackageVersion=$(MicrosoftAspNetCoreMvcPackageVersion);
+      MicrosoftAspNetCoreSpaServicesPackageVersion=$(MicrosoftAspNetCoreSpaServicesPackageVersion);
+      MicrosoftAspNetCoreStaticFilesPackageVersion=$(MicrosoftAspNetCoreStaticFilesPackageVersion);
+      MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion=$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion);
+    </GeneratedContentProperties>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <GeneratedContent Include="Angular-CSharp.template.json.in" OutputPath="content\Angular-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="React-CSharp.template.json.in" OutputPath="content\React-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+    <GeneratedContent Include="ReactRedux-CSharp.template.json.in" OutputPath="content\ReactRedux-CSharp\.template.config\template.json">
+      <Properties>$(GeneratedContentProperties)</Properties>
+    </GeneratedContent>
+  </ItemGroup>
+
 </Project>
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.nuspec b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.nuspec
index 97fd7dd3571adb8a11899b2e25deb4234d21f2d0..7edc9c7bb3e2c3c68168afaa7457e08b09aa0aa5 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.nuspec
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/Microsoft.DotNet.Web.Spa.ProjectTemplates.nuspec
@@ -17,9 +17,9 @@
     </packageTypes>
   </metadata>
   <files>
-    <file 
+    <file
       src="content/**/*"
-      exclude="**/node_modules/**;**/bin/**;**/obj/**;**/.vs/**;**/.vscode/**;**/ClientApp/dist/**;**/wwwroot/dist/**"
+      exclude="**/node_modules/**;**/bin/**;**/obj/**;**/.vs/**;**/.vscode/**;**/ClientApp/dist/**;**/wwwroot/dist/**;content/Directory.Build.*"
       target="Content" />
   </files>
 </package>
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/React-CSharp.template.json.in
similarity index 52%
rename from src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.Spa.ProjectTemplates/React-CSharp.template.json.in
index 35efb5e670970ae1ab0e4923e4d467e60d8b49a6..b08158ae4a02ef6b441c3dacacd80440d9784199 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/React-CSharp.template.json.in
@@ -55,6 +55,60 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreSpaServicesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.SpaServices",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreSpaServicesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreSpaServicesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
   "tags": {
@@ -84,4 +138,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/ReactRedux-CSharp.template.json.in
similarity index 53%
rename from src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json
rename to src/Microsoft.DotNet.Web.Spa.ProjectTemplates/ReactRedux-CSharp.template.json.in
index 38418e8db83c07103b0e0d1131e507b693225d6b..4895245d5257e3744fe9c1c6a9019c780ee6d12d 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/ReactRedux-CSharp.template.json.in
@@ -55,6 +55,60 @@
       "datatype": "bool",
       "description": "If specified, skips the automatic restore of the project on create.",
       "defaultValue": "false"
+    },
+    "MicrosoftAspNetCoreAllPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.All",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreAllPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreAllPackageVersion)"
+    },
+    "MicrosoftAspNetCorePackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCorePackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCorePackageVersion)"
+    },
+    "MicrosoftAspNetCoreStaticFilesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.StaticFiles",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreStaticFilesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreStaticFilesPackageVersion)"
+    },
+    "MicrosoftAspNetCoreSpaServicesPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.SpaServices",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreSpaServicesPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreSpaServicesPackageVersion)"
+    },
+    "MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.VisualStudio.Web.CodeGeneration.Tools",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion}"
+      },
+      "replaces": "$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)"
+    },
+    "MicrosoftAspNetCoreMvcPackageVersion": {
+      "type": "generated",
+      "description": "The package version for Microsoft.AspNetCore.Mvc",
+      "generator": "constant",
+      "parameters": {
+        "value": "${MicrosoftAspNetCoreMvcPackageVersion}"
+      },
+      "replaces": "$(MicrosoftAspNetCoreMvcPackageVersion)"
     }
   },
   "tags": {
@@ -84,4 +138,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/AngularSpa.csproj b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/AngularSpa.csproj
index 6bdf6b0cf989812130a7a15b015a46314340d72d..2ceb02847fcc06f718191103229205311fa746eb 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/AngularSpa.csproj
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/AngularSpa.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -9,17 +9,17 @@
   </PropertyGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
@@ -59,4 +59,4 @@
     </ItemGroup>
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/Microsoft.AspNetCore.SpaTemplates/Directory.Build.targets b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.props
similarity index 100%
rename from src/Microsoft.AspNetCore.SpaTemplates/Directory.Build.targets
rename to src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.props
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.targets b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.targets
new file mode 100644
index 0000000000000000000000000000000000000000..0f803ab0e03f6eaef2acaa3f4727e2463fe919da
--- /dev/null
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.targets
@@ -0,0 +1,7 @@
+<Project>
+    <Import Project="..\..\..\Directory.Build.targets" />
+    <!--
+        This file intentionally left mostly blank to ensure the template projects
+        are independent from the template package build config.
+    -->
+</Project>
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ReactSpa.csproj b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ReactSpa.csproj
index 22858ca3ba0c748ecb5a61acad9b085e032a4cae..2ceb02847fcc06f718191103229205311fa746eb 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ReactSpa.csproj
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ReactSpa.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -9,17 +9,22 @@
   </PropertyGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <!-- Files not to publish (note that the 'dist' subfolders are re-added below) -->
+    <Content Remove="ClientApp\**" />
   </ItemGroup>
 
 <!--/-:cnd:noEmit -->
@@ -46,7 +51,7 @@
 
     <!-- Include the newly-built files in the publish output -->
     <ItemGroup>
-      <DistFiles Include="wwwroot\dist\**" />
+      <DistFiles Include="wwwroot\dist\**; ClientApp\dist\**" />
       <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
         <RelativePath>%(DistFiles.Identity)</RelativePath>
         <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
@@ -54,4 +59,4 @@
     </ItemGroup>
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ReactReduxSpa.csproj b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ReactReduxSpa.csproj
index 6bdf6b0cf989812130a7a15b015a46314340d72d..2ceb02847fcc06f718191103229205311fa746eb 100644
--- a/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ReactReduxSpa.csproj
+++ b/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ReactReduxSpa.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework Condition="'$(TargetFrameworkOverride)' == ''">netcoreapp2.0</TargetFramework>
@@ -9,17 +9,17 @@
   </PropertyGroup>
 
   <ItemGroup Condition="'$(TargetFrameworkOverride)' == ''">
-    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
   </ItemGroup>
   <ItemGroup Condition="'$(TargetFrameworkOverride)' != ''">
-    <PackageReference Include="Microsoft.AspNetCore" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(TemplateDep_Coherence_2_1)" />
-    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(TemplateDep_Coherence_2_1)" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="$(MicrosoftVisualStudioWebCodeGenerationToolsPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
@@ -59,4 +59,4 @@
     </ItemGroup>
   </Target>
 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/SetPackageProperties.targets b/src/SetPackageProperties.targets
new file mode 100644
index 0000000000000000000000000000000000000000..d98dae43331f9a6001b917fb2a3c953f18dda617
--- /dev/null
+++ b/src/SetPackageProperties.targets
@@ -0,0 +1,10 @@
+<Project>
+  <Target Name="SetPackageProperties" BeforeTargets="GenerateNuspec">
+    <PropertyGroup>
+      <NuspecProperties>
+        $(NuspecProperties);
+        version=$(PackageVersion);
+      </NuspecProperties>
+    </PropertyGroup>
+  </Target>
+</Project>
diff --git a/test/Directory.Build.targets b/test/Directory.Build.targets
new file mode 100644
index 0000000000000000000000000000000000000000..5baa2f87978366c339ff5bf4ee4fd714f3a7e170
--- /dev/null
+++ b/test/Directory.Build.targets
@@ -0,0 +1,4 @@
+<Project>
+  <Import Project="..\Directory.Build.targets" />
+  <Import Project="GenerateTestProps.targets" />
+</Project>
diff --git a/test/GenerateTestProps.targets b/test/GenerateTestProps.targets
new file mode 100644
index 0000000000000000000000000000000000000000..d23932f7c5b79767f128eb5caf8957ecd24a3f8a
--- /dev/null
+++ b/test/GenerateTestProps.targets
@@ -0,0 +1,8 @@
+<Project>
+  <Target Name="GenerateTestProps" BeforeTargets="CoreCompile">
+    <Sdk_GenerateFileFromTemplate
+      TemplateFile="$(MSBuildThisFileDirectory)TemplateTests.props.in"
+      Properties="RestoreSources=$([MSBuild]::Escape($(RestoreSources)));RuntimeFrameworkVersion=$(RuntimeFrameworkVersion)"
+      OutputPath="$(OutputPath)TemplateTests.props" />
+  </Target>
+</Project>
diff --git a/test/TemplateTests.props.in b/test/TemplateTests.props.in
new file mode 100644
index 0000000000000000000000000000000000000000..9cd39793ffb8e5fa4040580b58850618a6cde7b5
--- /dev/null
+++ b/test/TemplateTests.props.in
@@ -0,0 +1,7 @@
+<Project>
+  <PropertyGroup>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <RestoreSources>${RestoreSources}</RestoreSources>
+    <RuntimeFrameworkVersion>${RuntimeFrameworkVersion}</RuntimeFrameworkVersion>
+  </PropertyGroup>
+</Project>
diff --git a/test/Templates.Test/EmptyWebTemplateTest.cs b/test/Templates.Test/EmptyWebTemplateTest.cs
index 528975424d55c41df9c9b28679bd66fc174b07f1..33f63f5eca78044afbce75c5fe33a73044a19d64 100644
--- a/test/Templates.Test/EmptyWebTemplateTest.cs
+++ b/test/Templates.Test/EmptyWebTemplateTest.cs
@@ -1,4 +1,8 @@
-using Xunit;
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
 using Xunit.Abstractions;
 
 namespace Templates.Test
@@ -9,10 +13,16 @@ namespace Templates.Test
         {
         }
 
-        [Theory]
-        [InlineData(null)]
-        [InlineData("net461")]
-        public void EmptyWebTemplate_Works(string targetFrameworkOverride)
+        [ConditionalFact]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        public void EmptyWebTemplate_Works_NetFramework()
+            => EmptyWebTemplateImpl("net461");
+
+        [Fact]
+        public void EmptyWebTemplate_Works_NetCore()
+            => EmptyWebTemplateImpl(null);
+
+        private void EmptyWebTemplateImpl(string targetFrameworkOverride)
         {
             RunDotNetNew("web", targetFrameworkOverride);
 
diff --git a/test/Templates.Test/Helpers/AspNetProcess.cs b/test/Templates.Test/Helpers/AspNetProcess.cs
index b1d20aeb04da5ca554821974dfd8cad1e87461a6..454c89fc295a695c02d4d885e77d4b1738849a3e 100644
--- a/test/Templates.Test/Helpers/AspNetProcess.cs
+++ b/test/Templates.Test/Helpers/AspNetProcess.cs
@@ -5,6 +5,7 @@ using System.IO;
 using System.Linq;
 using System.Net;
 using System.Net.Http;
+using Microsoft.Extensions.CommandLineUtils;
 using Xunit;
 using Xunit.Abstractions;
 
@@ -30,7 +31,7 @@ namespace Templates.Test.Helpers
             {
                 output.WriteLine("Publishing ASP.NET application...");
                 ProcessEx
-                    .Run(output, workingDirectory, "dotnet", "publish -c Release")
+                    .Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), "publish -c Release")
                     .WaitForExit(assertSuccess: true);
                 workingDirectory = Path.Combine(workingDirectory, "bin", "Release", framework, "publish");
             }
@@ -38,7 +39,7 @@ namespace Templates.Test.Helpers
             {
                 output.WriteLine("Building ASP.NET application...");
                 ProcessEx
-                    .Run(output, workingDirectory, "dotnet", "build --no-restore -c Debug")
+                    .Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), "build --no-restore -c Debug")
                     .WaitForExit(assertSuccess: true);
             }
 
@@ -56,7 +57,7 @@ namespace Templates.Test.Helpers
             if (framework.StartsWith("netcore"))
             {
                 var dllPath = publish ? $"{projectName}.dll" : $"bin/Debug/{framework}/{projectName}.dll";
-                _process = ProcessEx.Run(output, workingDirectory, "dotnet", $"exec {dllPath}", envVars: envVars);
+                _process = ProcessEx.Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), $"exec {dllPath}", envVars: envVars);
             }
             else
             {
@@ -74,7 +75,7 @@ namespace Templates.Test.Helpers
                 .FirstOrDefault(line => line.StartsWith(ListeningMessagePrefix, StringComparison.Ordinal));
             Assert.True(!string.IsNullOrEmpty(listeningMessage), $"ASP.NET process exited without listening for requests.\nOutput: { _process.Output }\nError: { _process.Error }");
 
-            // Verify we have a valid URL to make requests to            
+            // Verify we have a valid URL to make requests to
             var listeningUrlString = listeningMessage.Substring(ListeningMessagePrefix.Length);
             _listeningUri = new Uri(listeningUrlString, UriKind.Absolute);
             output.WriteLine($"Detected that ASP.NET application is accepting connections on: {listeningUrlString}");
diff --git a/test/Templates.Test/Helpers/ProcessEx.cs b/test/Templates.Test/Helpers/ProcessEx.cs
index f2204835c84989ddeb16c61e99c7ec52a2e4a2f6..c82c0594af349f72795fb864ded24b30325d246c 100644
--- a/test/Templates.Test/Helpers/ProcessEx.cs
+++ b/test/Templates.Test/Helpers/ProcessEx.cs
@@ -35,6 +35,7 @@ namespace Templates.Test.Helpers
                 }
             }
 
+            output.WriteLine($"==> {startInfo.FileName} {startInfo.Arguments} [{startInfo.WorkingDirectory}]");
             var proc = Process.Start(startInfo);
 
             return new ProcessEx(output, proc);
diff --git a/test/Templates.Test/Helpers/TemplatePackageInstaller.cs b/test/Templates.Test/Helpers/TemplatePackageInstaller.cs
index 05891572a7cfcce173538b16e2525fd1178b0c9e..6ab92681ae5765e85ef630c933b0440f26b23451 100644
--- a/test/Templates.Test/Helpers/TemplatePackageInstaller.cs
+++ b/test/Templates.Test/Helpers/TemplatePackageInstaller.cs
@@ -1,6 +1,7 @@
 using System;
 using System.IO;
 using System.Linq;
+using Microsoft.Extensions.CommandLineUtils;
 using Xunit.Abstractions;
 
 namespace Templates.Test.Helpers
@@ -38,8 +39,8 @@ namespace Templates.Test.Helpers
             {
                 var proc = ProcessEx.Run(
                     output,
-                    Directory.GetCurrentDirectory(),
-                    "dotnet",
+                    AppContext.BaseDirectory,
+                    DotNetMuxer.MuxerPathOrDefault(),
                     $"new --uninstall {packageName}");
 
                 // We don't need this command to succeed, because we'll verify next that
@@ -61,8 +62,8 @@ namespace Templates.Test.Helpers
                     output.WriteLine($"Installing templates package {packagePath}...");
                     var proc = ProcessEx.Run(
                         output,
-                        Directory.GetCurrentDirectory(),
-                        "dotnet",
+                        AppContext.BaseDirectory,
+                        DotNetMuxer.MuxerPathOrDefault(),
                         $"new --install \"{packagePath}\"");
                     proc.WaitForExit(assertSuccess: true);
                 }
@@ -72,13 +73,13 @@ namespace Templates.Test.Helpers
         private static void VerifyCannotFindTemplate(ITestOutputHelper output, string templateName)
         {
             // Verify we really did remove the previous templates
-            var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("D"));
+            var tempDir = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName(), Guid.NewGuid().ToString("D"));
             Directory.CreateDirectory(tempDir);
 
             var proc = ProcessEx.Run(
                 output,
                 tempDir,
-                "dotnet",
+                DotNetMuxer.MuxerPathOrDefault(),
                 $"new \"{templateName}\"");
             proc.WaitForExit(assertSuccess: false);
             if (!proc.Error.Contains($"No templates matched the input template name: {templateName}."))
@@ -91,7 +92,7 @@ namespace Templates.Test.Helpers
 
         private static string FindAncestorDirectoryContaining(string filename)
         {
-            var dir = Directory.GetCurrentDirectory();
+            var dir = AppContext.BaseDirectory;
             while (dir != null)
             {
                 if (File.Exists(Path.Combine(dir, filename)))
@@ -102,7 +103,7 @@ namespace Templates.Test.Helpers
                 dir = Directory.GetParent(dir)?.FullName;
             }
 
-            throw new InvalidOperationException($"Could not find any ancestor directory containing {filename} at or above {Directory.GetCurrentDirectory()}");
+            throw new InvalidOperationException($"Could not find any ancestor directory containing {filename} at or above {AppContext.BaseDirectory}");
         }
     }
 }
diff --git a/test/Templates.Test/Helpers/TemplateTestBase.cs b/test/Templates.Test/Helpers/TemplateTestBase.cs
index 8b28d81f71a5f0d45029562c6c5aff4905d565b3..54854d6c756d4935636f531424f4340c4c217323 100644
--- a/test/Templates.Test/Helpers/TemplateTestBase.cs
+++ b/test/Templates.Test/Helpers/TemplateTestBase.cs
@@ -1,7 +1,12 @@
-using System;
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
 using System.IO;
 using System.Reflection;
+using System.Runtime.InteropServices;
 using System.Threading;
+using Microsoft.Extensions.CommandLineUtils;
 using Templates.Test.Helpers;
 using Xunit;
 using Xunit.Abstractions;
@@ -30,7 +35,7 @@ namespace Templates.Test
             // We don't want any of the host repo's build config interfering with
             // how the test project is built, so disconnect it from the
             // Directory.Build.props/targets context
-            File.WriteAllText(Path.Combine(TemplateOutputDir, "Directory.Build.props"), "<Project />");
+            File.WriteAllText(Path.Combine(TemplateOutputDir, "Directory.Build.props"), "<Project><Import Project=\"../../TemplateTests.props\" /></Project>");
             File.WriteAllText(Path.Combine(TemplateOutputDir, "Directory.Build.targets"), "<Project />");
         }
 
@@ -58,7 +63,7 @@ namespace Templates.Test
                 args += $" -lang {language}";
             }
 
-            ProcessEx.Run(Output, TemplateOutputDir, "dotnet", args).WaitForExit(assertSuccess: true);            
+            ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), args).WaitForExit(assertSuccess: true);
         }
 
         protected void RunNpmInstall()
@@ -66,7 +71,10 @@ namespace Templates.Test
             // The first time this runs on any given CI agent it may take several minutes.
             // If the agent has NPM 5+ installed, it should be quite a lot quicker on
             // subsequent runs because of package caching.
-            ProcessEx.Run(Output, TemplateOutputDir, "cmd", "/c \"npm install\"").WaitForExit(assertSuccess: true);
+            var (exe, args) = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
+                ? ("cmd", "/c")
+                : ("bash", "-c");
+            ProcessEx.Run(Output, TemplateOutputDir, exe, args + " \"npm install\"").WaitForExit(assertSuccess: true);
         }
 
         protected void AssertDirectoryExists(string path, bool shouldExist)
diff --git a/test/Templates.Test/MvcTemplateTest.cs b/test/Templates.Test/MvcTemplateTest.cs
index b662a6b1af3c26e566f9727c1bd464520d13749f..463b6b78e792359463097c0a12635eb1e593564e 100644
--- a/test/Templates.Test/MvcTemplateTest.cs
+++ b/test/Templates.Test/MvcTemplateTest.cs
@@ -1,4 +1,8 @@
-using Xunit;
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
 using Xunit.Abstractions;
 
 namespace Templates.Test
@@ -9,12 +13,20 @@ namespace Templates.Test
         {
         }
 
+        [ConditionalTheory]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        [InlineData(null)]
+        [InlineData("F#")]
+        public void MvcTemplate_NoAuth_Works_NetFramework(string languageOverride)
+            => MvcTemplate_NoAuthImpl("net461", languageOverride);
+
         [Theory]
-        [InlineData(/* netcoreapp */ null, /* C# */ null)]
-        [InlineData("net461", /* C# */ null)]
-        [InlineData(/* netcoreapp */ null, "F#")]
-        [InlineData("net461", "F#")]
-        public void MvcTemplate_NoAuth_Works(string targetFrameworkOverride, string languageOverride)
+        [InlineData(null)]
+        [InlineData("F#")]
+        public void MvcTemplate_NoAuth_Works_NetCore(string languageOverride)
+            => MvcTemplate_NoAuthImpl(null, languageOverride);
+
+        private void MvcTemplate_NoAuthImpl(string targetFrameworkOverride, string languageOverride)
         {
             RunDotNetNew("mvc", targetFrameworkOverride, language: languageOverride);
 
@@ -42,13 +54,19 @@ namespace Templates.Test
             }
         }
 
-        [Theory]
-        [InlineData(null)]
-        [InlineData("net461")]
-        public void MvcTemplate_IndividualAuth_Works(string targetFrameworkOverride)
+        [ConditionalFact]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        public void MvcTemplate_IndividualAuth_Works_NetFramework()
+            => MvcTemplate_IndividualAuthImpl("net461");
+
+        [Fact]
+        public void MvcTemplate_IndividualAuth_Works_NetCore()
+            => MvcTemplate_IndividualAuthImpl(null);
+
+        private void MvcTemplate_IndividualAuthImpl(string targetFrameworkOverride)
         {
             RunDotNetNew("mvc", targetFrameworkOverride, auth: "Individual");
-            
+
             AssertDirectoryExists("Extensions", true);
             AssertFileExists("urlRewrite.config", false);
             AssertFileExists("Controllers/AccountController.cs", true);
diff --git a/test/Templates.Test/RazorPagesTemplateTest.cs b/test/Templates.Test/RazorPagesTemplateTest.cs
index 48e88b4142c3d0e50ad6e80db5706d6fce82c412..7d7ef64873ad14a4975075b50b63033ee9235228 100644
--- a/test/Templates.Test/RazorPagesTemplateTest.cs
+++ b/test/Templates.Test/RazorPagesTemplateTest.cs
@@ -1,4 +1,8 @@
-using Xunit;
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
 using Xunit.Abstractions;
 
 namespace Templates.Test
@@ -9,13 +13,19 @@ namespace Templates.Test
         {
         }
 
-        [Theory]
-        [InlineData(null)]
-        [InlineData("net461")]
-        public void RazorPagesTemplate_NoAuth_Works(string targetFrameworkOverride)
+        [ConditionalFact]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        public void RazorPagesTemplate_NoAuth_Works_NetFramework()
+            => RazorPagesTemplate_NoAuthImpl("net461");
+
+        [Fact]
+        public void RazorPagesTemplate_NoAuth_Works_NetCore()
+            => RazorPagesTemplate_NoAuthImpl(null);
+
+        private void RazorPagesTemplate_NoAuthImpl(string targetFrameworkOverride)
         {
             RunDotNetNew("razor", targetFrameworkOverride);
-            
+
             AssertDirectoryExists("Extensions", false);
             AssertFileExists("Controllers/AccountController.cs", false);
 
@@ -37,10 +47,16 @@ namespace Templates.Test
             }
         }
 
-        [Theory]
-        [InlineData(null)]
-        [InlineData("net461")]
-        public void RazorPagesTemplate_IndividualAuth_Works(string targetFrameworkOverride)
+        [ConditionalFact]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        public void RazorPagesTemplate_IndividualAuth_Works_NetFramework()
+            => RazorPagesTemplate_IndividualAuthImpl("net461");
+
+        [Fact]
+        public void RazorPagesTemplate_IndividualAuth_Works_NetCore()
+            => RazorPagesTemplate_IndividualAuthImpl(null);
+
+        private void RazorPagesTemplate_IndividualAuthImpl(string targetFrameworkOverride)
         {
             RunDotNetNew("razor", targetFrameworkOverride, auth: "Individual");
 
diff --git a/test/Templates.Test/SpaTemplateTest.cs b/test/Templates.Test/SpaTemplateTest.cs
index 8095c768994dfacffa37ea2b160f0cb177cb48e3..44efcf94238ca388b0585a41679f302224e2b51c 100644
--- a/test/Templates.Test/SpaTemplateTest.cs
+++ b/test/Templates.Test/SpaTemplateTest.cs
@@ -1,4 +1,8 @@
-using OpenQA.Selenium;
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Testing.xunit;
+using OpenQA.Selenium;
 using Templates.Test.Helpers;
 using Xunit;
 using Xunit.Abstractions;
@@ -11,17 +15,25 @@ namespace Templates.Test
         {
         }
 
-        [Theory]
-        [InlineData(null, "angular")]
-        [InlineData(null, "react")]
-        [InlineData(null, "reactredux")]
-        [InlineData(null, "aurelia")]
-        [InlineData(null, "knockout")]
-        [InlineData(null, "vue")]
+        [ConditionalTheory]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
         // Just use 'angular' as representative for .NET 4.6.1 coverage, as
         // the client-side code isn't affected by the .NET runtime choice
-        [InlineData("net461", "angular")]
-        public void SpaTemplate_Works(string targetFrameworkOverride, string template)
+        [InlineData("angular")]
+        public void SpaTemplate_Works_NetFramework(string template)
+            => SpaTemplateImpl("net461", template);
+
+        [Theory]
+        [InlineData("angular")]
+        [InlineData("react")]
+        [InlineData("reactredux")]
+        [InlineData("aurelia")]
+        [InlineData("knockout")]
+        [InlineData("vue")]
+        public void SpaTemplate_Works_NetCore(string template)
+            => SpaTemplateImpl(null, template);
+
+        private void SpaTemplateImpl(string targetFrameworkOverride, string template)
         {
             RunDotNetNew(template, targetFrameworkOverride);
             RunNpmInstall();
diff --git a/test/Templates.Test/Templates.Test.csproj b/test/Templates.Test/Templates.Test.csproj
index 6c2014748721112a4f00f894021952f5ea705bd0..d93039022c37aaa7ff60aac71e38d555d659bd9f 100644
--- a/test/Templates.Test/Templates.Test.csproj
+++ b/test/Templates.Test/Templates.Test.csproj
@@ -5,13 +5,15 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="System.Security.Permissions" Version="$(SystemSecurityPermissionsPackageVersion)" />
+    <PackageReference Include="Internal.AspNetCore.Sdk" Version="$(InternalAspNetCoreSdkPackageVersion)" />
+    <PackageReference Include="Microsoft.AspNetCore.Testing" Version="$(MicrosoftAspNetCoreTestingPackageVersion)" />
+    <PackageReference Include="Microsoft.Extensions.CommandLineUtils.Sources" Version="$(MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion)" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
-    <PackageReference Include="Internal.AspNetCore.Sdk" Version="$(InternalAspNetCoreSdkPackageVersion)" PrivateAssets="All" />
     <PackageReference Include="Selenium.Firefox.WebDriver" Version="$(SeleniumFirefoxWebDriverPackageVersion)" />
     <PackageReference Include="Selenium.Support" Version="$(SeleniumSupportPackageVersion)" NoWarn="NU1701" />
-    <PackageReference Include="Selenium.WebDriver" Version="$(SeleniumWebDriverPackageVersion)" NoWarn="NU1701" />
     <PackageReference Include="Selenium.WebDriver.MicrosoftDriver" Version="$(SeleniumWebDriverMicrosoftDriverPackageVersion)" />
+    <PackageReference Include="Selenium.WebDriver" Version="$(SeleniumWebDriverPackageVersion)" NoWarn="NU1701" />
+    <PackageReference Include="System.Security.Permissions" Version="$(SystemSecurityPermissionsPackageVersion)" />
     <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
     <PackageReference Include="xunit.analyzers" Version="$(XunitAnalyzersPackageVersion)" />
     <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" />
diff --git a/test/Templates.Test/WebApiTemplateTest.cs b/test/Templates.Test/WebApiTemplateTest.cs
index 977a968a09846fbc739d0f0caa54c99b425bf86a..75d18ba78056416b01a8d067591623ecbe23bf61 100644
--- a/test/Templates.Test/WebApiTemplateTest.cs
+++ b/test/Templates.Test/WebApiTemplateTest.cs
@@ -1,4 +1,8 @@
-using Xunit;
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Testing.xunit;
+using Xunit;
 using Xunit.Abstractions;
 
 namespace Templates.Test
@@ -9,10 +13,16 @@ namespace Templates.Test
         {
         }
 
-        [Theory]
-        [InlineData(null)]
-        [InlineData("net461")]
-        public void WebApiTemplate_Works(string targetFrameworkOverride)
+        [ConditionalFact]
+        [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+        public void WebApiTemplate_Works_NetFramework()
+            => WebApiTemplateImpl("net461");
+
+        [Fact]
+        public void WebApiTemplate_Works_NetCore()
+            => WebApiTemplateImpl(null);
+
+        private void WebApiTemplateImpl(string targetFrameworkOverride)
         {
             RunDotNetNew("api", targetFrameworkOverride);
 
diff --git a/tools/DependencyUpdater/DependencyUpdater.csproj b/tools/DependencyUpdater/DependencyUpdater.csproj
deleted file mode 100644
index ee85a128c6697c5674609f10098419e7b3ca6f72..0000000000000000000000000000000000000000
--- a/tools/DependencyUpdater/DependencyUpdater.csproj
+++ /dev/null
@@ -1,12 +0,0 @@
-<Project Sdk="Microsoft.Net.Sdk">
-  <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
-    <OutputType>Library</OutputType>
-    <IsPackable>false</IsPackable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Microsoft.Build.Framework" Version="$(MicrosoftBuildFrameworkPackageVersion)" />
-    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(MicrosoftBuildUtilitiesCorePackageVersion)" />
-  </ItemGroup>
-</Project>
diff --git a/tools/DependencyUpdater/SubstituteProjectFileVariables.cs b/tools/DependencyUpdater/SubstituteProjectFileVariables.cs
deleted file mode 100644
index e1c6676bba1f5148bc2736aac62682958627b18b..0000000000000000000000000000000000000000
--- a/tools/DependencyUpdater/SubstituteProjectFileVariables.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using System;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-
-namespace DependencyUpdater
-{
-    public class SubstituteProjectFileVariables : Task
-    {
-        private static string[] ProjectFileExtensions = new[]
-        {
-            ".csproj",
-            ".fsproj"
-        };
-
-        [Required] public string NupkgFile { get; set; }
-        [Required] public string OutDir { get; set; }
-        [Required] public ITaskItem[] Substitutions { get; set; }
-
-        public override bool Execute()
-        {
-            // We can't modify the .nupkg in place because the build system still
-            // has a lock on the file. We can read it, but not write it. So copy
-            // to the output location and then modify the copy.
-            var outFile = Path.Combine(OutDir, Path.GetFileName(NupkgFile));
-            File.Copy(NupkgFile, outFile, true);
-
-            var numProjectFiles = 0;
-            using (var zipFile = ZipFile.Open(outFile, ZipArchiveMode.Update))
-            {
-                foreach (var projectFile in zipFile.Entries.Where(IsProjectFile))
-                {
-                    numProjectFiles++;
-                    PerformVariableSubstitutions(projectFile);
-                }
-            }
-
-            if (numProjectFiles == 0)
-            {
-                Log.LogMessage(
-                    MessageImportance.High,
-                    $"No project files found in {Path.GetFileName(outFile)}, so no variables substituted.");
-            }
-            else
-            {
-                Log.LogMessage(
-                    MessageImportance.High,
-                    $"Substituted variables in {numProjectFiles} project file(s) in {Path.GetFileName(outFile)}");
-            }
-
-            return true;
-        }
-
-        private static bool IsProjectFile(ZipArchiveEntry entry)
-        {
-            return ProjectFileExtensions.Any(
-                extension => Path.GetExtension(entry.Name).Equals(extension, StringComparison.OrdinalIgnoreCase));
-        }
-
-        private void PerformVariableSubstitutions(ZipArchiveEntry entry)
-        {
-            using (var fileStream = entry.Open())
-            {
-                string contents;
-                using (var reader = new StreamReader(fileStream))
-                using (var writer = new StreamWriter(fileStream))
-                {
-                    contents = reader.ReadToEnd();
-                    fileStream.Seek(0, SeekOrigin.Begin);
-                    fileStream.SetLength(0);
-                    writer.Write(SubstituteVariables(contents));
-                }
-            }
-        }
-
-        private string SubstituteVariables(string text)
-        {
-            foreach (var item in Substitutions)
-            {
-                text = text.Replace($"$({item.ItemSpec})", item.GetMetadata("Value"));
-            }
-
-            return text;
-        }
-    }
-}
diff --git a/version.props b/version.props
index 7e4c6138cc6eb7bdc1b490af12f153fbc3ad8f26..47ffd05e45d132fbbee04ac0f4c83b4450261929 100644
--- a/version.props
+++ b/version.props
@@ -4,6 +4,8 @@
     <VersionSuffix>rtm</VersionSuffix>
     <PackageVersion Condition="'$(IsFinalBuild)' == 'true' AND '$(VersionSuffix)' == 'rtm' ">$(VersionPrefix)</PackageVersion>
     <PackageVersion Condition="'$(IsFinalBuild)' == 'true' AND '$(VersionSuffix)' != 'rtm' ">$(VersionPrefix)-$(VersionSuffix)-final</PackageVersion>
+    <BuildNumber Condition="'$(BuildNumber)' == ''">t000</BuildNumber>
     <VersionSuffix Condition="'$(VersionSuffix)' != '' And '$(BuildNumber)' != ''">$(VersionSuffix)-$(BuildNumber)</VersionSuffix>
+    <VersionSuffix Condition="'$(VersionSuffix)' != '' And '$(VersionMetadata)' != ''">$(VersionSuffix)+$(VersionMetadata)</VersionSuffix>
   </PropertyGroup>
 </Project>