diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityUpdater.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityUpdater.php
index 571b991425..b4ebcc8a7e 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityUpdater.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityUpdater.php
@@ -92,13 +92,13 @@ public static function create(ContainerInterface $container) {
   public function update(array &$sandbox, $entity_type_id, callable $callback = NULL) {
     $storage = $this->entityTypeManager->getStorage($entity_type_id);
     $sandbox_key = 'config_entity_updater:' . $entity_type_id;
-    if (!isset($sandbox[$sandbox_key])) {
+    if (!isset($sandbox['sandbox_keys'][$sandbox_key])) {
       $entity_type = $this->entityTypeManager->getDefinition($entity_type_id);
       if (!($entity_type instanceof ConfigEntityTypeInterface)) {
         throw new \InvalidArgumentException("The provided entity type ID '$entity_type_id' is not a configuration entity type");
       }
-      $sandbox[$sandbox_key]['entities'] = $storage->getQuery()->accessCheck(FALSE)->execute();
-      $sandbox[$sandbox_key]['count'] = count($sandbox[$sandbox_key]['entities']);
+      $sandbox['sandbox_keys'][$sandbox_key]['entities'] = $storage->getQuery()->accessCheck(FALSE)->execute();
+      $sandbox['sandbox_keys'][$sandbox_key]['count'] = count($sandbox['sandbox_keys'][$sandbox_key]['entities']);
     }
 
     // The default behaviour is to fix dependencies.
@@ -111,7 +111,7 @@ public function update(array &$sandbox, $entity_type_id, callable $callback = NU
     }
 
     /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */
-    $entities = $storage->loadMultiple(array_splice($sandbox[$sandbox_key]['entities'], 0, $this->batchSize));
+    $entities = $storage->loadMultiple(array_splice($sandbox['sandbox_keys'][$sandbox_key]['entities'], 0, $this->batchSize));
     foreach ($entities as $entity) {
       if (call_user_func($callback, $entity)) {
         $entity->trustData();
@@ -119,7 +119,14 @@ public function update(array &$sandbox, $entity_type_id, callable $callback = NU
       }
     }
 
-    $sandbox['#finished'] = empty($sandbox[$sandbox_key]['entities']) ? 1 : ($sandbox[$sandbox_key]['count'] - count($sandbox[$sandbox_key]['entities'])) / $sandbox[$sandbox_key]['count'];
+    $sandbox['sandbox_keys'][$sandbox_key]['#finished'] = empty($sandbox['sandbox_keys'][$sandbox_key]['entities']) ? 1 : ($sandbox['sandbox_keys'][$sandbox_key]['count'] - count($sandbox['sandbox_keys'][$sandbox_key]['entities'])) / $sandbox['sandbox_keys'][$sandbox_key]['count'];
+    $sandbox['#finished'] = $sandbox['sandbox_keys'][$sandbox_key]['#finished'];
+
+    $sub_sandbox_info = reset($sandbox['sandbox_keys']);
+    while(($sandbox['#finished'] == 1) && $sub_sandbox_info) {
+      $sandbox['#finished'] = $sub_sandbox_info['#finished'];
+      $sub_sandbox_info = next($sandbox['sandbox_keys']);
+    }
   }
 
 }
diff --git a/core/modules/system/system.post_update.php b/core/modules/system/system.post_update.php
index 114d289120..22fdf0c0b1 100644
--- a/core/modules/system/system.post_update.php
+++ b/core/modules/system/system.post_update.php
@@ -240,3 +240,12 @@ function system_post_update_entity_reference_autocomplete_match_limit(&$sandbox
 
   $config_entity_updater->update($sandbox, 'entity_form_display', $callback);
 }
+
+/**
+ * Update all entity displays that contain extra fields.
+ *
+ * Re-run the update because of https://www.drupal.org/project/drupal/issues/3092714
+ */
+function system_post_update_extra_fields_rerun(&$sandbox = NULL) {
+  system_post_update_extra_fields($sandbox);
+}
diff --git a/core/modules/text/text.post_update.php b/core/modules/text/text.post_update.php
index 5c98e26b00..f9baa021dd 100644
--- a/core/modules/text/text.post_update.php
+++ b/core/modules/text/text.post_update.php
@@ -47,3 +47,12 @@ function text_post_update_add_required_summary_flag(&$sandbox = NULL) {
   $config_entity_updater->update($sandbox, 'entity_form_display', $widget_callback);
   $config_entity_updater->update($sandbox, 'field_config', $field_callback);
 }
+
+/**
+ * Update text_with_summary fields and widgets to add summary required flags.
+ *
+ * Re-run the update because of https://www.drupal.org/project/drupal/issues/3092714
+ */
+function text_post_update_add_required_summary_flag_rerun(&$sandbox = NULL) {
+  text_post_update_add_required_summary_flag($sandbox);
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php b/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php
index f76578f99c..63938333a5 100644
--- a/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Config/Entity/ConfigEntityUpdaterTest.php
@@ -58,8 +58,8 @@ public function testUpdate() {
     $this->assertEquals('config_test_9', $entities['config_test_9']->label());
     $this->assertEquals('config_test_10', $entities['config_test_10']->label());
     $this->assertEquals('config_test_14', $entities['config_test_14']->label());
-    $this->assertEquals(15, $sandbox['config_entity_updater:config_test']['count']);
-    $this->assertCount(5, $sandbox['config_entity_updater:config_test']['entities']);
+    $this->assertEquals(15, $sandbox['sandbox_keys']['config_entity_updater:config_test']['count']);
+    $this->assertCount(5, $sandbox['sandbox_keys']['config_entity_updater:config_test']['entities']);
     $this->assertEquals(10 / 15, $sandbox['#finished']);
 
     // Update the rest.
@@ -70,7 +70,7 @@ public function testUpdate() {
     $this->assertEquals('config_test_10 (updated)', $entities['config_test_10']->label());
     $this->assertEquals('config_test_14 (updated)', $entities['config_test_14']->label());
     $this->assertEquals(1, $sandbox['#finished']);
-    $this->assertCount(0, $sandbox['config_entity_updater:config_test']['entities']);
+    $this->assertCount(0, $sandbox['sandbox_keys']['config_entity_updater:config_test']['entities']);
   }
 
   /**
@@ -100,8 +100,8 @@ public function testUpdateDefaultCallback() {
     $this->assertEquals(['added_dependency'], $entities['config_test_8']->getDependencies()['module']);
     $this->assertEquals([], $entities['config_test_9']->getDependencies());
     $this->assertEquals([], $entities['config_test_14']->getDependencies());
-    $this->assertEquals(15, $sandbox['config_entity_updater:config_test']['count']);
-    $this->assertCount(6, $sandbox['config_entity_updater:config_test']['entities']);
+    $this->assertEquals(15, $sandbox['sandbox_keys']['config_entity_updater:config_test']['count']);
+    $this->assertCount(6, $sandbox['sandbox_keys']['config_entity_updater:config_test']['entities']);
     $this->assertEquals(9 / 15, $sandbox['#finished']);
 
     // Update the rest.
@@ -110,7 +110,7 @@ public function testUpdateDefaultCallback() {
     $this->assertEquals(['added_dependency'], $entities['config_test_9']->getDependencies()['module']);
     $this->assertEquals(['added_dependency'], $entities['config_test_14']->getDependencies()['module']);
     $this->assertEquals(1, $sandbox['#finished']);
-    $this->assertCount(0, $sandbox['config_entity_updater:config_test']['entities']);
+    $this->assertCount(0, $sandbox['sandbox_keys']['config_entity_updater:config_test']['entities']);
   }
 
   /**
@@ -125,4 +125,70 @@ public function testUpdateException() {
     $updater->update($sandbox, 'entity_test_mul_changed');
   }
 
+  /**
+   * @covers ::update
+   */
+  public function testMultipleUpdate() {
+    // Create some entities to update, where the count of the first entity type
+    // is higher than the batch size and the count of the second entity type is
+    // less than the batch size. This will test that the sandbox will not be
+    // flagged as finished before both entity types have been processed.
+    $settings = Settings::getInstance() ? Settings::getAll() : [];
+    $settings['entity_update_batch_size'] = 2;
+    new Settings($settings);
+
+    /** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $config_test_storage */
+    $config_test_storage = $this->container->get('entity_type.manager')->getStorage('config_test');
+    for ($i = 0; $i < 4; $i++) {
+      $entity_id = 'config_test_' . $i;
+      $config_test_storage->create(['id' => $entity_id, 'label' => $entity_id])->save();
+    }
+    /** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $config_query_test_storage */
+    $config_query_test_storage = $this->container->get('entity_type.manager')->getStorage('config_query_test');
+    for ($i = 0; $i < 2; $i++) {
+      $entity_id = 'config_query_test_' . $i;
+      $config_query_test_storage->create(['id' => $entity_id, 'label' => $entity_id])->save();
+    }
+
+    // Set up the updater.
+    $sandbox = [];
+    $updater = $this->container->get('class_resolver')->getInstanceFromDefinition(ConfigEntityUpdater::class);
+
+    $callback = function ($config_entity) {
+      $config_entity->set('label', 'updated');
+      return TRUE;
+    };
+
+    // This should run against the first 2 entities per entity type.
+    $updater->update($sandbox, 'config_test', $callback);
+    $updater->update($sandbox, 'config_query_test', $callback);
+
+    // Ensure that not all the entities of the first entity type have been
+    // updated.
+    $count_updated_config_test = count($config_test_storage->loadByProperties(['label' => 'updated']));
+    $this->assertEquals($settings['entity_update_batch_size'], $count_updated_config_test);
+    $count_all_config_test = count($config_test_storage->loadMultiple());
+    $this->assertTrue($count_all_config_test > $settings['entity_update_batch_size']);
+
+    // Ensure that all the entities of the second entity type have been updated.
+    $count_updated_config_query_test = count($config_query_test_storage->loadByProperties(['label' => 'updated']));
+    $count_all_config_query_test = count($config_query_test_storage->loadMultiple());
+    $this->assertEquals($count_all_config_query_test, $count_updated_config_query_test);
+
+    // Ensure that the batch is not finished.
+    $this->assertFalse($sandbox['#finished'] == 1);
+
+    // This should run against the rest of the entities.
+    $updater->update($sandbox, 'config_test', $callback);
+    $updater->update($sandbox, 'config_query_test', $callback);
+
+    // Ensure that all the entities of the first entity type have been updated.
+    $count_updated_config_test = count($config_test_storage->loadByProperties(['label' => 'updated']));
+    $count_all_config_test = count($config_test_storage->loadMultiple());
+    $this->assertEquals($count_all_config_test, $count_updated_config_test);
+
+    // Ensure that the batch is finished.
+    $this->assertTrue($sandbox['#finished'] == 1);
+  }
+
 }
