diff --git a/typo3/sysext/core/Classes/Utility/GeneralUtility.php b/typo3/sysext/core/Classes/Utility/GeneralUtility.php
index 8e604db0207e27b71688c8532356ca2f64cb43f4..c1c08ffdc5b642d054399028900023da5e31d0c8 100644
--- a/typo3/sysext/core/Classes/Utility/GeneralUtility.php
+++ b/typo3/sysext/core/Classes/Utility/GeneralUtility.php
@@ -186,7 +186,7 @@ class GeneralUtility
      *
      * @param string $var Optional pointer to value in GET array (basically name of GET var)
      * @return mixed If $var is set it returns the value of $_GET[$var]. If $var is NULL (default), returns $_GET itself. In any case *slashes are stipped from the output!*
-     * @see _POST(), _GP(), _GETset()
+     * @see _POST(), _GP()
      */
     public static function _GET($var = null)
     {
@@ -223,9 +223,11 @@ class GeneralUtility
      *
      * @param mixed $inputGet
      * @param string $key
+     * @deprecated since TYPO3 v9 LTS, will be removed in TYPO3 v10.0.
      */
     public static function _GETset($inputGet, $key = '')
     {
+        trigger_error('GeneralUtility::_GETset() will be removed in TYPO3 v10.0. Use a PSR-15 middleware to set query parameters on the request object or set $_GET directly.', E_USER_DEPRECATED);
         if ($key != '') {
             if (strpos($key, '|') !== false) {
                 $pieces = explode('|', $key);
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-86389-GeneralUtility_GETsetAndTSFE-mergingWithGetVars.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-86389-GeneralUtility_GETsetAndTSFE-mergingWithGetVars.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6e878cdae7b49e286815aa653a236c7b9e28ee94
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-86389-GeneralUtility_GETsetAndTSFE-mergingWithGetVars.rst
@@ -0,0 +1,42 @@
+.. include:: ../../Includes.txt
+
+==============================================================================
+Deprecation: #86389 - GeneralUtility::_GETset() and TSFE->mergingWithGetVars()
+==============================================================================
+
+See :issue:`86389`
+
+Description
+===========
+
+Two methods related to setting global $_GET parameter have been deprecated:
+
+* :php:`TYPO3\CMS\Core\Utility\GeneralUtility::_GETset()`
+* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->mergingWithGetVars()`
+
+The two methods are wrappers to set the `$_GET` properties, however, this concept has been superseded
+by using the PSR-7 request object within PSR-15 middlewares to replace the variables.
+
+
+Impact
+======
+
+Calling any of the two methods within PHP will trigger a deprecation message.
+
+
+Affected Installations
+======================
+
+Any installation making use of these methods within a TYPO3 extension, e.g. RealURL.
+
+
+Migration
+=========
+
+Implement a custom PSR-15 middleware to update the PSR-7 request object, and to manually set `$_GET` on top,
+as long as TYPO3 still supports `GeneralUtility::_GP()`, although these methods will vanish in the near future.
+
+Relying on the request object, and using PSR-15 middlewares to manipulate request parameters is more future-proof
+for extensions and TYPO3 sites.
+
+.. index:: Frontend, PHP-API, FullyScanned
\ No newline at end of file
diff --git a/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
index 623f005bb5bc55c3d3e1843578a29336c31b0330..9d8b2101a2a402ef97a00dd7da771f13a4c25337 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
@@ -219,39 +219,6 @@ class GeneralUtilityTest extends UnitTestCase
         $this->assertSame($expected, GeneralUtility::_POST($key));
     }
 
-    ///////////////////////////////
-    // Tests concerning _GETset
-    ///////////////////////////////
-    /**
-     * @test
-     * @dataProvider getSetDataProvider
-     */
-    public function canSetNewGetInputValues($input, $key, $expected, $getPreset = [])
-    {
-        $_GET = $getPreset;
-        GeneralUtility::_GETset($input, $key);
-        $this->assertSame($expected, $_GET);
-    }
-
-    /**
-     * Data provider for canSetNewGetInputValues
-     *
-     * @return array
-     */
-    public function getSetDataProvider()
-    {
-        return [
-            'No input data used without target key' => [null, null, []],
-            'No input data used with target key' => ['', 'cake', ['cake' => '']],
-            'No target key used with string input data' => ['data', null, []],
-            'No target key used with array input data' => [['cake' => 'lie'], null, ['cake' => 'lie']],
-            'Target key and string input data' => ['lie', 'cake', ['cake' => 'lie']],
-            'Replace existing GET data' => ['lie', 'cake', ['cake' => 'lie'], ['cake' => 'is a lie']],
-            'Target key pointing to sublevels and string input data' => ['lie', 'cake|is', ['cake' => ['is' => 'lie']]],
-            'Target key pointing to sublevels and array input data' => [['a' => 'lie'], 'cake|is', ['cake' => ['is' => ['a' => 'lie']]]]
-        ];
-    }
-
     ///////////////////////////
     // Tests concerning cmpIPv4
     ///////////////////////////
@@ -2374,105 +2341,6 @@ class GeneralUtilityTest extends UnitTestCase
         $this->assertSame('\'' . $expected . '\'', GeneralUtility::quoteJSvalue($input));
     }
 
-    ///////////////////////////////
-    // Tests concerning _GETset()
-    ///////////////////////////////
-    /**
-     * @test
-     */
-    public function getSetWritesArrayToGetSystemVariable()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        $getParameters = ['foo' => 'bar'];
-        GeneralUtility::_GETset($getParameters);
-        $this->assertSame($getParameters, $_GET);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetWritesArrayToGlobalsHttpGetVars()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        $getParameters = ['foo' => 'bar'];
-        GeneralUtility::_GETset($getParameters);
-        $this->assertSame($getParameters, $GLOBALS['HTTP_GET_VARS']);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetForArrayDropsExistingValues()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        GeneralUtility::_GETset(['foo' => 'bar']);
-        GeneralUtility::_GETset(['oneKey' => 'oneValue']);
-        $this->assertEquals(['oneKey' => 'oneValue'], $GLOBALS['HTTP_GET_VARS']);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetAssignsOneValueToOneKey()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        GeneralUtility::_GETset('oneValue', 'oneKey');
-        $this->assertEquals('oneValue', $GLOBALS['HTTP_GET_VARS']['oneKey']);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetForOneValueDoesNotDropUnrelatedValues()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        GeneralUtility::_GETset(['foo' => 'bar']);
-        GeneralUtility::_GETset('oneValue', 'oneKey');
-        $this->assertEquals(['foo' => 'bar', 'oneKey' => 'oneValue'], $GLOBALS['HTTP_GET_VARS']);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetCanAssignsAnArrayToASpecificArrayElement()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        GeneralUtility::_GETset(['childKey' => 'oneValue'], 'parentKey');
-        $this->assertEquals(['parentKey' => ['childKey' => 'oneValue']], $GLOBALS['HTTP_GET_VARS']);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetCanAssignAStringValueToASpecificArrayChildElement()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        GeneralUtility::_GETset('oneValue', 'parentKey|childKey');
-        $this->assertEquals(['parentKey' => ['childKey' => 'oneValue']], $GLOBALS['HTTP_GET_VARS']);
-    }
-
-    /**
-     * @test
-     */
-    public function getSetCanAssignAnArrayToASpecificArrayChildElement()
-    {
-        $_GET = [];
-        $GLOBALS['HTTP_GET_VARS'] = [];
-        GeneralUtility::_GETset(['key1' => 'value1', 'key2' => 'value2'], 'parentKey|childKey');
-        $this->assertEquals([
-            'parentKey' => [
-                'childKey' => ['key1' => 'value1', 'key2' => 'value2']
-            ]
-        ], $GLOBALS['HTTP_GET_VARS']);
-    }
-
     ///////////////////////////
     // Tests concerning minifyJavaScript
     ///////////////////////////
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
index c5626d20dbe8e493fa91b567cc8ed35fbd09949e..1d572e405e45cd087a18b225d46a4847b25806de 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
@@ -270,4 +270,133 @@ class GeneralUtilityTest extends UnitTestCase
     {
         $this->assertEquals($expected, GeneralUtility::explodeUrl2Array($input, true));
     }
+
+    ///////////////////////////////
+    // Tests concerning _GETset()
+    ///////////////////////////////
+    /**
+     * @test
+     */
+    public function getSetWritesArrayToGetSystemVariable()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        $getParameters = ['foo' => 'bar'];
+        GeneralUtility::_GETset($getParameters);
+        $this->assertSame($getParameters, $_GET);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetWritesArrayToGlobalsHttpGetVars()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        $getParameters = ['foo' => 'bar'];
+        GeneralUtility::_GETset($getParameters);
+        $this->assertSame($getParameters, $GLOBALS['HTTP_GET_VARS']);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetForArrayDropsExistingValues()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        GeneralUtility::_GETset(['foo' => 'bar']);
+        GeneralUtility::_GETset(['oneKey' => 'oneValue']);
+        $this->assertEquals(['oneKey' => 'oneValue'], $GLOBALS['HTTP_GET_VARS']);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetAssignsOneValueToOneKey()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        GeneralUtility::_GETset('oneValue', 'oneKey');
+        $this->assertEquals('oneValue', $GLOBALS['HTTP_GET_VARS']['oneKey']);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetForOneValueDoesNotDropUnrelatedValues()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        GeneralUtility::_GETset(['foo' => 'bar']);
+        GeneralUtility::_GETset('oneValue', 'oneKey');
+        $this->assertEquals(['foo' => 'bar', 'oneKey' => 'oneValue'], $GLOBALS['HTTP_GET_VARS']);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetCanAssignsAnArrayToASpecificArrayElement()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        GeneralUtility::_GETset(['childKey' => 'oneValue'], 'parentKey');
+        $this->assertEquals(['parentKey' => ['childKey' => 'oneValue']], $GLOBALS['HTTP_GET_VARS']);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetCanAssignAStringValueToASpecificArrayChildElement()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        GeneralUtility::_GETset('oneValue', 'parentKey|childKey');
+        $this->assertEquals(['parentKey' => ['childKey' => 'oneValue']], $GLOBALS['HTTP_GET_VARS']);
+    }
+
+    /**
+     * @test
+     */
+    public function getSetCanAssignAnArrayToASpecificArrayChildElement()
+    {
+        $_GET = [];
+        $GLOBALS['HTTP_GET_VARS'] = [];
+        GeneralUtility::_GETset(['key1' => 'value1', 'key2' => 'value2'], 'parentKey|childKey');
+        $this->assertEquals([
+            'parentKey' => [
+                'childKey' => ['key1' => 'value1', 'key2' => 'value2']
+            ]
+        ], $GLOBALS['HTTP_GET_VARS']);
+    }
+
+    /**
+     * @test
+     * @dataProvider getSetDataProvider
+     */
+    public function canSetNewGetInputValues($input, $key, $expected, $getPreset = [])
+    {
+        $_GET = $getPreset;
+        GeneralUtility::_GETset($input, $key);
+        $this->assertSame($expected, $_GET);
+    }
+
+    /**
+     * Data provider for canSetNewGetInputValues
+     *
+     * @return array
+     */
+    public function getSetDataProvider()
+    {
+        return [
+            'No input data used without target key' => [null, null, []],
+            'No input data used with target key' => ['', 'cake', ['cake' => '']],
+            'No target key used with string input data' => ['data', null, []],
+            'No target key used with array input data' => [['cake' => 'lie'], null, ['cake' => 'lie']],
+            'Target key and string input data' => ['lie', 'cake', ['cake' => 'lie']],
+            'Replace existing GET data' => ['lie', 'cake', ['cake' => 'lie'], ['cake' => 'is a lie']],
+            'Target key pointing to sublevels and string input data' => ['lie', 'cake|is', ['cake' => ['is' => 'lie']]],
+            'Target key pointing to sublevels and array input data' => [['a' => 'lie'], 'cake|is', ['cake' => ['is' => ['a' => 'lie']]]]
+        ];
+    }
 }
diff --git a/typo3/sysext/extbase/Tests/Unit/Configuration/BackendConfigurationManagerTest.php b/typo3/sysext/extbase/Tests/Unit/Configuration/BackendConfigurationManagerTest.php
index 1f004812af8d989190417c6a188143fa19194437..4f64722346aff08f05d345f4e53949d250764b6e 100644
--- a/typo3/sysext/extbase/Tests/Unit/Configuration/BackendConfigurationManagerTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Configuration/BackendConfigurationManagerTest.php
@@ -47,7 +47,7 @@ class BackendConfigurationManagerTest extends \TYPO3\TestingFramework\Core\Unit\
      */
     public function getCurrentPageIdReturnsPageIdFromGet()
     {
-        \TYPO3\CMS\Core\Utility\GeneralUtility::_GETset(['id' => 123]);
+        $_GET['id'] = 123;
         $expectedResult = 123;
         $actualResult = $this->backendConfigurationManager->_call('getCurrentPageId');
         $this->assertEquals($expectedResult, $actualResult);
@@ -58,7 +58,7 @@ class BackendConfigurationManagerTest extends \TYPO3\TestingFramework\Core\Unit\
      */
     public function getCurrentPageIdReturnsPageIdFromPost()
     {
-        \TYPO3\CMS\Core\Utility\GeneralUtility::_GETset(['id' => 123]);
+        $_GET['id'] = 123;
         $_POST['id'] = 321;
         $expectedResult = 321;
         $actualResult = $this->backendConfigurationManager->_call('getCurrentPageId');
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php
index 439a6c9a7d0e89c0ab0a0209175a9ad9df1c1d47..38a36fcda061b5626e05320c2c82e59bcd30268d 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php
@@ -220,7 +220,9 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriKeepsQueryParametersIfAddQueryStringIsSet()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path', 'id' => 'pageId', 'foo' => 'bar']);
+        $_GET['route'] = '/test/Path';
+        $_GET['id'] = 'pageId';
+        $_GET['foo'] = 'bar';
         $_POST = [];
         $_POST['foo2'] = 'bar2';
         $this->uriBuilder->setAddQueryString(true);
@@ -235,7 +237,9 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriKeepsQueryParametersIfAddQueryStringMethodIsNotSet()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path', 'id' => 'pageId', 'foo' => 'bar']);
+        $_GET['route'] = '/test/Path';
+        $_GET['id'] = 'pageId';
+        $_GET['foo'] = 'bar';
         $_POST = [];
         $_POST['foo2'] = 'bar2';
         $this->uriBuilder->setAddQueryString(true);
@@ -330,7 +334,7 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriRemovesSpecifiedQueryParametersIfArgumentsToBeExcludedFromQueryStringIsSet(array $parameters, array $postArguments, array $excluded, $expected)
     {
-        GeneralUtility::_GETset($parameters);
+        $_GET = array_replace_recursive($_GET, $parameters);
         $_POST = $postArguments;
         $this->uriBuilder->setAddQueryString(true);
         $this->uriBuilder->setAddQueryStringMethod('GET,POST');
@@ -344,7 +348,7 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriKeepsModuleQueryParametersIfAddQueryStringIsNotSet()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path', 'id' => 'pageId', 'foo' => 'bar']);
+        $_GET = (['route' => '/test/Path', 'id' => 'pageId', 'foo' => 'bar']);
         $expectedResult = '/typo3/index.php?route=%2Ftest%2FPath&token=dummyToken&id=pageId';
         $actualResult = $this->uriBuilder->buildBackendUri();
         $this->assertEquals($expectedResult, $actualResult);
@@ -355,7 +359,7 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriMergesAndOverrulesQueryParametersWithArguments()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path', 'id' => 'pageId', 'foo' => 'bar']);
+        $_GET = ['route' => '/test/Path', 'id' => 'pageId', 'foo' => 'bar'];
         $this->uriBuilder->setArguments(['route' => '/test/Path2', 'somePrefix' => ['bar' => 'baz']]);
         $expectedResult = '/typo3/index.php?route=%2Ftest%2FPath2&token=dummyToken&id=pageId&somePrefix%5Bbar%5D=baz';
         $actualResult = $this->uriBuilder->buildBackendUri();
@@ -367,7 +371,7 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriConvertsDomainObjectsAfterArgumentsHaveBeenMerged()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path']);
+        $_GET['route'] = '/test/Path';
         $mockDomainObject = $this->getAccessibleMock(AbstractEntity::class, ['dummy']);
         $mockDomainObject->_set('uid', '123');
         $this->uriBuilder->setArguments(['somePrefix' => ['someDomainObject' => $mockDomainObject]]);
@@ -381,7 +385,7 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriRespectsSection()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path']);
+        $_GET['route'] = '/test/Path';
         $this->uriBuilder->setSection('someSection');
         $expectedResult = '/typo3/index.php?route=%2Ftest%2FPath&token=dummyToken#someSection';
         $actualResult = $this->uriBuilder->buildBackendUri();
@@ -393,7 +397,7 @@ class UriBuilderTest extends UnitTestCase
      */
     public function buildBackendUriCreatesAbsoluteUrisIfSpecified()
     {
-        GeneralUtility::_GETset(['route' => '/test/Path']);
+        $_GET['route'] = '/test/Path';
         $_SERVER['HTTP_HOST'] = 'baseuri';
         $_SERVER['SCRIPT_NAME'] = '/typo3/index.php';
         $_SERVER['ORIG_SCRIPT_NAME'] = '/typo3/index.php';
diff --git a/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php b/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
index c11e0e4833d2239971d82c9d28a4f43cedef5361..fe3f4a7fff5e0d720e1e8b6c217d8af33f741f94 100644
--- a/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
+++ b/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
@@ -103,6 +103,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
         'clearPageCacheContent_pidList' => 'Using $TSFE->clearPageCacheContent_pidList() has been marked as internal as its purpose is to be managed from within TSFE directly.',
         'setSysLastChanged' => 'Using $TSFE->setSysLastChanged() has been marked as internal as its purpose is to be managed from within TSFE directly.',
         'contentStrReplace' => 'Using $TSFE->contentStrReplace() has been marked as internal as its purpose is to be managed from within TSFE directly.',
+        'mergingWithGetVars' => '$TSFE->mergingWithGetVars() will be removed in TYPO3 v10.0. Use a middleware instead to override the PSR-7 request object AND set $_GET on top to achieve the same result.',
     ];
 
     /**
@@ -1663,7 +1664,10 @@ class TypoScriptFrontendController implements LoggerAwareInterface
         $this->context->setAspect('language', GeneralUtility::makeInstance(LanguageAspect::class, $languageId));
         $this->id = $this->page['uid'];
         // For common best-practice reasons, this is set, however, will be optional for new routing mechanisms
-        $this->mergingWithGetVars(['L' => $languageId]);
+        if (!$this->getCurrentSiteLanguage()) {
+            $_GET['L'] = $languageId;
+            $GLOBALS['HTTP_GET_VARS']['L'] = $languageId;
+        }
     }
 
     /**
@@ -2182,8 +2186,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      * Merging values into the global $_GET
      *
      * @param array $GET_VARS Array of key/value pairs that will be merged into the current GET-vars. (Non-escaped values)
+     * @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0. This was mainly used in RealURL to set $id etc. but should be done manually instead.
      */
-    public function mergingWithGetVars($GET_VARS)
+    protected function mergingWithGetVars($GET_VARS)
     {
         if (is_array($GET_VARS)) {
             // Getting $_GET var, unescaped.
@@ -2193,8 +2198,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
             }
             // Merge new values on top:
             ArrayUtility::mergeRecursiveWithOverrule($realGet, $GET_VARS);
-            // Write values back to $_GET:
-            GeneralUtility::_GETset($realGet);
+            // Write values back to $_GET
+            $_GET = $realGet;
+            $GLOBALS['HTTP_GET_VARS'] = $realGet;
             // Setting these specifically (like in the init-function):
             if (isset($GET_VARS['type'])) {
                 $this->type = (int)$GET_VARS['type'];
@@ -2638,7 +2644,8 @@ class TypoScriptFrontendController implements LoggerAwareInterface
         if (!empty($this->config['config']['defaultGetVars.'])) {
             $modifiedGetVars = GeneralUtility::removeDotsFromTS($this->config['config']['defaultGetVars.']);
             ArrayUtility::mergeRecursiveWithOverrule($modifiedGetVars, GeneralUtility::_GET());
-            GeneralUtility::_GETset($modifiedGetVars);
+            $_GET = $modifiedGetVars;
+            $GLOBALS['HTTP_GET_VARS'] = $modifiedGetVars;
         }
 
         // Auto-configure settings when a site is configured
diff --git a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
index 56ecdd234ca01dfa9c795cd0b9875864f4315e12..394e2c13486801529129a2255c84b1e0bf7b4f7f 100644
--- a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
+++ b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
@@ -3523,4 +3523,11 @@ return [
             'Deprecation-86366-MethodsInAbstractUpdate.rst'
         ],
     ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->mergingWithGetVars' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Deprecation-86389-GeneralUtility_GETsetAndTSFE-mergingWithGetVars.rst',
+        ],
+    ],
 ];
diff --git a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallStaticMatcher.php b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallStaticMatcher.php
index 3a99aea7f02fbc0ad92a6564327192a9999df507..b7067b5d5890e4dc69232510c7c6f49ceab4a89a 100644
--- a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallStaticMatcher.php
+++ b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallStaticMatcher.php
@@ -785,4 +785,11 @@ return [
             'Deprecation-85892-VariousMethodsRegardingSysDomainResolving.rst',
         ],
     ],
+    'TYPO3\CMS\Core\Utility\GeneralUtility::_GETset' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 2,
+        'restFiles' => [
+            'Deprecation-86389-GeneralUtility_GETsetAndTSFE-mergingWithGetVars.rst',
+        ],
+    ],
 ];