diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh
index f9731fe16a273757eda8598cb45633c0ea7ab1b2..82a891bf5386de4f8b2a80b7b67fcf1e396ecbad 100755
--- a/Build/Scripts/runTests.sh
+++ b/Build/Scripts/runTests.sh
@@ -867,6 +867,12 @@ case ${TEST_SUITE} in
         SUITE_EXIT_CODE=$?
         docker-compose down
         ;;
+    unitDeprecated10)
+        setUpDockerComposeDotEnv
+        docker-compose run unitDeprecated10
+        SUITE_EXIT_CODE=$?
+        docker-compose down
+        ;;
     unitJavascript)
         setUpDockerComposeDotEnv
         docker-compose run unitJavascript
diff --git a/Build/gitlab-ci/nightly/unit.yml b/Build/gitlab-ci/nightly/unit.yml
index 0ee3e654a946e591233f708054f9ffcfa8db05e3..a141ac21dbd6303ce22c5281aa6915774750ee7a 100644
--- a/Build/gitlab-ci/nightly/unit.yml
+++ b/Build/gitlab-ci/nightly/unit.yml
@@ -176,3 +176,19 @@ unit php 8.1 phpunit 10:
   script:
     - Build/Scripts/runTests.sh -s composerInstall -p 8.1
     - Build/Scripts/runTests.sh -s unit10 -p 8.1
+unit php 8.2 deprecated phpunit 10:
+  stage: unit
+  needs: []
+  only:
+    - schedules
+  script:
+    - Build/Scripts/runTests.sh -s composerInstall -p 8.2
+    - Build/Scripts/runTests.sh -s unitDeprecated10 -p 8.2
+unit php 8.1 deprecated phpunit 10:
+  stage: unit
+  needs: []
+  only:
+    - schedules
+  script:
+    - Build/Scripts/runTests.sh -s composerInstall -p 8.1
+    - Build/Scripts/runTests.sh -s unitDeprecated10 -p 8.1
diff --git a/Build/gitlab-ci/pre-merge/unit.yml b/Build/gitlab-ci/pre-merge/unit.yml
index 610d830d3afa26bce927391e1583f84ced780296..5fcd2257ad825504fa82d140788a8b440aa0d76a 100644
--- a/Build/gitlab-ci/pre-merge/unit.yml
+++ b/Build/gitlab-ci/pre-merge/unit.yml
@@ -60,3 +60,12 @@ unit php 8.2 phpunit 10 pre-merge:
   script:
     - Build/Scripts/runTests.sh -s composerInstall -p 8.2
     - Build/Scripts/runTests.sh -s unit10 -p 8.2
+unit php 8.2 deprecated phpunit 10 pre-merge:
+  stage: main
+  except:
+    refs:
+      - schedules
+      - main
+  script:
+    - Build/Scripts/runTests.sh -s composerInstall -p 8.2
+    - Build/Scripts/runTests.sh -s unitDeprecated10 -p 8.2
diff --git a/Build/phpunit/UnitTestsDeprecated-10.xml b/Build/phpunit/UnitTestsDeprecated-10.xml
new file mode 100644
index 0000000000000000000000000000000000000000..11b54d50f50c1ee0583d59fea0a4462e08bf9aff
--- /dev/null
+++ b/Build/phpunit/UnitTestsDeprecated-10.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!--
+	Unit test deprecated suite setup.
+
+	This suite allows tests to trigger E_USER_DEPRECATED errors
+	without making the tests fail. Used to test deprecated core
+	functionality.
+
+	Unit tests should extend \TYPO3\TestingFramework\Core\Tests\UnitTestCase,
+	take a look at this class for further documentation on how to run the suite.
+
+	TYPO3 CMS unit test suite also needs phpunit bootstrap code, the
+	file is located next to this .xml as UnitTestsBootstrap.php
+
+    The recommended way to execute the suite is "runTests.sh -s unitDeprecated"
+    execute "Build/Scripts/runTests.sh -h" for more details.
+-->
+<phpunit
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd"
+    backupGlobals="true"
+    bootstrap="UnitTestsBootstrap.php"
+    cacheResult="false"
+    colors="true"
+    beStrictAboutTestsThatDoNotTestAnything="false"
+    failOnWarning="true"
+    failOnRisky="true"
+    cacheDirectory=".phpunit.cache"
+>
+  <testsuites>
+    <testsuite name="Core tests">
+      <directory>../../typo3/sysext/*/Tests/UnitDeprecated/</directory>
+    </testsuite>
+  </testsuites>
+  <coverage>
+    <include>
+      <directory>../../typo3/sysext/*/Classes/</directory>
+    </include>
+  </coverage>
+  <php>
+    <ini name="display_errors" value="1"/>
+    <ini name="error_reporting" value="E_ALL"/>
+    <env name="TYPO3_CONTEXT" value="Testing"/>
+  </php>
+</phpunit>
diff --git a/Build/testing-docker/local/docker-compose.yml b/Build/testing-docker/local/docker-compose.yml
index 3712e3e4deda1ce7908ef41ab3fae0e7efa3ab64..07b012138f596ba0f69bd31add61a36b8e397438 100644
--- a/Build/testing-docker/local/docker-compose.yml
+++ b/Build/testing-docker/local/docker-compose.yml
@@ -1396,6 +1396,35 @@ services:
         fi
       "
 
+  unitDeprecated10:
+    image: typo3/core-testing-${DOCKER_PHP_IMAGE}:latest
+    user: "${HOST_UID}"
+    volumes:
+      - ${CORE_ROOT}:${CORE_ROOT}
+    working_dir: ${CORE_ROOT}
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
+    environment:
+      COMPOSER_CACHE_DIR: ".cache/composer"
+    command: >
+      /bin/sh -c "
+        if [ ${SCRIPT_VERBOSE} -eq 1 ]; then
+          set -x
+        fi
+        php -v | grep '^PHP'
+        composer req --dev --no-progress --no-interaction phpunit/phpunit:^10 -w
+        composer req --dev --no-progress --no-interaction typo3/testing-framework:dev-lolli-1
+        if [ ${PHP_XDEBUG_ON} -eq 0 ]; then
+          XDEBUG_MODE=\"off\" \
+          vendor/phpunit/phpunit/phpunit -c Build/phpunit/UnitTestsDeprecated-10.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE};
+        else
+          XDEBUG_MODE=\"debug,develop\" \
+          XDEBUG_TRIGGER=\"foo\" \
+          XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=host.docker.internal\" \
+          vendor/phpunit/phpunit/phpunit -c Build/phpunit/UnitTestsDeprecated-10.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE};
+        fi
+      "
+
   unitJavascript:
     image: typo3/core-testing-nodejs16-chrome:latest
     user: "${HOST_UID}"
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php
index 55adb67059c40b86dcfc424a37169dcd7e4bba96..66fc5d49b22eb7a8f99509d4f6878ac03ee2238c 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php
@@ -65,7 +65,7 @@ class PublicPropertyDeprecationTraitTest extends UnitTestCase
     /**
      * @return array [[$expected, $property],]
      */
-    public function issetDataProvider(): array
+    public static function issetDataProvider(): array
     {
         return [
             'public property' => [true, 'publicProperty'],
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php
index 2f2693ce8a67b9ca021f35914d69de5277f75126..435de129dbb75fb87f8b77eb0d900f66363989f0 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php
@@ -82,21 +82,19 @@ class AbstractConditionMatcherTest extends UnitTestCase
         $this->conditionMatcher->setLogger(new NullLogger());
     }
 
-    public function requestFunctionDataProvider(): array
+    public static function requestFunctionDataProvider(): array
     {
         return [
             // GET tests
             // getQueryParams()
             'request.getQueryParams()[\'foo\'] > 0' => ['request.getQueryParams()[\'foo\'] > 0', true],
             'request.getQueryParams()[\'foo\'][\'bar\'] > 0' => ['request.getQueryParams()[\'foo\'][\'bar\'] > 0', false],
-            'request.getQueryParams()[\'bar\'][\'foo\'] > 0' => ['request.getQueryParams()[\'bar\'][\'foo\'] > 0', false],
             'request.getQueryParams()[\'foo\'] == 0' => ['request.getQueryParams()[\'foo\'] == 0', false],
             'request.getQueryParams()[\'foo\'][\'bar\'] == 0' => ['request.getQueryParams()[\'foo\'][\'bar\'] == 0', false],
             // POST tests
             // getParsedBody()
             'request.getParsedBody()[\'foo\'] > 0' => ['request.getParsedBody()[\'foo\'] > 0', true],
             'request.getParsedBody()[\'foo\'][\'bar\'] > 0' => ['request.getParsedBody()[\'foo\'][\'bar\'] > 0', false],
-            'request.getParsedBody()[\'bar\'][\'foo\'] > 0' => ['request.getParsedBody()[\'bar\'][\'foo\'] > 0', false],
             'request.getParsedBody()[\'foo\'] == 0' => ['request.getParsedBody()[\'foo\'] == 0', false],
             'request.getParsedBody()[\'foo\'][\'bar\'] == 0' => ['request.getParsedBody()[\'foo\'][\'bar\'] == 0', false],
             // HEADERS tests
@@ -131,7 +129,7 @@ class AbstractConditionMatcherTest extends UnitTestCase
         );
     }
 
-    public function datesFunctionDataProvider(): array
+    public static function datesFunctionDataProvider(): array
     {
         return [
             '[dayofmonth = 17]' => ['j', 17, true],
@@ -203,7 +201,7 @@ class AbstractConditionMatcherTest extends UnitTestCase
     /**
      * Data provider with matching applicationContext conditions.
      */
-    public function matchingApplicationContextConditionsDataProvider(): array
+    public static function matchingApplicationContextConditionsDataProvider(): array
     {
         return [
             ['Production*'],
@@ -243,7 +241,7 @@ class AbstractConditionMatcherTest extends UnitTestCase
     /**
      * Data provider with not matching applicationContext conditions.
      */
-    public function notMatchingApplicationContextConditionsDataProvider(): array
+    public static function notMatchingApplicationContextConditionsDataProvider(): array
     {
         return [
             ['Production'],
@@ -283,7 +281,7 @@ class AbstractConditionMatcherTest extends UnitTestCase
     /**
      * Data provider for evaluateConditionCommonEvaluatesIpAddressesCorrectly
      */
-    public function evaluateConditionCommonDevIpMaskDataProvider(): array
+    public static function evaluateConditionCommonDevIpMaskDataProvider(): array
     {
         return [
             // [0] $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask']
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php b/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php
index 6aabb4d687413bd84b9e1f1180988e70c2dbac65..16a16889755fb6846e337c9ebcaf097d956b26ad 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php
@@ -86,7 +86,7 @@ class FormProtectionFactoryTest extends UnitTestCase
         $this->expectException(\InvalidArgumentException::class);
         $this->expectExceptionCode(1285353026);
 
-        FormProtectionFactory::get(self::class);
+        FormProtectionFactory::get(\stdClass::class);
     }
 
     /**
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php
index deb57d5da390e033f493efcf47c727827c2a095a..d5cc7193a390f5961cc0b9f5e00e9df7b9485238 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php
@@ -37,7 +37,7 @@ class FileExtensionFilterTest extends UnitTestCase
         parent::tearDown();
     }
 
-    public function invalidInlineChildrenFilterParametersDataProvider(): array
+    public static function invalidInlineChildrenFilterParametersDataProvider(): array
     {
         return [
             [null, null, null],
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php b/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php
index fb69ea7779d9811299ca66019fe07589bea3461b..95c75f74184207a982a7248e2baa26a4eb5e4e13 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php
@@ -48,7 +48,7 @@ class TypoScriptParserTest extends UnitTestCase
      *
      * @return array modifier name, modifier arguments, current value, expected result
      */
-    public function executeValueModifierDataProvider(): array
+    public static function executeValueModifierDataProvider(): array
     {
         return [
             'prependString with string' => [
@@ -247,7 +247,7 @@ class TypoScriptParserTest extends UnitTestCase
         self::assertEquals($expected, $actualValue);
     }
 
-    public function executeGetEnvModifierDataProvider(): array
+    public static function executeGetEnvModifierDataProvider(): array
     {
         return [
             'environment variable not set' => [
@@ -319,7 +319,7 @@ class TypoScriptParserTest extends UnitTestCase
      *
      * @return array modifier name, modifier arguments, current value, expected result
      */
-    public function executeValueModifierInvalidDataProvider(): array
+    public static function executeValueModifierInvalidDataProvider(): array
     {
         return [
             'sortList sorts a list numeric' => [
@@ -363,7 +363,7 @@ class TypoScriptParserTest extends UnitTestCase
         self::assertEquals($expected, $this->typoScriptParser->errors[0][0]);
     }
 
-    public function invalidConditionsDataProvider(): array
+    public static function invalidConditionsDataProvider(): array
     {
         return [
             '[1 == 1]a' => ['[1 == 1]a', false],
@@ -402,7 +402,7 @@ class TypoScriptParserTest extends UnitTestCase
         self::assertEquals($expected, $this->typoScriptParser->errors[0][0]);
     }
 
-    public function doubleSlashCommentsDataProvider(): array
+    public static function doubleSlashCommentsDataProvider(): array
     {
         return [
             'valid, without spaces' => ['// valid, without spaces'],
@@ -421,7 +421,7 @@ class TypoScriptParserTest extends UnitTestCase
         self::assertEmpty($this->typoScriptParser->errors);
     }
 
-    public function includeFileDataProvider(): array
+    public static function includeFileDataProvider(): array
     {
         return [
             'TS code before not matching include' => [
@@ -459,7 +459,7 @@ class TypoScriptParserTest extends UnitTestCase
         self::assertStringNotContainsString('INCLUDE_TYPOSCRIPT', $resolvedIncludeLines);
     }
 
-    public function importFilesDataProvider(): array
+    public static function importFilesDataProvider(): array
     {
         return [
             'Found include file as single file is imported' => [
@@ -681,7 +681,7 @@ test.TYPO3Forever.TypoScript = 1
         self::assertEquals($expected, $this->typoScriptParser->setup);
     }
 
-    public function typoScriptIsParsedToArrayDataProvider(): array
+    public static function typoScriptIsParsedToArrayDataProvider(): array
     {
         return [
             'simple assignment' => [
@@ -1167,7 +1167,7 @@ test.TYPO3Forever.TypoScript = 1
         self::assertSame($expectedRemainingKey, $remainingKey);
     }
 
-    public function parseNextKeySegmentReturnsCorrectNextKeySegmentDataProvider(): array
+    public static function parseNextKeySegmentReturnsCorrectNextKeySegmentDataProvider(): array
     {
         return [
             'key without separator' => [
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
index e5d09f5b6c17a1bf572e49b2a8b1f7833eb2b23d..465b526e5fb13a056606b763a853eb3ed786790e 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
@@ -36,7 +36,7 @@ class GeneralUtilityTest extends UnitTestCase
     /**
      * Data provider for gpMergedWillMergeArraysFromGetAndPost
      */
-    public function gpMergedDataProvider(): array
+    public static function gpMergedDataProvider(): array
     {
         $fullDataArray = ['cake' => ['a' => 'is a', 'b' => 'lie']];
         $postPartData = ['cake' => ['b' => 'lie']];
@@ -56,7 +56,7 @@ class GeneralUtilityTest extends UnitTestCase
      * and canRetrieveGlobalInputsThroughPost
      * @todo once _GET() becomes deprecated too, only move the test, the provider was copied
      */
-    public function getAndPostDataProvider(): array
+    public static function getAndPostDataProvider(): array
     {
         return [
             'canRetrieveGlobalInputsThroughPosted input data doesn\'t exist' => ['cake', [], null],
@@ -76,7 +76,7 @@ class GeneralUtilityTest extends UnitTestCase
         self::assertSame($expected, GeneralUtility::_POST($key));
     }
 
-    public function gpDataProvider(): array
+    public static function gpDataProvider(): array
     {
         return [
             'No key parameter' => [null, [], [], null],
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php
index 5cacabea167be7802ad0ed8b07d20241449f9ecd..f834048a205a047cba7079489bd7876f4f9ddec4 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php
@@ -25,7 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 class ResourceUtilityTest extends UnitTestCase
 {
-    public function recursiveFileListSortingHelperTestDataProvider(): array
+    public static function recursiveFileListSortingHelperTestDataProvider(): array
     {
         return [
             'normal file list' => [