diff --git a/core/drupalci.yml b/core/drupalci.yml
index 8cc5f1d..f326027 100644
--- a/core/drupalci.yml
+++ b/core/drupalci.yml
@@ -21,37 +21,37 @@ build:
       # deprecated code.
       run_tests.phpunit:
         types: 'PHPUnit-Unit'
-        testgroups: '--all'
+        testgroups: '--module update'
         suppress-deprecations: false
         halt-on-fail: false
       run_tests.kernel:
         types: 'PHPUnit-Kernel'
-        testgroups: '--all'
-        suppress-deprecations: false
-        halt-on-fail: false
-      run_tests.simpletest:
-         types: 'Simpletest'
-         testgroups: '--all'
-         suppress-deprecations: false
-         halt-on-fail: false
-      run_tests.build:
-        # Limit concurrency due to disk space concerns.
-        concurrency: 15
-        types: 'PHPUnit-Build'
-        testgroups: '--all'
+        testgroups: '--module update'
         suppress-deprecations: false
         halt-on-fail: false
+#      run_tests.simpletest:
+#         types: 'Simpletest'
+#         testgroups: '--all'
+#         suppress-deprecations: false
+#         halt-on-fail: false
+#      run_tests.build:
+#        # Limit concurrency due to disk space concerns.
+#        concurrency: 15
+#        types: 'PHPUnit-Build'
+#        testgroups: '--all'
+#        suppress-deprecations: false
+#        halt-on-fail: false
       run_tests.functional:
         types: 'PHPUnit-Functional'
-        testgroups: '--all'
-        suppress-deprecations: false
-        halt-on-fail: false
-      run_tests.javascript:
-        concurrency: 15
-        types: 'PHPUnit-FunctionalJavascript'
-        testgroups: '--all'
+        testgroups: '--module update'
         suppress-deprecations: false
         halt-on-fail: false
+#      run_tests.javascript:
+#        concurrency: 15
+#        types: 'PHPUnit-FunctionalJavascript'
+#        testgroups: '--all'
+#        suppress-deprecations: false
+#        halt-on-fail: false
       # Run nightwatch testing.
       # @see https://www.drupal.org/project/drupal/issues/2869825
-      nightwatchjs:
+#      nightwatchjs:
diff --git a/core/modules/update/css/update.admin.theme.css b/core/modules/update/css/update.admin.theme.css
index 785da9a..f926a41 100644
--- a/core/modules/update/css/update.admin.theme.css
+++ b/core/modules/update/css/update.admin.theme.css
@@ -61,3 +61,34 @@
 .project-update__version--recommended-strong .project-update__version-title {
   font-weight: bold;
 }
+
+.project-update__compatibility-details details {
+  height: 20px;
+  margin: 0;
+  border: 0;
+  background-color: inherit;
+}
+.project-update__compatibility-details details[open] {
+  overflow: visible;
+  height: auto;
+  white-space: normal;
+}
+.project-update__compatibility-details details summary {
+  color: #5c5c5b;
+  border: 0;
+  margin: 0;
+  padding: 0;
+  text-transform: none;
+  font-weight: normal;
+}
+.project-update__compatibility-details details summary:hover,
+.project-update__compatibility-details details summary:focus {
+  color: #5c5c5b;
+  outline: none;
+  border-bottom: 1px solid;
+}
+.project-update__compatibility-details details .details-wrapper {
+  margin: 0;
+  padding: 5px 0;
+  color: #5c5c5b;
+}
diff --git a/core/modules/update/src/ProjectCoreCompatibility.php b/core/modules/update/src/ProjectCoreCompatibility.php
index 4aae45f..264f605 100644
--- a/core/modules/update/src/ProjectCoreCompatibility.php
+++ b/core/modules/update/src/ProjectCoreCompatibility.php
@@ -7,13 +7,20 @@
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 
 /**
- * Utility class to set core compatibility messages for module updates.
+ * Utility class to set core compatibility messages for project releases.
  */
 class ProjectCoreCompatibility {
 
   use StringTranslationTrait;
 
   /**
+   * The currently-installed version of Drupal core on this site.
+   *
+   * @var string
+   */
+  protected $existingCoreVersion;
+
+  /**
    * Cache of core versions that are available for updates.
    *
    * @var string[]
@@ -40,7 +47,8 @@ class ProjectCoreCompatibility {
    *   The project data for Drupal core as returned by
    *   \Drupal\update\UpdateManagerInterface::getProjects() and then processed
    *   by update_process_project_info() and
-   *   update_calculate_project_update_status().
+   *   update_calculate_project_update_status(). The main key used is:
+   *   - existing_version (string): The currently-installed version of core.
    * @param array $core_releases
    *   The Drupal core available releases.
    *
@@ -50,30 +58,29 @@ class ProjectCoreCompatibility {
    */
   public function __construct(array $core_data, array $core_releases) {
     if (isset($core_data['existing_version'])) {
-      $this->possibleCoreUpdateVersions = $this->getPossibleCoreUpdateVersions($core_data['existing_version'], $core_releases);
+      $this->existingCoreVersion = $core_data['existing_version'];
+      $this->possibleCoreUpdateVersions = $this->getPossibleCoreUpdateVersions($core_releases);
     }
   }
 
   /**
    * Gets the core versions that should be considered for compatibility ranges.
    *
-   * @param string $existing_version
-   *   The existing (currently installed) version of Drupal core.
    * @param array $core_releases
    *   The Drupal core available releases.
    *
    * @return string[]
    *   The core version numbers that are possible to update the site to.
    */
-  protected function getPossibleCoreUpdateVersions($existing_version, array $core_releases) {
-    if (!isset($core_releases[$existing_version])) {
+  protected function getPossibleCoreUpdateVersions(array $core_releases) {
+    if (!isset($core_releases[$this->existingCoreVersion])) {
       // If we can't determine the existing version of core then we can't
       // calculate the core compatibility of a given release based on core
       // versions after the existing version.
       return [];
     }
     $core_release_versions = array_keys($core_releases);
-    $possible_core_update_versions = Semver::satisfiedBy($core_release_versions, '>= ' . $existing_version);
+    $possible_core_update_versions = Semver::satisfiedBy($core_release_versions, '>= ' . $this->existingCoreVersion);
     $possible_core_update_versions = Semver::sort($possible_core_update_versions);
     $possible_core_update_versions = array_filter($possible_core_update_versions, function ($version) {
       return VersionParser::parseStability($version) === 'stable';
@@ -131,12 +138,46 @@ public function setReleaseMessage(array &$project_data) {
     }
     foreach ($releases_to_set as &$release) {
       if (!empty($release['core_compatibility'])) {
-        $release['core_compatibility_message'] = $this->createMessageFromCoreCompatibility($release['core_compatibility']);
+        $release['core_compatible'] = $this->isCoreCompatible($release['core_compatibility']);
+        $release['core_compatibility_range'] = $this->createMessageFromCoreCompatibility($release['core_compatibility']);
+        $release['core_compatibility_details'] = $this->createCoreCompatibilityDetails($release['core_compatible'], $release['core_compatibility_range']);
       }
     }
   }
 
   /**
+   * Creates core a compatibility details element.
+   *
+   * @param bool $core_compatible
+   *   Is the release compatible with the currently installed version of core?
+   * @param string $core_compatibility_range
+   *   The translated core compatibility range message from
+   *   static::createMessageFromCoreCompatibility().
+   *
+   * @return array
+   *   Render array of the core compatibility details element.
+   *
+   * @todo Should this be a twig template?
+   *
+   * @see static::createMessageFromCoreCompatibility()
+   */
+  protected function createCoreCompatibilityDetails($core_compatible, $core_compatibility_range) {
+    return [
+      '#type' => 'details',
+      '#title' => $core_compatible ? $this->t('Compatible') : $this->t('Not compatible'),
+      '#open' => !$core_compatible,
+      'message' => [
+        '#markup' => $core_compatibility_range,
+      ],
+      '#attributes' => [
+        'class' => [
+          $core_compatible ? 'compatible' : 'not-compatible',
+        ],
+      ],
+    ];
+  }
+
+  /**
    * Creates core a compatibility message from a semantic version constraint.
    *
    * @param string $core_compatibility_constraint
@@ -157,12 +198,26 @@ protected function createMessageFromCoreCompatibility($core_compatibility_constr
           $range_messages[] = $core_compatibility_range[0];
         }
       }
-      $this->compatibilityMessages[$core_compatibility_constraint] = $this->t('This module is compatible with Drupal core:') . ' ' . implode(', ', $range_messages);
+      $this->compatibilityMessages[$core_compatibility_constraint] = $this->t('Requires Drupal core:') . ' ' . implode(', ', $range_messages);
     }
     return $this->compatibilityMessages[$core_compatibility_constraint];
   }
 
   /**
+   * Determines if a release is compatibile with the currently installed core.
+   *
+   * @param string $core_compatibility_constraint
+   *   A semantic version constraint.
+   *
+   * @return bool
+   *   TRUE if the given constraint is satisfied by the currently installed
+   *   version of Drupal core, otherwise FALSE.
+   */
+  protected function isCoreCompatible($core_compatibility_constraint) {
+    return Semver::satisfies($this->existingCoreVersion, $core_compatibility_constraint);
+  }
+
+  /**
    * Gets the compatibility ranges for a semantic version constraint.
    *
    * @param string $core_compatibility_constraint
diff --git a/core/modules/update/templates/update-version.html.twig b/core/modules/update/templates/update-version.html.twig
index 72c3174..f79f58b 100644
--- a/core/modules/update/templates/update-version.html.twig
+++ b/core/modules/update/templates/update-version.html.twig
@@ -11,6 +11,8 @@
  *   - date: The date of the release.
  *   - download_link: The URL for the downloadable file.
  *   - release_link: The URL for the release notes.
+ *   - core_compatible (bool): Is it compatible with the installed core or not?
+ *   - core_compatibility_details: Render array of core compatibility details.
  *
  * @ingroup themeable
  */
@@ -21,9 +23,6 @@
     <div class="project-update__version-details layout-column layout-column--quarter">
       <a href="{{ version.release_link }}">{{ version.version }}</a>
       <span class="project-update__version-date">({{ version.date|date('Y-M-d') }})</span>
-      {% if version.core_compatibility_message %}
-        <span class="project-update__core-compatibility-message">{{ version.core_compatibility_message }}</span>
-      {% endif %}
     </div>
     <div class="layout-column layout-column--half">
       <ul class="project-update__version-links">
@@ -33,6 +32,11 @@
         <li class="project-update__release-notes-link">
           <a href="{{ version.release_link }}">{{ 'Release notes'|t }}</a>
         </li>
+        {% if version.core_compatibility_details %}
+          <li class="project-update__compatibility-details">
+            {{ version.core_compatibility_details }}
+          </li>
+        {% endif %}
       </ul>
     </div>
   </div>
diff --git a/core/modules/update/tests/src/Functional/UpdateContribTest.php b/core/modules/update/tests/src/Functional/UpdateContribTest.php
index 839fee4..811bee6 100644
--- a/core/modules/update/tests/src/Functional/UpdateContribTest.php
+++ b/core/modules/update/tests/src/Functional/UpdateContribTest.php
@@ -719,7 +719,8 @@ public function securityUpdateAvailabilityProvider() {
   protected function assertCoreCompatibilityMessage($version, $expected_compatibility_range, $expected_release_title) {
     $link = $this->getSession()->getPage()->findLink($version);
     $update_info_element = $link->getParent();
-    $this->assertContains("This module is compatible with Drupal core: $expected_compatibility_range", $update_info_element->getText());
+    $update_compatibility_details_element = $update_info_element->getParent()->find('css', '.project-update__compatibility-details');
+    $this->assertContains("Requires Drupal core: $expected_compatibility_range", $update_compatibility_details_element->getText());
     $update_title_element = $update_info_element->getParent()->find('css', '.project-update__version-title');
     $this->assertSame($expected_release_title, $update_title_element->getText());
   }
diff --git a/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php b/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php
index 200aaec..329baaa 100644
--- a/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php
+++ b/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php
@@ -20,6 +20,14 @@ public function testSetProjectCoreCompatibilityRanges(array $project_data, $core
     $project_compatibility = new ProjectCoreCompatibility($core_data, $core_releases);
     $project_compatibility->setStringTranslation($this->getStringTranslationStub());
     $project_compatibility->setReleaseMessage($project_data);
+    // Ignore the <details> markup, and only assert that the core compatibility
+    // constraint, range message and core compatible boolean matches.
+    $purge_compatibility_details = function ($release) {
+      unset($release['core_compatibility_details']);
+      return $release;
+    };
+    $project_data['releases'] = array_map($purge_compatibility_details, $project_data['releases']);
+    $project_data['security updates'] = array_map($purge_compatibility_details, $project_data['security updates']);
     $this->assertSame($expected_releases, $project_data['releases']);
     $this->assertSame($expected_security_updates, $project_data['security updates']);
   }
@@ -72,22 +80,26 @@ public function providerSetProjectCoreCompatibilityRanges() {
       'expected_releases' => [
         '1.0.1' => [
           'core_compatibility' => '8.x',
-          'core_compatibility_message' => 'This module is compatible with Drupal core: 8.8.0 to 8.9.2',
+          'core_compatible' => TRUE,
+          'core_compatibility_range' => 'Requires Drupal core: 8.8.0 to 8.9.2',
         ],
         '1.2.3' => [
           'core_compatibility' => '^8.9 || ^9',
-          'core_compatibility_message' => 'This module is compatible with Drupal core: 8.9.0 to 8.9.2',
+          'core_compatible' => FALSE,
+          'core_compatibility_range' => 'Requires Drupal core: 8.9.0 to 8.9.2',
         ],
         '1.2.4' => [
           'core_compatibility' => '^8.9.2 || ^9',
-          'core_compatibility_message' => 'This module is compatible with Drupal core: 8.9.2',
+          'core_compatible' => FALSE,
+          'core_compatibility_range' => 'Requires Drupal core: 8.9.2',
         ],
         '1.2.6' => [],
       ],
       'expected_security_updates' => [
         '1.2.5' => [
           'core_compatibility' => '8.9.0 || 8.9.2 || ^9.0.1',
-          'core_compatibility_message' => 'This module is compatible with Drupal core: 8.9.0, 8.9.2',
+          'core_compatible' => FALSE,
+          'core_compatibility_range' => 'Requires Drupal core: 8.9.0, 8.9.2',
         ],
       ],
     ];
@@ -110,22 +122,26 @@ public function providerSetProjectCoreCompatibilityRanges() {
     $test_cases['with 9 full releases']['expected_releases'] = [
       '1.0.1' => [
         'core_compatibility' => '8.x',
-        'core_compatibility_message' => 'This module is compatible with Drupal core: 8.8.0 to 8.9.2',
+        'core_compatible' => TRUE,
+        'core_compatibility_range' => 'Requires Drupal core: 8.8.0 to 8.9.2',
       ],
       '1.2.3' => [
         'core_compatibility' => '^8.9 || ^9',
-        'core_compatibility_message' => 'This module is compatible with Drupal core: 8.9.0 to 9.0.2',
+        'core_compatible' => FALSE,
+        'core_compatibility_range' => 'Requires Drupal core: 8.9.0 to 9.0.2',
       ],
       '1.2.4' => [
         'core_compatibility' => '^8.9.2 || ^9',
-        'core_compatibility_message' => 'This module is compatible with Drupal core: 8.9.2 to 9.0.2',
+        'core_compatible' => FALSE,
+        'core_compatibility_range' => 'Requires Drupal core: 8.9.2 to 9.0.2',
       ],
       '1.2.6' => [],
     ];
     $test_cases['with 9 full releases']['expected_security_updates'] = [
       '1.2.5' => [
         'core_compatibility' => '8.9.0 || 8.9.2 || ^9.0.1',
-        'core_compatibility_message' => 'This module is compatible with Drupal core: 8.9.0, 8.9.2, 9.0.1 to 9.0.2',
+        'core_compatible' => FALSE,
+        'core_compatibility_range' => 'Requires Drupal core: 8.9.0, 8.9.2, 9.0.1 to 9.0.2',
       ],
     ];
     return $test_cases;
diff --git a/core/themes/claro/templates/admin/update-version.html.twig b/core/themes/claro/templates/admin/update-version.html.twig
index dcb5d65..69932e0 100644
--- a/core/themes/claro/templates/admin/update-version.html.twig
+++ b/core/themes/claro/templates/admin/update-version.html.twig
@@ -11,6 +11,8 @@
  *   - date: The date of the release.
  *   - download_link: The URL for the downloadable file.
  *   - release_link: The URL for the release notes.
+ *   - core_compatible (bool): Is it compatible with the installed core or not?
+ *   - core_compatibility_details: Render array of core compatibility details.
  */
 #}
 <div class="{{ attributes.class }} project-update__version"{{ attributes|without('class') }}>
@@ -19,9 +21,6 @@
     <div class="project-update__version-details layout-column layout-column--quarter">
       <a href="{{ version.release_link }}">{{ version.version }}</a>
       <span class="project-update__version-date">({{ version.date|date('Y-M-d') }})</span>
-      {% if version.core_compatibility_message %}
-        <span class="project-update__core-compatibility-message">{{ version.core_compatibility_message }}</span>
-      {% endif %}
     </div>
     <div class="layout-column layout-column--half">
       <ul class="project-update__version-links">
@@ -31,6 +30,11 @@
         <li class="project-update__release-notes-link">
           <a href="{{ version.release_link }}">{{ 'Release notes'|t }}</a>
         </li>
+        {% if version.core_compatibility_details %}
+          <li class="project-update__compatibility-details">
+            {{ version.core_compatibility_details }}
+          </li>
+        {% endif %}
       </ul>
     </div>
   </div>
diff --git a/core/themes/stable/css/update/update.admin.theme.css b/core/themes/stable/css/update/update.admin.theme.css
index 785da9a..61c4516 100644
--- a/core/themes/stable/css/update/update.admin.theme.css
+++ b/core/themes/stable/css/update/update.admin.theme.css
@@ -61,3 +61,34 @@
 .project-update__version--recommended-strong .project-update__version-title {
   font-weight: bold;
 }
+
+.project-update__compatibility-details details {
+  height: 20px;
+  margin: 0;
+  border: 0;
+  background-color: inherit;
+}
+.project-update__compatibility-details details[open] {
+  overflow: visible;
+  height: auto;
+  white-space: normal;
+}
+.project-update__compatibility-details details summary {
+  color: #5c5c5b;
+  border: 0;
+  margin: 0;
+  padding: 0;
+  text-transform: none;
+  font-weight: normal;
+}
+.project-update__compatibility-details details summary:hover,
+.project-update__compatibility-details details summary:focus {
+  color: #5c5c5b;
+  outline: none;  
+  border-bottom: 1px solid;
+}
+.project-update__compatibility-details details .details-wrapper {
+  margin: 0;
+  padding: 5px 0;
+  color: #5c5c5b;
+}
diff --git a/core/themes/stable/templates/admin/update-version.html.twig b/core/themes/stable/templates/admin/update-version.html.twig
index f3bce70..e426ee9 100644
--- a/core/themes/stable/templates/admin/update-version.html.twig
+++ b/core/themes/stable/templates/admin/update-version.html.twig
@@ -11,6 +11,8 @@
  *   - date: The date of the release.
  *   - download_link: The URL for the downloadable file.
  *   - release_link: The URL for the release notes.
+ *   - core_compatible (bool): Is it compatible with the installed core or not?
+ *   - core_compatibility_details: Render array of core compatibility details.
  */
 #}
 <div class="{{ attributes.class }} project-update__version"{{ attributes|without('class') }}>
@@ -19,9 +21,6 @@
     <div class="project-update__version-details layout-column layout-column--quarter">
       <a href="{{ version.release_link }}">{{ version.version }}</a>
       <span class="project-update__version-date">({{ version.date|date('Y-M-d') }})</span>
-      {% if version.core_compatibility_message %}
-        <span class="project-update__core-compatibility-message">{{ version.core_compatibility_message }}</span>
-      {% endif %}
     </div>
     <div class="layout-column layout-column--half">
       <ul class="project-update__version-links">
@@ -31,6 +30,11 @@
         <li class="project-update__release-notes-link">
           <a href="{{ version.release_link }}">{{ 'Release notes'|t }}</a>
         </li>
+        {% if version.core_compatibility_details %}
+          <li class="project-update__compatibility-details">
+            {{ version.core_compatibility_details }}
+          </li>
+        {% endif %}
       </ul>
     </div>
   </div>
