diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
index 04da0f588c..6a76ef051a 100644
--- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
@@ -165,6 +165,20 @@ class MigrateUpgradeForm extends ConfirmFormBase {
   ];
 
   /**
+   * List of extensions that have an incomplete upgrade path.
+   *
+   * This property is an array where the keys are the major Drupal core version
+   * from which we are upgrading, and the values are arrays of extension names
+   * that have at least one migration but need more to be complete.
+   *
+   * @var array[]
+   */
+  protected $incompleteUpgradePaths = [
+    '6' => [],
+    '7' => [],
+  ];
+
+  /**
    * Constructs the MigrateUpgradeForm.
    *
    * @param \Drupal\Core\State\StateInterface $state
@@ -789,7 +803,10 @@ public function buildConfirmForm(array $form, FormStateInterface $form_state) {
       unset($system_data['module'][$profile]);
     }
 
+    // Prepare the lists of source modules.
     $unmigrated_source_modules = array_diff_key($system_data['module'], $table_data);
+    $available_source_modules = array_diff_key($table_data, array_flip($this->incompleteUpgradePaths[$version]));
+    $incomplete_source_modules = array_intersect_key($table_data, array_flip($this->incompleteUpgradePaths[$version]));
 
     // Missing migrations.
     $missing_module_list = [
@@ -832,6 +849,52 @@ public function buildConfirmForm(array $form, FormStateInterface $form_state) {
         ];
       }
     }
+    // Incomplete migrations.
+    $incomplete_module_list = [
+      '#type' => 'details',
+      '#title' => [
+        '#type' => 'html_tag',
+        '#tag' => 'span',
+        '#value' => $this->t('incomplete upgrade paths'),
+        '#attributes' => ['id' => ['warning']],
+      ],
+      '#weight' => 3,
+    ];
+
+    $incomplete_module_list['module_list'] = [
+      '#type' => 'table',
+      '#header' => [
+        $this->t('Source module: Drupal @version', ['@version' => $version]),
+        $this->t('Upgrade module: Drupal 8'),
+      ],
+    ];
+    $incomplete_count = 0;
+    ksort($incomplete_source_modules);
+    foreach ($incomplete_source_modules as $source_module => $destination_module_info) {
+      $incomplete_count++;
+      $destination_details = [];
+      foreach ($destination_module_info as $destination_module => $migration_ids) {
+        $destination_details[$destination_module] = [
+          '#type' => 'item',
+          '#plain_text' => $destination_module,
+        ];
+      }
+      $incomplete_module_list['module_list'][$source_module] = [
+        'source_module' => [
+          '#type' => 'html_tag',
+          '#tag' => 'span',
+          '#value' => $source_module,
+          '#attributes' => [
+            'class' => [
+              'upgrade-analysis-report__status-icon',
+              'upgrade-analysis-report__status-icon--checked',
+            ],
+          ],
+        ],
+        'destination_module' => $destination_details,
+      ];
+    }
+
     // Available migrations.
     $available_module_list = [
       '#type' => 'details',
@@ -853,7 +916,7 @@ public function buildConfirmForm(array $form, FormStateInterface $form_state) {
     ];
 
     $available_count = 0;
-    foreach ($table_data as $source_module => $destination_module_info) {
+    foreach ($available_source_modules as $source_module => $destination_module_info) {
       $available_count++;
       $destination_details = [];
       foreach ($destination_module_info as $destination_module => $migration_ids) {
@@ -878,6 +941,7 @@ public function buildConfirmForm(array $form, FormStateInterface $form_state) {
       ];
     }
 
+    // Prepare the form.
     $counters = [];
     $general_info = [];
 
@@ -886,11 +950,21 @@ public function buildConfirmForm(array $form, FormStateInterface $form_state) {
         '#theme' => 'status_report_counter',
         '#amount' => $missing_count,
         '#text' => $this->formatPlural($missing_count, 'Missing upgrade path', 'Missing upgrade paths'),
-        '#severity' => 'warning',
+        '#severity' => 'error',
         '#weight' => 0,
       ];
       $general_info[] = $missing_module_list;
     }
+    if ($incomplete_count) {
+      $counters[] = [
+        '#theme' => 'status_report_counter',
+        '#amount' => $incomplete_count,
+        '#text' => $this->formatPlural($missing_count, 'Incomplete upgrade path', 'Incomplete upgrade paths'),
+        '#severity' => 'warning',
+        '#weight' => 0,
+      ];
+      $general_info[] = $incomplete_module_list;
+    }
     if ($available_count) {
       $counters[] = [
         '#theme' => 'status_report_counter',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
index 8496b115dd..2747b51a9e 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
@@ -178,4 +178,12 @@ protected function assertUpgradePaths(WebAssert $session, array $available_paths
    */
   abstract protected function getMissingPaths();
 
+  /**
+   * Gets the incomplete upgrade paths.
+   *
+   * @return string[]
+   *   An array of incomplete upgrade paths.
+   */
+  abstract protected function getIncompletePaths();
+
 }
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
index a526de77e9..6e04ece0ff 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
@@ -133,4 +133,13 @@ protected function getMissingPaths() {
     ];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function getIncompletePaths() {
+    return [
+      'menu',
+    ];
+  }
+
 }
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
index 474a9a9897..def00bae24 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
@@ -152,6 +152,13 @@ protected function getAvailablePaths() {
   /**
    * {@inheritdoc}
    */
+  protected function getIncompletePaths() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function getMissingPaths() {
     return [
       'i18nblocks',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php
index b8ea52b43f..32ab6d5ef7 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php
@@ -113,6 +113,15 @@ protected function getAvailablePaths() {
   /**
    * {@inheritdoc}
    */
+  protected function getIncompletePaths() {
+    return [
+      'menu',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function getMissingPaths() {
     return [
       'book',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
index 2b31a7990b..525dedfcb5 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
@@ -152,6 +152,13 @@ protected function getAvailablePaths() {
   /**
    * {@inheritdoc}
    */
+  protected function getIncompletePaths() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function getMissingPaths() {
     return [
       'book',
