diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst
new file mode 100644
index 0000000000000000000000000000000000000000..26f2228c2e47463ad49479602fd8999a46d0164b
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst
@@ -0,0 +1,53 @@
+.. include:: ../../Includes.txt
+
+=====================================================================
+Deprecation: #86047 - TSFE properties / methods and change visibility
+=====================================================================
+
+See :issue:`86047`
+
+Description
+===========
+
+The following properties have changed their visibility to be protected from public.
+
+* :php:`TypoScriptFrontendController->pageAccessFailureHistory`
+* :php:`TypoScriptFrontendController->workspacePreview` (not in use anymore)
+* :php:`TypoScriptFrontendController->ADMCMD_preview_BEUSER_uid` (not in use anymore)
+* :php:`TypoScriptFrontendController->debug` (not in use anymore)
+* :php:`TypoScriptFrontendController->MP_defaults` (not in use anymore outside of TSFE)
+* :php:`TypoScriptFrontendController->loginAllowedInBranch` (use checkIfLoginAllowedInBranch())
+
+The following methods have changed their signature to be protected, as their purpose is to be called from
+within :php:`TypoScriptFrontendController`.
+
+* :php:`TypoScriptFrontendController->tempPageCacheContent()`
+* :php:`TypoScriptFrontendController->realPageCacheContent()`
+* :php:`TypoScriptFrontendController->setPageCacheContent()`
+* :php:`TypoScriptFrontendController->clearPageCacheContent_pidList()`
+* :php:`TypoScriptFrontendController->setSysLastChanged()`
+* :php:`TypoScriptFrontendController->contentStrReplace()`
+
+
+Impact
+======
+
+Calling any of the PHP methods will trigger a deprecation warning, as well as setting any of the
+previously public properties.
+
+
+Affected Installations
+======================
+
+Any TYPO3 installation with extensions directly calling one of the methods or using one of the
+public properties.
+
+
+Migration
+=========
+
+For :php:`TypoScriptFrontendController->ADMCMD_preview_BEUSER_uid` use the backend.user aspect of the Context API.
+For :php:`TypoScriptFrontendController->workspacePreview` use the workspace aspect of the Context API.
+For :php:`TypoScriptFrontendController->loginAllowedInBranch` use the method :php:`checkIfLoginAllowedInBranch()` instead.
+
+.. index:: Frontend, FullyScanned, ext:frontend
diff --git a/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php b/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
index 860835db40e8e1bbe69b46a3f293e60d23ba85d8..b384c69858f6e78bdddc4b2a6a8f0421ef6a7c0f 100644
--- a/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
+++ b/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
@@ -24,6 +24,7 @@ use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Charset\CharsetConverter;
 use TYPO3\CMS\Core\Charset\UnknownCharsetException;
+use TYPO3\CMS\Core\Compatibility\PublicMethodDeprecationTrait;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\DateTimeAspect;
 use TYPO3\CMS\Core\Context\LanguageAspect;
@@ -93,6 +94,16 @@ use TYPO3\CMS\Frontend\Resource\FilePathSanitizer;
 class TypoScriptFrontendController implements LoggerAwareInterface
 {
     use LoggerAwareTrait;
+    use PublicMethodDeprecationTrait;
+
+    protected $deprecatedPublicMethods = [
+        'tempPageCacheContent' => 'Using $TSFE->tempPageCacheContent() has been marked as internal as its purpose is to be managed from within TSFE directly.',
+        'realPageCacheContent' => 'Using $TSFE->realPageCacheContent() has been marked as internal as its purpose is to be managed from within TSFE directly.',
+        'setPageCacheContent' => 'Using $TSFE->setPageCacheContent() has been marked as internal as its purpose is to be managed from within TSFE directly.',
+        '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.',
+    ];
 
     /**
      * The page id (int)
@@ -190,8 +201,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     /**
      * Array containing a history of why a requested page was not accessible.
      * @var array
+     * @deprecated this value has a protected visibility now, as it is only used for internal purpose. Use "getPageAccessFailureReasons()" instead.
      */
-    public $pageAccessFailureHistory = [];
+    protected $pageAccessFailureHistory = [];
 
     /**
      * @var string
@@ -251,14 +263,15 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      * Integer, that indicates which workspace is being previewed.
      * Not in use anymore, as this is part of the workspace preview functionality, use $TSFE->whichWorkspace() instead.
      * @var int
+     * @deprecated since TYPO3 v9.4, will be removed in TYPO3 v10.0. User the information within the context "workspace" aspect.
      */
-    public $workspacePreview = 0;
+    protected $workspacePreview = 0;
 
     /**
      * Shows whether logins are allowed in branch
      * @var bool
      */
-    public $loginAllowedInBranch = true;
+    protected $loginAllowedInBranch = true;
 
     /**
      * Shows specific mode (all or groups)
@@ -269,8 +282,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     /**
      * Set to backend user ID to initialize when keyword-based preview is used
      * @var int
+     * @deprecated since TYPO3 v9.4, will be removed in TYPO3 v10.0. User the information within the context "backend.user" aspect.
      */
-    public $ADMCMD_preview_BEUSER_uid = 0;
+    protected $ADMCMD_preview_BEUSER_uid = 0;
 
     /**
      * Flag indication that preview is active. This is based on the login of a
@@ -472,8 +486,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     /**
      * Debug flag. If TRUE special debug-output maybe be shown (which includes html-formatting).
      * @var bool
+     * @deprecated this property is not in use anymore and will be removed in TYPO3 v10.0.
      */
-    public $debug = false;
+    protected $debug = false;
 
     /**
      * Default internal target
@@ -497,8 +512,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      * Keys are page ids and values are default &MP (mount point) values to set
      * when using the linking features...)
      * @var array
+     * @deprecated this property is not in use anymore and will be removed in TYPO3 v10.0.
      */
-    public $MP_defaults = [];
+    protected $MP_defaults = [];
 
     /**
      * If set, typolink() function encrypts email addresses. Is set in pagegen-class.
@@ -3210,9 +3226,10 @@ class TypoScriptFrontendController implements LoggerAwareInterface
 
     /**
      * Temp cache content
-     * The temporary cache will expire after a few seconds (typ. 30) or will be cleared by the rendered page, which will also clear and rewrite the cache.
+     * The temporary cache will expire after a few seconds (typ. 30) or will be cleared by the rendered page,
+     * which will also clear and rewrite the cache.
      */
-    public function tempPageCacheContent()
+    protected function tempPageCacheContent()
     {
         $this->tempContent = false;
         if (!$this->no_cache) {
@@ -3265,7 +3282,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     /**
      * Set cache content to $this->content
      */
-    public function realPageCacheContent()
+    protected function realPageCacheContent()
     {
         // seconds until a cached page is too old
         $cacheTimeout = $this->get_cache_timeout();
@@ -3298,7 +3315,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      * @param int $expirationTstamp Expiration timestamp
      * @see realPageCacheContent(), tempPageCacheContent()
      */
-    public function setPageCacheContent($content, $data, $expirationTstamp)
+    protected function setPageCacheContent($content, $data, $expirationTstamp)
     {
         $cacheData = [
             'identifier' => $this->newHash,
@@ -3343,7 +3360,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      *
      * @param string $pidList A list of INTEGER numbers which points to page uids for which to clear entries in the cache_pages cache (page content cache)
      */
-    public function clearPageCacheContent_pidList($pidList)
+    protected function clearPageCacheContent_pidList($pidList)
     {
         $pageIds = GeneralUtility::trimExplode(',', $pidList);
         foreach ($pageIds as $pageId) {
@@ -3357,7 +3374,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      *
      * @see ContentObjectRenderer::lastChanged()
      */
-    public function setSysLastChanged()
+    protected function setSysLastChanged()
     {
         // We only update the info if browsing the live workspace
         if (!$this->doWorkspacePreview() && $this->page['SYS_LASTCHANGED'] < (int)$this->register['SYS_LASTCHANGED']) {
@@ -3997,7 +4014,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     /**
      * Substitute various tokens in content. This should happen only if the content is not cached by proxies or client browsers.
      */
-    public function contentStrReplace()
+    protected function contentStrReplace()
     {
         $search = [];
         $replace = [];
@@ -4954,7 +4971,6 @@ class TypoScriptFrontendController implements LoggerAwareInterface
 
     /**
      * Deprecation messages for TYPO3 v9 - public properties of TSFE which have been moved as
-     * @todo: ensure that TypoScript conditions make use of this as well.
      */
 
     /**
@@ -4998,6 +5014,21 @@ class TypoScriptFrontendController implements LoggerAwareInterface
             case 'showHiddenRecords':
                 trigger_error('Property $TSFE->showHiddenRecords is not in use anymore as this information is now stored within the visibility aspect.', E_USER_DEPRECATED);
                 return isset($this->$propertyName);
+            case 'ADMCMD_preview_BEUSER_uid':
+                trigger_error('Property $TSFE->ADMCMD_preview_BEUSER_uid is not in use anymore as this information is now stored within the backend.user aspect.', E_USER_DEPRECATED);
+                return isset($this->$propertyName);
+            case 'workspacePreview':
+                trigger_error('Property $TSFE->workspacePreview is not in use anymore as this information is now stored within the workspace aspect.', E_USER_DEPRECATED);
+                return isset($this->$propertyName);
+            case 'loginAllowedInBranch':
+                trigger_error('Property $TSFE->loginAllowedInBranch is marked as protected now as it only contains internal state. Use checkIfLoginAllowedInBranch() instead.', E_USER_DEPRECATED);
+                return isset($this->$propertyName);
+            // Regular deprecations / property visibility changes
+            case 'MP_defaults':
+            case 'debug':
+            case 'pageAccessFailureHistory':
+                trigger_error('Property $TSFE->' . $propertyName . ' is marked as protected now as it only contains internal state.', E_USER_DEPRECATED);
+                return isset($this->$propertyName);
         }
         return false;
     }
@@ -5041,6 +5072,21 @@ class TypoScriptFrontendController implements LoggerAwareInterface
             case 'showHiddenRecords':
                 trigger_error('Property $TSFE->showHiddenRecords is not in use anymore as this information is now stored within the visibility aspect.', E_USER_DEPRECATED);
                 return $this->context->getPropertyFromAspect('visibility', 'includeHiddenContent', false);
+            case 'ADMCMD_preview_BEUSER_uid':
+                trigger_error('Property $TSFE->ADMCMD_preview_BEUSER_uid is not in use anymore as this information is now stored within the backend.user aspect.', E_USER_DEPRECATED);
+                return $this->context->getPropertyFromAspect('backend.user', 'id', 0);
+            case 'workspacePreview':
+                trigger_error('Property $TSFE->workspacePreview is not in use anymore as this information is now stored within the workspace aspect.', E_USER_DEPRECATED);
+                return $this->context->getPropertyFromAspect('workspace', 'id', 0);
+            case 'loginAllowedInBranch':
+                trigger_error('Property $TSFE->loginAllowedInBranch is marked as protected now as it only contains internal state. Use checkIfLoginAllowedInBranch() instead.', E_USER_DEPRECATED);
+                break;
+            // Regular deprecations / property visibility changes
+            case 'MP_defaults':
+            case 'debug':
+            case 'pageAccessFailureHistory':
+                trigger_error('Property $TSFE->' . $propertyName . ' is marked as protected now as it only contains internal state.', E_USER_DEPRECATED);
+                break;
         }
         return $this->$propertyName;
     }
@@ -5155,6 +5201,23 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                 }
                 $this->context->setAspect('visibility', $newAspect);
                 break;
+            case 'ADMCMD_preview_BEUSER_uid':
+                trigger_error('Property $TSFE->ADMCMD_preview_BEUSER_uid is not in use anymore as this information is now stored within the backend.user aspect.', E_USER_DEPRECATED);
+                // No need to update an aspect here
+                break;
+            case 'workspacePreview':
+                trigger_error('Property $TSFE->workspacePreview is not in use anymore as this information is now stored within the workspace aspect.', E_USER_DEPRECATED);
+                $this->context->setAspect('workspace', GeneralUtility::makeInstance(WorkspaceAspect::class, (int)$propertyValue));
+                break;
+            case 'loginAllowedInBranch':
+                trigger_error('Property $TSFE->loginAllowedInBranch is marked as protected now as it only contains internal state. Use checkIfLoginAllowedInBranch() instead.', E_USER_DEPRECATED);
+                break;
+            // Regular deprecations / property visibility changes
+            case 'MP_defaults':
+            case 'debug':
+            case 'pageAccessFailureHistory':
+                trigger_error('Property $TSFE->' . $propertyName . ' is marked as protected now as it only contains internal state.', E_USER_DEPRECATED);
+                break;
         }
         $this->$propertyName = $propertyValue;
     }
@@ -5214,6 +5277,23 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                 }
                 $this->context->setAspect('visibility', $newAspect);
                 break;
+            case 'ADMCMD_preview_BEUSER_uid':
+                trigger_error('Property $TSFE->ADMCMD_preview_BEUSER_uid is not in use anymore as this information is now stored within the backend.user aspect.', E_USER_DEPRECATED);
+                // No need to update an aspect here
+                break;
+            case 'workspacePreview':
+                trigger_error('Property $TSFE->workspacePreview is not in use anymore as this information is now stored within the workspace aspect.', E_USER_DEPRECATED);
+                $this->context->setAspect('workspace', GeneralUtility::makeInstance(WorkspaceAspect::class, 0));
+                break;
+            case 'loginAllowedInBranch':
+                trigger_error('Property $TSFE->loginAllowedInBranch is marked as protected now as it only contains internal state. Use checkIfLoginAllowedInBranch() instead.', E_USER_DEPRECATED);
+                break;
+            // Regular deprecations / property visibility changes
+            case 'MP_defaults':
+            case 'debug':
+            case 'pageAccessFailureHistory':
+                trigger_error('Property $TSFE->' . $propertyName . ' is marked as protected now as it only contains internal state.', E_USER_DEPRECATED);
+                break;
         }
         unset($this->$propertyName);
     }
diff --git a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
index 0c9945aab5ab0505ac4b9679685caffffad9ec54..6aeb48bb04722b23c56437b9c6e1179cd7fe27a4 100644
--- a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
+++ b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
@@ -3348,4 +3348,46 @@ return [
             'Deprecation-85031-ProtectedImportExportController.rst',
         ],
     ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->tempPageCacheContent' => [
+        'numberOfMandatoryArguments' => 0,
+        'maximumNumberOfArguments' => 0,
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->realPageCacheContent' => [
+        'numberOfMandatoryArguments' => 0,
+        'maximumNumberOfArguments' => 0,
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->setPageCacheContent' => [
+        'numberOfMandatoryArguments' => 3,
+        'maximumNumberOfArguments' => 3,
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->clearPageCacheContent_pidList' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->setSysLastChanged' => [
+        'numberOfMandatoryArguments' => 0,
+        'maximumNumberOfArguments' => 0,
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->contentStrReplace' => [
+        'numberOfMandatoryArguments' => 0,
+        'maximumNumberOfArguments' => 0,
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
 ];
diff --git a/typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyProtectedMatcher.php b/typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyProtectedMatcher.php
index 249caae0389511702122adc3f99b85c0028e2adc..631b2413a8a44846b131fc5cae63c2a7c2ef6c11 100644
--- a/typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyProtectedMatcher.php
+++ b/typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyProtectedMatcher.php
@@ -862,4 +862,34 @@ return [
             'Deprecation-86110-FrontendEditingController.rst',
         ],
     ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->ADMCMD_preview_BEUSER_uid' => [
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->workspacePreview' => [
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->loginAllowedInBranch' => [
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->MP_defaults' => [
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->debug' => [
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->pageAccessFailureHistory' => [
+        'restFiles' => [
+            'Deprecation-86047-TSFEPropertiesMethodsAndChangeVisibility.rst',
+        ],
+    ],
 ];