diff --git a/.gdn/.gdnsettings b/.gdn/.gdnsettings
new file mode 100644
index 00000000000..9ebd4133b35
--- /dev/null
+++ b/.gdn/.gdnsettings
@@ -0,0 +1,7 @@
+{
+  "files": { },
+  "folders": { },
+  "overwriteLogs": true,
+  "telemetryFlushTimeout": 10,
+  "variables": { }
+}
diff --git a/.gdn/.gdnsuppress b/.gdn/.gdnsuppress
new file mode 100644
index 00000000000..05025c8dc59
--- /dev/null
+++ b/.gdn/.gdnsuppress
@@ -0,0 +1,62 @@
+{
+  "hydrated": false,
+  "properties": {
+    "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/suppressions",
+    "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance."
+  },
+  "version": "1.0.0",
+  "suppressionSets": {
+    "default": {
+      "name": "default",
+      "createdDate": "2024-02-21 20:58:02Z",
+      "lastUpdatedDate": "2024-02-22 21:40:38Z"
+    }
+  },
+  "results": {
+    "28e1a7a1157c8739dce8ac1bbd828a471e477444ec50d2656d0440948b58a274": {
+      "signature": "28e1a7a1157c8739dce8ac1bbd828a471e477444ec50d2656d0440948b58a274",
+      "alternativeSignatures": [],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "FillEventHistory+Event API documentation with generic example password.",
+      "createdDate": "2024-02-21 20:58:02Z"
+    },
+    "0b7cc0b28f27b0eeb2a415f10e62c32675dd2d4edcffe35600eae35f8064004e": {
+      "signature": "0b7cc0b28f27b0eeb2a415f10e62c32675dd2d4edcffe35600eae35f8064004e",
+      "alternativeSignatures": [],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Android.Service.Autofill.FillEventHistory+Event API documentation with generic example password.",
+      "createdDate": "2024-02-21 20:58:02Z"
+    },
+    "e57727a14a28f6fd8f4aa87cd3c4b33401dfea1078ce32fb3cbdf342e8adf63d": {
+      "signature": "e57727a14a28f6fd8f4aa87cd3c4b33401dfea1078ce32fb3cbdf342e8adf63d",
+      "alternativeSignatures": [],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Javax.Crypto.ISecretKey API documentation with generic example password.",
+      "createdDate": "2024-02-21 20:58:02Z"
+    },
+    "15c51590a2e2bb503a7277448e05357f5fd8d4cb2f9b9b7446e41c872cceaac4": {
+      "signature": "15c51590a2e2bb503a7277448e05357f5fd8d4cb2f9b9b7446e41c872cceaac4",
+      "alternativeSignatures": [],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Javax.Security.Auth.Callback.PasswordCallback API documentation with generic example password.",
+      "createdDate": "2024-02-21 20:58:02Z"
+    },
+    "1ccf925aa704efd1035bac38e94d2e629fb5b0d1784d5473e4a52e6d13db16ee": {
+      "signature": "1ccf925aa704efd1035bac38e94d2e629fb5b0d1784d5473e4a52e6d13db16ee",
+      "alternativeSignatures": [],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Dummy test.keystore file used for testing.",
+      "createdDate": "2024-02-21 20:58:02Z"
+    }
+  }
+}
diff --git a/.gdn/.gitignore b/.gdn/.gitignore
new file mode 100644
index 00000000000..de1a20ab6d5
--- /dev/null
+++ b/.gdn/.gitignore
@@ -0,0 +1,11 @@
+﻿## Ignore Guardian internal files
+.r/
+rc/
+rs/
+i/
+p/
+c/
+o/
+
+## Ignore Guardian Local settings
+LocalSettings.gdn.json
diff --git a/.gdn/policheck/CHT.gdnsuppress b/.gdn/policheck/CHT.gdnsuppress
new file mode 100644
index 00000000000..4a7ab1881eb
--- /dev/null
+++ b/.gdn/policheck/CHT.gdnsuppress
@@ -0,0 +1,26 @@
+{
+ "hydrated": false,
+  "properties": {
+    "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/suppressions",
+    "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance."
+  },
+  "version": "1.0.0",
+  "suppressionSets": {
+    "default": {
+      "name": "default",
+      "createdDate": "2023-02-24 00:05:39Z",
+      "lastUpdatedDate": "2024-02-22 21:40:38Z"
+    }
+  },
+  "results": {
+    "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019": {
+      "signature": "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019",
+      "alternativeSignatures": [],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to the Android package format APK.",
+      "createdDate": "2023-02-24 00:05:39Z"
+    }
+  }
+}
diff --git a/build-tools/automation/guardian/PoliCheck.Exclusions.xml b/.gdn/policheck/PoliCheck.Exclusions.xml
similarity index 100%
rename from build-tools/automation/guardian/PoliCheck.Exclusions.xml
rename to .gdn/policheck/PoliCheck.Exclusions.xml
diff --git a/.gdn/policheck/source.gdnsuppress b/.gdn/policheck/source.gdnsuppress
new file mode 100644
index 00000000000..f9f56338a57
--- /dev/null
+++ b/.gdn/policheck/source.gdnsuppress
@@ -0,0 +1,204 @@
+{
+  "hydrated": false,
+  "properties": {
+    "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/suppressions",
+    "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance."
+  },
+  "version": "1.0.0",
+  "suppressionSets": {
+    "default": {
+      "name": "default",
+      "createdDate": "2023-02-22 23:55:29Z",
+      "lastUpdatedDate": "2024-04-15 16:33:16Z"
+    }
+  },
+  "results": {
+     "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa": {
+      "signature": "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa",
+      "alternativeSignatures": [
+        "5c6188b6cec9a19a5e3b1c6b4a25fe79f1650edad0b9967c08983a33b57cdc2d"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Exclusion list includeded in external sources.",
+      "createdDate": "2024-04-15 16:33:16Z"
+    },
+    "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5": {
+      "signature": "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5",
+      "alternativeSignatures": [
+        "5c6188b6cec9a19a5e3b1c6b4a25fe79f1650edad0b9967c08983a33b57cdc2d"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Exclusion list includeded in external sources.",
+      "createdDate": "2024-04-15 16:33:16Z"
+    },
+    "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292": {
+      "signature": "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292",
+      "alternativeSignatures": [
+        "b5041e3ec6776af49d6d69148e4db480f366b559299d19ec8ea3e095295b39a8"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an ISCII term.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f": {
+      "signature": "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f",
+      "alternativeSignatures": [
+        "739cb5e6ee2409515900652ca668f819f697f23834becece8d2f9f9236723c1b"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an ISCII term.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789": {
+      "signature": "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789",
+      "alternativeSignatures": [
+        "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an Android logging function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab": {
+      "signature": "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab",
+      "alternativeSignatures": [
+        "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an Android logging function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d": {
+      "signature": "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d",
+      "alternativeSignatures": [
+        "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an Android logging function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a": {
+      "signature": "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a",
+      "alternativeSignatures": [
+        "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an Android logging function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac": {
+      "signature": "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac",
+      "alternativeSignatures": [
+        "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an Android logging function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97": {
+      "signature": "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97",
+      "alternativeSignatures": [
+        "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to an Android logging function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0": {
+      "signature": "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0",
+      "alternativeSignatures": [
+        "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to find first set bit function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb": {
+      "signature": "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb",
+      "alternativeSignatures": [
+        "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to find first set bit function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845": {
+      "signature": "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845",
+      "alternativeSignatures": [
+        "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to find first set bit function.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "f94ede7b396cb54934db2084f0879cd31a17ce2584eb01e0bfcd35324a724c31": {
+      "signature": "f94ede7b396cb54934db2084f0879cd31a17ce2584eb01e0bfcd35324a724c31",
+      "alternativeSignatures": [
+        "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to find first set bit function.",
+      "createdDate": "2024-02-22 21:40:38Z"
+    },
+    "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b": {
+      "signature": "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b",
+      "alternativeSignatures": [
+        "3901d031f3ac168bb1a84d06bb234355af514c59a0ed9da325b11a8861ff0b05"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to output from an external tool.",
+      "createdDate": "2023-02-22 23:55:29Z"
+    },
+    "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150": {
+      "signature": "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150",
+      "alternativeSignatures": [
+        "c78c3f8e456228997085b6409a12dce8b11eb5454a5588652225bc48a77d4662"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Exclusion list includeded in external sources.",
+      "createdDate": "2024-04-15 16:33:16Z"
+    },
+    "243e199c7aec22377e0363bdca82384278cc36b0674f35697935fde6c45cfd0e": {
+      "signature": "243e199c7aec22377e0363bdca82384278cc36b0674f35697935fde6c45cfd0e",
+      "alternativeSignatures": [
+        "cf02f44873b25336e01a1fa294bd858d2ea69ae734f08c6db40d4b83d17ccf76"
+      ],
+      "memberOf": [
+        "default"
+      ],
+      "justification": "Reference to a proper name.",
+      "createdDate": "2023-10-26 21:20:54Z"
+    }
+  }
+}
diff --git a/build-tools/automation/guardian/tsaoptions-v2.json b/.gdn/tsaoptions-v2.json
similarity index 100%
rename from build-tools/automation/guardian/tsaoptions-v2.json
rename to .gdn/tsaoptions-v2.json
diff --git a/build-tools/automation/azure-pipelines-nightly.yaml b/build-tools/automation/azure-pipelines-nightly.yaml
index 4370dc175d1..3d5e70518c5 100644
--- a/build-tools/automation/azure-pipelines-nightly.yaml
+++ b/build-tools/automation/azure-pipelines-nightly.yaml
@@ -27,7 +27,7 @@ resources:
 
 # Global variables
 variables:
-- template: yaml-templates/variables.yaml
+- template: /build-tools/automation/yaml-templates/variables.yaml
 
 stages:
 - stage: mac_build
@@ -52,16 +52,17 @@ stages:
     - checkout: self
       submodules: recursive
 
-    - template: yaml-templates/commercial-build.yaml
+    - template: /build-tools/automation/yaml-templates/commercial-build.yaml
       parameters:
         makeMSBuildArgs: /p:EnableNativeAnalyzers=true
+        use1ESTemplate: false
 
-    - template: yaml-templates/upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml
       parameters:
         xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
         artifactName: Build Results - Nightly macOS
         includeBuildResults: true
-
+        use1ESTemplate: false
 
 - stage: test_apk
   displayName: Test APKs
@@ -112,29 +113,26 @@ stages:
     workspace:
       clean: all
     steps:
-    - template: yaml-templates/setup-test-environment.yaml
+    - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml
       parameters:
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
         xaprepareScenario: EmulatorTestDependencies
         jdkTestFolder: $(JAVA_HOME_11_X64)
 
-    - template: yaml-templates/run-dotnet-preview.yaml
+    - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml
       parameters:
         project: Xamarin.Android.sln
         arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) -m:1 -v:n
         displayName: prepare java.interop $(XA.Build.Configuration)
         continueOnError: false
 
-    - template: yaml-templates/start-stop-emulator.yaml
+    - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml
       parameters:
         specificImage: true
         avdApiLevel: $(avdApiLevel)
         avdAbi: $(avdAbi)
         avdType: $(avdType)
 
-    - template: yaml-templates/apk-instrumentation.yaml
+    - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml
       parameters:
         configuration: $(XA.Build.Configuration)
         testName: Mono.Android.NET_Tests-$(XA.Build.Configuration)-$(avdApiLevel)
@@ -144,26 +142,27 @@ stages:
         artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
         artifactFolder: Mono.Android-$(XA.Build.Configuration)-$(avdApiLevel)
 
-    - template: yaml-templates/upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml
       parameters:
         configuration: $(XA.Build.Configuration)
         artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS
+        use1ESTemplate: false
 
-    - template: yaml-templates/fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml
 
-  - template: yaml-templates/run-emulator-tests.yaml
+  - template: /build-tools/automation/yaml-templates/run-emulator-tests.yaml
     parameters:
       emulatorMSBuildArgs: -p:TestAvdExtraBootArgs=-writable-system
       jobName: SystemApplicationTests
       jobTimeout: 120
       jdkTestFolder: $HOME/android-toolchain/jdk-17
+      use1ESTemplate: false
       testSteps:
       - template: run-nunit-tests.yaml
         parameters:
           testRunTitle: SystemApplicationTests On Device - macOS
           testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll
           dotNetTestExtraArgs: --filter "Name=SystemApplicationTests"
-          testResultsFile: TestResult-SystemApplicationTests-$(XA.Build.Configuration).xml
 
 
 # TimeZoneInfo test jobs
@@ -193,12 +192,9 @@ stages:
         echo "##vso[task.setvariable variable=JAVA_HOME]$HOME/android-toolchain/jdk-17"
       displayName: set JAVA_HOME to $HOME/android-toolchain/jdk-17
 
-    - template: yaml-templates/setup-test-environment.yaml
+    - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml
       parameters:
         installTestSlicer: true
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
         xaprepareScenario: EmulatorTestDependencies
         jdkTestFolder: $HOME/android-toolchain/jdk-17
 
@@ -207,21 +203,22 @@ stages:
         artifactName: $(TestAssembliesArtifactName)
         downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
 
-    - template: yaml-templates/start-stop-emulator.yaml
+    - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml
       parameters:
         emulatorMSBuildArgs: -p:TestAvdShowWindow=true
 
-    - template: yaml-templates/run-sliced-nunit-tests.yaml
+    - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml
       parameters:
         testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll
         testFilter: method == CheckTimeZoneInfoIsCorrectWithSlicer
         testRunTitle: CheckTimeZoneInfoIsCorrectNode On Device - macOS
 
-    - template: yaml-templates/upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml
       parameters:
         artifactName: Test Results - TimeZoneInfoTests With Emulator - macOS-$(System.JobPositionInPhase)
+        use1ESTemplate: false
 
-    - template: yaml-templates/fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml
 
 
 # Localization test jobs
@@ -251,12 +248,9 @@ stages:
         echo "##vso[task.setvariable variable=JAVA_HOME]$HOME/android-toolchain/jdk-17"
       displayName: set JAVA_HOME to $HOME/android-toolchain/jdk-17
 
-    - template: yaml-templates/setup-test-environment.yaml
+    - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml
       parameters:
         installTestSlicer: true
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
         xaprepareScenario: EmulatorTestDependencies
         jdkTestFolder: $HOME/android-toolchain/jdk-17
 
@@ -265,18 +259,19 @@ stages:
         artifactName: $(TestAssembliesArtifactName)
         downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
 
-    - template: yaml-templates/start-stop-emulator.yaml
+    - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml
       parameters:
         emulatorMSBuildArgs: -p:TestAvdShowWindow=true
 
-    - template: yaml-templates/run-sliced-nunit-tests.yaml
+    - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml
       parameters:
         testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll
         testFilter: method == CheckLocalizationIsCorrectWithSlicer
         testRunTitle: CheckLocalizationIsCorrect On Device - macOS
 
-    - template: yaml-templates/upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml
       parameters:
         artifactName: Test Results - Localization With Emulator - macOS-$(System.JobPositionInPhase)
+        use1ESTemplate: false
 
-    - template: yaml-templates/fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml
diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml
index 8d28320f2f4..6abe8d6ebb8 100644
--- a/build-tools/automation/azure-pipelines.yaml
+++ b/build-tools/automation/azure-pipelines.yaml
@@ -11,6 +11,10 @@ trigger:
 # External sources, scripts, tests, and yaml template files.
 resources:
   repositories:
+  - repository: 1esPipelines
+    type: git
+    name: 1ESPipelineTemplates/1ESPipelineTemplates
+    ref: refs/tags/release
   - repository: yaml-templates
     type: github
     name: xamarin/yaml-templates
@@ -24,11 +28,7 @@ resources:
   - repository: monodroid
     type: github
     name: xamarin/monodroid
-    endpoint: xamarin
-  - repository: release_scripts
-    type: github
-    name: xamarin/release-scripts
-    ref: refs/heads/sign-and-notarized
+    ref: refs/heads/main
     endpoint: xamarin
   - repository: maui
     type: github
@@ -37,12 +37,16 @@ resources:
     endpoint: xamarin
 
 parameters:
+- name: pushXAPackagesToMaestro
+  default: true
 - name: macTestAgentsUseCleanImages   # Test agents we do not need to clean up when finished because they are not reused
   default: true
+- name: Skip1ESComplianceTasks
+  default: false
 
 # Global variables
 variables:
-- template: yaml-templates/variables.yaml
+- template: /build-tools/automation/yaml-templates/variables.yaml@self
 - template: templates/common/vs-release-vars.yml@sdk-insertions
 - ${{ if eq(variables['Build.DefinitionName'], 'Xamarin.Android-Private') }}:
   - group: AzureDevOps-Artifact-Feeds-Pats
@@ -52,657 +56,597 @@ variables:
 - ${{ if ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private') }}:
   - name: DotNetFeedCredential
     value: dnceng-dotnet8
-- ${{ if and(or(eq(variables['Build.DefinitionName'], 'Xamarin.Android'), eq(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), ne(variables['Build.Reason'], 'PullRequest')) }}:
-  - name: MicroBuildSignType
+- name: MicroBuildSignType
+  ${{ if and(or(eq(variables['Build.DefinitionName'], 'Xamarin.Android'), eq(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), ne(variables['Build.Reason'], 'PullRequest')) }}:
     value: Real
-  - name: MacBuildPoolName
-    value: Azure Pipelines
-  - name: MacBuildPoolImage
-    value: internal-macos12
-  - name: LinuxBuildPoolName
-    value: android-devdiv-ubuntu-vmss
-  - name: LinuxBuildPoolImage
-    value: ''
-- ${{ if or(and(ne(variables['Build.DefinitionName'],'Xamarin.Android'), ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), eq(variables['Build.Reason'], 'PullRequest')) }}:
-  - name: MicroBuildSignType
+  ${{ else }}:
     value: Test
-  - name: MacBuildPoolName
-    value: VSEng-Xamarin-RedmondMac-Android-Untrusted
-  - name: MacBuildPoolImage
-    value: ''
-  - name: LinuxBuildPoolName
-    value: android-devdiv-ubuntu-vmss-pr
-  - name: LinuxBuildPoolImage
-    value: ''
-  - name: DisablePipelineConfigDetector
-    value: true
-
-# Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check.
-stages:
-- template: yaml-templates/build-macos.yaml
-
-- template: yaml-templates/build-windows.yaml
-
-# Check - "Xamarin.Android (Linux > Build)"
-- template: yaml-templates/build-linux.yaml
-
-- stage: smoke_tests
-  displayName: Package Tests
-  dependsOn: mac_build
-  jobs:
- # Check - "Xamarin.Android (macOS > Tests > APKs .NET)"
-  - job: mac_apk_tests_net
-    displayName: macOS > Tests > APKs .NET
-    pool:
-      vmImage: $(HostedMacImage)
-    timeoutInMinutes: 180
-    workspace:
-      clean: all
-    steps:
-    - template: yaml-templates/setup-test-environment.yaml
-      parameters:
-        provisionClassic: false
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
-        xaprepareScenario: EmulatorTestDependencies
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: $(TestAssembliesArtifactName)
-        downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
-
-    # Set up dependencies to run tests in both debug and release configurations
-    - task: DotNetCoreCLI@2
-      displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj
-      inputs:
-        projects: $(System.DefaultWorkingDirectory)/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
-        arguments: -c Debug -bl:$(System.DefaultWorkingDirectory)/bin/TestDebug/BootstrapTasks.binlog
-
-    - template: yaml-templates/run-dotnet-preview.yaml
-      parameters:
-        project: Xamarin.Android.sln
-        arguments: >-
-          -t:PrepareJavaInterop -c Debug --no-restore
-          -p:DotNetPreviewTool=$(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration)/dotnet/dotnet
-        displayName: prepare java.interop Debug
-        continueOnError: false
-
-    - template: yaml-templates/run-dotnet-preview.yaml
-      parameters:
-        project: Xamarin.Android.sln
-        arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) --no-restore
-        displayName: prepare java.interop $(XA.Build.Configuration)
-        continueOnError: false
 
-    - template: yaml-templates/start-stop-emulator.yaml
+extends:
+  ${{ if eq(variables['MicroBuildSignType'], 'Real') }}:
+    template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines
+  ${{ else }}:
+    template: v1/1ES.Unofficial.PipelineTemplate.yml@1esPipelines
+  parameters:
+    sdl:
+      ${{ if eq('${{ parameters.Skip1ESComplianceTasks }}', 'true') }}:
+        enableAllTools: false
+      binskim:
+        scanOutputDirectoryOnly: true
+      codeql:
+        runSourceLanguagesInSourceAnalysis: true
+      policheck:
+        enabled: false
+        justification: Built in task does not support multi-language scanning
+      spotBugs:
+        enabled: false
+        justification: 'Failing with "Could not successfully find the java tool launcher"'
+      sourceAnalysisPool:
+        name: AzurePipelines-EO
+        image: $(WindowsPoolImage1ESPT)
+        os: windows
+      sourceRepositoriesToScan:
+        include:
+        - repository: monodroid
+        exclude:
+        - repository: yaml-templates
+        - repository: maui
+      suppression:
+        suppressionFile: $(Build.SourcesDirectory)\.gdn\.gdnsuppress
+    stages:
+    - template: /build-tools/automation/yaml-templates/build-macos.yaml@self
+
+    - template: /build-tools/automation/yaml-templates/build-windows.yaml@self
+
+    - template: /build-tools/automation/yaml-templates/build-linux.yaml@self
+
+    - stage: smoke_tests
+      displayName: Package Tests
+      dependsOn: mac_build
+      jobs:
+    # Check - "Xamarin.Android (Package Tests macOS > Tests > APKs .NET)"
+      - job: mac_apk_tests_net
+        displayName: macOS > Tests > APKs .NET
+        pool:
+          name: Azure Pipelines
+          vmImage: $(HostedMacImage)
+          os: macOS
+        timeoutInMinutes: 180
+        workspace:
+          clean: all
+        steps:
+        - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
+          parameters:
+            xaprepareScenario: EmulatorTestDependencies
 
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Mono.Android.NET_Tests-$(XA.Build.Configuration)
-        project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
-        testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration).xml
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
-        artifactFolder: $(DotNetTargetFramework)-$(XA.Build.Configuration)
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        buildConfiguration: $(XA.Build.Configuration)
-        configuration: Debug
-        testName: Mono.Android.NET_Tests-Debug
-        project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
-        testResultsFiles: TestResult-Mono.Android.NET_Tests-Debug.xml
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk
-        artifactFolder: $(DotNetTargetFramework)-Debug
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Mono.Android.NET_Tests-NoAab
-        project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
-        testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAab.xml
-        extraBuildArgs: -p:TestsFlavor=NoAab -p:AndroidPackageFormat=apk
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk
-        artifactFolder: $(DotNetTargetFramework)-NoAab
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Mono.Android.NET_Tests-Interpreter
-        project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
-        testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)Interpreter.xml
-        extraBuildArgs: -p:TestsFlavor=Interpreter -p:UseInterpreter=True
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
-        artifactFolder: $(DotNetTargetFramework)-Interpreter
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Mono.Android.NET_Tests-NoAot
-        project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
-        testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAot.xml
-        extraBuildArgs: -p:TestsFlavor=NoAot -p:RunAOTCompilation=false
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
-        artifactFolder: $(DotNetTargetFramework)-NoAot
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Mono.Android.NET_Tests-AotLlvm
-        project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
-        testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml
-        extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
-        artifactFolder: $(DotNetTargetFramework)-AotLlvm
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Xamarin.Android.JcwGen_Tests
-        project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj
-        testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk
-        artifactFolder: $(DotNetTargetFramework)-Default
-
-    - template: yaml-templates/apk-instrumentation.yaml
-      parameters:
-        configuration: $(XA.Build.Configuration)
-        testName: Xamarin.Android.JcwGen_Tests_FastDev
-        project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj
-        testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml
-        artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk
-        artifactFolder: $(DotNetTargetFramework)-FastDev_Assemblies_Dexes
-        extraBuildArgs: /p:AndroidFastDeploymentType=Assemblies:Dexes
-
-    - template: yaml-templates/run-nunit-tests.yaml
-      parameters:
-        testRunTitle: Xamarin.Android.Tools.Aidl-Tests - macOS
-        testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Tools.Aidl-Tests.dll
-        testResultsFile: TestResult-Aidl-Tests-macOS-$(XA.Build.Configuration).xml
-
-    - task: ShellScript@2
-      displayName: Test dotnet-local.sh
-      inputs:
-        scriptPath: dotnet-local.sh
-        args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj
-
-    - ${{ if ne(parameters.macTestAgentsUseCleanImages, true) }}:
-      - template: yaml-templates/start-stop-emulator.yaml
-        parameters:
-          command: stop
+        - task: DownloadPipelineArtifact@2
+          inputs:
+            artifactName: $(TestAssembliesArtifactName)
+            downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
 
-    - template: yaml-templates/upload-results.yaml
-      parameters:
-        artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS
+        # Set up dependencies to run tests in both debug and release configurations
+        - task: DotNetCoreCLI@2
+          displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj
+          inputs:
+            projects: $(System.DefaultWorkingDirectory)/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
+            arguments: -c Debug -bl:$(System.DefaultWorkingDirectory)/bin/TestDebug/BootstrapTasks.binlog
+
+        - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
+          parameters:
+            project: Xamarin.Android.sln
+            arguments: >-
+              -t:PrepareJavaInterop -c Debug --no-restore
+              -p:DotNetPreviewTool=$(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration)/dotnet/dotnet
+            displayName: prepare java.interop Debug
+            continueOnError: false
+
+        - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
+          parameters:
+            project: Xamarin.Android.sln
+            arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) --no-restore
+            displayName: prepare java.interop $(XA.Build.Configuration)
+            continueOnError: false
+
+        - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Mono.Android.NET_Tests-$(XA.Build.Configuration)
+            project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
+            testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration).xml
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
+            artifactFolder: $(DotNetTargetFramework)-$(XA.Build.Configuration)
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            buildConfiguration: $(XA.Build.Configuration)
+            configuration: Debug
+            testName: Mono.Android.NET_Tests-Debug
+            project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
+            testResultsFiles: TestResult-Mono.Android.NET_Tests-Debug.xml
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk
+            artifactFolder: $(DotNetTargetFramework)-Debug
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Mono.Android.NET_Tests-NoAab
+            project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
+            testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAab.xml
+            extraBuildArgs: -p:TestsFlavor=NoAab -p:AndroidPackageFormat=apk
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk
+            artifactFolder: $(DotNetTargetFramework)-NoAab
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Mono.Android.NET_Tests-Interpreter
+            project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
+            testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)Interpreter.xml
+            extraBuildArgs: -p:TestsFlavor=Interpreter -p:UseInterpreter=True
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
+            artifactFolder: $(DotNetTargetFramework)-Interpreter
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Mono.Android.NET_Tests-NoAot
+            project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
+            testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAot.xml
+            extraBuildArgs: -p:TestsFlavor=NoAot -p:RunAOTCompilation=false
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
+            artifactFolder: $(DotNetTargetFramework)-NoAot
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Mono.Android.NET_Tests-AotLlvm
+            project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj
+            testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml
+            extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
+            artifactFolder: $(DotNetTargetFramework)-AotLlvm
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Xamarin.Android.JcwGen_Tests
+            project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj
+            testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk
+            artifactFolder: $(DotNetTargetFramework)-Default
+
+        - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            testName: Xamarin.Android.JcwGen_Tests_FastDev
+            project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj
+            testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml
+            artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk
+            artifactFolder: $(DotNetTargetFramework)-FastDev_Assemblies_Dexes
+            extraBuildArgs: /p:AndroidFastDeploymentType=Assemblies:Dexes
+
+        - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
+          parameters:
+            testRunTitle: Xamarin.Android.Tools.Aidl-Tests - macOS
+            testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Tools.Aidl-Tests.dll
+
+        - task: ShellScript@2
+          displayName: Test dotnet-local.sh
+          inputs:
+            scriptPath: dotnet-local.sh
+            args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj
+
+        - ${{ if ne(parameters.macTestAgentsUseCleanImages, true) }}:
+          - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
+            parameters:
+              command: stop
+
+        - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
+          parameters:
+            artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS
+
+        - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
+          parameters:
+            artifactName: Test Results - APKs .NET Debug - macOS
+            configuration: Debug
+
+        - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
+
+    - stage: linux_tests
+      displayName: Linux Tests
+      dependsOn:
+      - mac_build
+      - linux_build
+      jobs:
+      # Check - "Xamarin.Android (Linux Tests Linux > Tests > MSBuild)"
+      - job: linux_tests_smoke
+        displayName: Linux > Tests > MSBuild
+        pool:
+          name: MAUI-1ESPT
+          image: $(LinuxPoolImage1ESPT)
+          os: linux
+        timeoutInMinutes: 180
+        workspace:
+          clean: all
+        steps:
+        - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
 
-    - template: yaml-templates/upload-results.yaml
-      parameters:
-        artifactName: Test Results - APKs .NET Debug - macOS
-        configuration: Debug
-
-    - template: yaml-templates/fail-on-issue.yaml
-
-- stage: linux_tests
-  displayName: Linux Tests
-  dependsOn:
-  - mac_build
-  - linux_build
-  jobs:
-  # Check - "Xamarin.Android (Linux > Tests > MSBuild)"
-  - job: linux_tests_smoke
-    displayName: Linux > Tests > MSBuild
-    pool:
-      name: android-devdiv-ubuntu-vmss-pr
-    timeoutInMinutes: 180
-    workspace:
-      clean: all
-    steps:
-    - template: yaml-templates/setup-ubuntu.yaml
-
-    - template: yaml-templates/setup-test-environment.yaml
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: $(TestAssembliesArtifactName)
-        downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
-
-    - template: yaml-templates/run-nunit-tests.yaml
-      parameters:
-        testRunTitle: Xamarin.Android.Build.Tests - Linux BuildTest
-        testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
-        dotNetTestExtraArgs: --filter "Name = BuildTest"
-        testResultsFile: TestResult-BuildTest-Linux-$(XA.Build.Configuration).xml
+        - task: DownloadPipelineArtifact@2
+          inputs:
+            artifactName: $(TestAssembliesArtifactName)
+            downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
+
+        - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
+          parameters:
+            testRunTitle: Xamarin.Android.Build.Tests - Linux BuildTest
+            testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
+            dotNetTestExtraArgs: --filter "Name = BuildTest"
+
+        - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
+          parameters:
+            testRunTitle: Xamarin.Android.Build.Tests - Linux PackagingTest
+            testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
+            dotNetTestExtraArgs: --filter "Name = PackagingTest"
+
+        - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
+          parameters:
+            testRunTitle: Xamarin.Android.Build.Tests - Linux XASdkTests
+            testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
+            dotNetTestExtraArgs: --filter "Name = XASdkTests & Name != XamarinLegacySdk"
+
+        - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
+          parameters:
+            testRunTitle: Xamarin.Android.Build.Tests - Linux AndroidDependenciesTests
+            testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
+            dotNetTestExtraArgs: --filter "Name = AndroidDependenciesTests"
+
+        - task: ShellScript@2
+          displayName: Test dotnet-local.sh
+          inputs:
+            scriptPath: dotnet-local.sh
+            args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj
 
-    - template: yaml-templates/run-nunit-tests.yaml
-      parameters:
-        testRunTitle: Xamarin.Android.Build.Tests - Linux PackagingTest
-        testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
-        dotNetTestExtraArgs: --filter "Name = PackagingTest"
-        testResultsFile: TestResult-PackagingTest-Linux-$(XA.Build.Configuration).xml
+        - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
+          parameters:
+            configuration: $(XA.Build.Configuration)
+            artifactName: Test Results - MSBuild - Linux
 
-    - template: yaml-templates/run-nunit-tests.yaml
-      parameters:
-        testRunTitle: Xamarin.Android.Build.Tests - Linux XASdkTests
-        testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
-        dotNetTestExtraArgs: --filter "Name = XASdkTests & Name != XamarinLegacySdk"
-        testResultsFile: TestResult-XASdkTests-Linux-$(XA.Build.Configuration).xml
+        - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
 
-    - template: yaml-templates/run-nunit-tests.yaml
-      parameters:
-        testRunTitle: Xamarin.Android.Build.Tests - Linux AndroidDependenciesTests
-        testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
-        dotNetTestExtraArgs: --filter "Name = AndroidDependenciesTests"
-        testResultsFile: TestResult-AndroidDependenciesTests-Linux-$(XA.Build.Configuration).xml
-
-    - task: ShellScript@2
-      displayName: Test dotnet-local.sh
-      inputs:
-        scriptPath: dotnet-local.sh
-        args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj
-
-    - template: yaml-templates/upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/stage-msbuild-tests.yaml@self
+
+    - template: /build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml@self
       parameters:
-        configuration: $(XA.Build.Configuration)
-        artifactName: Test Results - MSBuild - Linux
+        usesCleanImages: ${{ parameters.macTestAgentsUseCleanImages }}
+
+    - stage: maui_tests
+      displayName: MAUI Tests
+      dependsOn: mac_build
+      condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(variables['RunMAUITestJob'], 'true'))
+      jobs:
+      # Check - "Xamarin.Android (MAUI Tests MAUI Integration)"
+      - job: maui_tests_integration
+        displayName: MAUI Integration
+        pool:
+          name: MAUI-1ESPT
+          image: $(WindowsPoolImage1ESPT)
+          os: windows
+        timeoutInMinutes: 180
+        workspace:
+          clean: all
+        variables:
+          BuildVersion: $(Build.BuildId)
+        steps:
+        - checkout: maui
+          clean: true
+          submodules: recursive
+          path: s/maui
+          persistCredentials: true
+
+        - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
+          parameters:
+            xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
+            androidSdkPlatforms: $(DefaultTestSdkPlatforms)
+
+        - task: NuGetAuthenticate@1
+          displayName: authenticate with azure artifacts
+          inputs:
+            forceReinstallCredentialProvider: true
 
-    - template: yaml-templates/fail-on-issue.yaml
+        - script: |
+            echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_17_X64%
+            echo ##vso[task.setvariable variable=JAVA_HOME]%JAVA_HOME_17_X64%
+          displayName: set JI_JAVA_HOME, JAVA_HOME to $(JAVA_HOME_17_X64)
 
-- template: yaml-templates/stage-msbuild-tests.yaml
+        - script: echo "##vso[task.prependpath]C:\Windows\System32\WindowsPowerShell\v1.0\"
+          displayName: add powershell to path
 
-- template: yaml-templates/stage-msbuild-emulator-tests.yaml
-  parameters:
-    usesCleanImages: ${{ parameters.macTestAgentsUseCleanImages }}
-
-- stage: maui_tests
-  displayName: MAUI Tests
-  dependsOn: mac_build
-  condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(variables['System.PullRequest.TargetBranch'], 'main'))
-  jobs:
-  # Check - "Xamarin.Android (MAUI Tests MAUI Integration)"
-  - job: maui_tests_integration
-    displayName: MAUI Integration
-    pool: $(1ESWindowsPool)
-    timeoutInMinutes: 180
-    workspace:
-      clean: all
-    variables:
-      BuildVersion: $(Build.BuildId)
-    steps:
-    - checkout: maui
-      clean: true
-      submodules: recursive
-      path: s/maui
-      persistCredentials: true
-
-    - template: yaml-templates/setup-test-environment.yaml
-      parameters:
-        xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
-        provisionClassic: false
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
-        androidSdkPlatforms: 23,24,25,26,27,28,29,30,31,32,$(DefaultTestSdkPlatforms)
-
-    - task: NuGetAuthenticate@0
-      displayName: authenticate with azure artifacts
-      inputs:
-        forceReinstallCredentialProvider: true
-
-    - script: |
-        echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_17_X64%
-        echo ##vso[task.setvariable variable=JAVA_HOME]%JAVA_HOME_17_X64%
-      displayName: set JI_JAVA_HOME, JAVA_HOME to $(JAVA_HOME_17_X64)
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: $(NuGetArtifactName)
-        downloadPath: $(Build.StagingDirectory)/android-packs
-
-    - pwsh: |
-        $searchPath = Join-Path $(Build.StagingDirectory) android-packs
-        $wlmanPack = Get-ChildItem $searchPath -Filter *Android*Manifest*.nupkg | Select-Object -First 1
-        $dest = Join-Path $searchPath "tmp-wlman" "$($wlmanPack.BaseName)"
-        Expand-Archive -LiteralPath $wlmanPack -DestinationPath $dest
-        $wlmanJsonPath = Join-Path $dest "data" "WorkloadManifest.json"
-        $json = Get-Content $wlmanJsonPath | ConvertFrom-Json -AsHashtable
-        Write-Host "Setting variable ANDROID_PACK_VERSION = $($json["version"])"
-        Write-Host "##vso[task.setvariable variable=ANDROID_PACK_VERSION;]$($json["version"])"
-      displayName: Set ANDROID_PACK_VERSION
-
-    - pwsh: >-
-        $(Build.SourcesDirectory)/maui/eng/scripts/update-version-props.ps1
-        -xmlFileName "$(Build.SourcesDirectory)/maui/eng/Versions.props"
-        -androidVersion $(ANDROID_PACK_VERSION)
-      displayName: Update MAUI's Android dependency
-
-    - task: DotNetCoreCLI@2
-      displayName: Update Android SDK band in Workloads.csproj
-      inputs:
-        projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln
-        arguments: -t:UpdateMauiWorkloadsProj -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/update-maui-workloadsproj.binlog
-
-    - pwsh: ./build.ps1 --target=dotnet --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic
-      displayName: Install .NET
-      retryCountOnTaskFailure: 3
-      workingDirectory: $(Build.SourcesDirectory)/maui
-
-    - pwsh: ./build.ps1 --target=dotnet-pack --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic
-      displayName: Pack .NET Maui
-      workingDirectory: $(Build.SourcesDirectory)/maui
-
-    - task: DotNetCoreCLI@2
-      displayName: Install MAUI workload packs
-      retryCountOnTaskFailure: 3
-      inputs:
-        projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln
-        arguments: -t:InstallMaui -p:MauiUseLocalPacks=true -p:MauiWorkloadToInstall=maui -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/install-maui.binlog
-
-    - template: yaml-templates/run-dotnet-preview.yaml
-      parameters:
-        command: new
-        arguments: maui -o $(Build.StagingDirectory)/MauiTestProj
-        xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
-        displayName: Create MAUI template
-        continueOnError: false
+        - task: DownloadPipelineArtifact@2
+          inputs:
+            artifactName: $(NuGetArtifactName)
+            downloadPath: $(Build.StagingDirectory)/android-packs
+
+        - pwsh: |
+            $searchPath = Join-Path $(Build.StagingDirectory) android-packs
+            $wlmanPack = Get-ChildItem $searchPath -Filter *Android*Manifest*.nupkg | Select-Object -First 1
+            $dest = Join-Path $searchPath "tmp-wlman" "$($wlmanPack.BaseName)"
+            Expand-Archive -LiteralPath $wlmanPack -DestinationPath $dest
+            $wlmanJsonPath = Join-Path $dest "data" "WorkloadManifest.json"
+            $json = Get-Content $wlmanJsonPath | ConvertFrom-Json -AsHashtable
+            Write-Host "Setting variable ANDROID_PACK_VERSION = $($json["version"])"
+            Write-Host "##vso[task.setvariable variable=ANDROID_PACK_VERSION;]$($json["version"])"
+          displayName: Set ANDROID_PACK_VERSION
+
+        - pwsh: >-
+            $(Build.SourcesDirectory)/maui/eng/scripts/update-version-props.ps1
+            -xmlFileName "$(Build.SourcesDirectory)/maui/eng/Versions.props"
+            -androidVersion $(ANDROID_PACK_VERSION)
+          displayName: Update MAUI's Android dependency
+
+        - task: DotNetCoreCLI@2
+          displayName: Update Android SDK band in Workloads.csproj
+          inputs:
+            projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln
+            arguments: -t:UpdateMauiWorkloadsProj -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/update-maui-workloadsproj.binlog
 
-    - template: yaml-templates/run-dotnet-preview.yaml
-      parameters:
-        project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj
-        arguments: >-
-          -f $(DotNetTargetFramework)-android -c Debug
-          --configfile $(Build.SourcesDirectory)/maui/NuGet.config
-          -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Debug.binlog
-        xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
-        displayName: Build MAUI template - Debug
-
-    - template: yaml-templates/run-dotnet-preview.yaml
-      parameters:
-        project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj
-        arguments: >-
-          -f $(DotNetTargetFramework)-android -c Release
-          --configfile $(Build.SourcesDirectory)/maui/NuGet.config
-          -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Release.binlog
-        xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
-        displayName: Build MAUI template - Release
-
-    - task: CopyFiles@2
-      displayName: copy build logs
-      condition: always()
-      inputs:
-        Contents: |
-          $(Build.SourcesDirectory)/maui/artifacts/logs/**
-        TargetFolder: $(Build.StagingDirectory)/logs
-        flattenFolders: true
-
-    - template: yaml-templates/publish-artifact.yaml
-      parameters:
-        displayName: upload build and test results
-        artifactName: Test Results - MAUI Integration
-        targetPath: $(Build.StagingDirectory)/logs
-        condition: or(ne(variables['Agent.JobStatus'], 'Succeeded'), eq(variables['XA.PublishAllLogs'], 'true'))
-
-    - template: yaml-templates/fail-on-issue.yaml
-
-
-- stage: dotnet_prepare_release
-  displayName: Prepare .NET Release
-  dependsOn:
-  - mac_build
-  - linux_build
-  condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real'))
-  jobs:
-  # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)"
-  - template: sign-artifacts/jobs/v2.yml@yaml-templates
-    parameters:
-      name: sign_net_mac_win
-      poolName: $(VSEngMicroBuildPool)
-      artifactName: $(NuGetArtifactName)
-      signType: $(MicroBuildSignType)
-      signedArtifactName: nuget-signed
-      usePipelineArtifactTasks: true
-
-  # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)"
-  - template: sign-artifacts/jobs/v2.yml@yaml-templates
-    parameters:
-      name: sign_net_linux
-      displayName: Sign Linux Archive
-      poolName: $(VSEngMicroBuildPool)
-      artifactName: $(LinuxNuGetArtifactName)
-      signType: $(MicroBuildSignType)
-      signedArtifactName: nuget-linux-signed
-      usePipelineArtifactTasks: true
-
-  # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)"
-  - template: nuget-msi-convert/job/v3.yml@yaml-templates
-    parameters:
-      yamlResourceName: yaml-templates
-      dependsOn: sign_net_mac_win
-      artifactName: nuget-signed
-      artifactPatterns: |
-        !*Darwin*
-      propsArtifactName: $(NuGetArtifactName)
-      signType: $(MicroBuildSignType)
-      postConvertSteps:
-      - task: DownloadPipelineArtifact@2
-        inputs:
+        - pwsh: ./build.ps1 --target=dotnet --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic
+          displayName: Install .NET
+          retryCountOnTaskFailure: 3
+          workingDirectory: $(Build.SourcesDirectory)/maui
+
+        - pwsh: ./build.ps1 --target=dotnet-pack --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic
+          displayName: Pack .NET Maui
+          workingDirectory: $(Build.SourcesDirectory)/maui
+
+        - task: DotNetCoreCLI@2
+          displayName: Install MAUI workload packs
+          retryCountOnTaskFailure: 3
+          inputs:
+            projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln
+            arguments: -t:InstallMaui -p:MauiUseLocalPacks=true -p:MauiWorkloadToInstall=maui -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/install-maui.binlog
+
+        - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
+          parameters:
+            command: new
+            arguments: maui -o $(Build.StagingDirectory)/MauiTestProj
+            xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
+            displayName: Create MAUI template
+            continueOnError: false
+
+        - powershell: |
+            $project = '$(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj'
+            [xml] $xml = Get-Content $project
+            $node = $xml.SelectSingleNode('/Project/PropertyGroup/TargetFrameworks')
+            $node.InnerText = '$(DotNetTargetFramework)-android'
+            $xml.Save($project)
+          displayName: set TargetFrameworks to Android-only
+
+        - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
+          parameters:
+            project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj
+            arguments: >-
+              -f $(DotNetTargetFramework)-android -c Debug
+              --configfile $(Build.SourcesDirectory)/maui/NuGet.config
+              -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Debug.binlog
+            xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
+            displayName: Build MAUI template - Debug
+
+        - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
+          parameters:
+            project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj
+            arguments: >-
+              -f $(DotNetTargetFramework)-android -c Release
+              --configfile $(Build.SourcesDirectory)/maui/NuGet.config
+              -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Release.binlog
+            xaSourcePath: $(Build.SourcesDirectory)/xamarin-android
+            displayName: Build MAUI template - Release
+
+        - task: CopyFiles@2
+          displayName: copy build logs
+          condition: always()
+          inputs:
+            Contents: |
+              $(Build.SourcesDirectory)/maui/artifacts/logs/**
+            TargetFolder: $(Build.StagingDirectory)/logs
+            flattenFolders: true
+
+        - template: /build-tools/automation/yaml-templates/publish-artifact.yaml@self
+          parameters:
+            displayName: upload build and test results
+            artifactName: Test Results - MAUI Integration
+            targetPath: $(Build.StagingDirectory)/logs
+            condition: or(ne(variables['Agent.JobStatus'], 'Succeeded'), eq(variables['XA.PublishAllLogs'], 'true'))
+
+        - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
+
+
+    - stage: dotnet_prepare_release
+      displayName: Prepare .NET Release
+      dependsOn:
+      - mac_build
+      - linux_build
+      condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real'))
+      jobs:
+      # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)"
+      - template: sign-artifacts/jobs/v2.yml@yaml-templates
+        parameters:
+          name: sign_net_mac_win
+          poolName: $(VSEngMicroBuildPool)
           artifactName: $(NuGetArtifactName)
-          downloadPath: $(Build.StagingDirectory)\sign-verify
-          patterns: |
-            **/SignVerifyIgnore.txt
-
-      - task: MicroBuildCodesignVerify@3
-        displayName: verify signed msi content
-        inputs:
-          TargetFolders: |
-            $(Build.ArtifactStagingDirectory)\bin\manifests
-            $(Build.ArtifactStagingDirectory)\bin\manifests-multitarget
-          ExcludeSNVerify: true
-          ApprovalListPathForCerts: $(Build.StagingDirectory)\sign-verify\SignVerifyIgnore.txt
-
-  # Check - "Xamarin.Android (Prepare .NET Release Push Internal)"
-  - job: push_signed_nugets
-    displayName: Push Internal
-    dependsOn:
-    - nuget_convert
-    - sign_net_linux
-    condition: and(eq(dependencies.nuget_convert.result, 'Succeeded'), eq(dependencies.sign_net_linux.result, 'Succeeded'))
-    timeoutInMinutes: 60
-    pool: $(VSEngMicroBuildPool)
-    workspace:
-      clean: all
-    variables:
-    - ${{ if eq(variables['MicroBuildSignType'], 'Real') }}:
-      - group: Publish-Build-Assets
-    steps:
-    - checkout: self
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: nuget-signed
-        downloadPath: $(Build.StagingDirectory)\nuget-signed
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: nuget-linux-signed
-        downloadPath: $(Build.StagingDirectory)\nuget-signed
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: vs-msi-nugets
-        downloadPath: $(Build.StagingDirectory)\nuget-signed
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: $(WindowsToolchainPdbArtifactName)
-        downloadPath: $(Build.StagingDirectory)\nuget-signed
-
-    - task: NuGetCommand@2
-      displayName: push nupkgs
-      inputs:
-        command: push
-        packagesToPush: $(Build.StagingDirectory)\nuget-signed\*.nupkg
-        nuGetFeedType: external
-        publishFeedCredentials: $(DotNetFeedCredential)
-      condition: and(succeeded(), eq(variables['PushXAPackages'], 'true'))
-
-    - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions
-      parameters:
-        githubToken: $(GitHub.Token)
-        githubContext: $(NupkgCommitStatusName)
-        blobName: $(NupkgCommitStatusName)
-        packagePrefix: xamarin-android
-        artifactsPath: $(Build.StagingDirectory)\nuget-signed
-        yamlResourceName: yaml-templates
-
-    - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions
-      parameters:
-        githubToken: $(GitHub.Token)
-        githubContext: $(VSDropCommitStatusName)
-        blobName: $(VSDropCommitStatusName)
-        packagePrefix: xamarin-android
-        artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName)
-        yamlResourceName: yaml-templates
-        downloadSteps:
+          signType: $(MicroBuildSignType)
+          signedArtifactName: nuget-signed
+          usePipelineArtifactTasks: true
+          use1ESTemplate: true
+
+      # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)"
+      - template: sign-artifacts/jobs/v2.yml@yaml-templates
+        parameters:
+          name: sign_net_linux
+          displayName: Sign Linux Archive
+          poolName: $(VSEngMicroBuildPool)
+          artifactName: $(LinuxNuGetArtifactName)
+          signType: $(MicroBuildSignType)
+          signedArtifactName: nuget-linux-signed
+          usePipelineArtifactTasks: true
+          use1ESTemplate: true
+
+      # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)"
+      - template: nuget-msi-convert/job/v3.yml@yaml-templates
+        parameters:
+          yamlResourceName: yaml-templates
+          dependsOn: sign_net_mac_win
+          artifactName: nuget-signed
+          artifactPatterns: |
+            !*Darwin*
+          propsArtifactName: $(NuGetArtifactName)
+          signType: $(MicroBuildSignType)
+          use1ESTemplate: true
+          postConvertSteps:
+          - task: DownloadPipelineArtifact@2
+            inputs:
+              artifactName: $(NuGetArtifactName)
+              downloadPath: $(Build.StagingDirectory)\sign-verify
+              patterns: |
+                **/SignVerifyIgnore.txt
+
+          - task: MicroBuildCodesignVerify@3
+            displayName: verify signed msi content
+            inputs:
+              TargetFolders: |
+                $(Build.ArtifactStagingDirectory)\bin\manifests
+                $(Build.ArtifactStagingDirectory)\bin\manifests-multitarget
+              ExcludeSNVerify: true
+              ApprovalListPathForCerts: $(Build.StagingDirectory)\sign-verify\SignVerifyIgnore.txt
+
+      # Check - "Xamarin.Android (Prepare .NET Release Push Internal)"
+      - job: push_signed_nugets
+        displayName: Push Internal
+        dependsOn:
+        - nuget_convert
+        - sign_net_linux
+        condition: and(eq(dependencies.nuget_convert.result, 'Succeeded'), eq(dependencies.sign_net_linux.result, 'Succeeded'))
+        timeoutInMinutes: 60
+        pool: $(VSEngMicroBuildPool)
+        workspace:
+          clean: all
+        variables:
+        - ${{ if eq(variables['MicroBuildSignType'], 'Real') }}:
+          - group: Publish-Build-Assets
+        templateContext:
+          outputs:
+          - output: nuget
+            condition: and(succeeded(), eq('${{ parameters.pushXAPackagesToMaestro }}', 'true'))
+            useDotNetTask: false # The default is false to use the NuGetCommand task. Set to true to use the DotNetCoreCLI task to publish packages.
+            packagesToPush: $(Build.StagingDirectory)\nuget-signed\*.nupkg
+            packageParentPath: $(Build.StagingDirectory)\nuget-signed
+            nuGetFeedType: external
+            publishFeedCredentials: $(DotNetFeedCredential)
+        steps:
+        - checkout: self
+
         - task: DownloadPipelineArtifact@2
           inputs:
-            artifactName: vsdrop-signed
-            downloadPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName)
+            artifactName: nuget-signed
+            downloadPath: $(Build.StagingDirectory)\nuget-signed
 
-    - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions
-      parameters:
-        githubToken: $(GitHub.Token)
-        githubContext: $(MultiTargetVSDropCommitStatusName)
-        blobName: $(MultiTargetVSDropCommitStatusName)
-        packagePrefix: xamarin-android
-        artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName)
-        yamlResourceName: yaml-templates
-        downloadSteps:
         - task: DownloadPipelineArtifact@2
           inputs:
-            artifactName: vsdrop-multitarget-signed
-            downloadPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName)
-
-    - powershell: >-
-        & dotnet build -v:n -c $(XA.Build.Configuration)
-        -t:PushManifestToBuildAssetRegistry
-        -p:BuildAssetRegistryToken=$(MaestroAccessToken)
-        -p:OutputPath=$(Build.StagingDirectory)\nuget-signed\
-        $(System.DefaultWorkingDirectory)\build-tools\create-packs\Microsoft.Android.Sdk.proj
-        -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\push-bar-manifest.binlog
-      displayName: generate and publish BAR manifest
-      condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true'))
-
-    - powershell: |
-        $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16'
-        $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content
-        $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json'
-        & dotnet tool update microsoft.dotnet.darc --version "$darcVersion" --add-source "$arcadeServicesSource" --tool-path $(Agent.ToolsDirectory)\darc -v n
-        & $(Agent.ToolsDirectory)\darc\darc add-build-to-channel --default-channels --id $(BARBuildId) --publishing-infra-version 3 --skip-assets-publishing --password $(MaestroAccessToken) --azdev-pat $(publishing-dnceng-devdiv-code-r-build-re)
-      displayName: add build to default darc channel
-      condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true'))
-
-    - template: yaml-templates\upload-results.yaml
-      parameters:
-        xaSourcePath: $(System.DefaultWorkingDirectory)
-        artifactName: Prepare Release - Push Internal
-        includeBuildResults: true
-
-
-- stage: post_build
-  displayName: Post Build
-  dependsOn:
-  - dotnet_prepare_release
-  condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded'))
-  jobs:
-  - job: sbom
-    displayName: Generate SBOM
-    timeoutInMinutes: 60
-    pool:
-      name: AzurePipelines-EO
-      demands:
-      - ImageOverride -equals AzurePipelinesWindows2022compliant
-    variables:
-      Packaging.EnableSBOMSigning: true
-    workspace:
-      clean: all
-    steps:
-    - checkout: self
-      submodules: recursive
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: nuget-signed
-        downloadPath: $(Build.StagingDirectory)\packages
-        patterns: '*.nupkg'
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: nuget-linux-signed
-        downloadPath: $(Build.StagingDirectory)\packages
-        patterns: '*.nupkg'
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: $(WindowsToolchainPdbArtifactName)
-        downloadPath: $(Build.StagingDirectory)\packages
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: vs-msi-nugets
-        downloadPath: $(Build.StagingDirectory)\packages
-        patterns: '*.nupkg'
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: vsdrop-signed
-        downloadPath: $(Build.StagingDirectory)\packages
-        patterns: '*.msi'
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: vsdrop-multitarget-signed
-        downloadPath: $(Build.StagingDirectory)\packages
-        patterns: '*.msi'
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: sbom-components-macos
-        downloadPath: $(Build.StagingDirectory)\sbom\components-macos
-
-    - task: DownloadPipelineArtifact@2
-      inputs:
-        artifactName: sbom-components-linux
-        downloadPath: $(Build.StagingDirectory)\sbom\components-linux
-
-    - template: compliance/sbom/scan.v1.yml@yaml-templates
+            artifactName: nuget-linux-signed
+            downloadPath: $(Build.StagingDirectory)\nuget-signed
+
+        - task: DownloadPipelineArtifact@2
+          inputs:
+            artifactName: vs-msi-nugets
+            downloadPath: $(Build.StagingDirectory)\nuget-signed
+
+        - task: DownloadPipelineArtifact@2
+          inputs:
+            artifactName: $(WindowsToolchainPdbArtifactName)
+            downloadPath: $(Build.StagingDirectory)\nuget-signed
+
+        - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions
+          parameters:
+            githubToken: $(GitHub.Token)
+            githubContext: $(NupkgCommitStatusName)
+            blobName: $(NupkgCommitStatusName)
+            packagePrefix: xamarin-android
+            artifactsPath: $(Build.StagingDirectory)\nuget-signed
+            yamlResourceName: yaml-templates
+
+        - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions
+          parameters:
+            githubToken: $(GitHub.Token)
+            githubContext: $(VSDropCommitStatusName)
+            blobName: $(VSDropCommitStatusName)
+            packagePrefix: xamarin-android
+            artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName)
+            yamlResourceName: yaml-templates
+            downloadSteps:
+            - task: DownloadPipelineArtifact@2
+              inputs:
+                artifactName: vsdrop-signed
+                downloadPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName)
+
+        - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions
+          parameters:
+            githubToken: $(GitHub.Token)
+            githubContext: $(MultiTargetVSDropCommitStatusName)
+            blobName: $(MultiTargetVSDropCommitStatusName)
+            packagePrefix: xamarin-android
+            artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName)
+            yamlResourceName: yaml-templates
+            downloadSteps:
+            - task: DownloadPipelineArtifact@2
+              inputs:
+                artifactName: vsdrop-multitarget-signed
+                downloadPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName)
+
+        - powershell: >-
+            & dotnet build -v:n -c $(XA.Build.Configuration)
+            -t:PushManifestToBuildAssetRegistry
+            -p:BuildAssetRegistryToken=$(MaestroAccessToken)
+            -p:OutputPath=$(Build.StagingDirectory)\nuget-signed\
+            $(System.DefaultWorkingDirectory)\build-tools\create-packs\Microsoft.Android.Sdk.proj
+            -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\push-bar-manifest.binlog
+          displayName: generate and publish BAR manifest
+          condition: and(succeeded(), eq('${{ parameters.pushXAPackagesToMaestro }}', 'true'))
+
+        - powershell: |
+            $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16'
+            $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content
+            $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json'
+            & dotnet tool update microsoft.dotnet.darc --version "$darcVersion" --add-source "$arcadeServicesSource" --tool-path $(Agent.ToolsDirectory)\darc -v n
+            & $(Agent.ToolsDirectory)\darc\darc add-build-to-channel --default-channels --id $(BARBuildId) --publishing-infra-version 3 --skip-assets-publishing --password $(MaestroAccessToken) --azdev-pat $(publishing-dnceng-devdiv-code-r-build-re)
+          displayName: add build to default darc channel
+          condition: and(succeeded(), eq('${{ parameters.pushXAPackagesToMaestro }}', 'true'))
+
+        - template: build-tools\automation\yaml-templates\upload-results.yaml@self
+          parameters:
+            xaSourcePath: $(System.DefaultWorkingDirectory)
+            artifactName: Prepare Release - Push Internal
+            includeBuildResults: true
+
+    # Check - "Xamarin.Android (PoliCheck PoliCheck $(Language))"
+    - template: security/policheck/v3.yml@yaml-templates
       parameters:
-        dropDirectory: $(Build.StagingDirectory)\packages
-        componentsDirectory: $(Build.StagingDirectory)\sbom
-        manifestDirectory: $(Build.StagingDirectory)\sbom
-        packageName: .NET Android
-        packageVersionRegex: '(?i)^Microsoft.*\.(?<version>\d+\.\d+\.\d+(-.*)?\.\d+).nupkg$'
-
-# Check - "Xamarin.Android (Compliance)"
-- template: security/full/v0.yml@yaml-templates
-  parameters:
-    stageDependsOn: []
-    credScanSuppressionFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\CredScanSuppressions.json
-    sourceGdnSuppressionFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\source.gdnsuppress
-    tsaConfigFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\tsaoptions-v2.json
-    policheckLocScanEnabled: true
-    policheckExclusionFilesFolder: $(Build.SourcesDirectory)\build-tools\automation\guardian
-    policheckGdnSuppressionFilesFolder: $(Build.SourcesDirectory)\build-tools\automation\guardian
-    policheckChsScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hans
-    policheckChtScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hant
-    policheckCsyScanFolder: $(Build.SourcesDirectory)\Localize\loc\cs
-    policheckDeuScanFolder: $(Build.SourcesDirectory)\Localize\loc\de
-    policheckEsnScanFolder: $(Build.SourcesDirectory)\Localize\loc\es
-    policheckFraScanFolder: $(Build.SourcesDirectory)\Localize\loc\fr
-    policheckItaScanFolder: $(Build.SourcesDirectory)\Localize\loc\it
-    policheckJpnScanFolder: $(Build.SourcesDirectory)\Localize\loc\ja
-    policheckKorScanFolder: $(Build.SourcesDirectory)\Localize\loc\ko
-    policheckPlkScanFolder: $(Build.SourcesDirectory)\Localize\loc\pl
-    policheckPtbScanFolder: $(Build.SourcesDirectory)\Localize\loc\pt-BR
-    policheckRusScanFolder: $(Build.SourcesDirectory)\Localize\loc\ru
-    policheckTrkScanFolder: $(Build.SourcesDirectory)\Localize\loc\tr
+        windowsImageOverride: $(WindowsPoolImage1ESPT)
+        stageDependsOn: []
+        tsaConfigFile: $(Build.SourcesDirectory)\.gdn\tsaoptions-v2.json
+        policheckLocScanEnabled: true
+        policheckExclusionFilesFolder: $(Build.SourcesDirectory)\.gdn\policheck
+        policheckGdnSuppressionFilesFolder: $(Build.SourcesDirectory)\.gdn\policheck
+        policheckChsScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hans
+        policheckChtScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hant
+        policheckCsyScanFolder: $(Build.SourcesDirectory)\Localize\loc\cs
+        policheckDeuScanFolder: $(Build.SourcesDirectory)\Localize\loc\de
+        policheckEsnScanFolder: $(Build.SourcesDirectory)\Localize\loc\es
+        policheckFraScanFolder: $(Build.SourcesDirectory)\Localize\loc\fr
+        policheckItaScanFolder: $(Build.SourcesDirectory)\Localize\loc\it
+        policheckJpnScanFolder: $(Build.SourcesDirectory)\Localize\loc\ja
+        policheckKorScanFolder: $(Build.SourcesDirectory)\Localize\loc\ko
+        policheckPlkScanFolder: $(Build.SourcesDirectory)\Localize\loc\pl
+        policheckPtbScanFolder: $(Build.SourcesDirectory)\Localize\loc\pt-BR
+        policheckRusScanFolder: $(Build.SourcesDirectory)\Localize\loc\ru
+        policheckTrkScanFolder: $(Build.SourcesDirectory)\Localize\loc\tr
diff --git a/build-tools/automation/guardian/CHT.gdnsuppress b/build-tools/automation/guardian/CHT.gdnsuppress
deleted file mode 100644
index 4396a9a378a..00000000000
--- a/build-tools/automation/guardian/CHT.gdnsuppress
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "version": "latest",
-  "suppressionSets": {
-    "default": {
-      "name": "default",
-      "createdDate": "2023-02-24 00:05:39Z",
-      "lastUpdatedDate": "2023-02-24 00:05:39Z"
-    }
-  },
-  "results": {
-    "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019": {
-      "signature": "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019",
-      "alternativeSignatures": [],
-      "target": "Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "64550",
-      "justification": "Reference to the Android package format APK.",
-      "createdDate": "2023-02-24 00:05:39Z",
-      "expirationDate": null,
-      "type": null
-    }
-  }
-}
diff --git a/build-tools/automation/guardian/CredScanSuppressions.json b/build-tools/automation/guardian/CredScanSuppressions.json
deleted file mode 100644
index d484f12ded2..00000000000
--- a/build-tools/automation/guardian/CredScanSuppressions.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-    "tool": "Credential Scanner",
-    "suppressions": [
-        {
-            "file": "\\src\\Xamarin.Android.Build.Tasks\\Tests\\Xamarin.ProjectTools\\Resources\\Base\\test.keystore",
-            "_justification": "Dummy keystore file used for testing."
-        },
-        {
-            "file": "tests\\MSBuildDeviceIntegration\\Tests\\InstallTests.cs",
-            "_justification": "Password of the dummy keystore file used only for testing."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Android.Webkit\\HttpAuthHandler.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Android.Webkit\\WebViewDatabase.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Java.Security\\KeyStore+PasswordProtection.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Security.Auth.Callback\\PasswordCallback.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Crypto\\ISecretKey.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Crypto\\KeyAgreementSpi.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        },
-        {
-            "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Crypto.Interfaces\\IPBEKey.xml",
-            "_justification": "Android API documentation, does not contain a password."
-        }
-    ]
-}
diff --git a/build-tools/automation/guardian/source.gdnsuppress b/build-tools/automation/guardian/source.gdnsuppress
deleted file mode 100644
index 7d42cdcacc6..00000000000
--- a/build-tools/automation/guardian/source.gdnsuppress
+++ /dev/null
@@ -1,236 +0,0 @@
-{
-  "version": "latest",
-  "suppressionSets": {
-    "default": {
-      "name": "default",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "lastUpdatedDate": "2023-05-04 13:54:18Z"
-    }
-  },
-  "results": {
-    "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa": {
-      "signature": "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa",
-      "alternativeSignatures": [],
-      "target": "src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79459",
-      "justification": "Reference to an external source file.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5": {
-      "signature": "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5",
-      "alternativeSignatures": [],
-      "target": "src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79459",
-      "justification": "Reference to an external source file.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292": {
-      "signature": "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292",
-      "alternativeSignatures": [],
-      "target": "Documentation/guides/building-apps/build-properties.md",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "185843",
-      "justification": "Reference to an ISCII term.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f": {
-      "signature": "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f",
-      "alternativeSignatures": [],
-      "target": "Documentation/guides/building-apps/build-properties.md",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "185837",
-      "justification": "Reference to an ISCII term.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789": {
-      "signature": "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789",
-      "alternativeSignatures": [],
-      "target": "src/Mono.Android/Android.Util/Log.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80418",
-      "justification": "Reference to an Android logging function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab": {
-      "signature": "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab",
-      "alternativeSignatures": [],
-      "target": "src/Mono.Android/Android.Util/Log.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80418",
-      "justification": "Reference to an Android logging function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d": {
-      "signature": "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d",
-      "alternativeSignatures": [],
-      "target": "src/Mono.Android/Android.Util/Log.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80418",
-      "justification": "Reference to an Android logging function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a": {
-      "signature": "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a",
-      "alternativeSignatures": [],
-      "target": "src/Mono.Android/Android.Util/Log.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80418",
-      "justification": "Reference to an Android logging function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac": {
-      "signature": "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac",
-      "alternativeSignatures": [],
-      "target": "src/Mono.Android/Android.Util/Log.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80418",
-      "justification": "Reference to an Android logging function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97": {
-      "signature": "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97",
-      "alternativeSignatures": [],
-      "target": "src/Mono.Android/Android.Util/Log.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80418",
-      "justification": "Reference to an Android logging function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0": {
-      "signature": "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0",
-      "alternativeSignatures": [],
-      "target": "src/monodroid/jni/logger.cc",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79668",
-      "justification": "Reference to find first set bit function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb": {
-      "signature": "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb",
-      "alternativeSignatures": [],
-      "target": "src/monodroid/jni/logger.cc",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79668",
-      "justification": "Reference to find first set bit function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845": {
-      "signature": "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845",
-      "alternativeSignatures": [],
-      "target": "src/monodroid/jni/logger.cc",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79668",
-      "justification": "Reference to find first set bit function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "d6b3df0b1d35cb4acec6a954acc145c9ec22041cd463b94ff080682c65a9bd62": {
-      "signature": "d6b3df0b1d35cb4acec6a954acc145c9ec22041cd463b94ff080682c65a9bd62",
-      "alternativeSignatures": [],
-      "target": "src/monodroid/jni/logger.cc",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79668",
-      "justification": "Reference to find first set bit function.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b": {
-      "signature": "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b",
-      "alternativeSignatures": [],
-      "target": "src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "80411",
-      "justification": "Reference to output from an external tool.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    },
-    "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150": {
-      "signature": "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150",
-      "alternativeSignatures": [],
-      "target": "src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs",
-      "memberOf": [
-        "default"
-      ],
-      "tool": "policheck",
-      "ruleId": "79459",
-      "justification": "Reference to an external source file.",
-      "createdDate": "2023-02-22 23:55:29Z",
-      "expirationDate": null,
-      "type": null
-    }
-  }
-}
diff --git a/build-tools/automation/yaml-templates/apk-instrumentation.yaml b/build-tools/automation/yaml-templates/apk-instrumentation.yaml
index 7f8b03133bf..0eac8e12dd8 100644
--- a/build-tools/automation/yaml-templates/apk-instrumentation.yaml
+++ b/build-tools/automation/yaml-templates/apk-instrumentation.yaml
@@ -9,41 +9,24 @@ parameters:
   testResultsFormat: NUnit
   artifactSource: ""
   artifactFolder: ""
-  useDotNet: true
   condition: succeeded()
   retryCountOnTaskFailure: 1
 
 steps:
-- ${{ if eq(parameters.useDotNet, false) }}:
-  - task: MSBuild@1
+- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
+  parameters:
+    configuration: ${{ parameters.buildConfiguration }}
+    xaSourcePath: ${{ parameters.xaSourcePath }}
     displayName: run ${{ parameters.testName }}
-    inputs:
-      solution: ${{ parameters.project }}
-      configuration: ${{ parameters.configuration }}
-      msbuildArguments: >-
-        /restore
-        /t:RunTestApp
-        /bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/run-${{ parameters.testName }}.binlog
-        ${{ parameters.extraBuildArgs }}
+    project: ${{ parameters.project }}
+    arguments: >-
+      -t:RunTestApp
+      -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/run-${{ parameters.testName }}.binlog
+      -v:n -c ${{ parameters.configuration }} ${{ parameters.extraBuildArgs }}
     condition: ${{ parameters.condition }}
     continueOnError: true
     retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }}
 
-- ${{ if eq(parameters.useDotNet, true) }}:
-  - template: run-dotnet-preview.yaml
-    parameters:
-      configuration: ${{ parameters.buildConfiguration }}
-      xaSourcePath: ${{ parameters.xaSourcePath }}
-      displayName: run ${{ parameters.testName }}
-      project: ${{ parameters.project }}
-      arguments: >-
-        -t:RunTestApp
-        -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/run-${{ parameters.testName }}.binlog
-        -v:n -c ${{ parameters.configuration }} ${{ parameters.extraBuildArgs }}
-      condition: ${{ parameters.condition }}
-      continueOnError: true
-      retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }}
-
 - script: >
     DEST="$(Build.StagingDirectory)/Test${{ parameters.configuration }}/${{ parameters.artifactFolder }}/" &&
     mkdir -p "$DEST" &&
diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml
index 859ab2b4b46..ae1b454c38f 100644
--- a/build-tools/automation/yaml-templates/build-linux.yaml
+++ b/build-tools/automation/yaml-templates/build-linux.yaml
@@ -1,6 +1,4 @@
 parameters:
-  buildPoolName: $(LinuxBuildPoolName)
-  buildPoolImage: $(LinuxBuildPoolImage)
   buildResultArtifactName: Build Results - Linux
   checkoutCommit: ''
   checkoutPath: 's/xamarin-android'
@@ -13,6 +11,7 @@ parameters:
   repositoryAlias: self
   stageName: linux_build
   stageDisplayName: Linux
+  use1ESTemplate: true
 
 stages:
 - stage: ${{ parameters.stageName }}
@@ -21,17 +20,26 @@ stages:
   ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}:
     condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}')
   jobs:
+  # Check - "Xamarin.Android (Linux Linux > Build)"
   - job: ${{ parameters.jobName }}
     displayName: ${{ parameters.jobDisplayName }}
     pool:
-      name: ${{ parameters.buildPoolName }}
-      vmImage: ${{ parameters.buildPoolImage }}
-    timeoutInMinutes: 180
+      name: MAUI-1ESPT
+      image: $(LinuxPoolImage1ESPT)
+      os: linux
+    timeoutInMinutes: 240
     workspace:
       clean: all
     variables:
       CXX: g++-10
       CC: gcc-10
+    ${{ if eq(parameters.use1ESTemplate, true) }}:
+      templateContext:
+        outputs:
+        - output: pipelineArtifact
+          displayName: upload linux sdk
+          artifactName: ${{ parameters.nugetArtifactName }}
+          targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux
     steps:
     - template: sdk-unified/steps/checkout/v1.yml@yaml-templates
       parameters:
@@ -59,8 +67,6 @@ stages:
         workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
         displayName: make prepare-external-git-dependencies
 
-    - template: setup-ubuntu.yaml
-
     - task: NuGetAuthenticate@0
       displayName: authenticate with azure artifacts
       inputs:
@@ -84,39 +90,18 @@ stages:
       workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
       displayName: copy linux sdk
 
-    - task: PublishPipelineArtifact@1
-      displayName: upload linux sdk
-      inputs:
-        artifactName: ${{ parameters.nugetArtifactName }}
-        targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux
-
-    - powershell: |
-        [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/empty")
-        [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/sbom-components")
-      displayName: create SBOM directories
-      condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-
-    - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
-      displayName: generate components SBOM
-      condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-      inputs:
-        BuildDropPath: $(Build.StagingDirectory)/empty
-        BuildComponentPath: $(System.DefaultWorkingDirectory)/xamarin-android
-        ManifestDirPath: $(Build.StagingDirectory)/sbom-components
-        PackageName: .NET Android
-        Verbosity: Verbose
-
-    - task: PublishBuildArtifacts@1
-      displayName: publish components SBOM
-      condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-      inputs:
-        artifactName: sbom-components-linux
-        pathToPublish: $(Build.StagingDirectory)/sbom-components
+    - ${{ if ne(parameters.use1ESTemplate, true) }}:
+      - task: PublishPipelineArtifact@1
+        displayName: upload linux sdk
+        inputs:
+          artifactName: ${{ parameters.nugetArtifactName }}
+          targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux
 
-    - template: upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
       parameters:
         xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
         artifactName: ${{ parameters.buildResultArtifactName }}
         includeBuildResults: true
+        use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-    - template: fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
diff --git a/build-tools/automation/yaml-templates/build-macos.yaml b/build-tools/automation/yaml-templates/build-macos.yaml
index 23d400ada95..2d12c21573a 100644
--- a/build-tools/automation/yaml-templates/build-macos.yaml
+++ b/build-tools/automation/yaml-templates/build-macos.yaml
@@ -1,9 +1,8 @@
 parameters:
-  buildPoolName: $(MacBuildPoolName)
-  buildPoolImage: $(MacBuildPoolImage)
   buildResultArtifactName: Build Results - macOS
   checkoutCommit: ''
   checkoutPath: 's/xamarin-android'
+  xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
   checkoutPersistCredentials: false
   dependsOn: ''
   dependsOnResult: ''
@@ -16,6 +15,7 @@ parameters:
   stageDisplayName: Mac
   testAssembliesArtifactName: $(TestAssembliesArtifactName)
   windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName)
+  use1ESTemplate: true
 
 stages:
 - stage: ${{ parameters.stageName }}
@@ -24,18 +24,43 @@ stages:
   ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}:
     condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}')
   jobs:
-  # Check - "Xamarin.Android (macOS > Build)"
+  # Check - "Xamarin.Android (Mac macOS > Build)"
   - job: ${{ parameters.jobName }}
     displayName: ${{ parameters.jobDisplayName }}
     pool:
-      name: ${{ parameters.buildPoolName }}
-      vmImage: ${{ parameters.buildPoolImage }}
-      ${{ if or(and(ne(variables['Build.DefinitionName'],'Xamarin.Android'), ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private'), ne(variables['Build.DefinitionName'], 'xamarin.megapipeline')), eq(variables['Build.Reason'], 'PullRequest')) }}:
+      ${{ if or(eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR'), eq(variables['Build.DefinitionName'], 'Xamarin.Android Nightly')) }}:
+        name: VSEng-Xamarin-RedmondMac-Android-Untrusted
         demands: macOS.Name -equals Monterey
+      ${{ else }}:
+        name: Azure Pipelines
+        vmImage: $(HostedMacImage)
+      os: macOS
     timeoutInMinutes: 240
     cancelTimeoutInMinutes: 5
     workspace:
       clean: all
+    ${{ if eq(parameters.use1ESTemplate, true) }}:
+      templateContext:
+        outputParentDirectory: ${{ parameters.xaSourcePath }}/bin
+        outputs:
+        - output: pipelineArtifact
+          displayName: upload nupkgs
+          artifactName: ${{ parameters.nugetArtifactName }}
+          targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned
+        - output: pipelineArtifact
+          displayName: upload Windows toolchain pdb files
+          artifactName: ${{ parameters.windowsToolchainPdbArtifactName }}
+          targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb
+        - output: pipelineArtifact
+          displayName: upload test assemblies
+          artifactName: ${{ parameters.testAssembliesArtifactName }}
+          targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
+          sbomEnabled: false
+        - output: pipelineArtifact
+          displayName: upload build tools inventory
+          artifactName: AndroidBuildToolsInventory
+          targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv
+          sbomEnabled: false
     steps:
     - template: sdk-unified/steps/checkout/v1.yml@yaml-templates
       parameters:
@@ -44,50 +69,18 @@ stages:
         path: ${{ parameters.checkoutPath }}
         persistCredentials: ${{ parameters.checkoutPersistCredentials }}
 
-    - template: commercial-build.yaml
+    - template: /build-tools/automation/yaml-templates/commercial-build.yaml@self
       parameters:
+        xaSourcePath: ${{ parameters.xaSourcePath }}
         installerArtifactName: ${{ parameters.installerArtifactName }}
         nugetArtifactName: ${{ parameters.nugetArtifactName }}
         testAssembliesArtifactName: ${{ parameters.testAssembliesArtifactName }}
+        windowsToolchainPdbArtifactName: ${{ parameters.windowsToolchainPdbArtifactName }}
+        use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-    - powershell: |
-        [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/empty")
-        [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/sbom-components")
-      displayName: create SBOM directories
-      condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-
-    - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
-      displayName: generate components SBOM
-      condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-      inputs:
-        BuildDropPath: $(Build.StagingDirectory)/empty
-        BuildComponentPath: $(System.DefaultWorkingDirectory)/xamarin-android
-        ManifestDirPath: $(Build.StagingDirectory)/sbom-components
-        PackageName: .NET Android
-        Verbosity: Verbose
-
-    - task: PublishBuildArtifacts@1
-      displayName: publish components SBOM
-      condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-      inputs:
-        artifactName: sbom-components-macos
-        pathToPublish: $(Build.StagingDirectory)/sbom-components
-
-    - script: >
-        mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb &&
-        cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb &&
-        zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip .
-      workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
-      displayName: zip Windows toolchain pdb files
-
-    - task: PublishPipelineArtifact@1
-      displayName: upload Windows toolchain pdb files
-      inputs:
-        artifactName: ${{ parameters.windowsToolchainPdbArtifactName }}
-        targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb
-
-    - template: upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
       parameters:
-        xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
+        xaSourcePath: ${{ parameters.xaSourcePath }}
         artifactName: ${{ parameters.buildResultArtifactName }}
         includeBuildResults: true
+        use1ESTemplate: ${{ parameters.use1ESTemplate }}
diff --git a/build-tools/automation/yaml-templates/build-windows.yaml b/build-tools/automation/yaml-templates/build-windows.yaml
index 389b67f8afb..a2ccbfc04d8 100644
--- a/build-tools/automation/yaml-templates/build-windows.yaml
+++ b/build-tools/automation/yaml-templates/build-windows.yaml
@@ -1,5 +1,4 @@
 parameters:
-  buildPool: $(1ESWindowsPool)
   buildResultArtifactName: Build Results - Windows
   checkoutCommit: ''
   checkoutPath: ''
@@ -20,11 +19,14 @@ stages:
   ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}:
     condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}')
   jobs:
-  # Check - "Xamarin.Android (Windows > Build & Smoke Test)"
+  # Check - "Xamarin.Android (Windows Windows > Build & Smoke Test)"
   - job: ${{ parameters.jobName }}
     displayName: ${{ parameters.jobDisplayName }}
-    pool: ${{ parameters.buildPool }}
-    timeoutInMinutes: 360
+    pool:
+      name: MAUI-1ESPT
+      image: $(WindowsPoolImage1ESPT)
+      os: windows
+    timeoutInMinutes: 240
     steps:
     - template: sdk-unified/steps/checkout/v1.yml@yaml-templates
       parameters:
@@ -33,15 +35,15 @@ stages:
         path: ${{ parameters.checkoutPath }}
         persistCredentials: ${{ parameters.checkoutPersistCredentials }}
 
-    - template: kill-processes.yaml
+    - template: /build-tools/automation/yaml-templates/kill-processes.yaml@self
 
-    - template: clean.yaml
+    - template: /build-tools/automation/yaml-templates/clean.yaml@self
 
     - script: |
         echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_17_X64%
       displayName: set JI_JAVA_HOME to $(JAVA_HOME_17_X64)
 
-    - template: use-dot-net.yaml
+    - template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self
       parameters:
         remove_dotnet: true
 
@@ -77,7 +79,7 @@ stages:
         arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog'
 
     # Build, pack .nupkgs, and extract workload packs to dotnet preview test directory
-    - template: run-dotnet-preview.yaml
+    - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
       parameters:
         project: Xamarin.Android.sln
         arguments: >-
@@ -86,16 +88,15 @@ stages:
         displayName: Build Solution
         continueOnError: false
 
-    - template: install-global-tool.yaml
+    - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self
       parameters:
         toolName: apkdiff
         version: $(ApkDiffToolVersion)
 
-    - template: run-nunit-tests.yaml
+    - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
       parameters:
         testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build
         testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll
-        testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml
         dotNetTestExtraArgs: --filter "TestCategory = SmokeTests"
 
     - task: BatchScript@1
@@ -104,9 +105,9 @@ stages:
         filename: dotnet-local.cmd
         arguments: build samples\HelloWorld\HelloWorld\HelloWorld.DotNet.csproj
 
-    - template: upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
       parameters:
         artifactName: ${{ parameters.buildResultArtifactName }}
         includeBuildResults: true
 
-    - template: fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
diff --git a/build-tools/automation/yaml-templates/commercial-build.yaml b/build-tools/automation/yaml-templates/commercial-build.yaml
index 59a2dd2f10b..ff6c996a1b5 100644
--- a/build-tools/automation/yaml-templates/commercial-build.yaml
+++ b/build-tools/automation/yaml-templates/commercial-build.yaml
@@ -4,12 +4,14 @@ parameters:
   makeMSBuildArgs: ''
   nugetArtifactName: $(NuGetArtifactName)
   testAssembliesArtifactName: $(TestAssembliesArtifactName)
+  windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName)
+  use1ESTemplate: true
 
 steps:
 - script: echo "##vso[task.setvariable variable=JI_JAVA_HOME]$HOME/android-toolchain/jdk-17"
   displayName: set JI_JAVA_HOME
 
-- template: use-dot-net.yaml
+- template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self
   parameters:
     remove_dotnet: true
 
@@ -26,13 +28,6 @@ steps:
 #  https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path
 - checkout: maui
 
-- script: >
-    ls -l /Applications &&
-    sudo xcode-select --switch /Applications/Xcode_14.2.app &&
-    xcode-select --print-path
-  displayName: Use Xcode 14.2
-  condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
-
 - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
   # Clone 'monodroid' without submodules
   - checkout: monodroid
@@ -71,7 +66,7 @@ steps:
   displayName: CodeQL 3000 Finalize
   condition: and(succeededOrFailed(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
 
-- template: install-microbuild-tooling.yaml
+- template: /build-tools/automation/yaml-templates/install-microbuild-tooling.yaml@self
   parameters:
     condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
 
@@ -120,7 +115,7 @@ steps:
       /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)/MicroBuild/Plugins
       /bl:${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/sign-bu-ex.binlog
 
-- template: remove-microbuild-tooling.yaml
+- template: /build-tools/automation/yaml-templates/remove-microbuild-tooling.yaml@self
   parameters:
     condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real'))
 
@@ -128,20 +123,34 @@ steps:
   workingDirectory: ${{ parameters.xaSourcePath }}
   displayName: make create-installers
 
-- task: PublishPipelineArtifact@1
-  displayName: upload nupkgs
-  inputs:
-    artifactName: ${{ parameters.nugetArtifactName }}
-    targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned
-
-- task: PublishPipelineArtifact@1
-  displayName: upload test assemblies
-  inputs:
-    artifactName: ${{ parameters.testAssembliesArtifactName }}
-    targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
-
-- task: PublishPipelineArtifact@1
-  displayName: upload build tools inventory
-  inputs:
-    artifactName: AndroidBuildToolsInventory
-    targetPath:  ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv
+- script: >
+    mkdir -p ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb &&
+    cd ${{ parameters.xaSourcePath }}/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb &&
+    zip -r ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip .
+  workingDirectory: ${{ parameters.xaSourcePath }}
+  displayName: zip Windows toolchain pdb files
+
+- ${{ if ne(parameters.use1ESTemplate, true) }}:
+  - task: PublishPipelineArtifact@1
+    displayName: upload nupkgs
+    inputs:
+      artifactName: ${{ parameters.nugetArtifactName }}
+      targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned
+
+  - task: PublishPipelineArtifact@1
+    displayName: upload test assemblies
+    inputs:
+      artifactName: ${{ parameters.testAssembliesArtifactName }}
+      targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
+
+  - task: PublishPipelineArtifact@1
+    displayName: upload Windows toolchain pdb files
+    inputs:
+      artifactName: ${{ parameters.windowsToolchainPdbArtifactName }}
+      targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb
+
+  - task: PublishPipelineArtifact@1
+    displayName: upload build tools inventory
+    inputs:
+      artifactName: AndroidBuildToolsInventory
+      targetPath:  ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv
diff --git a/build-tools/automation/yaml-templates/install-global-tool.yaml b/build-tools/automation/yaml-templates/install-dotnet-tool.yaml
similarity index 75%
rename from build-tools/automation/yaml-templates/install-global-tool.yaml
rename to build-tools/automation/yaml-templates/install-dotnet-tool.yaml
index 69ac8c28583..65e9cf02243 100644
--- a/build-tools/automation/yaml-templates/install-global-tool.yaml
+++ b/build-tools/automation/yaml-templates/install-dotnet-tool.yaml
@@ -18,6 +18,10 @@ steps:
     command: custom
     custom: tool
     arguments: >-
-      update ${{ parameters.toolName }} -g
+      update ${{ parameters.toolName }} -v:diag
+      --tool-path $(Agent.ToolsDirectory)
       --version ${{ parameters.version }}
       --add-source "https://api.nuget.org/v3/index.json"
+
+- script: echo "##vso[task.prependpath]$(Agent.ToolsDirectory)"
+  displayName: add $(Agent.ToolsDirectory) to path
diff --git a/build-tools/automation/yaml-templates/plots-to-appinsights.yaml b/build-tools/automation/yaml-templates/plots-to-appinsights.yaml
deleted file mode 100644
index b141919bc1a..00000000000
--- a/build-tools/automation/yaml-templates/plots-to-appinsights.yaml
+++ /dev/null
@@ -1,62 +0,0 @@
-parameters:
-  configuration: ''
-  environment: Production
-  buildSystem: Azure DevOps
-  buildRepo: $(Build.Repository.Name)
-  buildReason: $(Build.Reason)
-  buildPipelineName: $(Build.DefinitionName)
-  buildId: $(Build.BuildId)
-  buildNumber: $(Build.BuildNumber)
-  buildUrl: $(Build.BuildUri)
-  buildCommit: $(Build.SourceVersion)
-  plotGroup: ''
-  plotTitle: ''
-  plotPathAndFilename: ''
-  appInsightsTelemetryKey: $(XA.Plots.AppInsightsTelemetryKey)  # Defined as a hidden variable on the Xamarin.Android CI build definition: https://devdiv.visualstudio.com/DevDiv/_apps/hub/ms.vss-ciworkflow.build-ci-hub?_a=edit-build-definition&id=11410&view=Tab_Variables
-  condition: succeeded()
-
-steps:
-- powershell: |
-    Write-Host "Current directory"
-    Get-Location
-
-    Write-Host "Input parameters:"
-    Write-Host "  configuration ${{ parameters.configuration }}"
-    Write-Host "  environment ${{ parameters.environment }}"
-    Write-Host "  buildSystem ${{ parameters.buildSystem }}"
-    Write-Host "  buildRepo ${{ parameters.buildRepo }}"
-    Write-Host "  buildReason ${{ parameters.buildReason }}"
-    Write-Host "  buildPipelineName ${{ parameters.buildPipelineName }}"
-    Write-Host "  buildId ${{ parameters.buildId }}"
-    Write-Host "  buildNumber ${{ parameters.buildNumber }}"
-    Write-Host "  buildUrl ${{ parameters.buildUrl }}"
-    Write-Host "  buildCommit ${{ parameters.buildCommit }}"
-    Write-Host "  plotGroup ${{ parameters.plotGroup }}"
-    Write-Host "  plotTitle ${{ parameters.plotTitle }}"
-    Write-Host "  plotPathAndFilename ${{ parameters.plotPathAndFilename }}"
-
-    $buildReason = "${{ parameters.buildReason }}"
-
-    # https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables
-    $buildType  = [string]::Empty
-    switch ($buildReason) {
-        'Manual' { $buildType = 'Manual' }
-        'IndividualCI' { $buildType = 'CI' }
-        'PullRequest' { $buildType = 'PR' }
-        default { $buildType = 'Unknown' }
-    }
-
-    if ($buildType -eq 'CI' -Or $buildType -eq 'Manual') {
-        $azureTimestampFormatUtc = 'yyyy-MM-ddTHH:mm:ss.fffffffZ'
-        $buildTime = [DateTime]::UtcNow.ToString($azureTimestampFormatUtc)
-        Write-Host $buildTime
-        Write-Host "Sending plot telemtry"
-        mono "$(System.DefaultWorkingDirectory)/build-tools/plots-to-appinsights/bin/${{ parameters.configuration }}/ProcessPlotCSVFile.exe" -d:"${buildTime}" -e:"${{ parameters.environment }}" -r:"${{ parameters.buildRepo }}" -t:"${buildType}" -p:"${{  parameters.buildPipelineName }}" -c:${{ parameters.buildCommit }} -i:${{ parameters.buildId }} -n:"${{ parameters.buildNumber }}" -u:"${{ parameters.buildUrl }}" -pg:"${{ parameters.plotGroup }}" -pt:"${{ parameters.plotTitle }}" -k:"${{ parameters.appInsightsTelemetryKey }}" "${{ parameters.plotPathAndFilename }}"
-    } else {
-        Write-Host "WARNING: Plot telmemetry not sent. Plot telemetry is only sent for continuous integration (CI) or manual builds. buildType: ${buildType}"
-    }
-  errorActionPreference: silentlyContinue
-  continueOnError: true
-  ignoreLASTEXITCODE: true
-  displayName: 'Plots to AppInsights: ${{ parameters.plotTitle }}'
-  condition: ${{ parameters.condition }}
\ No newline at end of file
diff --git a/build-tools/automation/yaml-templates/publish-artifact.yaml b/build-tools/automation/yaml-templates/publish-artifact.yaml
index 5bfb098624e..50c7824282d 100644
--- a/build-tools/automation/yaml-templates/publish-artifact.yaml
+++ b/build-tools/automation/yaml-templates/publish-artifact.yaml
@@ -3,6 +3,7 @@ parameters:
   artifactName: artifact
   targetPath: $(Build.ArtifactStagingDirectory)
   condition: always()
+  use1ESTemplate: true
 
 steps:
 # Add the "(Attempt X)" for retries, but leave the initial run blank
@@ -12,9 +13,17 @@ steps:
   displayName: Set upload artifact name
   condition: ${{ parameters.condition }}
 
-- task: PublishPipelineArtifact@1
-  displayName: ${{ parameters.displayName }}
-  inputs:
-    artifactName: ${{ parameters.artifactName }} $(UploadAttemptSuffix)
-    targetPath: ${{ parameters.targetPath }}
-  condition: ${{ parameters.condition }}
+- ${{ if eq(parameters.use1ESTemplate, true) }}:
+  - task: 1ES.PublishPipelineArtifact@1
+    displayName: ${{ parameters.displayName }}
+    inputs:
+      artifactName: ${{ parameters.artifactName }} $(UploadAttemptSuffix)
+      targetPath: ${{ parameters.targetPath }}
+    condition: ${{ parameters.condition }}
+- ${{ else }}:
+  - task: PublishPipelineArtifact@1
+    displayName: ${{ parameters.displayName }}
+    inputs:
+      artifactName: ${{ parameters.artifactName }} $(UploadAttemptSuffix)
+      targetPath: ${{ parameters.targetPath }}
+    condition: ${{ parameters.condition }}
diff --git a/build-tools/automation/yaml-templates/run-designer-tests.yml b/build-tools/automation/yaml-templates/run-designer-tests.yml
deleted file mode 100644
index f6a63f5adc6..00000000000
--- a/build-tools/automation/yaml-templates/run-designer-tests.yml
+++ /dev/null
@@ -1,79 +0,0 @@
-parameters:
-  designerSourcePath: $(System.DefaultWorkingDirectory)
-  nunitConsoleVersion: '3.9.0'
-  runAddinTests: true
-  testResultArtifactName: Test Results - Designer - Windows
-
-steps:
-- task: DeleteFiles@1
-  displayName: Delete Test Outputs
-  inputs:
-    SourceFolder: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests
-    Contents: |
-     CustomControlsOutput
-     AndroidCustomControlsClass/obj
-     AndroidCustomControlsBinding/obj
-     AndroidCustomControls/obj
-     AndroidCustomControlsClass/bin
-     AndroidCustomControlsBinding/bin
-     AndroidCustomControls/bin
-
-- task: NuGetCommand@2
-  displayName: Install NUnit.Console ${{ parameters.nunitConsoleVersion }}
-  inputs:
-    command: custom
-    arguments: install NUnit.Console -version ${{ parameters.nunitConsoleVersion }} -OutputDirectory ${{ parameters.designerSourcePath }}/packages
-
-- powershell: |
-    $nunitConsole = [IO.Path]::Combine("${{ parameters.designerSourcePath }}", "packages", "NUnit.ConsoleRunner.${{ parameters.nunitConsoleVersion }}", "tools", "nunit3-console.exe")
-    if ([Environment]::OSVersion.Platform -eq "Unix")
-    {
-        mono64 "$nunitConsole" "-labels=All" "-result=TestResult_AndroidDesignerUnitTests.xml" "Xamarin.AndroidDesigner.UnitTests.dll"
-    }
-    else
-    {
-        ."$nunitConsole" "-labels=All" "-result=TestResult_AndroidDesignerUnitTests.xml" "Xamarin.AndroidDesigner.UnitTests.dll"
-    }
-  displayName: Run Unit Tests
-  workingDirectory: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests/bin-tests/Debug
-
-- powershell: |
-    if ([Environment]::OSVersion.Platform -eq "Unix")
-    {
-        mono64 "--debug" "GuiUnit.exe" "-labels=All" "-result=TestResult_AndroidDesigner.xml" "Xamarin.AndroidDesigner.Tests.dll"
-    }
-    else
-    {
-        .\GuiUnit.exe "-labels=All" "-result=TestResult_AndroidDesigner.xml" "Xamarin.AndroidDesigner.Tests.dll"
-    }
-  displayName: Run GUI Tests 
-  workingDirectory: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests/bin/Debug
-  condition: false # https://dev.azure.com/devdiv/DevDiv/_workitems/edit/1583237
-
-- task: PublishTestResults@2
-  displayName: Publish Core Unit Test Results
-  inputs:
-    testResultsFormat: NUnit
-    testResultsFiles: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests/**/TestResult_*.xml
-    testRunTitle: Xamarin.AndroidDesigner.Tests
-  condition: succeededOrFailed()
-
-- task: CopyFiles@2
-  displayName: 'Copy binlogs'
-  inputs:
-    sourceFolder: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android
-    contents: |
-      **/*.binlog
-      **/hs*.log
-      **/hs*.mdmp
-    targetFolder: $(Build.ArtifactStagingDirectory)/designer-binlogs
-    overWrite: true
-    flattenFolders: true
-  condition: ne(variables['Agent.JobStatus'], 'Succeeded')
-
-- template: publish-artifact.yaml
-  parameters:
-    displayName: upload designer binlogs
-    artifactName: ${{ parameters.testResultArtifactName }}
-    targetPath: $(Build.ArtifactStagingDirectory)/designer-binlogs
-    condition: ne(variables['Agent.JobStatus'], 'Succeeded')
diff --git a/build-tools/automation/yaml-templates/run-emulator-tests.yaml b/build-tools/automation/yaml-templates/run-emulator-tests.yaml
index e3484dd5c5b..bbf7e212943 100644
--- a/build-tools/automation/yaml-templates/run-emulator-tests.yaml
+++ b/build-tools/automation/yaml-templates/run-emulator-tests.yaml
@@ -6,6 +6,7 @@ parameters:
   jobTimeout: 360
   jdkTestFolder: $(JAVA_HOME_17_X64)
   testSteps: []
+  use1ESTemplate: true
 
 jobs:
   - job: mac_${{ parameters.jobName }}_tests
@@ -25,11 +26,8 @@ jobs:
         echo "##vso[task.setvariable variable=JAVA_HOME]${{ parameters.jdkTestFolder }}"
       displayName: set JAVA_HOME to ${{ parameters.jdkTestFolder }}
 
-    - template: setup-test-environment.yaml
+    - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
       parameters:
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
         xaprepareScenario: EmulatorTestDependencies
         jdkTestFolder: ${{ parameters.jdkTestFolder }}
 
@@ -38,14 +36,15 @@ jobs:
         artifactName: $(TestAssembliesArtifactName)
         downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
 
-    - template: start-stop-emulator.yaml
+    - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
       parameters:
         emulatorMSBuildArgs: ${{ parameters.emulatorMSBuildArgs }}
 
     - ${{ parameters.testSteps }}
 
-    - template: upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
       parameters:
         artifactName: Test Results - ${{ parameters.jobName }} With Emulator - macOS
+        use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-    - template: fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
diff --git a/build-tools/automation/yaml-templates/run-installer.yaml b/build-tools/automation/yaml-templates/run-installer.yaml
deleted file mode 100644
index b66b0209ada..00000000000
--- a/build-tools/automation/yaml-templates/run-installer.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
-parameters:
-  provisionExtraArgs: -vv -f
-
-steps:
-- task: DownloadPipelineArtifact@2
-  inputs:
-    artifactName: $(InstallerArtifactName)
-    downloadPath: $(System.DefaultWorkingDirectory)
-    patterns: xamarin.android*.pkg
-  condition: and(succeeded(), eq(variables['agent.os'], 'Darwin'))
-
-- task: DownloadPipelineArtifact@2
-  inputs:
-    artifactName: $(InstallerArtifactName)
-    downloadPath: $(System.DefaultWorkingDirectory)
-    patterns: Xamarin.Android*.vsix
-  condition: and(succeeded(), eq(variables['agent.os'], 'Windows_NT'))
-
-- powershell: |
-    $itemPattern = "*.vsix"
-    if ([Environment]::OSVersion.Platform -eq "Unix") {
-        $itemPattern = "*.pkg"
-    }
-    $searchDir = [System.IO.Path]::Combine("$(System.DefaultWorkingDirectory)", "*")
-    $installer = Get-ChildItem -Path "$searchDir" -Include "$itemPattern" -File
-    if (![System.IO.File]::Exists($installer)) {
-        throw [System.IO.FileNotFoundException] "Installer not found in $artifactDirectory."
-    }
-    Write-Host "##vso[task.setvariable variable=XA.Provisionator.Args]$installer"
-  displayName: find installer and set provisionator variable
-  condition: and(succeeded(), ne(variables['agent.os'], 'Linux'))
-
-- task: provisionator@2
-  inputs:
-    provisionator_uri: $(provisionator-uri)
-    github_token: $(GitHub.Token)
-    provisioning_script: $(XA.Provisionator.Args)
-    provisioning_extra_args: ${{ parameters.provisionExtraArgs }}
-  # Disabled on Windows on .NET release branches
-  condition: and(succeeded(), ne(variables['System.PullRequest.IsFork'], 'True'), ne(variables['agent.os'], 'Linux'), or(eq(variables.IsRelOrTargetingRel, 'False'), eq(variables['agent.os'], 'Darwin')))
diff --git a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml
index 6d5193a5f87..9b96227b118 100644
--- a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml
+++ b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml
@@ -8,6 +8,7 @@ parameters:
   repositoryAlias: 'self'
   commit: ''
   shouldFailOnIssue: true
+  use1ESTemplate: true
 
 jobs:
 - job: ${{ parameters.jobName }}
@@ -15,27 +16,29 @@ jobs:
     parallel: ${{ parameters.agentCount }}
   displayName: ${{ parameters.jobDisplayName }}
   ${{ if eq(parameters.testOS, 'Windows') }}:
-    pool: $(1ESWindowsPool)
+    pool:
+      name: MAUI-1ESPT
+      image: $(WindowsPoolImage1ESPT)
+      os: windows
   ${{ if eq(parameters.testOS, 'macOS') }}:
     pool:
+      name: Azure Pipelines
       vmImage: $(HostedMacImage)
-  timeoutInMinutes: 180
+      os: macOS
+  timeoutInMinutes: 240
   cancelTimeoutInMinutes: 5
   steps:
   - ${{ if eq(parameters.testOS, 'Windows') }}:
     - script: netsh int ipv4 set global sourceroutingbehavior=drop
 
-    - template: kill-processes.yaml
+    - template: /build-tools/automation/yaml-templates/kill-processes.yaml@self
 
-    - template: clean.yaml
+    - template: /build-tools/automation/yaml-templates/clean.yaml@self
 
-  - template: setup-test-environment.yaml
+  - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
     parameters:
       installTestSlicer: true
-      installLegacyDotNet: false
       installLegacyXamarinAndroid: true
-      restoreNUnitConsole: false
-      updateMono: false
       xaSourcePath: ${{ parameters.xaSourcePath }}
       repositoryAlias: ${{ parameters.repositoryAlias }}
       commit: ${{ parameters.commit }}
@@ -45,7 +48,7 @@ jobs:
       artifactName: $(TestAssembliesArtifactName)
       downloadPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
 
-  - template: run-sliced-nunit-tests.yaml
+  - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml@self
     parameters:
       testAssembly: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll
       testFilter: ${{ parameters.testFilter }}
@@ -53,11 +56,12 @@ jobs:
       retryFailedTests: false
       xaSourcePath: ${{ parameters.xaSourcePath }}
 
-  - template: upload-results.yaml
+  - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
     parameters:
       artifactName: Test Results - MSBuild - ${{ parameters.testOS }}-$(System.JobPositionInPhase)
       xaSourcePath: ${{ parameters.xaSourcePath }}
+      use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-  - template: fail-on-issue.yaml
+  - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
     parameters:
       condition: ${{ parameters.shouldFailOnIssue }}
diff --git a/build-tools/automation/yaml-templates/run-nunit-tests.yaml b/build-tools/automation/yaml-templates/run-nunit-tests.yaml
index 95d49d08506..709a503e477 100644
--- a/build-tools/automation/yaml-templates/run-nunit-tests.yaml
+++ b/build-tools/automation/yaml-templates/run-nunit-tests.yaml
@@ -1,71 +1,25 @@
 parameters:
-  configuration: $(XA.Build.Configuration)
-  xaSourcePath: $(System.DefaultWorkingDirectory)
   testRunTitle: Xamarin Android Tests
   testAssembly: ''
-  testResultsFile: TestResult.xml
-  nunitConsoleExtraArgs: ''
   dotNetTestExtraArgs: ''
-  useDotNet: true
-  useDotNetPreview: false
   workers: $(NUnit.NumberOfTestWorkers)
   condition: succeeded()
-  timeoutInMinutes: 0
+  timeoutInMinutes: 180
   retryCountOnTaskFailure: 0
 
 steps:
-- ${{ if and(eq(parameters.useDotNet, false), eq(parameters.useDotNetPreview, false)) }}:
-  - powershell: |
-      Write-Host '##vso[task.setvariable variable=TestResultsFormat]NUnit'
-      if ([Environment]::OSVersion.Platform -eq "Unix") {
-          & ${{ parameters.xaSourcePath }}/build-tools/scripts/nunit3-console ${{ parameters.testAssembly }} --result ${{ parameters.testResultsFile }} --workers=${{ parameters.workers }} ${{ parameters.nunitConsoleExtraArgs }}
-      } else {
-          & cmd /c '${{ parameters.xaSourcePath }}\build-tools\scripts\nunit3-console.cmd' ${{ parameters.testAssembly }} --result ${{ parameters.testResultsFile }} --workers=${{ parameters.workers }} ${{ parameters.nunitConsoleExtraArgs }}
-      }
-      if ($LASTEXITCODE -ne 0) {
-          Write-Host "##vso[task.logissue type=error]Test suite had $LASTEXITCODE failure(s)."
-          Write-Host "##vso[task.complete result=Failed;]"
-          exit 0
-      }
-    displayName: run ${{ parameters.testRunTitle }}
-    condition: ${{ parameters.condition }}
-    continueOnError: true
-
-- ${{ if and(eq(parameters.useDotNet, true), eq(parameters.useDotNetPreview, true)) }}:
-  - powershell: Write-Host '##vso[task.setvariable variable=TestResultsFormat]VSTest'
-  - template: run-dotnet-preview.yaml
-    parameters:
-      configuration: ${{ parameters.configuration }}
-      xaSourcePath: ${{ parameters.xaSourcePath }}
-      command: test
-      project: ${{ parameters.testAssembly }}
-      useExitCodeForErrors: true
-      arguments: >-
-        --results-directory . --logger "trx;LogFileName=${{ parameters.testResultsFile }}"
-        ${{ parameters.dotNetTestExtraArgs }} -- NUnit.NumberOfTestWorkers=${{ parameters.workers }}
-      displayName: run ${{ parameters.testRunTitle }}
-      condition: ${{ parameters.condition }}
-
-- ${{ if and(eq(parameters.useDotNet, true), eq(parameters.useDotNetPreview, false)) }}:
-  - task: DotNetCoreCLI@2
-    inputs:
-      command: test
-      projects: ${{ parameters.testAssembly }}
-      arguments: >-
-        ${{ parameters.dotNetTestExtraArgs }} -- NUnit.NumberOfTestWorkers=${{ parameters.workers }}
-      publishTestResults: true
-      testRunTitle: ${{ parameters.testRunTitle }}
-    displayName: run ${{ parameters.testRunTitle }}
-    condition: ${{ parameters.condition }}
-    continueOnError: true
-    timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
-    retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }}
-
-- template: kill-processes.yaml
-
-- task: PublishTestResults@2
+- task: DotNetCoreCLI@2
   inputs:
-    testResultsFormat: $(TestResultsFormat)
-    testResultsFiles: ${{ parameters.testResultsFile }}
+    command: test
+    projects: ${{ parameters.testAssembly }}
+    arguments: >-
+      ${{ parameters.dotNetTestExtraArgs }} -- NUnit.NumberOfTestWorkers=${{ parameters.workers }}
+    publishTestResults: true
     testRunTitle: ${{ parameters.testRunTitle }}
-  condition: and(${{ parameters.condition }}, or(ne('${{ parameters.useDotNet }}', 'true'), eq('${{ parameters.useDotNetPreview }}', 'true')))
+  displayName: run ${{ parameters.testRunTitle }}
+  condition: ${{ parameters.condition }}
+  continueOnError: true
+  timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
+  retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }}
+
+- template: /build-tools/automation/yaml-templates/kill-processes.yaml@self
diff --git a/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml b/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml
index 5e44373d5dd..b81af9b0943 100644
--- a/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml
+++ b/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml
@@ -8,7 +8,7 @@ parameters:
 steps:
 - ${{if parameters.testFilter}}:
   - pwsh: >-
-      dotnet-test-slicer slice
+      $(Agent.ToolsDirectory)/dotnet-test-slicer slice
       --test-assembly="${{ parameters.testAssembly }}"
       --test-filter="${{ parameters.testFilter }}"
       --slice-number=$(System.JobPositionInPhase)
@@ -18,7 +18,7 @@ steps:
     failOnStderr: true
 - ${{ else }}:
   - pwsh: >-
-      dotnet-test-slicer slice
+      $(Agent.ToolsDirectory)/dotnet-test-slicer slice
       --test-assembly="${{ parameters.testAssembly }}"
       --slice-number=$(System.JobPositionInPhase)
       --total-slices=$(System.TotalJobsInPhase)
@@ -28,7 +28,7 @@ steps:
 
 - ${{ if eq(parameters.retryFailedTests, 'false') }}:
   # If we aren't using auto-retry logic, then this is just a simple template call
-  - template: run-nunit-tests.yaml
+  - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
     parameters:
       testRunTitle: ${{ parameters.testRunTitle }}-$(System.JobPositionInPhase)
       testAssembly: ${{ parameters.testAssembly }}
@@ -49,7 +49,7 @@ steps:
     workingDirectory: ${{ parameters.xaSourcePath }}
 
   - pwsh: |
-      dotnet-test-slicer `
+      $(Agent.ToolsDirectory)/dotnet-test-slicer `
         retry `
         --trx="$(Agent.TempDirectory)" `
         --outfile="${{ parameters.testAssembly }}.runsettings"
@@ -70,7 +70,7 @@ steps:
       custom: build-server
       arguments: shutdown
 
-  - template: run-nunit-tests.yaml
+  - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self
     parameters:
       testRunTitle: ${{ parameters.testRunTitle }}-$(System.JobPositionInPhase) (Auto-Retry)
       testAssembly: ${{ parameters.testAssembly }}
diff --git a/build-tools/automation/yaml-templates/run-xaprepare.yaml b/build-tools/automation/yaml-templates/run-xaprepare.yaml
index 1136cbec6e1..209aab8219d 100644
--- a/build-tools/automation/yaml-templates/run-xaprepare.yaml
+++ b/build-tools/automation/yaml-templates/run-xaprepare.yaml
@@ -3,7 +3,6 @@ parameters:
   name:
   configuration: $(XA.Build.Configuration)
   xaSourcePath: $(System.DefaultWorkingDirectory)
-  framework: $(DotNetStableTargetFramework)
   condition: succeeded()
   arguments:
 
@@ -15,4 +14,4 @@ steps:
   inputs:
     command: run
     projects: ${{ parameters.xaSourcePath }}/build-tools/xaprepare/xaprepare/xaprepare.csproj
-    arguments: -f ${{ parameters.framework }} -c ${{ parameters.configuration }} -- ${{ parameters.arguments }} --no-emoji --run-mode=CI
+    arguments: -f $(DotNetStableTargetFramework) -c ${{ parameters.configuration }} -- ${{ parameters.arguments }} --no-emoji --run-mode=CI
diff --git a/build-tools/automation/yaml-templates/setup-test-environment.yaml b/build-tools/automation/yaml-templates/setup-test-environment.yaml
index bcd91d29145..45901d9770a 100644
--- a/build-tools/automation/yaml-templates/setup-test-environment.yaml
+++ b/build-tools/automation/yaml-templates/setup-test-environment.yaml
@@ -5,17 +5,15 @@ parameters:
   remove_dotnet: false
   installTestSlicer: false
   installApkDiff: true
-  installLegacyDotNet: true
+  installLegacyDotNet: false
   installLegacyXamarinAndroid: false
-  restoreNUnitConsole: true
-  updateMono: true
+  updateMono: false
   androidSdkPlatforms: $(DefaultTestSdkPlatforms)
   repositoryAlias: 'self'
   commit: ''
   xaprepareScenario: AndroidTestDependencies        # Use 'EmulatorTestDependencies' for agents that need the emulator installed
 
 steps:
-
 - template: sdk-unified/steps/checkout/v1.yml@yaml-templates
   parameters:
     resource: ${{ parameters.repositoryAlias }}
@@ -37,14 +35,14 @@ steps:
 
 # Install .NET 6 for legacy tests
 - ${{ if eq(parameters.installLegacyDotNet, true) }}:
-  - template: use-dot-net.yaml
+  - template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self
     parameters:
       version: 6.0
       quality: GA
       remove_dotnet: ${{ parameters.remove_dotnet }}
 
 # Install latest .NET
-- template: use-dot-net.yaml
+- template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self
 
 - task: DotNetCoreCLI@2
   displayName: shut down existing build daemons
@@ -54,7 +52,7 @@ steps:
     arguments: shutdown
 
 - ${{ if eq(parameters.updateMono, true) }}:
-  - template: run-xaprepare.yaml
+  - template: /build-tools/automation/yaml-templates/run-xaprepare.yaml@self
     parameters:
       displayName: run xaprepare-UpdateMono
       arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes
@@ -62,29 +60,19 @@ steps:
       xaSourcePath: ${{ parameters.xaSourcePath }}
 
 - ${{ if eq(parameters.installLegacyXamarinAndroid, true) }}:
-  - template: install-global-tool.yaml
+  - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self
     parameters:
       toolName: boots
       version: $(BootsToolVersion)
       continueOnError: false
-  - powershell: boots --stable Xamarin.Android
+  - pwsh: $(Agent.ToolsDirectory)/boots --stable Xamarin.Android
     displayName: install Xamarin.Android stable
 
-- template: run-xaprepare.yaml
+- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml@self
   parameters:
     arguments: --s=${{ parameters.xaprepareScenario }}  --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}"
     xaSourcePath: ${{ parameters.xaSourcePath }}
 
-- ${{ if eq(parameters.restoreNUnitConsole, true) }}:
-  - task: DotNetCoreCLI@2
-    displayName: restore NUnit.Console
-    inputs:
-      command: restore
-      projects: ${{ parameters.xaSourcePath }}/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Xamarin.ProjectTools.csproj
-      restoreArguments: -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.ProjectTools.binlog
-      nugetConfigPath: ${{ parameters.xaSourcePath }}/NuGet.config
-      feedsToUse: config
-
 - task: DotNetCoreCLI@2
   displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj
   inputs:
@@ -110,13 +98,13 @@ steps:
     arguments: -t:ExtractWorkloadPacks -c ${{ parameters.configuration }} -v:n -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/extract-workloads.binlog
 
 - ${{ if eq(parameters.installApkDiff, true) }}:
-  - template: install-global-tool.yaml
+  - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self
     parameters:
       toolName: apkdiff
       version: $(ApkDiffToolVersion)
 
 - ${{ if eq(parameters.installTestSlicer, true) }}:
-  - template: install-global-tool.yaml
+  - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self
     parameters:
       toolName: dotnet-test-slicer
       version: $(TestSlicerToolVersion)
diff --git a/build-tools/automation/yaml-templates/setup-ubuntu.yaml b/build-tools/automation/yaml-templates/setup-ubuntu.yaml
deleted file mode 100644
index 4dd8d7062b5..00000000000
--- a/build-tools/automation/yaml-templates/setup-ubuntu.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-steps:
-
-- script: sudo rm /etc/apt/sources.list.d/treasure-data.list || true
-  displayName: remove invalid treasure-data source
-
-- script: echo "##vso[task.setvariable variable=XDG_CONFIG_HOME]$HOME/.config"
-  displayName: update XDG_CONFIG_HOME
-
-- script: >
-    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF &&
-    echo "deb https://download.mono-project.com/repo/ubuntu preview-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-preview.list &&
-    sudo apt update &&
-    sudo apt install -y --no-install-recommends mono-complete nuget msbuild
-  displayName: install mono preview
-
-- template: use-dot-net.yaml
-  parameters:
-    remove_dotnet: true
-
-- task: NuGetToolInstaller@1
-  displayName: Use NuGet 5.x
-  inputs:
-    versionSpec: 5.x
diff --git a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml
index 88657721c3f..b61b495467e 100644
--- a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml
+++ b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml
@@ -13,6 +13,7 @@ parameters:
   usesCleanImages: true
   shouldFailOnIssue: true
   emulatorStartContinueOnError: false
+  use1ESTemplate: true
 
 stages:
 - stage: ${{ parameters.stageName }}
@@ -25,19 +26,19 @@ stages:
       parallel: ${{ parameters.agent_count }}
     displayName: "macOS > Tests > MSBuild+Emulator"
     pool:
+      name: Azure Pipelines
       vmImage: $(HostedMacImage)
-    timeoutInMinutes: 90
+      os: macOS
+    timeoutInMinutes: 180
     cancelTimeoutInMinutes: 5
     workspace:
       clean: all
     steps:
-    - template: setup-test-environment.yaml
+    - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
       parameters:
         installTestSlicer: true
         installApkDiff: false
-        installLegacyDotNet: false
         installLegacyXamarinAndroid: true
-        restoreNUnitConsole: false
         updateMono: true
         xaSourcePath: ${{ parameters.xaSourcePath }}
         repositoryAlias: ${{ parameters.repositoryAlias }}
@@ -49,29 +50,30 @@ stages:
         artifactName: $(TestAssembliesArtifactName)
         downloadPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
 
-    - template: start-stop-emulator.yaml
+    - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
       parameters:
         xaSourcePath: ${{ parameters.xaSourcePath }}
         startContinueOnError: ${{ parameters.emulatorStartContinueOnError }}
 
-    - template: run-sliced-nunit-tests.yaml
+    - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml@self
       parameters:
         testAssembly: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll
         testFilter: $(ExcludedNightlyNUnitCategories)
         testRunTitle: MSBuildDeviceIntegration On Device - macOS
 
     - ${{ if ne(parameters.usesCleanImages, true) }}:
-      - template: start-stop-emulator.yaml
+      - template: start-stop-emulator.yaml@self
         parameters:
           command: stop
           xaSourcePath: ${{ parameters.xaSourcePath }}
 
-    - template: upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
       parameters:
         artifactName: Test Results - MSBuild With Emulator - macOS-$(System.JobPositionInPhase)
         xaSourcePath: ${{ parameters.xaSourcePath }}
+        use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-    - template: fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
       parameters:
         condition: ${{ parameters.shouldFailOnIssue }}
 
@@ -88,17 +90,16 @@ stages:
       deviceName: wear_square
       androidSdkPlatforms: 33
     pool:
+      name: Azure Pipelines
       vmImage: $(HostedMacImage)
+      os: macOS
     workspace:
       clean: all
     steps:
-    - template: setup-test-environment.yaml
+    - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self
       parameters:
         installTestSlicer: true
         installApkDiff: false
-        installLegacyDotNet: false
-        restoreNUnitConsole: false
-        updateMono: false
         xaSourcePath: ${{ parameters.xaSourcePath }}
         repositoryAlias: ${{ parameters.repositoryAlias }}
         commit: ${{ parameters.commit }}
@@ -109,7 +110,7 @@ stages:
         artifactName: $(TestAssembliesArtifactName)
         downloadPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
 
-    - template: start-stop-emulator.yaml
+    - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
       parameters:
         specificImage: true
         deviceName: $(deviceName)
@@ -119,7 +120,7 @@ stages:
         xaSourcePath: ${{ parameters.xaSourcePath }}
         startContinueOnError: ${{ parameters.emulatorStartContinueOnError }}
 
-    - template: run-sliced-nunit-tests.yaml
+    - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml@self
       parameters:
         testRunTitle: WearOS On Device - macOS
         testAssembly: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll
@@ -127,7 +128,7 @@ stages:
         xaSourcePath: ${{ parameters.xaSourcePath }}
 
     - ${{ if ne(parameters.usesCleanImages, true) }}:
-      - template: start-stop-emulator.yaml
+      - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
         parameters:
           command: stop
           specificImage: true
@@ -137,12 +138,13 @@ stages:
           avdType: $(avdType)
           xaSourcePath: ${{ parameters.xaSourcePath }}
 
-    - template: upload-results.yaml
+    - template: /build-tools/automation/yaml-templates/upload-results.yaml@self
       parameters:
         configuration: $(XA.Build.Configuration)
         artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS
         xaSourcePath: ${{ parameters.xaSourcePath }}
+        use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-    - template: fail-on-issue.yaml
+    - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self
       parameters:
         condition: ${{ parameters.shouldFailOnIssue }}
diff --git a/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml
index 9b4745c543c..a00eb91295e 100644
--- a/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml
+++ b/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml
@@ -9,6 +9,7 @@ parameters:
   repositoryAlias: 'self'
   commit: ''
   shouldFailOnIssue: true
+  use1ESTemplate: true
 
 stages:
 - stage: ${{ parameters.stageName }}
@@ -16,7 +17,7 @@ stages:
   dependsOn: ${{ parameters.dependsOn }}
   condition: ${{ parameters.stageCondition }}
   jobs:
-  - template: run-msbuild-tests.yaml
+  - template: /build-tools/automation/yaml-templates/run-msbuild-tests.yaml@self
     parameters:
       testOS: macOS
       jobName: mac_msbuild_tests
@@ -26,8 +27,9 @@ stages:
       repositoryAlias: ${{ parameters.repositoryAlias }}
       commit: ${{ parameters.commit }}
       shouldFailOnIssue: ${{ parameters.shouldFailOnIssue }}
+      use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
-  - template: run-msbuild-tests.yaml
+  - template: /build-tools/automation/yaml-templates/run-msbuild-tests.yaml@self
     parameters:
       testOS: Windows
       jobName: win_msbuild_tests
@@ -37,3 +39,4 @@ stages:
       repositoryAlias: ${{ parameters.repositoryAlias }}
       commit: ${{ parameters.commit }}
       shouldFailOnIssue: ${{ parameters.shouldFailOnIssue }}
+      use1ESTemplate: ${{ parameters.use1ESTemplate }}
diff --git a/build-tools/automation/yaml-templates/upload-results.yaml b/build-tools/automation/yaml-templates/upload-results.yaml
index ed782a58d4d..40ce61a07cd 100644
--- a/build-tools/automation/yaml-templates/upload-results.yaml
+++ b/build-tools/automation/yaml-templates/upload-results.yaml
@@ -4,9 +4,10 @@ parameters:
   artifactName: results
   includeBuildResults: false
   condition: or(ne(variables['Agent.JobStatus'], 'Succeeded'), eq(variables['XA.PublishAllLogs'], 'true'))
+  use1ESTemplate: true
 
 steps:
-- template: run-xaprepare.yaml
+- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml@self
   parameters:
     configuration: ${{ parameters.configuration }}
     arguments: --s=CopyExtraResultFilesForCI --verbosity v
@@ -15,12 +16,13 @@ steps:
     condition: ${{ parameters.condition }}
 
 - ${{ if eq(parameters.includeBuildResults, false) }}:
-  - template: publish-artifact.yaml
+  - template: /build-tools/automation/yaml-templates/publish-artifact.yaml@self
     parameters:
       displayName: upload test results
       artifactName: ${{ parameters.artifactName }}
       targetPath: $(Build.StagingDirectory)/Test${{ parameters.configuration }}
       condition: ${{ parameters.condition }}
+      use1ESTemplate: ${{ parameters.use1ESTemplate }}
 
 # Copy Build$(Configuration) folder into test result root and upload single artifact
 - ${{ if eq(parameters.includeBuildResults, true) }}:
@@ -30,9 +32,10 @@ steps:
       targetFolder: $(Build.StagingDirectory)/Test${{ parameters.configuration }}/Build${{ parameters.configuration }}
     condition: ${{ parameters.condition }}
 
-  - template: publish-artifact.yaml
+  - template: /build-tools/automation/yaml-templates/publish-artifact.yaml@self
     parameters:
       displayName: upload build and test results
       artifactName: ${{ parameters.artifactName }}
       targetPath: $(Build.StagingDirectory)/Test${{ parameters.configuration }}
       condition: ${{ parameters.condition }}
+      use1ESTemplate: ${{ parameters.use1ESTemplate }}
diff --git a/build-tools/automation/yaml-templates/use-dot-net.yaml b/build-tools/automation/yaml-templates/use-dot-net.yaml
index 41fdfad874a..7480ddc8176 100644
--- a/build-tools/automation/yaml-templates/use-dot-net.yaml
+++ b/build-tools/automation/yaml-templates/use-dot-net.yaml
@@ -8,7 +8,6 @@ parameters:
   retryCountOnTaskFailure: 3
 
 steps:
-
   - pwsh: |
       $ErrorActionPreference = 'Stop'
       $ProgressPreference = 'SilentlyContinue'
diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml
index ad1ff2cd733..e9908323d5d 100644
--- a/build-tools/automation/yaml-templates/variables.yaml
+++ b/build-tools/automation/yaml-templates/variables.yaml
@@ -33,8 +33,10 @@ variables:
   value: macOS-13
 - name: HostedWinImage
   value: windows-2022
-- name: 1ESWindowsPool
-  value: android-win-2022
+- name: WindowsPoolImage1ESPT
+  value: 1ESPT-Windows2022
+- name: LinuxPoolImage1ESPT
+  value: 1ESPT-Ubuntu22.04
 - name: VSEngMicroBuildPool
   value: VSEngSS-MicroBuild2022-1ES
 - name: TeamName
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs
index 29c00189e8e..06da0feeb21 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs
@@ -115,10 +115,16 @@ protected static (int code, string stdOutput, string stdError) RunApkDiffCommand
 			try {
 				return RunProcessWithExitCode ("apkdiff" + ext, args);
 			} catch (System.ComponentModel.Win32Exception) {
-				// apkdiff's location might not be in the $PATH, try known location
+				// apkdiff's location might not be in the $PATH, try known locations
 				var profileDir = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile);
-
-				return RunProcessWithExitCode (Path.Combine (profileDir, ".dotnet", "tools", "apkdiff" + ext), args);
+				var apkdiffPath = Path.Combine (profileDir, ".dotnet", "tools", "apkdiff" + ext);
+				if (!File.Exists (apkdiffPath)) {
+					var agentToolsDir = Environment.GetEnvironmentVariable ("AGENT_TOOLSDIRECTORY");
+					if (Directory.Exists (agentToolsDir)) {
+						apkdiffPath = Path.Combine (agentToolsDir, "apkdiff" + ext);
+					}
+				}
+				return RunProcessWithExitCode (apkdiffPath, args);
 			}
 		}
 
