diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index ca0ef63a15a6f3c3465ecbfbac64e567777e5572..7f3270f81d1f914891668f31b968dc60e5750574 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -446,6 +446,7 @@ stages:
         displayName: Pack Templates
       - script: ./src/ProjectTemplates/build.cmd -ci -test -NoRestore -NoBuild -NoBuilddeps "/p:RunTemplateTests=true /bl:artifacts/log/template.test.binlog"
         displayName: Test Templates
+        continueOnError: true # Continue on error to avoid issues with stabilized build.
       artifacts:
       - name: Windows_Test_Templates_Logs
         path: artifacts/log/
diff --git a/eng/Publishing.props b/eng/Publishing.props
index 0b01250bffab4d7a32874de601d236376f62ca99..aa5294832a3c9d4af77181f87ab045d51b65bf41 100644
--- a/eng/Publishing.props
+++ b/eng/Publishing.props
@@ -46,8 +46,8 @@
       <ItemsToPushToBlobFeed Remove="@(ItemsToPushToBlobFeed)" Condition="'$(OS)' != 'Windows_NT'" />
 
       <ItemsToPushToBlobFeed Include="@(_InstallersToPublish)">
-        <IsShipping>false</IsShipping>
-        <ManifestArtifactData>NonShipping=true;ShipInstaller=dotnetcli</ManifestArtifactData>
+        <IsShipping>true</IsShipping>
+        <ManifestArtifactData>ShipInstaller=dotnetcli</ManifestArtifactData>
         <PublishFlatContainer>true</PublishFlatContainer>
         <RelativeBlobPath>$(_UploadPathRoot)/%(_InstallersToPublish.UploadPathSegment)/$(_PackageVersion)/%(Filename)%(Extension)</RelativeBlobPath>
       </ItemsToPushToBlobFeed>
diff --git a/eng/Versions.props b/eng/Versions.props
index a06fb4b916cce006dafad60b15762446065cd35d..023598352fa1975e4f9a435bb0b8ad686a24adfd 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -10,6 +10,13 @@
     <AspNetCoreMinorVersion>0</AspNetCoreMinorVersion>
     <AspNetCorePatchVersion>0</AspNetCorePatchVersion>
     <PreReleasePreviewNumber>2</PreReleasePreviewNumber>
+
+    <!--
+        When StabilizePackageVersion is set to 'true', this branch will produce stable outputs for 'Shipping' packages
+    -->
+    <StabilizePackageVersion Condition="'$(StabilizePackageVersion)' == ''">true</StabilizePackageVersion>
+    <DotNetFinalVersionKind Condition="'$(StabilizePackageVersion)' == 'true'">release</DotNetFinalVersionKind>
+
     <IncludePreReleaseLabelInPackageVersion>true</IncludePreReleaseLabelInPackageVersion>
     <IncludePreReleaseLabelInPackageVersion Condition=" '$(DotNetFinalVersionKind)' == 'release' ">false</IncludePreReleaseLabelInPackageVersion>
     <PreReleaseVersionLabel>rc$(PreReleasePreviewNumber)</PreReleaseVersionLabel>
diff --git a/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj b/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj
index 8cde3262d996dfd6c712ed112bb3fe5db69f4d61..bdbb0d2b320ee93bfab10eeaecea6852dc18ee4a 100644
--- a/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj
+++ b/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj
@@ -15,10 +15,6 @@
       <_Parameter1>SharedFxVersion</_Parameter1>
       <_Parameter2>$(SharedFxVersion)</_Parameter2>
     </AssemblyAttribute>
-    <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
-      <_Parameter1>TargetingPackVersion</_Parameter1>
-      <_Parameter2>$(TargetingPackVersion)</_Parameter2>
-    </AssemblyAttribute>
     <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
       <_Parameter1>TargetRuntimeIdentifier</_Parameter1>
       <_Parameter2>$(TargetRuntimeIdentifier)</_Parameter2>
@@ -57,11 +53,35 @@
   </ItemGroup>
 
   <Target Name="GenerateTestData" BeforeTargets="GetAssemblyAttributes" DependsOnTargets="InitializeSourceControlInformation">
+    <!-- This target is defined in eng/targets/Packaging.targets and included in every C# and F# project. -->
+    <MSBuild Projects="$(RepoRoot)src\Framework\src\Microsoft.AspNetCore.App.Runtime.csproj"
+        Targets="_GetPackageVersionInfo"
+        SkipNonexistentProjects="false">
+      <Output TaskParameter="TargetOutputs" ItemName="_RuntimePackageVersionInfo" />
+    </MSBuild>
+
+    <!-- Runtime and Ref packs may have separate versions. -->
+    <MSBuild Projects="$(RepoRoot)src\Framework\ref\Microsoft.AspNetCore.App.Ref.csproj"
+        Targets="_GetPackageVersionInfo"
+        SkipNonexistentProjects="false">
+      <Output TaskParameter="TargetOutputs" ItemName="_TargetingPackVersionInfo" />
+    </MSBuild>
+
     <ItemGroup>
       <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
         <_Parameter1>RepositoryCommit</_Parameter1>
         <_Parameter2>$(SourceRevisionId)</_Parameter2>
       </AssemblyAttribute>
+
+      <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
+        <_Parameter1>RuntimePackageVersion</_Parameter1>
+        <_Parameter2>@(_RuntimePackageVersionInfo->'%(PackageVersion)')</_Parameter2>
+      </AssemblyAttribute>
+
+      <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
+        <_Parameter1>TargetingPackVersion</_Parameter1>
+        <_Parameter2>@(_TargetingPackVersionInfo->'%(PackageVersion)')</_Parameter2>
+      </AssemblyAttribute>
     </ItemGroup>
   </Target>
 
diff --git a/src/Framework/test/SharedFxTests.cs b/src/Framework/test/SharedFxTests.cs
index 7dcc3920bd4c1b2da9b03b9b40a43a22ca387c4f..2fc09b96b021d61a4c3209bd38540799fec5afb6 100644
--- a/src/Framework/test/SharedFxTests.cs
+++ b/src/Framework/test/SharedFxTests.cs
@@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore
             _output = output;
             _expectedTfm = "netcoreapp" + TestData.GetSharedFxVersion().Substring(0, 3);
             _expectedRid = TestData.GetSharedFxRuntimeIdentifier();
-            _sharedFxRoot = Path.Combine(TestData.GetTestDataValue("SharedFrameworkLayoutRoot"), "shared", "Microsoft.AspNetCore.App", TestData.GetSharedFxVersion());
+            _sharedFxRoot = Path.Combine(TestData.GetTestDataValue("SharedFrameworkLayoutRoot"), "shared", "Microsoft.AspNetCore.App", TestData.GetTestDataValue("RuntimePackageVersion"));
         }
 
         [Fact]
@@ -77,7 +77,7 @@ namespace Microsoft.AspNetCore
 
             var target = $".NETCoreApp,Version=v{TestData.GetSharedFxVersion().Substring(0, 3)}/{_expectedRid}";
             var ridPackageId = $"Microsoft.AspNetCore.App.Runtime.{_expectedRid}";
-            var libraryId = $"{ridPackageId}/{TestData.GetSharedFxVersion()}";
+            var libraryId = $"{ridPackageId}/{TestData.GetTestDataValue("RuntimePackageVersion")}";
 
             AssertEx.FileExists(depsFilePath);
 
@@ -136,7 +136,7 @@ namespace Microsoft.AspNetCore
             var lines = File.ReadAllLines(versionFile);
             Assert.Equal(2, lines.Length);
             Assert.Equal(TestData.GetRepositoryCommit(), lines[0]);
-            Assert.Equal(TestData.GetSharedFxVersion(), lines[1]);
+            Assert.Equal(TestData.GetTestDataValue("RuntimePackageVersion"), lines[1]);
         }
     }
 }
diff --git a/src/Installers/Debian/Directory.Build.props b/src/Installers/Debian/Directory.Build.props
index 9d46b71673c7a4527fb23db8624a4548c242a398..f3d7df1c9ef18d9fefaa17b9b362ac8a2ff1ba88 100644
--- a/src/Installers/Debian/Directory.Build.props
+++ b/src/Installers/Debian/Directory.Build.props
@@ -12,5 +12,9 @@
     <DebianPackageArch Condition=" '$(TargetArchitecture)' == 'x64' ">amd64</DebianPackageArch>
 
     <DebianBuildScript>$(MSBuildThisFileDirectory)tools/build.sh</DebianBuildScript>
+
+    <!-- All installers are shipping assets. -->
+    <IsShipping>true</IsShipping>
+    <IsShippingPackage>true</IsShippingPackage>
   </PropertyGroup>
 </Project>
diff --git a/src/Installers/Rpm/Directory.Build.props b/src/Installers/Rpm/Directory.Build.props
index d27e528217fb214186daf94fd44a4e8eb3aea1b3..09110a30fb94e0b99acec960615b41e051595b96 100644
--- a/src/Installers/Rpm/Directory.Build.props
+++ b/src/Installers/Rpm/Directory.Build.props
@@ -4,10 +4,14 @@
 <Project>
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
 
-  <!-- Output paths -->
   <PropertyGroup>
+    <!-- Output paths -->
     <IntermediateOutputPath>$(IntermediateOutputPath)$(TargetRuntimeIdentifier)\</IntermediateOutputPath>
     <OutputPath>$(InstallersOutputPath)</OutputPath>
+
+    <!-- All installers are shipping assets. -->
+    <IsShipping>true</IsShipping>
+    <IsShippingPackage>true</IsShippingPackage>
   </PropertyGroup>
 
 </Project>
diff --git a/src/Installers/Windows/SharedFramework/SharedFramework.wixproj b/src/Installers/Windows/SharedFramework/SharedFramework.wixproj
index ed2fa9e235cb3dad6863997229cc2673c875378a..4752953ec2832dd80639b022f65bffbf18f43d8d 100644
--- a/src/Installers/Windows/SharedFramework/SharedFramework.wixproj
+++ b/src/Installers/Windows/SharedFramework/SharedFramework.wixproj
@@ -85,15 +85,21 @@
     <PropertyGroup>
       <MsiFullPath>$(InstallersOutputPath)$(PackageFileName)</MsiFullPath>
       <CabFullPath>$(InstallersOutputPath)$(Cabinet)</CabFullPath>
+
+      <!-- Everything built in this project _except_ the final package are shipping assets. -->
+      <_GeneratedPackageVersion>$(PackageVersion)</_GeneratedPackageVersion>
+      <_GeneratedPackageVersion
+          Condition="! $(PackageVersion.Contains('$(_PreReleaseLabel)'))">$(PackageVersion)-$(_PreReleaseLabel)$(_BuildNumberLabels)</_GeneratedPackageVersion>
     </PropertyGroup>
-      <Exec Command="powershell -NoProfile -NoLogo $(GenerateNupkgPowershellScript) ^
+
+    <Exec Command="powershell -NoProfile -NoLogo $(GenerateNupkgPowershellScript) ^
                       '$(ProductNameShort)' ^
                       '$(MsiFullPath)' ^
                       '$(CabFullPath)' ^
                       '$(ToolsetInstallerNuspecFile)' ^
                       '$(ArtifactsNonShippingPackagesDir)' ^
                       '$(Platform)' ^
-                      '$(PackageVersion)' ^
+                      '$(_GeneratedPackageVersion)' ^
                       '$(RepoRoot)' ^
                       '$(AspNetCoreMajorVersion)' ^
                       '$(AspNetCoreMinorVersion)'" />
diff --git a/src/Installers/Windows/SharedFramework/SharedFrameworkPackage.nuspec b/src/Installers/Windows/SharedFramework/SharedFrameworkPackage.nuspec
index 62d039eededb4a1f526c515e8517502efafa9294..b5b8c43d9e974c7b010c916d806a8ff50d3a0c31 100644
--- a/src/Installers/Windows/SharedFramework/SharedFrameworkPackage.nuspec
+++ b/src/Installers/Windows/SharedFramework/SharedFrameworkPackage.nuspec
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
-        <id> VS.Redist.Common.AspNetCore.SharedFramework.$ARCH$.$MAJOR$.$MINOR$</id>
+        <id>VS.Redist.Common.AspNetCore.SharedFramework.$ARCH$.$MAJOR$.$MINOR$</id>
         <version>1.0.0</version>
-        <title> VS.Redist.Common.AspNetCore.SharedFramework.$ARCH$.$MAJOR$.$MINOR$</title>
+        <title>VS.Redist.Common.AspNetCore.SharedFramework.$ARCH$.$MAJOR$.$MINOR$</title>
         <authors>Microsoft</authors>
         <owners>Microsoft</owners>
         <licenseUrl>https://www.microsoft.com/net/dotnet_library_license.htm</licenseUrl>
diff --git a/src/Installers/Windows/TargetingPack/TargetingPack.wixproj b/src/Installers/Windows/TargetingPack/TargetingPack.wixproj
index 1780b67ecf235f009dc8603b1fc8be36f900018b..d8b2b051af3ad08008e55c2e21c1eb740114a7ba 100644
--- a/src/Installers/Windows/TargetingPack/TargetingPack.wixproj
+++ b/src/Installers/Windows/TargetingPack/TargetingPack.wixproj
@@ -80,15 +80,21 @@
    <Target Name="CreateTargetingPackNugetPackage" AfterTargets="CopyToArtifactsDirectory;Build">
     <PropertyGroup>
       <MsiFullPath>$(InstallersOutputPath)$(PackageFileName)</MsiFullPath>
+
+      <!-- Everything built in this project _except_ the final package are shipping assets. -->
+      <_GeneratedPackageVersion>$(PackageVersion)</_GeneratedPackageVersion>
+      <_GeneratedPackageVersion
+          Condition="! $(PackageVersion.Contains('$(_PreReleaseLabel)'))">$(PackageVersion)-$(_PreReleaseLabel)$(_BuildNumberLabels)</_GeneratedPackageVersion>
     </PropertyGroup>
-      <Exec Command="powershell -NoProfile -NoLogo $(GenerateNupkgPowershellScript) ^
+
+    <Exec Command="powershell -NoProfile -NoLogo $(GenerateNupkgPowershellScript) ^
                       '$(ProductNameShort)' ^
                       '$(MsiFullPath)' ^
                       '$(CabFullPath)' ^
                       '$(ToolsetInstallerNuspecFile)' ^
                       '$(ArtifactsNonShippingPackagesDir)' ^
                       '$(Platform)' ^
-                      '$(PackageVersion)' ^
+                      '$(_GeneratedPackageVersion)' ^
                       '$(RepoRoot)' ^
                       '$(AspNetCoreMajorVersion)' ^
                       '$(AspNetCoreMinorVersion)'" />
diff --git a/src/Installers/Windows/TargetingPack/TargetingPackPackage.nuspec b/src/Installers/Windows/TargetingPack/TargetingPackPackage.nuspec
index 51f4a304e4fe1c83425c2d9bc2319066c2779094..d5ef9a2069ad9ed5bd70c5a0b495825e5becb597 100644
--- a/src/Installers/Windows/TargetingPack/TargetingPackPackage.nuspec
+++ b/src/Installers/Windows/TargetingPack/TargetingPackPackage.nuspec
@@ -3,7 +3,7 @@
     <metadata>
         <id>VS.Redist.Common.AspNetCore.TargetingPack.$ARCH$.$MAJOR$.$MINOR$</id>
         <version>1.0.0</version>
-        <title> VS.Redist.Common.AspNetCore.TargetingPack.$ARCH$.$MAJOR$.$MINOR$</title>
+        <title>VS.Redist.Common.AspNetCore.TargetingPack.$ARCH$.$MAJOR$.$MINOR$</title>
         <authors>Microsoft</authors>
         <owners>Microsoft</owners>
         <licenseUrl>https://www.microsoft.com/net/dotnet_library_license.htm</licenseUrl>
@@ -15,4 +15,4 @@
     <files>
         <file src="$ASPNETCORE_RUNTIME_MSI$" />
     </files>
-</package>
\ No newline at end of file
+</package>
diff --git a/src/ProjectTemplates/test/Infrastructure/GenerateTestProps.targets b/src/ProjectTemplates/test/Infrastructure/GenerateTestProps.targets
index df2b4e5e1b3213d556a9cafe8e38ceb2f4fa6947..4ce37d3f61e41d0ee5958e1cb66cfda1cc7a4e35 100644
--- a/src/ProjectTemplates/test/Infrastructure/GenerateTestProps.targets
+++ b/src/ProjectTemplates/test/Infrastructure/GenerateTestProps.targets
@@ -1,9 +1,22 @@
 <Project>
-  <Target
-    Name="GenerateTestProps"
-    BeforeTargets="CoreCompile"
-    DependsOnTargets="PrepareForTest"
-    Condition="$(DesignTimeBuild) != true">
+  <Target Name="GenerateTestProps"
+      BeforeTargets="CoreCompile"
+      DependsOnTargets="PrepareForTest"
+      Condition="$(DesignTimeBuild) != true">
+    <!-- The version of the shared framework. This is used in tests to ensure they run against the shared framework version we just built. -->
+    <MSBuild Projects="$(RepoRoot)src\Framework\ref\Microsoft.AspNetCore.App.Ref.csproj"
+        Targets="_GetPackageVersionInfo"
+        SkipNonexistentProjects="false">
+      <Output TaskParameter="TargetOutputs" ItemName="_TargetingPackVersionInfo" />
+    </MSBuild>
+
+    <!-- Runtime and Ref packs may have separate versions. -->
+    <MSBuild Projects="$(RepoRoot)src\Framework\src\Microsoft.AspNetCore.App.Runtime.csproj"
+        Targets="_GetPackageVersionInfo"
+        SkipNonexistentProjects="false">
+      <Output TaskParameter="TargetOutputs" ItemName="_RuntimePackageVersionInfo" />
+    </MSBuild>
+
     <PropertyGroup>
       <PropsProperties>
         RestoreAdditionalProjectSources=$([MSBuild]::Escape("$(RestoreAdditionalProjectSources);$(ArtifactsShippingPackagesDir);$(ArtifactsNonShippingPackagesDir)"));
@@ -12,7 +25,8 @@
         MicrosoftNETCoreAppRefPackageVersion=$(MicrosoftNETCoreAppRefPackageVersion);
         MicrosoftNETCorePlatformsPackageVersion=$(MicrosoftNETCorePlatformsPackageVersion);
         MicrosoftNETSdkRazorPackageVersion=$(MicrosoftNETSdkRazorPackageVersion);
-        MicrosoftAspNetCoreAppPackageVersion=$(SharedFxVersion);
+        MicrosoftAspNetCoreAppRefPackageVersion=@(_TargetingPackVersionInfo->'%(PackageVersion)');
+        MicrosoftAspNetCoreAppRuntimePackageVersion=@(_RuntimePackageVersionInfo->'%(PackageVersion)');
         SupportedRuntimeIdentifiers=$(SupportedRuntimeIdentifiers);
       </PropsProperties>
     </PropertyGroup>
diff --git a/src/ProjectTemplates/test/Infrastructure/TemplateTests.props.in b/src/ProjectTemplates/test/Infrastructure/TemplateTests.props.in
index b10d74b52bcf6efabc20810c6ce11c8bb5952711..25fbc524a47e6f398e933e15d2781d92294f0f7b 100644
--- a/src/ProjectTemplates/test/Infrastructure/TemplateTests.props.in
+++ b/src/ProjectTemplates/test/Infrastructure/TemplateTests.props.in
@@ -18,9 +18,9 @@
 
     <KnownFrameworkReference
       Update="Microsoft.AspNetCore.App"
-      DefaultRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppPackageVersion}"
-      LatestRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppPackageVersion}"
-      TargetingPackVersion="${MicrosoftAspNetCoreAppPackageVersion}"
+      DefaultRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppRuntimePackageVersion}"
+      LatestRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppRuntimePackageVersion}"
+      TargetingPackVersion="${MicrosoftAspNetCoreAppRefPackageVersion}"
       RuntimePackRuntimeIdentifiers="${SupportedRuntimeIdentifiers}" />
   </ItemGroup>
 
diff --git a/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj b/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj
index e1f4b6d6709e10abe8460aed873c7127fbf26c74..240809107d780364fb5aff82949e64b8c4c84009 100644
--- a/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj
+++ b/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj
@@ -24,8 +24,6 @@
   <ItemGroup>
     <Reference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.2.1" Version="$(MicrosoftAspNetCoreAzureAppServicesSiteExtension21PackageVersion)" PrivateAssets="All" />
     <Reference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.2.2" Version="$(MicrosoftAspNetCoreAzureAppServicesSiteExtension22PackageVersion)" PrivateAssets="All" />
-    <PackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.3.0.x86" Version="$(PackageVersion)" PrivateAssets="All" />
-    <PackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.3.0.x64" Version="$(PackageVersion)" PrivateAssets="All" />
   </ItemGroup>
 
   <ItemGroup>
@@ -39,7 +37,25 @@
   </ItemGroup>
 
   <Target Name="AddContent" BeforeTargets="_GetPackageFiles">
+    <!-- Cannot assume this project and LB.csproj have the same package version. -->
+    <!-- This target is defined in eng/targets/Packaging.targets and included in every C# and F# project. -->
+    <MSBuild Projects="$(RepoRoot)src\SiteExtensions\LoggingBranch\LB.csproj"
+        Targets="_GetPackageVersionInfo"
+        SkipNonexistentProjects="false">
+      <Output TaskParameter="TargetOutputs" ItemName="_ResolvedPackageVersionInfo" />
+    </MSBuild>
+
+    <ItemGroup>
+      <PackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.3.0.x86"
+          Version="%(_ResolvedPackageVersionInfo.PackageVersion)"
+          PrivateAssets="All" />
+      <PackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.3.0.x64"
+          Version="%(_ResolvedPackageVersionInfo.PackageVersion)"
+          PrivateAssets="All" />
+    </ItemGroup>
+
     <ItemGroup>
+      <!-- LB.csproj package content is bundled into this one. -->
       <ContentFilesToPack Include="$(NugetPackageRoot)\%(PackageReference.Identity)\%(PackageReference.Version)\content\**\*.*" />
 
       <!-- Temporarily skip the common files -->