diff --git a/typo3/sysext/install/Classes/Command/SetupCommand.php b/typo3/sysext/install/Classes/Command/SetupCommand.php
index 30e03a309e0b530deaec1d8c9e9a25cd6458b106..e38f99adaa8adc3b60030a7f666d543da83429ae 100644
--- a/typo3/sysext/install/Classes/Command/SetupCommand.php
+++ b/typo3/sysext/install/Classes/Command/SetupCommand.php
@@ -28,6 +28,7 @@ use Symfony\Component\Console\Question\ConfirmationQuestion;
 use Symfony\Component\Console\Question\Question;
 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
 use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Package\FailsafePackageManager;
 use TYPO3\CMS\Core\Resource\Exception\ExistingTargetFileNameException;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -56,7 +57,8 @@ class SetupCommand extends Command
         private readonly SetupDatabaseService $setupDatabaseService,
         private readonly SetupService $setupService,
         private readonly ConfigurationManager $configurationManager,
-        private readonly LateBootService $lateBootService
+        private readonly LateBootService $lateBootService,
+        private readonly FailsafePackageManager $packageManager,
     ) {
         parent::__construct($name);
 
@@ -210,6 +212,8 @@ EOT
         $serverType = $this->getServerType($questionHelper, $input, $output);
         $folderStructureFactory = GeneralUtility::makeInstance(DefaultFactory::class);
         $folderStructureFactory->getStructure($serverType)->fix();
+        // Ensure existing PackageStates.php for non-composer installation.
+        $this->packageManager->recreatePackageStatesFileIfMissing(true);
 
         try {
             $force = $input->getOption('force');
diff --git a/typo3/sysext/install/Classes/Service/SetupService.php b/typo3/sysext/install/Classes/Service/SetupService.php
index 94c55991d32057f68811a34e2fe980deb5c21a18..bedc731a57d486b60056b40ed6a549e1da13b05c 100644
--- a/typo3/sysext/install/Classes/Service/SetupService.php
+++ b/typo3/sysext/install/Classes/Service/SetupService.php
@@ -135,7 +135,9 @@ class SetupService
             );
         }
 
-        // @todo: Remove once LocalConfiguration.php support was dropped.
+        // @todo Remove once LocalConfiguration.php support was dropped.
+        // @todo Web installer creates default configuration based on default factory configuration. Recheck if we
+        //       should use this here too instead of an empty array.
         // Ugly hack to write system/settings.php, to avoid fallback to
         // LocalConfiguration.php causing issues because it does not exist!
         @unlink($configurationFileLocation);
diff --git a/typo3/sysext/install/Classes/ServiceProvider.php b/typo3/sysext/install/Classes/ServiceProvider.php
index f72e507cf137a6e055a9971f44d2e59ef2ceb5ac..a2d41531d27313b4cc49250beac2970aac0be23f 100644
--- a/typo3/sysext/install/Classes/ServiceProvider.php
+++ b/typo3/sysext/install/Classes/ServiceProvider.php
@@ -359,7 +359,8 @@ class ServiceProvider extends AbstractServiceProvider
             $container->get(Service\SetupDatabaseService::class),
             $container->get(Service\SetupService::class),
             $container->get(ConfigurationManager::class),
-            $container->get(LateBootService::class)
+            $container->get(LateBootService::class),
+            $container->get(FailsafePackageManager::class),
         );
     }