diff --git a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
index 04b1a1d9158c80193c887cdbe18d20acc3e34c0a..88f32614ff3cd92a0b7d0f78de5a0a2c1b747388 100644
--- a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
+++ b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
@@ -59,6 +59,11 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
      */
     private $config;
 
+    /**
+     * @var Filesystem $fileSystem
+     */
+    private $fileSystem;
+
     /**
      * Array of Composer package names (as array key) that are installed by Composer but have no relation to TYPO3 extension API
      * @var array
@@ -88,6 +93,7 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
     {
         $this->event = $event;
         $this->config = Config::load($this->event->getComposer(), $this->event->getIO());
+        $this->fileSystem = new Filesystem();
         $composer = $this->event->getComposer();
         $basePath = $this->config->get('base-dir');
         $this->packagesBasePath = $basePath . '/';
@@ -95,13 +101,13 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
             $packagePath = PathUtility::sanitizeTrailingSeparator($path);
             $package = new Package($this, $extensionKey, $packagePath, true);
             $this->setTitleFromExtEmConf($package);
-            $package->makePathRelative(new Filesystem(), $basePath);
+            $package->makePathRelative($this->fileSystem, $basePath);
             $package->getPackageMetaData()->setVersion($composerPackage->getPrettyVersion());
             $this->registerPackage($package);
         }
         $this->sortPackagesAndConfiguration();
         $cacheIdentifier = md5(serialize($composer->getLocker()->getLockData()) . $this->event->isDevMode());
-        $this->setPackageCache(new ComposerPackageArtifact($composer->getConfig()->get('vendor-dir') . '/typo3', new Filesystem(), $cacheIdentifier));
+        $this->setPackageCache(new ComposerPackageArtifact($composer->getConfig()->get('vendor-dir') . '/typo3', $this->fileSystem, $cacheIdentifier));
         $this->saveToPackageCache();
 
         return true;
@@ -246,10 +252,9 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
         if (!str_contains($typo3ExtensionInstallPath, self::LEGACY_EXTENSION_INSTALL_PATH)) {
             return [$rootPackage, $baseDir, $extensionKey];
         }
-        $filesystem = new Filesystem();
-        if (!file_exists($typo3ExtensionInstallPath) && !$filesystem->isSymlinkedDirectory($typo3ExtensionInstallPath)) {
-            $filesystem->ensureDirectoryExists(dirname($typo3ExtensionInstallPath));
-            $filesystem->relativeSymlink($baseDir, $typo3ExtensionInstallPath);
+        if (!file_exists($typo3ExtensionInstallPath) && !$this->fileSystem->isSymlinkedDirectory($typo3ExtensionInstallPath)) {
+            $this->fileSystem->ensureDirectoryExists(dirname($typo3ExtensionInstallPath));
+            $this->fileSystem->relativeSymlink($baseDir, $typo3ExtensionInstallPath);
         }
         if (realpath($baseDir) !== realpath($typo3ExtensionInstallPath)) {
             $this->event->getIO()->warning('The root package is of type "typo3-cms-extension" and has public resources, but could not be linked to "' . self::LEGACY_EXTENSION_INSTALL_PATH . '" directory, because target directory already exits.');
@@ -260,7 +265,6 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
 
     private function publishResources(array $installedTypo3Packages): void
     {
-        $fileSystem = new Filesystem();
         $baseDir = $this->config->get('base-dir');
         foreach ($installedTypo3Packages as [$composerPackage, $path, $extensionKey]) {
             $fileSystemResourcesPath = $path . '/Resources/Public';
@@ -269,12 +273,12 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
             }
             $relativePath = substr($fileSystemResourcesPath, strlen($baseDir));
             [$relativePrefix] = explode('Resources/Public', $relativePath);
-            $publicResourcesPath = $fileSystem->normalizePath($this->config->get('web-dir') . '/_assets/' . md5($relativePrefix));
-            $fileSystem->ensureDirectoryExists(dirname($publicResourcesPath));
-            if (Platform::isWindows() && !$fileSystem->isJunction($publicResourcesPath)) {
-                $fileSystem->junction($fileSystemResourcesPath, $publicResourcesPath);
-            } elseif (!$fileSystem->isSymlinkedDirectory($publicResourcesPath)) {
-                $fileSystem->relativeSymlink($fileSystemResourcesPath, $publicResourcesPath);
+            $publicResourcesPath = $this->fileSystem->normalizePath($this->config->get('web-dir') . '/_assets/' . md5($relativePrefix));
+            $this->fileSystem->ensureDirectoryExists(dirname($publicResourcesPath));
+            if (Platform::isWindows() && !$this->fileSystem->isJunction($publicResourcesPath)) {
+                $this->fileSystem->junction($fileSystemResourcesPath, $publicResourcesPath);
+            } elseif (!$this->fileSystem->isSymlinkedDirectory($publicResourcesPath)) {
+                $this->fileSystem->relativeSymlink($fileSystemResourcesPath, $publicResourcesPath);
             }
         }
     }