diff --git a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
index 1492746422e7cd81a64ce293b6740976da4cfb3f..6aae34d4ee0047cffc20204a9aba735adc861310 100644
--- a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
+++ b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
@@ -92,7 +92,7 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
         }
         $this->sortPackagesAndConfiguration();
         $cacheIdentifier = md5(serialize($composer->getLocker()->getLockData()));
-        $this->setPackageCache(new ComposerPackageArtifact(getenv('TYPO3_PATH_APP') . '/var', new Filesystem(), $cacheIdentifier));
+        $this->setPackageCache(new ComposerPackageArtifact($this->config->get('app-dir') . '/var', new Filesystem(), $cacheIdentifier));
         $this->saveToPackageCache();
 
         return true;
@@ -271,7 +271,7 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
      */
     private function scanForRootExtensions(): array
     {
-        $thirdPartyExtensionDir = getenv('TYPO3_PATH_ROOT') . '/typo3conf/ext';
+        $thirdPartyExtensionDir = $this->config->get('root-dir') . '/typo3conf/ext';
         if (!is_dir($thirdPartyExtensionDir) || !$this->hasSubDirectories($thirdPartyExtensionDir)) {
             return [];
         }
diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php
index 5268cc381184833357fcaf5dd9c99ca547750ef1..66079e71bb13686a51ea16d0f36afc5ae65afc4c 100644
--- a/typo3/sysext/core/Classes/Package/PackageManager.php
+++ b/typo3/sysext/core/Classes/Package/PackageManager.php
@@ -249,6 +249,9 @@ class PackageManager implements SingletonInterface
      */
     public function scanAvailablePackages()
     {
+        if (Environment::isComposerMode()) {
+            return;
+        }
         $packagePaths = $this->scanPackagePathsForExtensions();
         $packages = [];
         foreach ($packagePaths as $packageKey => $packagePath) {
diff --git a/typo3/sysext/install/Classes/Controller/UpgradeController.php b/typo3/sysext/install/Classes/Controller/UpgradeController.php
index 92aafe3b71df6ee686ed7bb4a789e3823f214153..f9e8bc44e5b82b4671ade180b2e9b04c7c445932 100644
--- a/typo3/sysext/install/Classes/Controller/UpgradeController.php
+++ b/typo3/sysext/install/Classes/Controller/UpgradeController.php
@@ -211,7 +211,11 @@ class UpgradeController extends AbstractController
     public function cardsAction(ServerRequestInterface $request): ResponseInterface
     {
         $view = $this->initializeStandaloneView($request, 'Upgrade/Cards.html');
-        $view->assign('extensionFoldersInTypo3conf', (new Finder())->directories()->in(Environment::getExtensionsPath())->depth(0)->count());
+        $installedExtensions = 0;
+        if (is_dir(Environment::getExtensionsPath())) {
+            $installedExtensions = (new Finder())->directories()->in(Environment::getExtensionsPath())->depth(0)->count();
+        }
+        $view->assign('extensionFoldersInTypo3conf', $installedExtensions);
         return new JsonResponse([
             'success' => true,
             'html' => $view->render(),
diff --git a/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php b/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php
index 422fca2b0d2a75bab1c09ab53c9b2deb0d94e113..6d8d502681bede6c948a5d4746496ec9ca6ff4e8 100644
--- a/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php
+++ b/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php
@@ -164,13 +164,6 @@ class DefaultFactory
                     'name' => 'typo3conf',
                     'type' => DirectoryNode::class,
                     'targetPermission' => $directoryPermission,
-                    'children' => [
-                        [
-                            'name' => 'ext',
-                            'type' => DirectoryNode::class,
-                            'targetPermission' => $directoryPermission,
-                        ],
-                    ],
                 ],
                 $this->getFileadminStructure(),
             ];
diff --git a/typo3/sysext/install/Classes/Service/LanguagePackService.php b/typo3/sysext/install/Classes/Service/LanguagePackService.php
index ae39779b61caa7db6a963b0b4dec43eb93f38cb3..e25c04c78ced89288862ab6d958a2e3ab67d4d16 100644
--- a/typo3/sysext/install/Classes/Service/LanguagePackService.php
+++ b/typo3/sysext/install/Classes/Service/LanguagePackService.php
@@ -217,15 +217,8 @@ class LanguagePackService
             throw new \RuntimeException('Language iso code ' . (string)$iso . ' not available or active', 1520117054);
         }
         $packageManager = GeneralUtility::makeInstance(PackageManager::class);
-        $activePackages = $packageManager->getActivePackages();
-        $packageActive = false;
-        foreach ($activePackages as $package) {
-            if ($package->getPackageKey() === $key) {
-                $packageActive = true;
-                break;
-            }
-        }
-        if (!$packageActive) {
+        $package = $packageManager->getActivePackages()[$key] ?? null;
+        if (!$package) {
             throw new \RuntimeException('Extension ' . (string)$key . ' not loaded', 1520117245);
         }
 
@@ -234,9 +227,8 @@ class LanguagePackService
         // Allow to modify the base url on the fly
         $event = $this->eventDispatcher->dispatch(new ModifyLanguagePackRemoteBaseUrlEvent(new Uri($languagePackBaseUrl), $key));
         $languagePackBaseUrl = $event->getBaseUrl();
-        $path = ExtensionManagementUtility::extPath($key);
         $majorVersion = GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion();
-        if (strpos($path, '/sysext/') !== false) {
+        if ($package->getValueFromComposerManifest('type') === 'typo3-cms-framework') {
             // This is a system extension and the package URL should be adapted to have different packs per core major version
             // https://localize.typo3.org/xliff/b/a/backend-l10n/backend-l10n-fr.v9.zip
             $packageUrl = $key[0] . '/' . $key[1] . '/' . $key . '-l10n/' . $key . '-l10n-' . $iso . '.v' . $majorVersion . '.zip';