diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 68a296dc447a80..c41f2bbfbefd0c 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -90,9 +90,9 @@
       <Sha>89be445dd4936157533ad96bafb95f701430653a</Sha>
       <SourceBuild RepoName="cecil" ManagedOnly="true" />
     </Dependency>
-    <Dependency Name="Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport" Version="9.0.0-alpha.1.23465.3">
+    <Dependency Name="Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport" Version="9.0.0-alpha.1.23471.2">
       <Uri>https://github.com/dotnet/emsdk</Uri>
-      <Sha>bebe955e9f7d392fbca594b1c76c54ba2e27027e</Sha>
+      <Sha>fc01829cbf76b7bbf48a39161562468715a0a3b4</Sha>
       <SourceBuild RepoName="emsdk" ManagedOnly="true" />
     </Dependency>
     <Dependency Name="Microsoft.SourceBuild.Intermediate.source-build-reference-packages" Version="9.0.0-alpha.1.23468.3">
diff --git a/eng/Versions.props b/eng/Versions.props
index f70c21cf3ca6c7..939f5639553e87 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -7,7 +7,7 @@
     <MinorVersion>0</MinorVersion>
     <PatchVersion>0</PatchVersion>
     <SdkBandVersion>9.0.100</SdkBandVersion>
-    <PackageVersionNet8>8.0.0-rc.1.23414.4</PackageVersionNet8>
+    <PackageVersionNet8>8.0.0-rc.2.23469.22</PackageVersionNet8>
     <PackageVersionNet7>7.0.8</PackageVersionNet7>
     <PackageVersionNet6>6.0.$([MSBuild]::Add($([System.Version]::Parse('$(PackageVersionNet7)').Build),11))</PackageVersionNet6>
     <PreReleaseVersionLabel>alpha</PreReleaseVersionLabel>
@@ -236,7 +236,7 @@
          Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
                like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport
     -->
-    <MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>9.0.0-alpha.1.23465.3</MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>
+    <MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>9.0.0-alpha.1.23471.2</MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion>
     <MicrosoftNETRuntimeEmscriptenVersion>$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion)</MicrosoftNETRuntimeEmscriptenVersion>
     <!-- workloads -->
     <SwixPackageVersion>1.1.87-gba258badda</SwixPackageVersion>
diff --git a/eng/testing/tests.browser.targets b/eng/testing/tests.browser.targets
index 8c4b3e46c9eac9..4f10b931f79757 100644
--- a/eng/testing/tests.browser.targets
+++ b/eng/testing/tests.browser.targets
@@ -264,6 +264,11 @@
                             Variant="latest"
                             Version="$(PackageVersionForWorkloadManifests)" />
 
+      <WorkloadIdForTesting Include="wasm-tools-net8;wasm-experimental-net8"
+                            ManifestName="Microsoft.NET.Workload.Mono.ToolChain.net8"
+                            Variant="net8"
+                            Version="$(PackageVersionForWorkloadManifests)" />
+
       <WorkloadIdForTesting Include="wasm-tools-net7;wasm-experimental-net7"
                             ManifestName="Microsoft.NET.Workload.Mono.ToolChain.net7"
                             Variant="net7"
@@ -277,7 +282,7 @@
                             IgnoreErrors="$(WasmIgnoreNet6WorkloadInstallErrors)"
                             Condition="'$(WorkloadsTestPreviousVersions)' == 'true'" />
 
-      <WorkloadCombinationsToInstall Include="latest"        Variants="latest" />
+      <WorkloadCombinationsToInstall Include="latest"        Variants="latest;net8" />
       <WorkloadCombinationsToInstall Include="net7"          Variants="net7" Condition="'$(WorkloadsTestPreviousVersions)' == 'true'" />
       <WorkloadCombinationsToInstall Include="net7+latest"   Variants="net7;latest" Condition="'$(WorkloadsTestPreviousVersions)' == 'true'" />
       <!--<WorkloadCombinationsToInstall Include="net6"     Variants="net6" />-->
diff --git a/src/mono/nuget/Microsoft.NET.Runtime.WebAssembly.Sdk/Sdk/AutoImport.props b/src/mono/nuget/Microsoft.NET.Runtime.WebAssembly.Sdk/Sdk/AutoImport.props
index 6c0c775c12b0aa..46d7b7e50b4a51 100644
--- a/src/mono/nuget/Microsoft.NET.Runtime.WebAssembly.Sdk/Sdk/AutoImport.props
+++ b/src/mono/nuget/Microsoft.NET.Runtime.WebAssembly.Sdk/Sdk/AutoImport.props
@@ -1,8 +1,8 @@
 <!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
 <Project>
   <PropertyGroup>
-    <WasmNativeWorkload Condition="'$(WasmNativeWorkload)' == ''">net8.0</WasmNativeWorkload>
-    <WasmNativeWorkload8>true</WasmNativeWorkload8>
+    <WasmNativeWorkload Condition="'$(WasmNativeWorkload)' == ''">net9.0</WasmNativeWorkload>
+    <WasmNativeWorkload9>true</WasmNativeWorkload9>
     <!--<WasmNativeWorkloadAvailableList>$(WasmNativeWorkloadAvailableList)+net8.0+</WasmNativeWorkloadAvailableList>-->
   </PropertyGroup>
 </Project>
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest.pkgproj b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest.pkgproj
index e327fcf2635a2a..41c41ea12cd6cf 100644
--- a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest.pkgproj
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest.pkgproj
@@ -44,9 +44,10 @@
     <ItemGroup>
       <_WorkloadManifestValues Include="WorkloadVersion" Value="$(PackageVersion)" />
       <_WorkloadManifestValues Include="PackageVersion" Value="$(PackageVersion)" />
+      <_WorkloadManifestValues Include="PackageVersionNet8" Value="$(PackageVersionNet8)" Condition="'$(PackageVersionNet8)' != ''" />
+      <_WorkloadManifestValues Include="PackageVersionNet8" Value="$(PackageVersion)" Condition="'$(PackageVersionNet8)' == ''" />
+      <_WorkloadManifestValues Include="PackageVersionNet7" Value="$(PackageVersionNet7)" />
       <_WorkloadManifestValues Include="PackageVersionNet6" Value="$(PackageVersionNet6)" />
-      <_WorkloadManifestValues Include="PackageVersionNet7" Value="$(PackageVersionNet7)" Condition="'$(PackageVersionNet7)' != ''" />
-      <_WorkloadManifestValues Include="PackageVersionNet7" Value="$(PackageVersion)" Condition="'$(PackageVersionNet7)' == ''" />
       <_WorkloadManifestValues Include="NetCoreAppCurrent" Value="$(NetCoreAppCurrent)" />
       <_WorkloadManifestValues Include="EmscriptenVersion" Value="$(MicrosoftNETRuntimeEmscriptenVersion)" />
     </ItemGroup>
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.Wasi.targets.in b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.Wasi.targets.in
index f6197d5e269b4b..6828a880c74206 100644
--- a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.Wasi.targets.in
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.Wasi.targets.in
@@ -1,10 +1,11 @@
 <!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
 <Project>
-  <PropertyGroup Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'">
-    <WasiNativeWorkloadAvailable Condition="'$(TargetsCurrent)' == 'true' and '$(WasiNativeWorkload)' == 'net8.0'">true</WasiNativeWorkloadAvailable>
+  <PropertyGroup>
+    <WasiNativeWorkloadAvailable Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0')) and '$(WasiNativeWorkload)' == 'net8.0'">true</WasiNativeWorkloadAvailable>
+    <TargetsCurrent Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0'))">true</TargetsCurrent>
   </PropertyGroup>
 
-  <PropertyGroup Condition="'$(RuntimeIdentifier)' == 'wasi-wasm' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp'">
+  <PropertyGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp'">
     <UsingWasiRuntimeWorkload Condition="'$(UsingWasiRuntimeWorkload)' == ''">$(WasiNativeWorkloadAvailable)</UsingWasiRuntimeWorkload>
   </PropertyGroup>
 </Project>
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.json.in b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.json.in
index 5af8dcbd94e17e..993a9733f362ec 100644
--- a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.json.in
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.json.in
@@ -18,7 +18,7 @@
       "description": ".NET WebAssembly experimental tooling",
       "packs": [
         "Microsoft.NET.Runtime.WebAssembly.Templates",
-        "Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm",
+        "Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm"
       ],
       "extends": [ "wasm-tools" ],
       "platforms": [ "win-x64", "win-arm64", "linux-x64", "linux-arm64", "osx-x64", "osx-arm64" ]
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.targets.in b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.targets.in
index 70658c5c21a1f7..953ca2b03351af 100644
--- a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.targets.in
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.targets.in
@@ -2,19 +2,22 @@
 <Project>
   <PropertyGroup>
     <_RuntimePackInWorkloadVersionCurrent>${PackageVersion}</_RuntimePackInWorkloadVersionCurrent>
+    <_RuntimePackInWorkloadVersion8>${PackageVersionNet8}</_RuntimePackInWorkloadVersion8>
     <_RuntimePackInWorkloadVersion7>${PackageVersionNet7}</_RuntimePackInWorkloadVersion7>
     <_RuntimePackInWorkloadVersion6>${PackageVersionNet6}</_RuntimePackInWorkloadVersion6>
 
+    <TargetsNet9    Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionEquals('$(TargetFrameworkVersion)', '9.0'))">true</TargetsNet9>
     <TargetsNet8    Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionEquals('$(TargetFrameworkVersion)', '8.0'))">true</TargetsNet8>
-    <TargetsNet6    Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionEquals('$(TargetFrameworkVersion)', '6.0'))">true</TargetsNet6>
     <TargetsNet7    Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionEquals('$(TargetFrameworkVersion)', '7.0'))">true</TargetsNet7>
-    <TargetsCurrent Condition="'$(TargetsNet8)' == 'true'">true</TargetsCurrent>
+    <TargetsNet6    Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionEquals('$(TargetFrameworkVersion)', '6.0'))">true</TargetsNet6>
+
+    <TargetsCurrent Condition="'$(TargetsNet9)' == 'true'">true</TargetsCurrent>
 
     <!-- override WorkloadDetectionWhen net7 == net8 -->
     <WasmNativeWorkload7 Condition="'${PackageVersionNet7}' == '${PackageVersion}'">$(WasmNativeWorkload8)</WasmNativeWorkload7>
   </PropertyGroup>
 
-  <Import Project="$(MSBuildThisFileDirectory)WorkloadManifest.Wasi.targets" />
+  <Import Project="$(MSBuildThisFileDirectory)WorkloadManifest.Wasi.targets" Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'" />
 
   <PropertyGroup Condition="'$(RuntimeIdentifier)' == 'browser-wasm' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp'">
     <_BrowserWorkloadNotSupportedForTFM Condition="$([MSBuild]::VersionLessThan($(TargetFrameworkVersion), '6.0'))">true</_BrowserWorkloadNotSupportedForTFM>
@@ -31,8 +34,9 @@
 
   <PropertyGroup Condition="'$(RuntimeIdentifier)' == 'browser-wasm'">
     <SelfContained>true</SelfContained>
-    <WasmNativeWorkloadAvailable Condition="'$(TargetsNet7)' == 'true'">$(WasmNativeWorkload7)</WasmNativeWorkloadAvailable>
+    <WasmNativeWorkloadAvailable Condition="'$(TargetsNet9)' == 'true'">$(WasmNativeWorkload9)</WasmNativeWorkloadAvailable>
     <WasmNativeWorkloadAvailable Condition="'$(TargetsNet8)' == 'true'">$(WasmNativeWorkload8)</WasmNativeWorkloadAvailable>
+    <WasmNativeWorkloadAvailable Condition="'$(TargetsNet7)' == 'true'">$(WasmNativeWorkload7)</WasmNativeWorkloadAvailable>
     <WasmNativeWorkloadAvailable Condition="'$(TargetsNet6)' == 'true'">$(WasmNativeWorkload)</WasmNativeWorkloadAvailable>
     <WasmNativeWorkloadAvailable Condition="'$(WasmNativeWorkloadAvailable)' == '' or '$(WasmNativeWorkload)' == 'false'">false</WasmNativeWorkloadAvailable>
     <WasmNativeWorkload>$(WasmNativeWorkloadAvailable)</WasmNativeWorkload>
@@ -141,14 +145,14 @@
     <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk" />
   </ImportGroup>
 
-  <ImportGroup Condition="'$(TargetsCurrent)' == 'true' and '$(RuntimeIdentifier)' == 'wasi-wasm' and '$(UsingWasiRuntimeWorkload)' == 'true'">
+  <ImportGroup Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0')) and '$(RuntimeIdentifier)' == 'wasi-wasm' and '$(UsingWasiRuntimeWorkload)' == 'true'">
     <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk" />
     <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.WebAssembly.Wasi.Sdk" />
     <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.WebAssembly.Wasi.Sdk" />
     <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk" />
   </ImportGroup>
 
-  <PropertyGroup Condition="'$(TargetsCurrent)' == 'true' and ('$(UsingMobileWorkload)' == 'true' or '$(RuntimeIdentifier)' == 'browser-wasm' or '$(RuntimeIdentifier)' == 'wasi-wasm')">
+  <PropertyGroup Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0')) and ('$(UsingMobileWorkload)' == 'true' or '$(RuntimeIdentifier)' == 'browser-wasm' or '$(RuntimeIdentifier)' == 'wasi-wasm')">
     <_MonoWorkloadTargetsMobile>true</_MonoWorkloadTargetsMobile>
     <_MonoWorkloadRuntimePackPackageVersion>$(_RuntimePackInWorkloadVersionCurrent)</_MonoWorkloadRuntimePackPackageVersion>
     <_KnownWebAssemblySdkPackVersion>$(_RuntimePackInWorkloadVersionCurrent)</_KnownWebAssemblySdkPackVersion>
@@ -163,7 +167,16 @@
     <SdkSupportedTargetPlatformVersion Include="1.0" />
   </ItemGroup>
 
-  <ItemGroup Condition="'$(TargetsCurrent)' == 'true' and '$(_MonoWorkloadTargetsMobile)' == 'true'">
+    <!-- Support for "wasi" target platform identifier -->
+  <PropertyGroup Condition="'$(TargetPlatformIdentifier)' == 'wasi' and $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0'))">
+    <TargetPlatformSupported>true</TargetPlatformSupported>
+    <TargetPlatformVersion Condition="'$(TargetPlatformVersion)' == ''">1.0</TargetPlatformVersion>
+  </PropertyGroup>
+  <ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'wasi' and $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0'))">
+    <SdkSupportedTargetPlatformVersion Include="1.0" />
+  </ItemGroup>
+
+  <ItemGroup Condition="(('$(RuntimeIdentifier)' == 'wasi-wasm' and '$(TargetsNet8)' == 'true') or '$(TargetsCurrent)' == 'true') and '$(_MonoWorkloadTargetsMobile)' == 'true'">
     <KnownRuntimePack Update="@(KnownRuntimePack)">
       <!-- FIXMEWASI: workaround for now -->
       <RuntimePackRuntimeIdentifiers Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'">%(RuntimePackRuntimeIdentifiers);wasi-wasm</RuntimePackRuntimeIdentifiers>
@@ -212,6 +225,6 @@
         Importance="High" />
   </Target>
 
-  <Import Condition="'$(TargetsCurrent)' == 'true' and ('$(UsingBrowserRuntimeWorkload)' == 'true' or '$(UsingMobileWorkload)' == 'true')" 
+  <Import Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '8.0')) and ('$(UsingBrowserRuntimeWorkload)' == 'true' or '$(UsingMobileWorkload)' == 'true')"
           Project="$(MSBuildThisFileDirectory)WorkloadTelemetry.targets" />
 </Project>
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest.pkgproj b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest.pkgproj
new file mode 100644
index 00000000000000..59f77406140cf1
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest.pkgproj
@@ -0,0 +1,63 @@
+<Project DefaultTargets="Build">
+  <Import Project="$([MSBuild]::GetPathOfFileAbove(Directory.Build.props))" />
+
+  <PropertyGroup>
+    <PackageDescription>Internal toolchain package not meant for direct consumption. Please do not reference directly.</PackageDescription>
+  </PropertyGroup>
+
+  <Target Name="_PrepareForPack" BeforeTargets="GetPackageFiles" Returns="@(PackageFile)">
+    <Error Condition="'$(SdkBandVersionForWorkload_FromRuntimeVersions)' == ''"
+           Text="%24(SdkBandVersionForWorkload_FromRuntimeVersions) is not set" />
+
+    <!-- Override the id to include the sdk band as per the workload installer spec -->
+    <PropertyGroup>
+      <Id>Microsoft.NET.Workload.Mono.ToolChain.net8.Manifest-$(SdkBandVersionForWorkload_FromRuntimeVersions)</Id>
+    </PropertyGroup>
+
+    <PropertyGroup>
+      <WorkloadManifestPath>$(IntermediateOutputPath)WorkloadManifest.json</WorkloadManifestPath>
+      <WorkloadManifestTargetsPath>$(IntermediateOutputPath)WorkloadManifest.targets</WorkloadManifestTargetsPath>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageFile Include="$(WorkloadManifestPath)" TargetPath="data" />
+      <PackageFile Include="$(WorkloadManifestTargetsPath)" TargetPath="data" />
+    </ItemGroup>
+
+    <ItemGroup>
+      <File Include="localize/**/*">
+        <TargetPath>data/localize</TargetPath>
+      </File>
+    </ItemGroup>
+  </Target>
+
+  <!-- Running this target ensures we have the fully evaluated PackageVersion -->
+  <Target Name="_WriteManifestValues" AfterTargets="CalculatePackageVersion">
+    <PropertyGroup>
+      <PackagePathVersion>PackageVersion=$(PackageVersion);</PackagePathVersion>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <_WorkloadManifestValues Include="WorkloadVersion" Value="$(PackageVersion)" />
+      <_WorkloadManifestValues Include="PackageVersionNet8" Value="$(PackageVersionNet8)" Condition="'$(PackageVersionNet8)' != ''" />
+      <_WorkloadManifestValues Include="PackageVersionNet8" Value="$(PackageVersion)" Condition="'$(PackageVersionNet8)' == ''" />
+      <_WorkloadManifestValues Include="EmscriptenVersion" Value="$(MicrosoftNETRuntimeEmscriptenVersion)" />
+      <_WorkloadManifestValues Include="NetCoreAppCurrent" Value="$(NetCoreAppCurrent)" />
+    </ItemGroup>
+
+    <Error Condition="'%(_WorkloadManifestValues.Value)' == ''"
+           Text="No version specified for template variable '%(_WorkloadManifestValues.Identity)'" />
+
+    <GenerateFileFromTemplate
+      TemplateFile="WorkloadManifest.json.in"
+      Properties="@(_WorkloadManifestValues)"
+      OutputPath="$(WorkloadManifestPath)" />
+
+    <GenerateFileFromTemplate
+      TemplateFile="WorkloadManifest.targets.in"
+      Properties="@(_WorkloadManifestValues)"
+      OutputPath="$(WorkloadManifestTargetsPath)" />
+  </Target>
+
+  <Import Project="$([MSBuild]::GetPathOfFileAbove(Directory.Build.targets))" />
+</Project>
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/WorkloadManifest.json.in b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/WorkloadManifest.json.in
new file mode 100644
index 00000000000000..a52b903984804f
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/WorkloadManifest.json.in
@@ -0,0 +1,494 @@
+{
+  "version": "${WorkloadVersion}",
+  "depends-on": {
+    "Microsoft.NET.Workload.Emscripten.net8": "${EmscriptenVersion}"
+  },
+  "workloads": {
+    "wasm-tools-net8": {
+      "description": ".NET WebAssembly build tools for net8.0",
+      "packs": [
+        "Microsoft.NET.Runtime.WebAssembly.Sdk.net8",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.browser-wasm",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.browser-wasm"
+      ],
+      "extends": [ "microsoft-net-runtime-mono-tooling-net8", "microsoft-net-sdk-emscripten-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "linux-x64", "osx-x64", "osx-arm64" ]
+    },
+    "wasm-experimental-net8": {
+      "description": ".NET WebAssembly experimental tooling for net8.0",
+      "packs": [
+        "Microsoft.NET.Runtime.WebAssembly.Templates.net8",
+        "Microsoft.NETCore.App.Runtime.Mono.multithread.net8.browser-wasm"
+      ],
+      "extends": [ "wasm-tools-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "linux-x64", "osx-x64", "osx-arm64" ]
+    },
+    "wasi-experimental-net8": {
+      "description": ".NET WASI experimental",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.Mono.net8.wasi-wasm",
+      ],
+      "extends": [ "wasi-experimental", "microsoft-net-runtime-mono-tooling-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "linux-x64", "linux-arm64", "osx-x64", "osx-arm64" ]
+    },
+    "microsoft-net-runtime-android-net8": {
+      "abstract": true,
+      "description": "Android Mono Runtime",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.Mono.net8.android-arm",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.android-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.android-x64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.android-x86"
+      ],
+      "extends": [ "microsoft-net-runtime-mono-tooling-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "linux-x64", "osx-x64", "osx-arm64" ]
+    },
+    "microsoft-net-runtime-android-aot-net8": {
+      "abstract": true,
+      "description": "Android Mono AOT Workload",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-x86",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-x64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-arm",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-arm64"
+      ],
+      "extends": [ "microsoft-net-runtime-android-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "linux-x64", "osx-x64", "osx-arm64" ]
+    },
+    "microsoft-net-runtime-ios-net8": {
+      "abstract": true,
+      "description": "iOS Mono Runtime and AOT Workload",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.ios-arm",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.ios-arm64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-arm64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-x64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-x86"
+      ],
+      "extends": [ "runtimes-ios-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "osx-arm64", "osx-x64" ]
+    },
+    "runtimes-ios-net8": {
+      "abstract": true,
+      "description": "iOS Mono Runtime Packs",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.Mono.net8.ios-arm",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.ios-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.iossimulator-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.iossimulator-x64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.iossimulator-x86"
+      ],
+      "extends": [ "microsoft-net-runtime-mono-tooling-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "osx-arm64", "osx-x64" ]
+    },
+    "microsoft-net-runtime-maccatalyst-net8": {
+      "abstract": true,
+      "description": "MacCatalyst Mono Runtime and AOT Workload",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.maccatalyst-arm64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.maccatalyst-x64"
+      ],
+      "extends": [ "runtimes-maccatalyst-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "osx-arm64", "osx-x64" ]
+    },
+    "runtimes-maccatalyst-net8": {
+      "abstract": true,
+      "description": "MacCatalyst Mono Runtime Packs",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.Mono.net8.maccatalyst-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.maccatalyst-x64"
+      ],
+      "extends": [ "microsoft-net-runtime-mono-tooling-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "osx-arm64", "osx-x64" ]
+    },
+    "microsoft-net-runtime-macos-net8": {
+      "abstract": true,
+      "description": "MacOS CoreCLR and Mono Runtime Workload",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.Mono.net8.osx-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.osx-x64",
+        "Microsoft.NETCore.App.Runtime.osx-arm64",
+        "Microsoft.NETCore.App.Runtime.osx-x64"
+      ],
+      "extends": [ "microsoft-net-runtime-mono-tooling-net8" ],
+      "platforms": [ "osx-arm64", "osx-x64" ]
+    },
+    "microsoft-net-runtime-tvos-net8": {
+      "abstract": true,
+      "description": "tvOS Mono Runtime and AOT Workload",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvos-arm64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvossimulator-arm64",
+        "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvossimulator-x64"
+      ],
+      "extends": [ "runtimes-tvos-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "osx-arm64", "osx-x64" ]
+    },
+    "runtimes-tvos-net8": {
+      "abstract": true,
+      "description": "tvOS Mono Runtime Packs",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.Mono.net8.tvos-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.tvossimulator-arm64",
+        "Microsoft.NETCore.App.Runtime.Mono.net8.tvossimulator-x64"
+      ],
+      "extends": [ "microsoft-net-runtime-mono-tooling-net8" ],
+      "platforms": [ "win-x64", "win-arm64", "osx-arm64", "osx-x64" ]
+    },
+    "runtimes-windows-net8": {
+      "abstract": true,
+      "description": "Windows Runtime Packs for net8.0",
+      "packs": [
+        "Microsoft.NETCore.App.Runtime.net8.win-x64",
+        "Microsoft.NETCore.App.Runtime.net8.win-x86",
+        "Microsoft.NETCore.App.Runtime.net8.win-arm",
+        "Microsoft.NETCore.App.Runtime.net8.win-arm64"
+      ]
+    },
+    "microsoft-net-runtime-mono-tooling-net8": {
+      "abstract": true,
+      "description": "Shared native build tooling for Mono runtime",
+      "packs": [
+        "Microsoft.NET.Runtime.MonoAOTCompiler.Task.net8",
+        "Microsoft.NET.Runtime.MonoTargets.Sdk.net8"
+      ]
+    }
+  },
+  "packs": {
+    "Microsoft.NET.Runtime.MonoAOTCompiler.Task.net8": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NET.Runtime.MonoAOTCompiler.Task"
+      }
+    },
+    "Microsoft.NET.Runtime.MonoTargets.Sdk.net8": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NET.Runtime.MonoTargets.Sdk"
+      }
+    },
+    "Microsoft.NET.Runtime.WebAssembly.Sdk.net8": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NET.Runtime.WebAssembly.Sdk"
+      }
+    },
+    "Microsoft.NET.Runtime.WebAssembly.Templates.net8": {
+      "kind": "template",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NET.Runtime.WebAssembly.Templates"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.android-arm": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.android-arm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.android-arm64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.android-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.android-x64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.android-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.android-x86": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.android-x86"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-x86": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x86",
+        "win-arm64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x86",
+        "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x86",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-x64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x64",
+        "win-arm64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x64",
+        "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-arm": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm",
+        "win-arm64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm",
+        "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-arm64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm64",
+        "win-arm64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm64",
+        "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.maccatalyst-arm64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.maccatalyst-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.maccatalyst-x64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.maccatalyst-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.osx-arm64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.osx-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.osx-x64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.osx-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.net8.osx-arm64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.osx-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.net8.osx-x64": {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+          "any": "Microsoft.NETCore.App.Runtime.osx-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.ios-arm" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.ios-arm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.ios-arm64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.ios-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.iossimulator-arm64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.iossimulator-x64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+          "any": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.iossimulator-x86" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvos-arm64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.tvos-arm64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.tvos-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.tvossimulator-arm64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.tvossimulator-x64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.maccatalyst-arm64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-arm64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.maccatalyst-x64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-x64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvossimulator-arm64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-arm64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvossimulator-x64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-x64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.ios-arm": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.ios-arm64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-arm64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-arm64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-arm64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-x64": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x64",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-x86": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x86",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x86"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.net8.browser-wasm": {
+      "kind": "Sdk",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm",
+        "win-arm64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm",
+        "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.browser-wasm",
+        "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm",
+        "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.browser-wasm" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.browser-wasm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.multithread.net8.browser-wasm" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.Mono.net8.wasi-wasm" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}"
+    },
+    "Microsoft.NETCore.App.Runtime.net8.win-x64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.win-x64"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.net8.win-x86" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.win-x86"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.net8.win-arm" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.win-arm"
+      }
+    },
+    "Microsoft.NETCore.App.Runtime.net8.win-arm64" : {
+      "kind": "framework",
+      "version": "${PackageVersionNet8}",
+      "alias-to": {
+        "any": "Microsoft.NETCore.App.Runtime.win-arm64"
+      }
+    }
+  }
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/WorkloadManifest.targets.in b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/WorkloadManifest.targets.in
new file mode 100644
index 00000000000000..096fdf71743fc3
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/WorkloadManifest.targets.in
@@ -0,0 +1,74 @@
+<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
+<Project>
+  <Import Condition="'$(TargetsNet8)' == 'true' and '$(RunAOTCompilation)' == 'true' and ('$(UsingBrowserRuntimeWorkload)' == 'true' or '$(UsingMobileWorkload)' == 'true')" Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoAOTCompiler.Task.net8" />
+
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'android'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'android' and '$(RunAOTCompilation)' == 'true'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-x86" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-x64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-arm" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.android-arm64" />
+  </ImportGroup>
+
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'macOS'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+  </ImportGroup>
+
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'ios'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'ios' and $([MSBuild]::IsOSPlatform('osx'))">
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.ios-arm" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.ios-arm64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-arm64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-x64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.iossimulator-x86" />
+  </ImportGroup>
+
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'maccatalyst'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'maccatalyst' and $([MSBuild]::IsOSPlatform('osx'))">
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.maccatalyst-arm64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.maccatalyst-x64" />
+  </ImportGroup>
+
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'tvos'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(TargetPlatformIdentifier)' == 'tvos' and $([MSBuild]::IsOSPlatform('osx'))">
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvos-arm64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvossimulator-arm64" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.tvossimulator-x64" />
+  </ImportGroup>
+
+  <ImportGroup Condition="'$(TargetsNet8)' == 'true' and '$(RuntimeIdentifier)' == 'browser-wasm' and '$(UsingBrowserRuntimeWorkload)' == 'true'">
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.WebAssembly.Sdk.net8" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.WebAssembly.Sdk.net8" />
+    <Import Project="Sdk.props" Sdk="Microsoft.NETCore.App.Runtime.AOT.Cross.net8.browser-wasm" />
+    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.MonoTargets.Sdk.net8" />
+  </ImportGroup>
+
+  <PropertyGroup Condition="'$(TargetsNet8)' == 'true' and ('$(TargetPlatformIdentifier)' == 'android' or '$(TargetPlatformIdentifier)' == 'macOS' or '$(TargetPlatformIdentifier)' == 'ios' or '$(TargetPlatformIdentifier)' == 'maccatalyst' or '$(TargetPlatformIdentifier)' == 'tvos' or '$(RuntimeIdentifier)' == 'browser-wasm' or '$(RuntimeIdentifier)' == 'wasi-wasm')">
+    <_MonoWorkloadTargetsMobile>true</_MonoWorkloadTargetsMobile>
+    <_MonoWorkloadRuntimePackPackageVersion>$(_RuntimePackInWorkloadVersion8)</_MonoWorkloadRuntimePackPackageVersion>
+  </PropertyGroup>
+
+  <ItemGroup Condition="'$(TargetsNet8)' == 'true' and '$(_MonoWorkloadTargetsMobile)' == 'true'">
+    <KnownRuntimePack Update="@(KnownRuntimePack)">
+      <!-- FIXMEWASI: workaround for now -->
+      <RuntimePackRuntimeIdentifiers Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'">%(RuntimePackRuntimeIdentifiers);wasi-wasm</RuntimePackRuntimeIdentifiers>
+      <LatestRuntimeFrameworkVersion Condition="'%(KnownRuntimePack.TargetFramework)' == 'net8.0' and '%(KnownRuntimePack.RuntimePackLabels)' == 'Mono'">$(_MonoWorkloadRuntimePackPackageVersion)</LatestRuntimeFrameworkVersion>
+      <!-- Overrides for wasm threads support -->
+      <RuntimePackNamePatterns Condition="'$(RuntimeIdentifier)' == 'browser-wasm' and '$(WasmEnablethreads)' == 'true'">Microsoft.NETCore.App.Runtime.Mono.multithread.**RID**</RuntimePackNamePatterns>
+    </KnownRuntimePack>
+  </ItemGroup>
+</Project>
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.cs.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.cs.json
new file mode 100644
index 00000000000000..c79d39ad7f74a1
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.cs.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net7/description": "Nástroje pro sestavení .NET WebAssembly"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.de.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.de.json
new file mode 100644
index 00000000000000..deac970f9cf458
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.de.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET 8.0 WebAssembly-Buildtools"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.en.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.en.json
new file mode 100644
index 00000000000000..78a5129362796d
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.en.json
@@ -0,0 +1,5 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET WebAssembly build tools for net8.0",
+  "workloads/wasm-experimental-net8/description": ".NET WebAssembly experimental tooling for net8.0",
+  "workloads/runtimes-windows-net8/description": "Windows Runtime Packs for net8.0"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.es.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.es.json
new file mode 100644
index 00000000000000..06b3489658c9d1
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.es.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": "Herramientas de compilación de WebAssembly de .NET 8.0"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.fr.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.fr.json
new file mode 100644
index 00000000000000..87fe76f3549521
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.fr.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": "Outils de construction .NET 8.0 WebAssembly"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.it.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.it.json
new file mode 100644
index 00000000000000..d4c591ea616d14
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.it.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": "Strumenti di compilazione WebAssembly .NET 8.0"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ja.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ja.json
new file mode 100644
index 00000000000000..c57f53c27ccecc
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ja.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET WebAssembly ビルド ツール"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ko.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ko.json
new file mode 100644
index 00000000000000..fc62bb1de6da73
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ko.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET 8.0 WebAssembly 빌드 도구"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.pl.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.pl.json
new file mode 100644
index 00000000000000..0ec404a2bea3e4
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.pl.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": "Narzędzia kompilacji zestawu WebAssembly platformy .NET 8.0"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.pt-BR.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.pt-BR.json
new file mode 100644
index 00000000000000..82031365ecb7ca
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.pt-BR.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": "Ferramentas de build do .NET 8.0 WebAssembly"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ru.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ru.json
new file mode 100644
index 00000000000000..d797f5dcc3f20c
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.ru.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": "Средства сборки WebAssembly .NET 8.0"
+}
\ No newline at end of file
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.tr.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.tr.json
new file mode 100644
index 00000000000000..e20300297e258a
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.tr.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET 8.0 derleme araçları"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.zh-Hans.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.zh-Hans.json
new file mode 100644
index 00000000000000..351d7a5aeed3cb
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.zh-Hans.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET 8.0 WebAssembly 生成工具"
+}
diff --git a/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.zh-Hant.json b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.zh-Hant.json
new file mode 100644
index 00000000000000..10cf7b47769291
--- /dev/null
+++ b/src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest/localize/WorkloadManifest.zh-Hant.json
@@ -0,0 +1,3 @@
+{
+  "workloads/wasm-tools-net8/description": ".NET 8.0 WebAssembly 組建工具"
+}
diff --git a/src/mono/nuget/manifest-packages.proj b/src/mono/nuget/manifest-packages.proj
index 271409ec507a0f..e7cd9607a4a02b 100644
--- a/src/mono/nuget/manifest-packages.proj
+++ b/src/mono/nuget/manifest-packages.proj
@@ -3,5 +3,6 @@
     <ProjectReference Include="Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest\Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest.pkgproj" />
     <ProjectReference Include="Microsoft.NET.Workload.Mono.Toolchain.net6.Manifest\Microsoft.NET.Workload.Mono.Toolchain.net6.Manifest.pkgproj" />
     <ProjectReference Include="Microsoft.NET.Workload.Mono.Toolchain.net7.Manifest\Microsoft.NET.Workload.Mono.Toolchain.net7.Manifest.pkgproj" />
+    <ProjectReference Include="Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest\Microsoft.NET.Workload.Mono.Toolchain.net8.Manifest.pkgproj" />
   </ItemGroup>
 </Project>
diff --git a/src/mono/wasm/Makefile b/src/mono/wasm/Makefile
index 6af5ba3a597fc8..5d6f4e53085877 100644
--- a/src/mono/wasm/Makefile
+++ b/src/mono/wasm/Makefile
@@ -88,7 +88,7 @@ build-tasks:
 	$(DOTNET) build $(TOP)/src/tasks/tasks.proj /p:Configuration=$(CONFIG) $(MSBUILD_ARGS)
 
 build-packages:
-	rm $(TOP)/artifacts/packages/$(CONFIG)/Shipping/*.nupkg
+	rm -f $(TOP)/artifacts/packages/$(CONFIG)/Shipping/*.nupkg
 	EMSDK_PATH=$(EMSDK_PATH) $(TOP)/build.sh mono.packages+mono.manifests+packs.product -os browser -c $(CONFIG) --binaryLog /p:ContinueOnError=false /p:StopOnFirstFailure=true $(MSBUILD_ARGS)
 
 clean:
diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs
index 08488d487a6151..4462452486768f 100644
--- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs
@@ -185,19 +185,19 @@ public void ConsoleBuildThenPublish(string config)
         [InlineData("Release", false)]
         [InlineData("Release", true)]
         public void ConsoleBuildAndRunDefault(string config, bool relinking)
-            => ConsoleBuildAndRun(config, relinking, string.Empty, DefaultTargetFramework);
+            => ConsoleBuildAndRun(config, relinking, string.Empty, DefaultTargetFramework, addFrameworkArg: true);
 
         [Theory]
         // [ActiveIssue("https://github.com/dotnet/runtime/issues/79313")]
         // [InlineData("Debug", "-f net7.0", "net7.0")]
         [InlineData("Debug", "-f net8.0", "net8.0")]
         public void ConsoleBuildAndRunForSpecificTFM(string config, string extraNewArgs, string expectedTFM)
-            => ConsoleBuildAndRun(config, false, extraNewArgs, expectedTFM);
+            => ConsoleBuildAndRun(config, false, extraNewArgs, expectedTFM, addFrameworkArg: extraNewArgs?.Length == 0);
 
-        private void ConsoleBuildAndRun(string config, bool relinking, string extraNewArgs, string expectedTFM)
+        private void ConsoleBuildAndRun(string config, bool relinking, string extraNewArgs, string expectedTFM, bool addFrameworkArg)
         {
             string id = $"{config}_{GetRandomId()}";
-            string projectFile = CreateWasmTemplateProject(id, "wasmconsole", extraNewArgs);
+            string projectFile = CreateWasmTemplateProject(id, "wasmconsole", extraNewArgs, addFrameworkArg: addFrameworkArg);
             string projectName = Path.GetFileNameWithoutExtension(projectFile);
 
             UpdateProgramCS();
@@ -418,7 +418,7 @@ public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework
         {
             string config = "Debug";
             string id = $"browser_{config}_{GetRandomId()}";
-            CreateWasmTemplateProject(id, "wasmbrowser", extraNewArgs);
+            CreateWasmTemplateProject(id, "wasmbrowser", extraNewArgs, addFrameworkArg: extraNewArgs.Length == 0);
 
             UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath);
 
diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs
index d23166ff5545e2..c7392f3dbece93 100644
--- a/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs
@@ -21,7 +21,7 @@ protected WasmTemplateTestBase(ITestOutputHelper output, SharedBuildPerTestClass
         _provider.BundleDirName = "AppBundle";
     }
 
-    public string CreateWasmTemplateProject(string id, string template = "wasmbrowser", string extraArgs = "", bool runAnalyzers = true)
+    public string CreateWasmTemplateProject(string id, string template = "wasmbrowser", string extraArgs = "", bool runAnalyzers = true, bool addFrameworkArg = true)
     {
         InitPaths(id);
         InitProjectDir(_projectDir, addNuGetSourceForLocalPackages: true);
@@ -39,6 +39,8 @@ public string CreateWasmTemplateProject(string id, string template = "wasmbrowse
             """);
         File.Copy(BuildEnvironment.WasmOverridePacksTargetsPath, Path.Combine(_projectDir, Path.GetFileName(BuildEnvironment.WasmOverridePacksTargetsPath)), overwrite: true);
 
+        if (addFrameworkArg)
+            extraArgs += $" -f {DefaultTargetFramework}";
         new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false)
                 .WithWorkingDirectory(_projectDir!)
                 .ExecuteWithCapturedOutput($"new {template} {extraArgs}")
diff --git a/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs b/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs
index fa36165bab3bc0..009da0c7bb1aee 100644
--- a/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs
@@ -5,6 +5,7 @@
 using System.IO;
 using System.Linq;
 using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
 using System.Xml;
 using System.Xml.Serialization;
 using Xunit;
@@ -58,13 +59,20 @@ public void FilesInUnixFilesPermissionsXmlExist()
             // have the unixFilePermissions for that
             // Expect just the emscripten ones here for now
 
-            // linux doesn't have Emscripten.Python package, so only 2 there
             int expectedPermFileCount = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? 4 : 5;
 
-            int permFileCount = unixPermFiles.Count();
-            if (permFileCount != expectedPermFileCount)
-                throw new XunitException($"Expected to find {expectedPermFileCount} UnixFilePermissions.xml files, but got {permFileCount}."
-                                            + $"{Environment.NewLine}Files: {string.Join(", ", unixPermFiles)}");
+            // extract pack names from ./artifacts/bin/dotnet-latest/packs/Microsoft.NET.Runtime.Emscripten.3.1.34.Sdk.linux-x64/8.0.0-rtm.23470.1/data/UnixFilePermissions.xml
+            var packNames = unixPermFiles.Select(f => Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(f))))).ToArray();
+
+            Assert.Contains(packNames, name => Regex.IsMatch(name!, "Microsoft\\.NET\\.Runtime\\.Emscripten\\.[0-9\\.]+\\.Cache\\."));
+            Assert.Contains(packNames, name => Regex.IsMatch(name!, "Microsoft\\.NET\\.Runtime\\.Emscripten\\.[0-9\\.]+\\.Node\\."));
+            Assert.Contains(packNames, name => Regex.IsMatch(name!, "Microsoft\\.NET\\.Runtime\\.Emscripten\\.[0-9\\.]+\\.Sdk\\."));
+
+            // linux doesn't have Emscripten.Python package, so only 2 there
+            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
+                Assert.Contains(packNames, name => Regex.IsMatch(name!, "Microsoft\\.NET\\.Runtime\\.Emscripten\\.[0-9\\.]+\\.Python\\."));
+
+            Assert.Contains(packNames, name => Regex.IsMatch(name!, "Microsoft.NETCore.App.Runtime.AOT\\..*\\.Cross.browser-wasm"));
         }
     }
 
diff --git a/src/mono/wasm/templates/templates/browser/.template.config/template.json b/src/mono/wasm/templates/templates/browser/.template.config/template.json
index 3cb0a19dc265b2..9d3e32811b8fa9 100644
--- a/src/mono/wasm/templates/templates/browser/.template.config/template.json
+++ b/src/mono/wasm/templates/templates/browser/.template.config/template.json
@@ -4,8 +4,8 @@
   "classifications": [ "Web", "WebAssembly", "Browser" ],
   "generatorVersions": "[1.0.0.0-*)",
   "groupIdentity": "WebAssembly.Browser",
-  "precedence": 8000,
-  "identity": "WebAssembly.Browser.8.0",
+  "precedence": 9000,
+  "identity": "WebAssembly.Browser.9.0",
   "name": "WebAssembly Browser App",
   "description": "A project template for creating a .NET app that runs on WebAssembly in a browser",
   "shortName": "wasmbrowser",
@@ -40,12 +40,12 @@
       "datatype": "choice",
       "choices": [
         {
-          "choice": "net8.0",
-          "description": "Target net8.0",
-          "displayName": ".NET 8.0"
+          "choice": "net9.0",
+          "description": "Target net9.0",
+          "displayName": ".NET 9.0"
         }
       ],
-      "defaultValue": "net8.0",
+      "defaultValue": "net9.0",
       "replaces": "net7.0",
       "displayName": "framework"
     }
diff --git a/src/mono/wasm/templates/templates/console/.template.config/template.json b/src/mono/wasm/templates/templates/console/.template.config/template.json
index 559902639dec4d..a3dd13fc2d10c0 100644
--- a/src/mono/wasm/templates/templates/console/.template.config/template.json
+++ b/src/mono/wasm/templates/templates/console/.template.config/template.json
@@ -3,8 +3,8 @@
   "author": "Microsoft",
   "classifications": [ "Web", "WebAssembly", "Console" ],
   "groupIdentity": "WebAssembly.Console",
-  "precedence": 8000,
-  "identity": "WebAssembly.Console.8.0",
+  "precedence": 9000,
+  "identity": "WebAssembly.Console.9.0",
   "name": "WebAssembly Console App",
   "description": "A project template for creating a .NET app that runs on WebAssembly on Node JS or V8",
   "shortName": "wasmconsole",
@@ -21,12 +21,12 @@
       "datatype": "choice",
       "choices": [
         {
-          "choice": "net8.0",
-          "description": "Target net8.0",
-          "displayName": ".NET 8.0"
+          "choice": "net9.0",
+          "description": "Target net9.0",
+          "displayName": ".NET 9.0"
         }
       ],
-      "defaultValue": "net8.0",
+      "defaultValue": "net9.0",
       "replaces": "net7.0",
       "displayName": "framework"
     }