diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml
index 88f0bebc179e9f081032ebbaa268b8ea9f8e8080..45a0f46cb83633ab4d62368f6c72bb68838755be 100644
--- a/.azure/pipelines/jobs/default-build.yml
+++ b/.azure/pipelines/jobs/default-build.yml
@@ -77,6 +77,9 @@ jobs:
     dependsOn: ${{ parameters.dependsOn }}
     ${{ if ne(parameters.condition, '') }}:
       condition: ${{ parameters.condition }}
+    ${{ if ne(parameters.enableRichCodeNavigation, '') }}:
+      enableRichCodeNavigation: true
+      richCodeNavigationLanguage: 'csharp,typescript,java'
     timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
     cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }}
     ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.agentOs, 'Windows'), eq(parameters.codeSign, 'true')) }}:
diff --git a/.azure/pipelines/richnav.yml b/.azure/pipelines/richnav.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a41986ca81ad30ba5e7b2679cdb257c8720b5ad2
--- /dev/null
+++ b/.azure/pipelines/richnav.yml
@@ -0,0 +1,64 @@
+#
+# See https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema for details on this file.
+#
+
+# Configure which branches trigger builds
+trigger:
+  branches:
+    include:
+    - blazor-wasm
+    - master
+    - release/*
+    - internal/release/*
+
+variables:
+- name: _BuildArgs
+  value: '/p:SkipTestBuild=true'
+- name: Windows86LogArgs
+  value: -ExcludeCIBinaryLog
+
+stages:
+- stage: build
+  displayName: Build
+  jobs:
+  # Build Windows (x64/x86)
+  - template: jobs/default-build.yml
+    parameters:
+      codeSign: false
+      jobName: Windows_build
+      jobDisplayName: "Build: Windows x64/x86"
+      enableRichCodeNavigation: true
+      agentOs: Windows
+      steps:
+      - script: ./build.cmd
+                -ci
+                -all
+                -arch x64
+                /p:EnableRichCodeNavigation=true
+                $(_BuildArgs)
+        displayName: Build x64
+
+      # Build the x86 shared framework
+      # This is going to actually build x86 native assets.
+      - script: ./build.cmd
+                -ci
+                -noBuildRepoTasks
+                -arch x86
+                -all
+                -noBuildJava
+                -noBuildNative
+                /p:EnableRichCodeNavigation=true
+                $(_BuildArgs)
+                $(Windows86LogArgs)
+        displayName: Build x86
+
+      # Windows installers bundle both x86 and x64 assets
+      - script: ./build.cmd
+                -ci
+                -noBuildRepoTasks
+                -buildInstallers
+                -noBuildNative
+                /p:AssetManifestFileName=aspnetcore-win-x64-x86.xml
+                /p:EnableRichCodeNavigation=true
+                $(_BuildArgs)
+        displayName: Build Installers
diff --git a/NuGet.config b/NuGet.config
index 4b1bf8e5576292d3b833b08a5f1cfe37e68cd889..f7375b2fdcbf4b9ba48b60701aa6b3bf4ef753a1 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -12,6 +12,8 @@
     <add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" />
     <!-- Used for the SiteExtension 3.1 bits that are included in the 5.0 build -->
     <add key="dotnet31-transport" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3.1-transport/nuget/v3/index.json" />
+    <!-- Used for the Rich Navigation indexing task -->
+    <add key="richnav" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/vs-buildservices/nuget/v3/index.json" />
   </packageSources>
   <disabledPackageSources>
     <clear />