diff --git a/eng/Helix.CrossTarget.targets b/eng/Helix.CrossTarget.targets
new file mode 100644
index 00000000000..66bc48b89d5
--- /dev/null
+++ b/eng/Helix.CrossTarget.targets
@@ -0,0 +1,16 @@
+
+
+
+ <_TargetFrameworks Remove="@(_TargetFrameworks)" />
+ <_TargetFrameworks Include="$(TargetFrameworks)" />
+
+
+
+
+
+
diff --git a/eng/Helix.SingleTarget.targets b/eng/Helix.SingleTarget.targets
new file mode 100644
index 00000000000..e034e6b9260
--- /dev/null
+++ b/eng/Helix.SingleTarget.targets
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/Helix.props b/eng/Helix.props
new file mode 100644
index 00000000000..40c64d43196
--- /dev/null
+++ b/eng/Helix.props
@@ -0,0 +1,6 @@
+
+
+ true
+ false
+
+
diff --git a/eng/Helix.targets b/eng/Helix.targets
new file mode 100644
index 00000000000..8d82ef7cc69
--- /dev/null
+++ b/eng/Helix.targets
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/eng/helix/Helix.proj b/eng/helix/Helix.proj
new file mode 100644
index 00000000000..6f17013f02f
--- /dev/null
+++ b/eng/helix/Helix.proj
@@ -0,0 +1,164 @@
+
+
+
+ $(Configuration)
+ $(BuildArch)
+ true
+ false
+
+ $(PackageRid)
+
+
+
+ .open
+
+ $(USERNAME)
+ $(USER)
+
+
+
+ pr
+ pr
+ official
+
+
+
+ pr
+ $(HelixSourcePrefix)/dotnet/dotnet-monitor
+ $(HelixSource)/$(BUILD_SOURCEBRANCH)
+ test/binaries/
+
+
+
+
+ Platform=$(HelixArchitecture)
+
+
+
+
+
+
+
+
+
+ Windows 11 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+ Windows 10 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+
+ Windows 10 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+
+
+
+
+ Debian 11 $(HelixArchitecture) $(HelixConfiguration)
+
+
+ Ubuntu 18.04 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+ Debian 11 $(HelixArchitecture) $(HelixConfiguration)
+
+
+ Mariner 2.0 $(HelixArchitecture) $(HelixConfiguration)
+
+
+ Ubuntu 18.04 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+
+
+
+
+ Alpine 3.15 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+ Alpine 3.15 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+
+
+
+
+ OSX 13 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+ OSX 13 $(HelixArchitecture) $(HelixConfiguration)
+
+
+
+
+
+ %(AdditionalProperties);Configuration=$(HelixConfiguration)
+
+
+
+
+
+ true
+ sdk
+ $(MicrosoftDotnetSdkInternalVersion)
+
+
+
+
+
+ aspnetcore-runtime
+
+
+ aspnetcore-runtime
+
+
+ aspnetcore-runtime
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/helix/payload/dotnettest.cmd b/eng/helix/payload/dotnettest.cmd
new file mode 100644
index 00000000000..5a62c203585
--- /dev/null
+++ b/eng/helix/payload/dotnettest.cmd
@@ -0,0 +1,34 @@
+@echo off
+setlocal
+
+set testAssembly=%1
+set configuration=%2
+set targetFramework=%3
+set architecture=%~4
+set timeoutMinutes=%~5
+
+set filterArgs=
+if not "%~6" == "" (
+ set filterArgs=--filter ^"%~6^"
+)
+
+set exit_code=0
+
+echo "Start tests..."
+
+dotnet.exe test ^
+ "%HELIX_CORRELATION_PAYLOAD%\%testAssembly%\%configuration%\%targetFramework%\%testAssembly%.dll" ^
+ --logger:"console;verbosity=normal" ^
+ --logger:"trx;LogFileName=%testAssembly%_%targetFramework%_%architecture%.trx" ^
+ --logger:"html;LogFileName=%testAssembly%_%targetFramework%_%architecture%.html" ^
+ --ResultsDirectory:%HELIX_WORKITEM_UPLOAD_ROOT% ^
+ --blame "CollectHangDump;TestTimeout=%timeoutMinutes%m" ^
+ %filterArgs%
+
+if not errorlevel 0 (
+ set exit_code=%errorlevel%
+)
+
+echo "Finished tests; exit code: %exit_code%"
+
+exit /b %exit_code%
\ No newline at end of file
diff --git a/eng/helix/payload/dotnettest.sh b/eng/helix/payload/dotnettest.sh
new file mode 100755
index 00000000000..b78d0efb45c
--- /dev/null
+++ b/eng/helix/payload/dotnettest.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+testAssembly="$1"
+configuration="$2"
+targetFramework="$3"
+architecture="$4"
+timeoutMinutes="$5"
+
+filterArgs=""
+if [[ ! -z "$6" ]]; then
+ filterArgs="--filter \"$6\""
+fi
+
+exit_code=0
+
+echo "Start tests..."
+
+dotnet test \
+ "$HELIX_CORRELATION_PAYLOAD/$testAssembly/$configuration/$targetFramework/$testAssembly.dll" \
+ --logger:"console;verbosity=normal" \
+ --logger:"trx;LogFileName=${testAssembly}_${targetFramework}_${architecture}.trx" \
+ --logger:"html;LogFileName=${testAssembly}_${targetFramework}_${architecture}.html" \
+ --ResultsDirectory:$HELIX_WORKITEM_UPLOAD_ROOT \
+ --blame "CollectHangDump;TestTimeout=${timeoutMinutes}m" \
+ $filterArgs
+
+exit_code=$?
+
+echo "Finished tests; exit code: $exit_code"
+
+exit $exit_code
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 5604afb705f..379e69cfb1a 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -26,13 +26,15 @@
- --blame "CollectHangDump;TestTimeout=15m"
+ 15
+ --blame "CollectHangDump;TestTimeout=$(TestRunnerTestTimeoutMinutes)m"
- $(TestRunnerAdditionalArguments) --filter "TargetFrameworkMoniker=Net80"
+ TargetFrameworkMoniker=Net80
+ $(TestRunnerAdditionalArguments) --filter "$(TestRunnerFilterArguments)"
@@ -62,5 +64,6 @@
+
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index 7835a5a36d4..d01c1c8ddca 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -2,6 +2,8 @@
+
+
diff --git a/src/Tests/Directory.Build.targets b/src/Tests/Directory.Build.targets
index cabc57929c0..546017f7f57 100644
--- a/src/Tests/Directory.Build.targets
+++ b/src/Tests/Directory.Build.targets
@@ -16,4 +16,5 @@
+
diff --git a/src/Tests/Helix.targets b/src/Tests/Helix.targets
new file mode 100644
index 00000000000..86c75cae1aa
--- /dev/null
+++ b/src/Tests/Helix.targets
@@ -0,0 +1,19 @@
+
+
+ $(TargetName) $(Configuration) $(TargetFramework) $(Platform) $(TestRunnerTestTimeoutMinutes) $(TestRunnerFilterArguments)
+ call %HELIX_CORRELATION_PAYLOAD%\dotnettest.cmd $(HelixDotnetTestArgs)
+ $HELIX_CORRELATION_PAYLOAD/dotnettest.sh $(HelixDotnetTestArgs)
+
+ $([MSBuild]::Add($(TestRunnerTestTimeoutMinutes), 10))
+
+
+
+
+
+ @(HelixWorkItemPreCommand)
+ $(HelixDotnetTestCommand)
+ @(HelixWorkItemPostCommand)
+ 00:$(HelixTimeoutMinutes):00
+
+
+
\ No newline at end of file