public static function getTSFE($id, $typeNum)
    {
        // Initialize the tracker if necessary
        if (!is_object($GLOBALS['TT'])) {
            $GLOBALS['TT'] = new TimeTracker(false);
            $GLOBALS['TT']->start();
        }

        if (!array_key_exists("$id/$typeNum", self::$frontendControllers)) {
            $tsfeBackup      = empty($GLOBALS['TSFE']) ? null : $GLOBALS['TSFE'];
            $GLOBALS['TSFE'] = GeneralUtility::makeInstance(
                TypoScriptFrontendController::class,
                $GLOBALS['TYPO3_CONF_VARS'],
                $id,
                $typeNum
            );

            $GLOBALS['TSFE']->sys_page = GeneralUtility::makeInstance(PageRepository::class);
            $GLOBALS['TSFE']->sys_page->init(true);
            $GLOBALS['TSFE']->connectToDB();
            $GLOBALS['TSFE']->initFEuser();
            $GLOBALS['TSFE']->determineId();
            $GLOBALS['TSFE']->initTemplate();
            $GLOBALS['TSFE']->rootLine = $GLOBALS['TSFE']->sys_page->getRootLine($id, '');

            try {
                $GLOBALS['TSFE']->getConfigArray();
            } catch (ServiceUnavailableException $e) {
                // Skip unconfigured page type
            }

            // Calculate the absolute path prefix
            if (!empty($GLOBALS['TSFE']->config['config']['absRefPrefix'])) {
                $absRefPrefix                  = trim($GLOBALS['TSFE']->config['config']['absRefPrefix']);
                $GLOBALS['TSFE']->absRefPrefix = ($absRefPrefix === 'auto') ? GeneralUtility::getIndpEnv(
                    'TYPO3_SITE_PATH'
                ) : $absRefPrefix;
            } else {
                $GLOBALS['TSFE']->absRefPrefix = '';
            }

            self::$frontendControllers["$id/$typeNum"] = $GLOBALS['TSFE'];

            if ($tsfeBackup) {
                $GLOBALS['TSFE'] = $tsfeBackup;
            } else {
                unset($GLOBALS['TSFE']);
            }
        }

        return self::$frontendControllers["$id/$typeNum"];
    }