diff --git a/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php b/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php
index e6a832537889e05be7c8b9c4641074ee9c3258dc..ac778868ba49fdd8f4503c048896b934cc379936 100644
--- a/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php
+++ b/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php
@@ -6,7 +6,6 @@ use Drupal\package_manager\ProjectInfo;
 use Drupal\automatic_updates_extensions\ExtensionUpdater;
 use Drupal\package_manager\LegacyVersionUtility;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
-use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
@@ -63,43 +62,6 @@ final class UpdateReleaseValidator implements EventSubscriberInterface {
     return FALSE;
   }
 
-  /**
-   * Checks that the packages are secure and supported.
-   *
-   * @param \Drupal\package_manager\Event\PreApplyEvent $event
-   *   The event object.
-   */
-  public function checkStagedReleases(PreApplyEvent $event): void {
-    $messages = [];
-
-    // Get packages that were installed and also updated in the staging area.
-    $active = $event->getStage()->getActiveComposer();
-    $staged = $event->getStage()->getStageComposer();
-    $updated_packages = $staged->getPackagesWithDifferentVersionsIn($active);
-    foreach ($updated_packages as $staged_package) {
-      if (!in_array($staged_package->getType(),
-        ['drupal-module', 'drupal-theme'], TRUE)) {
-        continue;
-      }
-      $project_name = $staged->getProjectForPackage($staged_package->getName());
-      $semantic_version = $staged_package->getPrettyVersion();
-      if (!$this->isSupportedRelease($project_name, $semantic_version)) {
-        $messages[] = $this->t('Project @project_name to version @version', [
-          '@project_name' => $project_name,
-          '@version' => $semantic_version,
-        ]);
-      }
-    }
-    if ($messages) {
-      $summary = $this->formatPlural(
-        count($messages),
-        'Cannot update because the following project version is not in the list of installable releases.',
-        'Cannot update because the following project versions are not in the list of installable releases.'
-      );
-      $event->addError($messages, $summary);
-    }
-  }
-
   /**
    * Checks that the update projects are secure and supported.
    *
@@ -144,7 +106,6 @@ final class UpdateReleaseValidator implements EventSubscriberInterface {
   public static function getSubscribedEvents() {
     return [
       PreCreateEvent::class => 'checkRelease',
-      PreApplyEvent::class => 'checkStagedReleases',
     ];
   }
 
diff --git a/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php b/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php
index c610ed11239b6874e35bf2bae1a53d15590912d8..14c5cddb47259ea4e402818e9496e4cf67f76cb3 100644
--- a/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php
+++ b/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php
@@ -19,7 +19,7 @@ abstract class AutomaticUpdatesExtensionsKernelTestBase extends AutomaticUpdates
    */
   protected static $modules = [
     'automatic_updates_extensions',
-    'automatic_updates_test_release_history',
+    'package_manager_test_release_history',
   ];
 
   /**
diff --git a/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php b/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php
index a7fc66d7b7357e989e18f00cdbcea36d762ca348..42c3068a9f4e8187bb7d253f7610c661e0141f03 100644
--- a/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php
+++ b/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php
@@ -22,6 +22,7 @@ class PackagesInstalledWithComposerValidatorTest extends AutomaticUpdatesExtensi
     // In this test, we don't care whether the updated projects are secure and
     // supported.
     $this->disableValidators[] = 'automatic_updates_extensions.validator.target_release';
+    $this->disableValidators[] = 'package_manager.validator.supported_releases';
     // @todo The validator being tested covers the same cases as the following
     //   validator. PackagesInstalledWithComposerValidatorTest will be removed
     //   in https://drupal.org/i/3303900.
diff --git a/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php b/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php
index 0c6918e2d8cc49c1fc8382fa8a6241a9abe400f7..b83fc5b7d9616390f7db02a91da2e48ee2fe9625 100644
--- a/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php
+++ b/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php
@@ -3,7 +3,6 @@
 namespace Drupal\Tests\automatic_updates_extensions\Kernel\Validator;
 
 use Drupal\package_manager\LegacyVersionUtility;
-use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
 use Drupal\package_manager\ValidationResult;
 use Drupal\Tests\automatic_updates_extensions\Kernel\AutomaticUpdatesExtensionsKernelTestBase;
@@ -80,80 +79,4 @@ class UpdateReleaseValidatorTest extends AutomaticUpdatesExtensionsKernelTestBas
     $this->assertUpdateResults([$project => $target_version], $expected_results, PreCreateEvent::class);
   }
 
-  /**
-   * Data provider for testPreApplyException().
-   *
-   * @return mixed[][]
-   *   The test cases.
-   */
-  public function providerTestPreApplyException(): array {
-    $fixtures_folder = __DIR__ . '/../../../fixtures/update_release_validator';
-    return [
-      'semver, supported update' => ['semver_test', '8.1.0', '8.1.1', "$fixtures_folder/semver_supported_update_stage", FALSE],
-      'semver, update to unsupported branch' => ['semver_test', '8.1.0', '8.2.0', "$fixtures_folder/semver_unsupported_update_stage", TRUE],
-      'legacy, supported update' => ['aaa_update_test', '8.x-2.0', '8.x-2.1', "$fixtures_folder/legacy_supported_update_stage", FALSE],
-      'legacy, update to unsupported branch' => ['aaa_update_test', '8.x-2.0', '8.x-3.0', "$fixtures_folder/legacy_unsupported_update_stage", TRUE],
-    ];
-  }
-
-  /**
-   * Tests updating to a release during pre-apply.
-   *
-   * @param string $project
-   *   The project to update.
-   * @param string $installed_version
-   *   The installed version of the project.
-   * @param string $target_version
-   *   The target version.
-   * @param string $stage_dir
-   *   Path of fixture stage directory. It will be used as the virtual project's
-   *   stage directory.
-   * @param bool $error_expected
-   *   Whether an error is expected in the update.
-   *
-   * @dataProvider providerTestPreApplyException
-   */
-  public function testPreApplyException(string $project, string $installed_version, string $target_version, string $stage_dir, bool $error_expected): void {
-    $this->enableModules(['aaa_automatic_updates_test', $project]);
-
-    $module_info = ['version' => $installed_version, 'project' => $project];
-    $aaa_automatic_updates_test_info = ['version' => '7.0.0', 'project' => 'aaa_automatic_updates_test'];
-    $this->config('update_test.settings')
-      ->set("system_info.$project", $module_info)
-      ->set("system_info.aaa_automatic_updates_test", $aaa_automatic_updates_test_info)
-      ->save();
-
-    // Path of `active.installed.json` file. It will be used as the virtual
-    // project's active `vendor/composer/installed.json` file.
-    $this->setReleaseMetadata([
-      'aaa_automatic_updates_test' => __DIR__ . "/../../../../../package_manager/tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml",
-      $project => __DIR__ . "/../../../fixtures/release-history/$project.1.1.xml",
-      'drupal' => __DIR__ . '/../../../../../package_manager/tests/fixtures/release-history/drupal.9.8.2.xml',
-    ]);
-    $active_dir = __DIR__ . '/../../../fixtures/update_release_validator/active';
-    $this->copyFixtureFolderToActiveDirectory($active_dir);
-    $this->copyFixtureFolderToStageDirectoryOnApply($stage_dir);
-    if ($error_expected) {
-      $expected_results = [
-        ValidationResult::createError(
-          ["Project $project to version " . LegacyVersionUtility::convertToSemanticVersion($target_version)],
-          t('Cannot update because the following project version is not in the list of installable releases.')
-        ),
-      ];
-    }
-    else {
-      $expected_results = [];
-    }
-
-    // Always updating aaa_automatic_updates_test to 7.0.1(valid release) along
-    // with the project provided for test.
-    $this->assertUpdateResults(
-      [
-        'aaa_automatic_updates_test' => '7.0.1',
-      ],
-      $expected_results,
-      PreApplyEvent::class
-    );
-  }
-
 }
diff --git a/package_manager/package_manager.services.yml b/package_manager/package_manager.services.yml
index 50edf6afdb8f80cde92251aec69d2543a5c15d24..cb63a5f1b1a540da2192652eaafbbb63834b4b59 100644
--- a/package_manager/package_manager.services.yml
+++ b/package_manager/package_manager.services.yml
@@ -179,6 +179,10 @@ services:
     class: Drupal\package_manager\Validator\ComposerPatchesValidator
     tags:
       - { name: event_subscriber }
+  package_manager.validator.supported_releases:
+    class: Drupal\package_manager\Validator\SupportedReleaseValidator
+    tags:
+      - { name: event_subscriber }
   package_manager.update_processor:
     class: Drupal\package_manager\PackageManagerUpdateProcessor
     arguments: [ '@config.factory', '@queue', '@update.fetcher', '@state', '@private_key', '@keyvalue', '@keyvalue.expirable' ]
diff --git a/package_manager/src/Validator/SupportedReleaseValidator.php b/package_manager/src/Validator/SupportedReleaseValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..780cda00ceb8983717a85099502badb9ad82d8af
--- /dev/null
+++ b/package_manager/src/Validator/SupportedReleaseValidator.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Drupal\package_manager\Validator;
+
+use Drupal\Component\Render\FormattableMarkup;
+use Drupal\package_manager\ProjectInfo;
+use Drupal\package_manager\LegacyVersionUtility;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\package_manager\Event\PreApplyEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Validates that updated projects are secure and supported.
+ *
+ * @internal
+ *   This class is an internal part of the module's update handling and
+ *   should not be used by external code.
+ */
+final class SupportedReleaseValidator implements EventSubscriberInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * Checks if the given version of a project is supported.
+   *
+   * Checks if the given version of the given project is in the core update
+   * system's list of known, secure, installable releases of that project.
+   * considered a supported release by verifying if the project is found in the
+   * core update system's list of known, secure, and installable releases.
+   *
+   * @param string $name
+   *   The name of the project.
+   * @param string $semantic_version
+   *   A semantic version number for the project.
+   *
+   * @return bool
+   *   TRUE if the given version of the project is supported, otherwise FALSE.
+   *   given version is not supported will return FALSE.
+   */
+  protected function isSupportedRelease(string $name, string $semantic_version): bool {
+    $supported_releases = (new ProjectInfo($name))->getInstallableReleases();
+    if (!$supported_releases) {
+      return FALSE;
+    }
+
+    // If this version is found in the list of installable releases, it is
+    // secured and supported.
+    if (array_key_exists($semantic_version, $supported_releases)) {
+      return TRUE;
+    }
+    // If the semantic version number wasn't in the list of
+    // installable releases, convert it to a legacy version number and see
+    // if the version number is in the list.
+    $legacy_version = LegacyVersionUtility::convertToLegacyVersion($semantic_version);
+    if ($legacy_version && array_key_exists($legacy_version, $supported_releases)) {
+      return TRUE;
+    }
+    // Neither the semantic version nor the legacy version are in the list
+    // of installable releases, so the release isn't supported.
+    return FALSE;
+  }
+
+  /**
+   * Checks that the packages are secure and supported.
+   *
+   * @param \Drupal\package_manager\Event\PreApplyEvent $event
+   *   The event object.
+   */
+  public function checkStagedReleases(PreApplyEvent $event): void {
+    $active = $event->getStage()->getActiveComposer();
+    $staged = $event->getStage()->getStageComposer();
+    $updated_packages = array_merge(
+      $staged->getPackagesNotIn($active),
+      $staged->getPackagesWithDifferentVersionsIn($active)
+    );
+    $unknown_packages = [];
+    $unsupported_packages = [];
+    foreach ($updated_packages as $package_name => $staged_package) {
+      // Only packages of the types 'drupal-module' or 'drupal-theme' that
+      // start with 'drupal/' will have update XML from drupal.org.
+      if (!in_array($staged_package->getType(), ['drupal-module', 'drupal-theme'], TRUE)
+         || !str_starts_with($package_name, 'drupal/')) {
+        continue;
+      }
+      $project_name = $staged->getProjectForPackage($package_name);
+      if (empty($project_name)) {
+        $unknown_packages[] = $package_name;
+        continue;
+      }
+      $semantic_version = $staged_package->getPrettyVersion();
+      if (!$this->isSupportedRelease($project_name, $semantic_version)) {
+        $unsupported_packages[] = new FormattableMarkup('@project_name (@package_name) @version', [
+          '@project_name' => $project_name,
+          '@package_name' => $package_name,
+          '@version' => $semantic_version,
+        ]);
+      }
+    }
+    if ($unsupported_packages) {
+      $summary = $this->formatPlural(
+        count($unsupported_packages),
+        'Cannot update because the following project version is not in the list of installable releases.',
+        'Cannot update because the following project versions are not in the list of installable releases.'
+      );
+      $event->addError($unsupported_packages, $summary);
+    }
+    if ($unknown_packages) {
+      $summary = $this->formatPlural(
+        count($unknown_packages),
+        'Cannot update because the following new or updated Drupal package does not have project information.',
+        'Cannot update because the following new or updated Drupal packages do not have project information.',
+      );
+      $event->addError($unknown_packages, $summary);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    return [
+      PreApplyEvent::class => 'checkStagedReleases',
+    ];
+  }
+
+}
diff --git a/package_manager/tests/fixtures/release-history/aaa_update_test.1.1.xml b/package_manager/tests/fixtures/release-history/aaa_update_test.1.1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2451a4bd4f0390ef183974f615d162bb0382152d
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/aaa_update_test.1.1.xml
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Test legacy versions -->
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>AAA Update test</title>
+<short_name>aaa_update_test</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>8.x-2.,8.x-1.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/aaa_update_test</link>
+  <terms>
+   <term><name>Projects</name><value>AAA Update test project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>AAA Update test 8.x-3.0</name>
+    <version>8.x-3.0</version>
+    <tag>8.x-3.0</tag>
+    <status>published</status>
+    <release_link>http://example.com/aaa_update_test-8-3-0-release</release_link>
+    <download_link>http://example.com/aaa_update_test-8-3-0.tar.gz</download_link>
+    <date>1584195300</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+ <release>
+   <name>AAA Update test 8.x-2.1</name>
+   <version>8.x-2.1</version>
+   <tag>8.x-2.1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-2-1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-2-1.tar.gz</download_link>
+   <date>1581603300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-2.1-beta1</name>
+   <version>8.x-2.1-beta1</version>
+   <tag>8.x-2.1-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-2-1-beta1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-2-1-beta1.tar.gz</download_link>
+   <date>1579011300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-2.1-alpha1</name>
+   <version>8.x-2.1-alpha1</version>
+   <tag>8.x-2.1-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-2-1-alpha1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-2-1-alpha1.tar.gz</download_link>
+   <date>1576419300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-2.0</name>
+   <version>8.x-2.0</version>
+   <tag>8.x-2.0</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-2-0-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-2-0.tar.gz</download_link>
+   <date>1573827300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-2.0-beta1</name>
+   <version>8.x-2.0-beta1</version>
+   <tag>8.x-2.0-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-2-0-beta1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-2-0-beta1.tar.gz</download_link>
+   <date>1571235300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-2.0-alpha1</name>
+   <version>8.x-2.0-alpha1</version>
+   <tag>8.x-2.0-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-2-0-alpha1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-2-0-alpha1.tar.gz</download_link>
+   <date>1568643300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-1.1</name>
+   <version>8.x-1.1</version>
+   <tag>8.x-1.1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-1-1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-1-1.tar.gz</download_link>
+   <date>1566051300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-1.1-beta1</name>
+   <version>8.x-1.1-beta1</version>
+   <tag>8.x-1.1-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-1-1-beta1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-1-1-beta1.tar.gz</download_link>
+   <date>1563459300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-1.1-alpha1</name>
+   <version>8.x-1.1-alpha1</version>
+   <tag>8.x-1.1-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-1-1-alpha1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-1-1-alpha1.tar.gz</download_link>
+   <date>1560867300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-1.0</name>
+   <version>8.x-1.0</version>
+   <tag>8.x-1.0</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-1-0-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-1-0.tar.gz</download_link>
+   <date>1558275300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-1.0-beta1</name>
+   <version>8.x-1.0-beta1</version>
+   <tag>8.x-1.0-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-1-0-beta1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-1-0-beta1.tar.gz</download_link>
+   <date>1555683300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>AAA Update test 8.x-1.0-alpha1</name>
+   <version>8.x-1.0-alpha1</version>
+   <tag>8.x-1.0-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/aaa_update_test-8-x-1-0-alpha1-release</release_link>
+   <download_link>http://example.com/aaa_update_test-8-x-1-0-alpha1.tar.gz</download_link>
+   <date>1553091300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+</releases>
+</project>
diff --git a/package_manager/tests/fixtures/release-history/alpha.1.1.0.xml b/package_manager/tests/fixtures/release-history/alpha.1.1.0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1bcdbbad801481b4431aad8eb2a5c8288ddfad52
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/alpha.1.1.0.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Alpha</title>
+<short_name>alpha</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>1.1.,1.0.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/alpha</link>
+  <terms>
+   <term><name>Projects</name><value>Alpha project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>Alpha 1.1.0</name>
+    <version>1.1.0</version>
+    <tag>1.1.0</tag>
+    <status>published</status>
+    <release_link>http://example.com/alpha-1-1-0-release</release_link>
+    <download_link>http://example.com/alpha-1-1-0.tar.gz</download_link>
+    <date>1584195300</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+ <release>
+   <name>Alpha 1.0.0</name>
+   <version>1.0.0</version>
+   <tag>1.0.0</tag>
+   <status>published</status>
+   <release_link>http://example.com/alpha-1-0-0-release</release_link>
+   <download_link>http://example.com/alpha-1-0-0.tar.gz</download_link>
+   <date>1581603300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+</releases>
+</project>
diff --git a/package_manager/tests/fixtures/release-history/semver_test.1.1.xml b/package_manager/tests/fixtures/release-history/semver_test.1.1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..addca0b25be665a50c2a4cc62e027c6b274b0e08
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/semver_test.1.1.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Semver Test</title>
+<short_name>semver_test</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>8.0.,8.1.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/semver_test</link>
+  <terms>
+   <term><name>Projects</name><value>Semver Test project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>Semver Test 8.2.0</name>
+    <version>8.2.0</version>
+    <tag>8.2.0</tag>
+    <status>published</status>
+    <release_link>http://example.com/semver_test-8-2-0-release</release_link>
+    <download_link>http://example.com/semver_test-8-2-0.tar.gz</download_link>
+    <date>1584195300</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+ <release>
+   <name>Semver Test 8.1.1</name>
+   <version>8.1.1</version>
+   <tag>8.1.1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-1-1-release</release_link>
+   <download_link>http://example.com/semver_test-8-1-1.tar.gz</download_link>
+   <date>1581603300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.1.1-beta1</name>
+   <version>8.1.1-beta1</version>
+   <tag>8.1.1-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-1-1-beta1-release</release_link>
+   <download_link>http://example.com/semver_test-8-1-1-beta1.tar.gz</download_link>
+   <date>1579011300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.1.1-alpha1</name>
+   <version>8.1.1-alpha1</version>
+   <tag>8.1.1-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-1-1-alpha1-release</release_link>
+   <download_link>http://example.com/semver_test-8-1-1-alpha1.tar.gz</download_link>
+   <date>1576419300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.1.0</name>
+   <version>8.1.0</version>
+   <tag>8.1.0</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-1-0-release</release_link>
+   <download_link>http://example.com/semver_test-8-1-0.tar.gz</download_link>
+   <date>1573827300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.1.0-beta1</name>
+   <version>8.1.0-beta1</version>
+   <tag>8.1.0-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-1-0-beta1-release</release_link>
+   <download_link>http://example.com/semver_test-8-1-0-beta1.tar.gz</download_link>
+   <date>1571235300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.1.0-alpha1</name>
+   <version>8.1.0-alpha1</version>
+   <tag>8.1.0-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-1-0-alpha1-release</release_link>
+   <download_link>http://example.com/semver_test-8-1-0-alpha1.tar.gz</download_link>
+   <date>1568643300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.0.1</name>
+   <version>8.0.1</version>
+   <tag>8.0.1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-0-1-release</release_link>
+   <download_link>http://example.com/semver_test-8-0-1.tar.gz</download_link>
+   <date>1566051300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.0.1-beta1</name>
+   <version>8.0.1-beta1</version>
+   <tag>8.0.1-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-0-1-beta1-release</release_link>
+   <download_link>http://example.com/semver_test-8-0-1-beta1.tar.gz</download_link>
+   <date>1563459300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.0.1-alpha1</name>
+   <version>8.0.1-alpha1</version>
+   <tag>8.0.1-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-0-1-alpha1-release</release_link>
+   <download_link>http://example.com/semver_test-8-0-1-alpha1.tar.gz</download_link>
+   <date>1560867300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.0.0</name>
+   <version>8.0.0</version>
+   <tag>8.0.0</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-0-0-release</release_link>
+   <download_link>http://example.com/semver_test-8-0-0.tar.gz</download_link>
+   <date>1558275300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.0.0-beta1</name>
+   <version>8.0.0-beta1</version>
+   <tag>8.0.0-beta1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-0-0-beta1-release</release_link>
+   <download_link>http://example.com/semver_test-8-0-0-beta1.tar.gz</download_link>
+   <date>1555683300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+ <release>
+   <name>Semver Test 8.0.0-alpha1</name>
+   <version>8.0.0-alpha1</version>
+   <tag>8.0.0-alpha1</tag>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-8-0-0-alpha1-release</release_link>
+   <download_link>http://example.com/semver_test-8-0-0-alpha1.tar.gz</download_link>
+   <date>1553091300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+</releases>
+</project>
diff --git a/package_manager/tests/fixtures/release-history/updated_module.1.1.0.xml b/package_manager/tests/fixtures/release-history/updated_module.1.1.0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b8aaf22c6e50e65bbce4b2d9bb22177172f4f330
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/updated_module.1.1.0.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Updated Module</title>
+<short_name>updated_module</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>1.1.,1.0.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/alpha</link>
+  <terms>
+   <term><name>Projects</name><value>Updated Module project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>Updated Module 1.1.0</name>
+    <version>1.1.0</version>
+    <tag>1.1.0</tag>
+    <status>published</status>
+    <release_link>http://example.com/updated_module-1-1-0-release</release_link>
+    <download_link>http://example.com/updated_module-1-1-0.tar.gz</download_link>
+    <date>1584195300</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+ <release>
+   <name>Updated Module 1.0.0</name>
+   <version>1.0.0</version>
+   <tag>1.0.0</tag>
+   <status>published</status>
+   <release_link>http://example.com/updated_module-1-0-0-release</release_link>
+   <download_link>http://example.com/updated_module-1-0-0.tar.gz</download_link>
+   <date>1581603300</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+</releases>
+</project>
diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..8215de0b462a258714e2ebb3b9624da096742794
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide
@@ -0,0 +1 @@
+project: aaa_automatic_updates_test
diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.json
new file mode 100644
index 0000000000000000000000000000000000000000..e2e49f1fc08a7951d2e53a0c5420aa9c972a43d3
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.json
@@ -0,0 +1,25 @@
+{
+    "packages": [
+        {
+            "name": "drupal/core-recommended",
+            "version": "9.8.0",
+            "require": {
+                "drupal/core": "9.8.0"
+            }
+        },
+        {
+            "name": "drupal/core",
+            "version": "9.8.0"
+        },
+        {
+          "name": "drupal/dependency",
+          "version": "9.8.1",
+          "type": "drupal-library"
+        },
+        {
+          "name": "drupal/aaa_automatic_updates_test",
+          "version": "7.0.1",
+          "type": "drupal-module"
+        }
+    ]
+}
diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..3615e159a244713222feaaccf897438f6487cf34
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/aaa_automatic_updates_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/aaa_automatic_updates_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..8215de0b462a258714e2ebb3b9624da096742794
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide
@@ -0,0 +1 @@
+project: aaa_automatic_updates_test
diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.json
new file mode 100644
index 0000000000000000000000000000000000000000..67af3dbbccc1b9fd56e24b8c5741649500f770d0
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.json
@@ -0,0 +1,25 @@
+{
+    "packages": [
+        {
+            "name": "drupal/core-recommended",
+            "version": "9.8.0",
+            "require": {
+                "drupal/core": "9.8.0"
+            }
+        },
+        {
+            "name": "drupal/core",
+            "version": "9.8.0"
+        },
+        {
+          "name": "drupal/dependency",
+          "version": "9.8.1",
+          "type": "drupal-library"
+        },
+        {
+          "name": "drupal/aaa_automatic_updates_test",
+          "version": "7.0.1-dev",
+          "type": "drupal-module"
+        }
+    ]
+}
diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..3615e159a244713222feaaccf897438f6487cf34
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/aaa_automatic_updates_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/aaa_automatic_updates_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/supported_release_validator/active/modules/aaa_update_test/aaa_update_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/active/modules/aaa_update_test/aaa_update_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..b2d1f884d4a007ebd07dc00b3e46a8c5d098918d
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/active/modules/aaa_update_test/aaa_update_test.info.yml.hide
@@ -0,0 +1 @@
+project: aaa_update_test
diff --git a/package_manager/tests/fixtures/supported_release_validator/active/modules/semver_test/semver_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/active/modules/semver_test/semver_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..6175b81a041a98520a59f20ff0e1bce7b659cacd
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/active/modules/semver_test/semver_test.info.yml.hide
@@ -0,0 +1 @@
+project: semver_test
diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/active/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.json
similarity index 82%
rename from automatic_updates_extensions/tests/fixtures/update_release_validator/active/vendor/composer/installed.json
rename to package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.json
index 4e077b457077d987dbbfdc465ca7ba5cf56f9454..f243b4a216a8f47b2802e3ae34c0bd2bbc7e85d4 100644
--- a/automatic_updates_extensions/tests/fixtures/update_release_validator/active/vendor/composer/installed.json
+++ b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.json
@@ -16,11 +16,6 @@
           "version": "9.8.0",
           "type": "drupal-library"
         },
-        {
-          "name": "drupal/aaa_automatic_updates_test",
-          "version": "7.0.0",
-          "type": "drupal-module"
-        },
         {
           "name": "drupal/aaa_update_test",
           "version": "2.0.0",
diff --git a/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b9371be01a0fd1a5cdb7c6c9a05fea544e586b3
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/semver_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/semver_test',
+    ],
+    'drupal/aaa_update_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/aaa_update_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..b2d1f884d4a007ebd07dc00b3e46a8c5d098918d
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide
@@ -0,0 +1 @@
+project: aaa_update_test
diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_supported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.json
similarity index 100%
rename from automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_supported_update_stage/vendor/composer/installed.json
rename to package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.json
diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..badfa21a19596c4e48162dd0afa57537f78fd4f5
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/aaa_update_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/aaa_update_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..b2d1f884d4a007ebd07dc00b3e46a8c5d098918d
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide
@@ -0,0 +1 @@
+project: aaa_update_test
diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json
similarity index 100%
rename from automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json
rename to package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json
diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..badfa21a19596c4e48162dd0afa57537f78fd4f5
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/aaa_update_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/aaa_update_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/modules/semver_test/semver_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/modules/semver_test/semver_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..6175b81a041a98520a59f20ff0e1bce7b659cacd
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/modules/semver_test/semver_test.info.yml.hide
@@ -0,0 +1 @@
+project: semver_test
diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/semver_supported_update_stage/composer/vendor/installed.json b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.json
similarity index 100%
rename from automatic_updates_extensions/tests/fixtures/update_release_validator/semver_supported_update_stage/composer/vendor/installed.json
rename to package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.json
diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed3212d4688ae6d507442567b6792864b2ce033c
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/semver_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/semver_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/modules/semver_test/semver_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/modules/semver_test/semver_test.info.yml.hide
new file mode 100644
index 0000000000000000000000000000000000000000..6175b81a041a98520a59f20ff0e1bce7b659cacd
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/modules/semver_test/semver_test.info.yml.hide
@@ -0,0 +1 @@
+project: semver_test
diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json
similarity index 100%
rename from automatic_updates_extensions/tests/fixtures/update_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json
rename to package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json
diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed3212d4688ae6d507442567b6792864b2ce033c
--- /dev/null
+++ b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Lists packages installed by Composer.
+ */
+
+$projects_dir = __DIR__ . '/../../modules';
+return [
+  'versions' => [
+    'drupal/semver_test' => [
+      'type' => 'drupal-module',
+      'install_path' => $projects_dir . '/semver_test',
+    ],
+  ],
+];
diff --git a/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml b/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml.hide
similarity index 86%
rename from package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml
rename to package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml.hide
index ebf1452ec9c88c23a25d6451946844b21b7a4228..5d31bbdb5a80a68434488753a0dc6902949446f6 100644
--- a/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml
+++ b/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml.hide
@@ -2,3 +2,4 @@ name: 'Updated module'
 description: 'A module which will change during an update, to ensure that the changes are picked up.'
 type: module
 package: Testing
+project: updated_module
diff --git a/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml b/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml.hide
similarity index 86%
rename from package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml
rename to package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml.hide
index ebf1452ec9c88c23a25d6451946844b21b7a4228..5d31bbdb5a80a68434488753a0dc6902949446f6 100644
--- a/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml
+++ b/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml.hide
@@ -2,3 +2,4 @@ name: 'Updated module'
 description: 'A module which will change during an update, to ensure that the changes are picked up.'
 type: module
 package: Testing
+project: updated_module
diff --git a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.info.yml b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.info.yml
similarity index 78%
rename from tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.info.yml
rename to package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.info.yml
index a66c6682cc213647015759d225ae708a87cff496..ecf8c8e6122e9648240eaf05ea07c18886336bda 100644
--- a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.info.yml
+++ b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.info.yml
@@ -1,4 +1,4 @@
-name: 'Automatic Updates Test - Release history'
+name: 'Package Manager Test Release history'
 type: module
 description: 'Provides a mechanism for serving fake release history metadata in functional tests.'
 package: Testing
diff --git a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.routing.yml b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.routing.yml
similarity index 55%
rename from tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.routing.yml
rename to package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.routing.yml
index 2adff0876e3a259893a47df3fe6ac9d323bf94ab..df0b40c617810dcf79a62e863901c2c24e79855d 100644
--- a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.routing.yml
+++ b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.routing.yml
@@ -1,8 +1,8 @@
-automatic_updates_test_release_history.metadata:
+package_manager_test_release_history.metadata:
   path: '/test-release-history/{project_name}/{version}'
   defaults:
     _title: 'Update test'
-    _controller: '\Drupal\automatic_updates_test_release_history\TestController::metadata'
+    _controller: '\Drupal\package_manager_test_release_history\TestController::metadata'
   requirements:
     _access: 'TRUE'
   options:
diff --git a/tests/modules/automatic_updates_test_release_history/src/TestController.php b/package_manager/tests/modules/package_manager_test_release_history/src/TestController.php
similarity index 96%
rename from tests/modules/automatic_updates_test_release_history/src/TestController.php
rename to package_manager/tests/modules/package_manager_test_release_history/src/TestController.php
index 5cdd3a1729d965e3f66f16b1e0e3f415f0e2340b..b56375abde8ad6e9a65c4b969d9569ecaaa28b1b 100644
--- a/tests/modules/automatic_updates_test_release_history/src/TestController.php
+++ b/package_manager/tests/modules/package_manager_test_release_history/src/TestController.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\automatic_updates_test_release_history;
+namespace Drupal\package_manager_test_release_history;
 
 use Drupal\Core\Controller\ControllerBase;
 use Symfony\Component\HttpFoundation\BinaryFileResponse;
diff --git a/package_manager/tests/src/Build/PackageInstallTest.php b/package_manager/tests/src/Build/PackageInstallTest.php
index 831e62375955f8205c83a1f10b25b6f99eb3b841..46b2c6289289a3d63ac0a8b3d918f12271674c26 100644
--- a/package_manager/tests/src/Build/PackageInstallTest.php
+++ b/package_manager/tests/src/Build/PackageInstallTest.php
@@ -15,11 +15,10 @@ class PackageInstallTest extends TemplateProjectTestBase {
   public function testPackageInstall(): void {
     $this->createTestProject('RecommendedProject');
 
-    $this->addRepository('alpha', __DIR__ . '/../../fixtures/alpha/1.0.0');
-
-    $this->installQuickStart('minimal');
-    $this->formLogin($this->adminUsername, $this->adminPassword);
-    $this->installModules(['package_manager_test_api']);
+    $this->setReleaseMetadata([
+      'alpha' => __DIR__ . '/../../fixtures/release-history/alpha.1.1.0.xml',
+    ]);
+    $this->addRepository('alpha', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/alpha/1.0.0'));
 
     // Use the API endpoint to create a stage and install alpha 1.0.0. We ask
     // the API to return the contents of composer.json file of installed module,
diff --git a/package_manager/tests/src/Build/PackageUpdateTest.php b/package_manager/tests/src/Build/PackageUpdateTest.php
index 120f59b6a1466139fea373cfdecda48f0f2c890b..336f51e8b1a732d8211257f6fc9184da630a11c8 100644
--- a/package_manager/tests/src/Build/PackageUpdateTest.php
+++ b/package_manager/tests/src/Build/PackageUpdateTest.php
@@ -15,19 +15,20 @@ class PackageUpdateTest extends TemplateProjectTestBase {
   public function testPackageUpdate(): void {
     $this->createTestProject('RecommendedProject');
 
-    $this->addRepository('alpha', __DIR__ . '/../../fixtures/alpha/1.0.0');
-    $this->addRepository('updated_module', __DIR__ . '/../../fixtures/updated_module/1.0.0');
+    $this->addRepository('alpha', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/alpha/1.0.0'));
+    $this->addRepository('updated_module', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/updated_module/1.0.0'));
+    $this->setReleaseMetadata([
+      'updated_module' => __DIR__ . '/../../fixtures/release-history/updated_module.1.1.0.xml',
+    ]);
     $this->runComposer('COMPOSER_MIRROR_PATH_REPOS=1 composer require drupal/alpha drupal/updated_module --update-with-all-dependencies', 'project');
 
-    $this->installQuickStart('minimal');
-    $this->formLogin($this->adminUsername, $this->adminPassword);
     // The updated_module provides actual Drupal-facing functionality that we're
     // testing as well, so we need to install it.
-    $this->installModules(['package_manager_test_api', 'updated_module']);
+    $this->installModules(['updated_module']);
 
     // Change both modules' upstream version.
-    $this->addRepository('alpha', __DIR__ . '/../../fixtures/alpha/1.1.0');
-    $this->addRepository('updated_module', __DIR__ . '/../../fixtures/updated_module/1.1.0');
+    $this->addRepository('alpha', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/alpha/1.1.0'));
+    $this->addRepository('updated_module', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/updated_module/1.1.0'));
 
     // Use the API endpoint to create a stage and update updated_module to
     // 1.1.0. Even though both modules have version 1.1.0 available, only
diff --git a/package_manager/tests/src/Build/TemplateProjectTestBase.php b/package_manager/tests/src/Build/TemplateProjectTestBase.php
index ed711eabffcb5d45d8230f598cfb6a301452c15b..c4de1dc5d65e9326abf4c10ebe913d72006386c6 100644
--- a/package_manager/tests/src/Build/TemplateProjectTestBase.php
+++ b/package_manager/tests/src/Build/TemplateProjectTestBase.php
@@ -4,6 +4,8 @@ namespace Drupal\Tests\package_manager\Build;
 
 use Drupal\BuildTests\QuickStart\QuickStartTestBase;
 use Drupal\Composer\Composer;
+use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait;
+use Drupal\Tests\RandomGeneratorTrait;
 
 /**
  * Base class for tests which create a test site from a core project template.
@@ -15,6 +17,9 @@ use Drupal\Composer\Composer;
  */
 abstract class TemplateProjectTestBase extends QuickStartTestBase {
 
+  use FixtureUtilityTrait;
+  use RandomGeneratorTrait;
+
   /**
    * The web root of the test site, relative to the workspace directory.
    *
@@ -22,6 +27,23 @@ abstract class TemplateProjectTestBase extends QuickStartTestBase {
    */
   private $webRoot;
 
+  /**
+   * A secondary server instance, to serve XML metadata about available updates.
+   *
+   * @var \Symfony\Component\Process\Process
+   */
+  private $metadataServer;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function tearDown(): void {
+    if ($this->metadataServer) {
+      $this->metadataServer->stop();
+    }
+    parent::tearDown();
+  }
+
   /**
    * Data provider for tests which use all of the core project templates.
    *
@@ -136,6 +158,19 @@ END;
     $this->runComposer("composer config repo.$name '$repository'", $working_directory);
   }
 
+  /**
+   * Prepares the test site to serve an XML feed of available release metadata.
+   *
+   * @param array $xml_map
+   *   The update XML map, as used by update_test.settings.
+   *
+   * @see \Drupal\automatic_updates_test\TestController::metadata()
+   */
+  protected function setReleaseMetadata(array $xml_map): void {
+    $xml_map = var_export($xml_map, TRUE);
+    $this->writeSettings("\$config['update_test.settings']['xml_map'] = $xml_map;");
+  }
+
   /**
    * Creates a test project from a given template and installs Drupal.
    *
@@ -225,6 +260,28 @@ END;
       $this->assertStringNotContainsString('Symlinking', $output);
     }
     // END: DELETE FROM CORE MERGE REQUEST
+
+    // Install Drupal.
+    $this->installQuickStart('minimal');
+    $this->formLogin($this->adminUsername, $this->adminPassword);
+
+    // When checking for updates, we need to be able to make sub-requests, but
+    // the built-in PHP server is single-threaded. Therefore, open a second
+    // server instance on another port, which will serve the metadata about
+    // available updates.
+    $port = $this->findAvailablePort();
+    $this->metadataServer = $this->instantiateServer($port);
+    $code = <<<END
+\$config['automatic_updates.settings']['cron_port'] = $port;
+\$config['update.settings']['fetch']['url'] = 'http://localhost:$port/test-release-history';
+END;
+    $this->writeSettings($code);
+
+    // Install helpful modules.
+    $this->installModules([
+      'package_manager_test_api',
+      'package_manager_test_release_history',
+    ]);
   }
 
   /**
@@ -366,6 +423,21 @@ END;
     }
   }
 
+  /**
+   * Copies a fixture directory to a temporary directory and returns its path.
+   *
+   * @param string $fixture_directory
+   *   The fixture directory.
+   *
+   * @return string
+   *   The temporary directory.
+   */
+  protected function copyFixtureToTempDirectory(string $fixture_directory): string {
+    $temp_directory = $this->getWorkspaceDirectory() . '/fixtures_temp_' . $this->randomMachineName(20);
+    static::copyFixtureFilesTo($fixture_directory, $temp_directory);
+    return $temp_directory;
+  }
+
   // BEGIN: DELETE FROM CORE MERGE REQUEST
 
   /**
diff --git a/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php b/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php
index a757fc9e048ef57a7fc58de1e220e61a7cee036e..7eae32bb717f9e49e8e19e1ae59f3510b8f00286 100644
--- a/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php
+++ b/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php
@@ -12,6 +12,16 @@ use Drupal\package_manager\ValidationResult;
  */
 class OverwriteExistingPackagesValidatorTest extends PackageManagerKernelTestBase {
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    // In this test, we don't care whether the updated projects are secure and
+    // supported.
+    $this->disableValidators[] = 'package_manager.validator.supported_releases';
+    parent::setUp();
+  }
+
   /**
    * Tests that new installed packages overwrite existing directories.
    *
diff --git a/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php b/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ba83e7360d5c2e4f8fbac71bd315e4d9415ce75
--- /dev/null
+++ b/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace Drupal\Tests\package_manager\Kernel;
+
+use Drupal\package_manager\Event\PreApplyEvent;
+use Drupal\package_manager\ValidationResult;
+
+/**
+ * @coversDefaultClass \Drupal\package_manager\Validator\SupportedReleaseValidator
+ *
+ * @group package_manager
+ */
+class SupportedReleaseValidatorTest extends PackageManagerKernelTestBase {
+
+  /**
+   * Data provider for testException().
+   *
+   * @return mixed[][]
+   *   The test cases.
+   */
+  public function providerException(): array {
+    $fixtures_folder = __DIR__ . '/../../fixtures/supported_release_validator';
+    $release_fixture_folder = __DIR__ . '/../../fixtures/release-history';
+    $summary = t('Cannot update because the following project version is not in the list of installable releases.');
+    return [
+      'semver, supported update' => [
+        'semver_test',
+        "$release_fixture_folder/semver_test.1.1.xml",
+        "$fixtures_folder/semver_supported_update_stage",
+        [],
+      ],
+      'semver, update to unsupported branch' => [
+        'semver_test',
+        "$release_fixture_folder/semver_test.1.1.xml",
+        "$fixtures_folder/semver_unsupported_update_stage",
+        [
+          ValidationResult::createError(['semver_test (drupal/semver_test) 8.2.0'], $summary),
+        ],
+      ],
+      'legacy, supported update' => [
+        'aaa_update_test',
+        "$release_fixture_folder/aaa_update_test.1.1.xml",
+        "$fixtures_folder/legacy_supported_update_stage",
+        [],
+      ],
+      'legacy, update to unsupported branch' => [
+        'aaa_update_test',
+        "$release_fixture_folder/aaa_update_test.1.1.xml",
+        "$fixtures_folder/legacy_unsupported_update_stage",
+        [
+          ValidationResult::createError(['aaa_update_test (drupal/aaa_update_test) 3.0.0'], $summary),
+        ],
+      ],
+      'aaa_automatic_updates_test(not in active), update to unsupported branch' => [
+        'aaa_automatic_updates_test',
+        "$release_fixture_folder/aaa_automatic_updates_test.9.8.2.xml",
+        "$fixtures_folder/aaa_automatic_updates_test_unsupported_update_stage",
+        [
+          ValidationResult::createError(['aaa_automatic_updates_test (drupal/aaa_automatic_updates_test) 7.0.1-dev'], $summary),
+        ],
+      ],
+      'aaa_automatic_updates_test(not in active), update to supported branch' => [
+        'aaa_automatic_updates_test',
+        "$release_fixture_folder/aaa_automatic_updates_test.9.8.2.xml",
+        "$fixtures_folder/aaa_automatic_updates_test_supported_update_stage",
+        [],
+      ],
+    ];
+  }
+
+  /**
+   * Tests exceptions when updating to unsupported or insecure releases.
+   *
+   * @param string $project
+   *   The project to update.
+   * @param string $release_xml
+   *   Path of release xml for project.
+   * @param string $stage_dir
+   *   Path of fixture stage directory. It will be used as the virtual project's
+   *   stage directory.
+   * @param array $expected_results
+   *   The expected validation results.
+   *
+   * @dataProvider providerException
+   */
+  public function testException(string $project, string $release_xml, string $stage_dir, array $expected_results): void {
+    $this->setReleaseMetadata([
+      $project => $release_xml,
+      'drupal' => __DIR__ . '/../../fixtures/release-history/drupal.9.8.2.xml',
+    ]);
+    $active_dir = __DIR__ . '/../../fixtures/supported_release_validator/active';
+    $this->copyFixtureFolderToActiveDirectory($active_dir);
+    $this->copyFixtureFolderToStageDirectoryOnApply($stage_dir);
+
+    $this->assertResults($expected_results, PreApplyEvent::class);
+  }
+
+}
diff --git a/tests/src/Build/UpdateTestBase.php b/tests/src/Build/UpdateTestBase.php
index c88d11f40a049b99175c6d6dc50c0efa3585640e..effacbb73f885abf6ec3c2fa2211a382796a317e 100644
--- a/tests/src/Build/UpdateTestBase.php
+++ b/tests/src/Build/UpdateTestBase.php
@@ -4,75 +4,24 @@ namespace Drupal\Tests\automatic_updates\Build;
 
 use Drupal\Component\Utility\Html;
 use Drupal\Tests\package_manager\Build\TemplateProjectTestBase;
-use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait;
-use Drupal\Tests\RandomGeneratorTrait;
 
 /**
  * Base class for tests that perform in-place updates.
  */
 abstract class UpdateTestBase extends TemplateProjectTestBase {
 
-  use FixtureUtilityTrait;
-  use RandomGeneratorTrait;
-
-  /**
-   * A secondary server instance, to serve XML metadata about available updates.
-   *
-   * @var \Symfony\Component\Process\Process
-   */
-  private $metadataServer;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function tearDown(): void {
-    if ($this->metadataServer) {
-      $this->metadataServer->stop();
-    }
-    parent::tearDown();
-  }
-
   /**
    * {@inheritdoc}
    */
   protected function createTestProject(string $template): void {
     parent::createTestProject($template);
 
-    // Install Drupal, Automatic Updates, and other modules needed for testing.
-    $this->installQuickStart('minimal');
-    $this->formLogin($this->adminUsername, $this->adminPassword);
+    // Install Automatic Updates, and other modules needed for testing.
     $this->installModules([
       'automatic_updates',
       'automatic_updates_test',
       'automatic_updates_test_cron',
-      'automatic_updates_test_release_history',
     ]);
-
-    // When checking for updates, we need to be able to make sub-requests, but
-    // the built-in PHP server is single-threaded. Therefore, open a second
-    // server instance on another port, which will serve the metadata about
-    // available updates.
-    $port = $this->findAvailablePort();
-    $this->metadataServer = $this->instantiateServer($port);
-
-    $code = <<<END
-\$config['automatic_updates.settings']['cron_port'] = $port;
-\$config['update.settings']['fetch']['url'] = 'http://localhost:$port/test-release-history';
-END;
-    $this->writeSettings($code);
-  }
-
-  /**
-   * Prepares the test site to serve an XML feed of available release metadata.
-   *
-   * @param array $xml_map
-   *   The update XML map, as used by update_test.settings.
-   *
-   * @see \Drupal\automatic_updates_test\TestController::metadata()
-   */
-  protected function setReleaseMetadata(array $xml_map): void {
-    $xml_map = var_export($xml_map, TRUE);
-    $this->writeSettings("\$config['update_test.settings']['xml_map'] = $xml_map;");
   }
 
   /**
@@ -106,19 +55,4 @@ END;
     }
   }
 
-  /**
-   * Copies a fixture directory to a temporary directory and returns its path.
-   *
-   * @param string $fixture_directory
-   *   The fixture directory.
-   *
-   * @return string
-   *   The temporary directory.
-   */
-  protected function copyFixtureToTempDirectory(string $fixture_directory): string {
-    $temp_directory = $this->getWorkspaceDirectory() . '/fixtures_temp_' . $this->randomMachineName(20);
-    static::copyFixtureFilesTo($fixture_directory, $temp_directory);
-    return $temp_directory;
-  }
-
 }
diff --git a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php
index 9a043e65df161c6a2c7499f41d4d4ae332c04ddb..aca41c16559560a33679eca0a3f0bd762cdb2cb4 100644
--- a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php
+++ b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php
@@ -55,7 +55,7 @@ abstract class AutomaticUpdatesFunctionalTestBase extends BrowserTestBase {
    */
   protected function installModulesFromClassProperty(ContainerInterface $container): void {
     $container->get('module_installer')->install([
-      'automatic_updates_test_release_history',
+      'package_manager_test_release_history',
     ]);
     $this->container = $container->get('kernel')->getContainer();
 
diff --git a/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php b/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php
index 864814f293fdf609c4f1c85828ef97103c29ae9c..eac85e7c2c4353372f4b3c22df4aab7e29d20ec6 100644
--- a/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php
+++ b/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php
@@ -19,6 +19,16 @@ class StagedProjectsValidatorTest extends AutomaticUpdatesKernelTestBase {
    */
   protected static $modules = ['automatic_updates'];
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    // In this test, we don't care whether the updated projects are secure and
+    // supported.
+    $this->disableValidators[] = 'package_manager.validator.supported_releases';
+    parent::setUp();
+  }
+
   /**
    * Asserts a set of validation results when staged changes are applied.
    *