diff -u b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
--- b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
+++ b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
@@ -8,6 +8,11 @@
 use Drupal\Core\Url;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Event\MigrateEvents;
+use Drupal\migrate\Event\MigrateIdMapMessageEvent;
+use Drupal\migrate\Event\MigrateMapDeleteEvent;
+use Drupal\migrate\Event\MigrateMapSaveEvent;
+use Drupal\migrate\Event\MigratePostRowSaveEvent;
+use Drupal\migrate\Event\MigrateRowDeleteEvent;
 use Drupal\migrate\MigrateExecutable;
 
 /**
@@ -16,6 +21,41 @@
 class MigrateUpgradeImportBatch extends MigrateUpgradeBatchBase {
 
   /**
+   * Maximum number of previous messages to display.
+   */
+  const MESSAGE_LENGTH = 20;
+
+  /**
+   * The processed items for one batch of a given migration.
+   *
+   * @var int
+   */
+  static $numProcessed = 0;
+
+  /**
+   * Ensure we only add the listeners once per request.
+   *
+   * @var bool
+   */
+  protected static $listenersAdded = FALSE;
+
+  /**
+   * The maximum length in seconds to allow processing in a request.
+   *
+   * @see self::run()
+   *
+   * @var int
+   */
+  protected static $maxExecTime;
+
+  /**
+   * MigrateMessage instance to capture messages during the migration process.
+   *
+   * @var \Drupal\migrate_drupal_ui\Batch\MigrateMessageCapture
+   */
+  protected static $messages;
+
+  /**
    * Runs a single migrate import batch.
    *
    * @param int[] $initial_ids
@@ -175,9 +215,9 @@
    *   TRUE if batch successfully completed.
    * @param array $results
    *   Batch results.
-   * @param $operations
+   * @param array $operations
    *   An array of methods run in the batch.
-   * @param $elapsed
+   * @param string $elapsed
    *   The time to run the batch.
    */
   public static function finished($success, $results, $operations, $elapsed) {
@@ -209,2 +249,66 @@
 
+  /**
+   * Reacts to item import.
+   *
+   * @param \Drupal\migrate\Event\MigratePostRowSaveEvent $event
+   *   The post-save event.
+   */
+  public static function onPostRowSave(MigratePostRowSaveEvent $event) {
+    // We want to interrupt this batch and start a fresh one.
+    if ((time() - REQUEST_TIME) > static::$maxExecTime) {
+      $event->getMigration()->interruptMigration(MigrationInterface::RESULT_INCOMPLETE);
+    }
+  }
+
+  /**
+   * Reacts to item deletion.
+   *
+   * @param \Drupal\migrate\Event\MigrateRowDeleteEvent $event
+   *   The post-save event.
+   */
+  public static function onPostRowDelete(MigrateRowDeleteEvent $event) {
+    // We want to interrupt this batch and start a fresh one.
+    if ((time() - REQUEST_TIME) > static::$maxExecTime) {
+      $event->getMigration()->interruptMigration(MigrationInterface::RESULT_INCOMPLETE);
+    }
+  }
+
+  /**
+   * Counts up any map save events.
+   *
+   * @param \Drupal\migrate\Event\MigrateMapSaveEvent $event
+   *   The map event.
+   */
+  public static function onMapSave(MigrateMapSaveEvent $event) {
+    static::$numProcessed++;
+  }
+
+  /**
+   * Counts up any map delete events.
+   *
+   * @param \Drupal\migrate\Event\MigrateMapDeleteEvent $event
+   *   The map event.
+   */
+  public static function onMapDelete(MigrateMapDeleteEvent $event) {
+    static::$numProcessed++;
+  }
+
+  /**
+   * Displays any messages being logged to the ID map.
+   *
+   * @param \Drupal\migrate\Event\MigrateIdMapMessageEvent $event
+   *   The message event.
+   */
+  public static function onIdMapMessage(MigrateIdMapMessageEvent $event) {
+    if ($event->getLevel() == MigrationInterface::MESSAGE_NOTICE || $event->getLevel() == MigrationInterface::MESSAGE_INFORMATIONAL) {
+      $type = 'status';
+    }
+    else {
+      $type = 'error';
+    }
+    $source_id_string = implode(',', $event->getSourceIdValues());
+    $message = t('Source ID @source_id: @message', ['@source_id' => $source_id_string, '@message' => $event->getMessage()]);
+    static::$messages->display($message, $type);
+  }
+
 }
