diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index e3f920c..7ebf19a 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -15,6 +15,7 @@
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Plugin\RequirementsInterface;
 use Drupal\Component\Utility\NestedArray;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
 /**
  * Defines the Migration entity.
@@ -241,6 +242,13 @@ class Migration extends ConfigEntityBase implements MigrationInterface, Requirem
   protected $entityManager;
 
   /**
+   * The event dispatcher.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
    * {@inheritdoc}
    */
   public function getSourcePlugin() {
@@ -401,6 +409,16 @@ protected function getEntityManager() {
   /**
    * {@inheritdoc}
    */
+  public function getEventDispatcher() {
+    if (!isset($this->eventDispatcher)) {
+      $this->eventDispatcher = \Drupal::service('event_dispatcher');
+    }
+    return $this->eventDispatcher;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function setMigrationResult($result) {
     $migrate_result_store = \Drupal::keyValue('migrate_result');
     $migrate_result_store->set($this->id(), $result);
diff --git a/core/modules/migrate/src/Entity/MigrationInterface.php b/core/modules/migrate/src/Entity/MigrationInterface.php
index 5d20723..2f26577 100644
--- a/core/modules/migrate/src/Entity/MigrationInterface.php
+++ b/core/modules/migrate/src/Entity/MigrationInterface.php
@@ -283,4 +283,12 @@ public function setTrackLastImported($track_last_imported);
    */
   public function getMigrationDependencies();
 
+  /**
+   * Get the event dispatcher.
+   *
+   * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   *   The event dispatcher.
+   */
+  public function getEventDispatcher();
+
 }
diff --git a/core/modules/migrate/src/MigrateEvents.php b/core/modules/migrate/src/MigrateEvents.php
new file mode 100644
index 0000000..3676330
--- /dev/null
+++ b/core/modules/migrate/src/MigrateEvents.php
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\migrate\MigrateEvents.
+ */
+
+namespace Drupal\migrate;
+
+/**
+ * Defines events for the migration system.
+ *
+ * @see \Drupal\migrate\MigrateMapSaveEvent
+ * @see \Drupal\migrate\MigrateMapDeleteEvent
+ * @see \Drupal\migrate\MigratePreImportEvent
+ * @see \Drupal\migrate\MigratePostImportEvent
+ */
+final class MigrateEvents {
+
+  /**
+   * Name of the event fired when saving to a migration's map.
+   *
+   * This event allows modules to perform an action whenever the disposition of
+   * an item being migrated is saved to the map table. The event listener method
+   * receives a \Drupal\migrate\MigrateMapSaveEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\migrate\MigrateMapSaveEvent
+   *
+   * @var string
+   */
+  const MAP_SAVE = 'migrate.map_save';
+
+  /**
+   * Name of the event fired when removing an entry from a migration's map.
+   *
+   * This event allows modules to perform an action whenever a row is deleted
+   * from a migration's map table (implying it has been rolled back). The event
+   * listener method receives a \Drupal\migrate\MigrateMapDeleteEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\migrate\MigrateMapDeleteEvent
+   *
+   * @var string
+   */
+  const MAP_DELETE = 'migrate.map_delete';
+
+  /**
+   * Name of the event fired when beginning a migration import operation.
+   *
+   * This event allows modules to perform an action whenever a migration import
+   * operation is about to begin. The event listener method receives a
+   * \Drupal\migrate\MigratePreImportEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\migrate\MigratePreImportEvent
+   *
+   * @var string
+   */
+  const PRE_IMPORT = 'migrate.pre_import';
+
+  /**
+   * Name of the event fired when finishing a migration import operation.
+   *
+   * This event allows modules to perform an action whenever a migration import
+   * operation is completing. The event listener method receives a
+   * \Drupal\migrate\MigratePostImportEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\migrate\MigratePreImportEvent
+   *
+   * @var string
+   */
+  const POST_IMPORT = 'migrate.post_import';
+
+  /**
+   * Name of the event fired when about to import a single item.
+   *
+   * This event allows modules to perform an action whenever a specific item
+   * is about to be saved by the destination plugin. The event listener method
+   * receives a \Drupal\migrate\MigratePreSaveEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\migrate\MigratePreSaveEvent
+   *
+   * @var string
+   */
+  const PRE_SAVE = 'migrate.pre_save';
+
+  /**
+   * Name of the event fired just after a single item has been imported.
+   *
+   * This event allows modules to perform an action whenever a specific item
+   * has been saved by the destination plugin. The event listener method
+   * receives a \Drupal\migrate\MigratePostSaveEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\migrate\MigratePostSaveEvent
+   *
+   * @var string
+   */
+  const POST_SAVE = 'migrate.post_save';
+
+}
diff --git a/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php
index 139a07d..db18304 100644
--- a/core/modules/migrate/src/MigrateExecutable.php
+++ b/core/modules/migrate/src/MigrateExecutable.php
@@ -27,20 +27,6 @@ class MigrateExecutable implements MigrateExecutableInterface {
   protected $migration;
 
   /**
-   * The number of successfully imported rows since feedback was given.
-   *
-   * @var int
-   */
-  protected $successesSinceFeedback;
-
-  /**
-   * The number of rows that were successfully processed.
-   *
-   * @var int
-   */
-  protected $totalSuccesses;
-
-  /**
    * Status of one row.
    *
    * The value is a MigrateIdMapInterface::STATUS_* constant, for example:
@@ -51,15 +37,6 @@ class MigrateExecutable implements MigrateExecutableInterface {
   protected $sourceRowStatus;
 
   /**
-   * The number of rows processed.
-   *
-   * The total attempted, whether or not they were successful.
-   *
-   * @var int
-   */
-  protected $totalProcessed;
-
-  /**
    * The queued messages not yet saved.
    *
    * Each element in the array is an array with two keys:
@@ -71,44 +48,6 @@ class MigrateExecutable implements MigrateExecutableInterface {
   protected $queuedMessages = array();
 
   /**
-   * The options that can be set when executing the migration.
-   *
-   * Values can be set for:
-   * - 'limit': Sets a time limit.
-   *
-   * @var array
-   */
-  protected $options;
-
-  /**
-   * The PHP max_execution_time.
-   *
-   * @var int
-   */
-  protected $maxExecTime;
-
-  /**
-   * The ratio of the memory limit at which an operation will be interrupted.
-   *
-   * @var float
-   */
-  protected $memoryThreshold = 0.85;
-
-  /**
-   * The ratio of the time limit at which an operation will be interrupted.
-   *
-   * @var float
-   */
-  public $timeThreshold = 0.90;
-
-  /**
-   * The time limit when executing the migration.
-   *
-   * @var array
-   */
-  public $limit = array();
-
-  /**
    * The configuration values of the source.
    *
    * @var array
@@ -116,20 +55,6 @@ class MigrateExecutable implements MigrateExecutableInterface {
   protected $sourceIdValues;
 
   /**
-   * The number of rows processed since feedback was given.
-   *
-   * @var int
-   */
-  protected $processedSinceFeedback = 0;
-
-  /**
-   * The PHP memory_limit expressed in bytes.
-   *
-   * @var int
-   */
-  protected $memoryLimit;
-
-  /**
    * The rollback action to be saved for the current row.
    *
    * @var int
@@ -187,31 +112,6 @@ public function __construct(MigrationInterface $migration, MigrateMessageInterfa
     $this->migration = $migration;
     $this->message = $message;
     $this->migration->getIdMap()->setMessage($message);
-    // Record the memory limit in bytes
-    $limit = trim(ini_get('memory_limit'));
-    if ($limit == '-1') {
-      $this->memoryLimit = PHP_INT_MAX;
-    }
-    else {
-      if (!is_numeric($limit)) {
-        $last = strtolower(substr($limit, -1));
-        switch ($last) {
-          case 'g':
-            $limit *= 1024;
-          case 'm':
-            $limit *= 1024;
-          case 'k':
-            $limit *= 1024;
-            break;
-          default:
-            throw new MigrateException($this->t('Invalid PHP memory_limit !limit',
-              array('!limit' => $limit)));
-        }
-      }
-      $this->memoryLimit = $limit;
-    }
-    // Record the maximum execution time limit.
-    $this->maxExecTime = ini_get('max_execution_time');
   }
 
   /**
@@ -237,6 +137,9 @@ protected function getSource() {
    * {@inheritdoc}
    */
   public function import() {
+    $this->migration->getEventDispatcher()->dispatch(MigrateEvents::PRE_IMPORT,
+      new MigratePreImportEvent($this->migration));
+
     // Knock off migration if the requirements haven't been met.
     try {
       $this->migration->checkRequirements();
@@ -284,14 +187,16 @@ public function import() {
 
       if ($save) {
         try {
+          $this->migration->getEventDispatcher()->dispatch(MigrateEvents::PRE_SAVE,
+            new MigratePreSaveEvent($this->migration, $row));
           $destination_id_values = $destination->import($row, $id_map->lookupDestinationId($this->sourceIdValues));
+          $this->migration->getEventDispatcher()->dispatch(MigrateEvents::POST_SAVE,
+            new MigratePostSaveEvent($this->migration, $row, $destination_id_values));
           if ($destination_id_values) {
             // We do not save an idMap entry for config.
             if ($destination_id_values !== TRUE) {
               $id_map->saveIdMapping($row, $destination_id_values, $this->sourceRowStatus, $this->rollbackAction);
             }
-            $this->successesSinceFeedback++;
-            $this->totalSuccesses++;
           }
           else {
             $id_map->saveIdMapping($row, array(), MigrateIdMapInterface::STATUS_FAILED, $this->rollbackAction);
@@ -312,8 +217,6 @@ public function import() {
           $this->handleException($e);
         }
       }
-      $this->totalProcessed++;
-      $this->processedSinceFeedback++;
       if ($high_water_property = $this->migration->get('highWaterProperty')) {
         $this->migration->saveHighWater($row->getSourceProperty($high_water_property['name']));
       }
@@ -321,11 +224,8 @@ public function import() {
       // Reset row properties.
       unset($sourceValues, $destinationValues);
       $this->sourceRowStatus = MigrateIdMapInterface::STATUS_IMPORTED;
-
-      if (($return = $this->checkStatus()) != MigrationInterface::RESULT_COMPLETED) {
-        break;
-      }
-      if ($this->timeOptionExceeded()) {
+      if ($this->migration->getMigrationResult() == MigrationInterface::STATUS_STOPPING) {
+        $return = MigrationInterface::RESULT_COMPLETED;
         break;
       }
       try {
@@ -339,12 +239,9 @@ public function import() {
       }
     }
 
-    /**
-     * @TODO uncomment this
-     */
-    #$this->progressMessage($return);
-
     $this->migration->setMigrationResult($return);
+    $this->migration->getEventDispatcher()->dispatch(MigrateEvents::POST_IMPORT,
+      new MigratePostImportEvent($this->migration));
     return $return;
   }
 
@@ -410,40 +307,6 @@ protected function currentSourceIds() {
   }
 
   /**
-   * Tests whether we've exceeded the designated time limit.
-   *
-   * @return bool
-   *   TRUE if the threshold is exceeded, FALSE if not.
-   */
-  protected function timeOptionExceeded() {
-    // If there is no time limit, then it is not exceeded.
-    if (!$time_limit = $this->getTimeLimit()) {
-      return FALSE;
-    }
-    // Calculate if the time limit is exceeded.
-    $time_elapsed = $this->getTimeElapsed();
-    if ($time_elapsed >= $time_limit) {
-      return TRUE;
-    }
-    else {
-      return FALSE;
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getTimeLimit() {
-    $limit = $this->limit;
-    if (isset($limit['unit']) && isset($limit['value']) && ($limit['unit'] == 'seconds' || $limit['unit'] == 'second')) {
-      return $limit['value'];
-    }
-    else {
-      return NULL;
-    }
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function saveMessage($message, $level = MigrationInterface::MESSAGE_ERROR) {
@@ -468,143 +331,6 @@ public function saveQueuedMessages() {
   }
 
   /**
-   * Checks for exceptional conditions, and display feedback.
-   *
-   * Standard top-of-loop stuff, common between rollback and import.
-   */
-  protected function checkStatus() {
-    if ($this->memoryExceeded()) {
-      return MigrationInterface::RESULT_INCOMPLETE;
-    }
-    if ($this->maxExecTimeExceeded()) {
-      return MigrationInterface::RESULT_INCOMPLETE;
-    }
-    /*
-     * @TODO uncomment this
-    if ($this->getStatus() == MigrationInterface::STATUS_STOPPING) {
-      return MigrationBase::RESULT_STOPPED;
-    }
-    */
-    // If feedback is requested, produce a progress message at the proper time
-    /*
-     * @TODO uncomment this
-    if (isset($this->feedback)) {
-      if (($this->feedback_unit == 'seconds' && time() - $this->lastfeedback >= $this->feedback) ||
-          ($this->feedback_unit == 'items' && $this->processed_since_feedback >= $this->feedback)) {
-        $this->progressMessage(MigrationInterface::RESULT_INCOMPLETE);
-      }
-    }
-    */
-
-    return MigrationInterface::RESULT_COMPLETED;
-  }
-
-  /**
-   * Tests whether we've exceeded the desired memory threshold.
-   *
-   * If so, output a message.
-   *
-   * @return bool
-   *   TRUE if the threshold is exceeded, otherwise FALSE.
-   */
-  protected function memoryExceeded() {
-    $usage = $this->getMemoryUsage();
-    $pct_memory = $usage / $this->memoryLimit;
-    if (!$threshold = $this->memoryThreshold) {
-      return FALSE;
-    }
-    if ($pct_memory > $threshold) {
-      $this->message->display(
-        $this->t('Memory usage is !usage (!pct% of limit !limit), reclaiming memory.',
-          array('!pct' => round($pct_memory*100),
-                '!usage' => $this->formatSize($usage),
-                '!limit' => $this->formatSize($this->memoryLimit))),
-        'warning');
-      $usage = $this->attemptMemoryReclaim();
-      $pct_memory = $usage / $this->memoryLimit;
-      // Use a lower threshold - we don't want to be in a situation where we keep
-      // coming back here and trimming a tiny amount
-      if ($pct_memory > (0.90 * $threshold)) {
-        $this->message->display(
-          $this->t('Memory usage is now !usage (!pct% of limit !limit), not enough reclaimed, starting new batch',
-            array('!pct' => round($pct_memory*100),
-                  '!usage' => $this->formatSize($usage),
-                  '!limit' => $this->formatSize($this->memoryLimit))),
-          'warning');
-        return TRUE;
-      }
-      else {
-        $this->message->display(
-          $this->t('Memory usage is now !usage (!pct% of limit !limit), reclaimed enough, continuing',
-            array('!pct' => round($pct_memory*100),
-                  '!usage' => $this->formatSize($usage),
-                  '!limit' => $this->formatSize($this->memoryLimit))),
-          'warning');
-        return FALSE;
-      }
-    }
-    else {
-      return FALSE;
-    }
-  }
-
-  /**
-   * Returns the memory usage so far.
-   *
-   * @return int
-   *   The memory usage.
-   */
-  protected function getMemoryUsage() {
-    return memory_get_usage();
-  }
-
-  /**
-   * Tries to reclaim memory.
-   *
-   * @return int
-   *   The memory usage after reclaim.
-   */
-  protected function attemptMemoryReclaim() {
-    // First, try resetting Drupal's static storage - this frequently releases
-    // plenty of memory to continue.
-    drupal_static_reset();
-    // @TODO: explore resetting the container.
-    return memory_get_usage();
-  }
-
-  /**
-   * Generates a string representation for the given byte count.
-   *
-   * @param int $size
-   *   A size in bytes.
-   *
-   * @return string
-   *   A translated string representation of the size.
-   */
-  protected function formatSize($size) {
-    return format_size($size);
-  }
-
-  /**
-   * Tests whether we're approaching the PHP maximum execution time limit.
-   *
-   * @return bool
-   *   TRUE if the threshold is exceeded, FALSE if not.
-   */
-  protected function maxExecTimeExceeded() {
-    return $this->maxExecTime && (($this->getTimeElapsed() / $this->maxExecTime) > $this->timeThreshold);
-  }
-
-  /**
-   * Returns the time elapsed.
-   *
-   * This allows a test to set a fake elapsed time.
-   */
-  protected function getTimeElapsed() {
-    return time() - REQUEST_TIME;
-  }
-
-  /**
    * Takes an Exception object and both saves and displays it.
    *
    * Pulls in additional information on the location triggering the exception.
diff --git a/core/modules/migrate/src/MigrateExecutableInterface.php b/core/modules/migrate/src/MigrateExecutableInterface.php
index b0d62ec..415a53f 100644
--- a/core/modules/migrate/src/MigrateExecutableInterface.php
+++ b/core/modules/migrate/src/MigrateExecutableInterface.php
@@ -37,14 +37,6 @@ public function import();
   public function processRow(Row $row, array $process = NULL, $value = NULL);
 
   /**
-   * Returns the time limit.
-   *
-   * @return null|int
-   *   The time limit, NULL if no limit or if the units were not in seconds.
-   */
-  public function getTimeLimit();
-
-  /**
    * Passes messages through to the map class.
    *
    * @param string $message
diff --git a/core/modules/migrate/src/MigrateMapDeleteEvent.php b/core/modules/migrate/src/MigrateMapDeleteEvent.php
new file mode 100644
index 0000000..497c30e
--- /dev/null
+++ b/core/modules/migrate/src/MigrateMapDeleteEvent.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\MigrateMapDeleteEvent.
+ */
+
+namespace Drupal\migrate;
+
+use Drupal\migrate\Plugin\MigrateIdMapInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Wraps a migrate map delete event for event listeners.
+ */
+class MigrateMapDeleteEvent extends Event {
+
+  /**
+   * Map object.
+   *
+   * @var \Drupal\migrate\Plugin\MigrateIdMapInterface
+   */
+  protected $map;
+
+  /**
+   * Array of source ID fields.
+   *
+   * @var array
+   */
+  protected $sourceId;
+
+  /**
+   * Constructs a migration map delete event object.
+   *
+   * @param \Drupal\migrate\Plugin\MigrateIdMapInterface $map
+   *  Map object.
+   * @param array $source_id
+   *  Array of source ID fields representing the object being deleted from the map.
+   */
+  public function __construct(MigrateIdMapInterface $map, array $source_id) {
+    $this->map = $map;
+    $this->sourceId = $source_id;
+  }
+
+  /**
+   * Gets map object.
+   *
+   * @return \Drupal\migrate\Plugin\MigrateIdMapInterface
+   *   The map object that caused the event to fire.
+   */
+  public function getMap() {
+    return $this->map;
+  }
+
+  /**
+   * Gets the source ID of the item being removed from the map.
+   *
+   * @return array
+   *   Array of source ID fields.
+   */
+  public function getSourceId() {
+    return $this->sourceId;
+  }
+
+}
diff --git a/core/modules/migrate/src/MigrateMapSaveEvent.php b/core/modules/migrate/src/MigrateMapSaveEvent.php
new file mode 100644
index 0000000..41a2ac0
--- /dev/null
+++ b/core/modules/migrate/src/MigrateMapSaveEvent.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\MigrateMapSaveEvent.
+ */
+
+namespace Drupal\migrate;
+
+use Drupal\migrate\Plugin\MigrateIdMapInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Wraps a migrate map save event for event listeners.
+ */
+class MigrateMapSaveEvent extends Event {
+
+  /**
+   * Map object.
+   *
+   * @var \Drupal\migrate\Plugin\MigrateIdMapInterface
+   */
+  protected $map;
+
+  /**
+   * Array of fields being saved to the map, keyed by field name.
+   *
+   * @var array
+   */
+  protected $fields;
+
+  /**
+   * Constructs a migration map event object.
+   *
+   * @param \Drupal\migrate\Plugin\MigrateIdMapInterface $map
+   *  Map object.
+   * @param array $fields
+   *  Array of fields being saved to the map.
+   */
+  public function __construct(MigrateIdMapInterface $map, array $fields) {
+    $this->map = $map;
+    $this->fields = $fields;
+  }
+
+  /**
+   * Gets map object.
+   *
+   * @return \Drupal\migrate\Plugin\MigrateIdMapInterface
+   *   The map object that caused the event to fire.
+   */
+  public function getMap() {
+    return $this->map;
+  }
+
+  /**
+   * Gets the fields about to be saved to the map.
+   *
+   * @return array
+   *   Array of map fields, keyed by field name.
+   */
+  public function getFields() {
+    return $this->fields;
+  }
+
+}
diff --git a/core/modules/migrate/src/MigratePostImportEvent.php b/core/modules/migrate/src/MigratePostImportEvent.php
new file mode 100644
index 0000000..db9c5d6
--- /dev/null
+++ b/core/modules/migrate/src/MigratePostImportEvent.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\MigratePostImportEvent.
+ */
+
+namespace Drupal\migrate;
+
+use Drupal\migrate\Entity\MigrationInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Wraps a post-import event for event listeners.
+ */
+class MigratePostImportEvent extends Event {
+
+  /**
+   * Migration object.
+   *
+   * @var \Drupal\migrate\Entity\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * Constructs a post-import event object.
+   *
+   * @param \Drupal\migrate\Entity\MigrationInterface $migration
+   *  Migration object.
+   */
+  public function __construct(MigrationInterface $migration) {
+    $this->migration = $migration;
+  }
+
+  /**
+   * Gets migration object.
+   *
+   * @return \Drupal\migrate\Entity\MigrationInterface
+   *   The migration object just finishing an import operation.
+   */
+  public function getMigration() {
+    return $this->migration;
+  }
+
+}
diff --git a/core/modules/migrate/src/MigratePostSaveEvent.php b/core/modules/migrate/src/MigratePostSaveEvent.php
new file mode 100644
index 0000000..b9b5568
--- /dev/null
+++ b/core/modules/migrate/src/MigratePostSaveEvent.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\MigratePostSaveEvent.
+ */
+
+namespace Drupal\migrate;
+
+use Drupal\migrate\Entity\MigrationInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Wraps a post-save event for event listeners.
+ */
+class MigratePostSaveEvent extends Event {
+
+  /**
+   * Migration object.
+   *
+   * @var \Drupal\migrate\Row
+   */
+  protected $row;
+
+  /**
+   * Row object.
+   *
+   * @var \Drupal\migrate\Entity\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * Values represent the destination ID.
+   *
+   * @var array|bool
+   */
+  protected $destinationIdValues;
+
+  /**
+   * Constructs a post-save event object.
+   *
+   * @param \Drupal\migrate\Entity\MigrationInterface $migration
+   *   Migration object.
+   * @param \Drupal\migrate\Row $row
+   *   Row object.
+   * @param array|bool $destination_id_values
+   *   Values represent the destination ID.
+   */
+  public function __construct(MigrationInterface $migration, Row $row, $destination_id_values) {
+    $this->migration = $migration;
+    $this->row = $row;
+    $this->destinationIdValues = $destination_id_values;
+  }
+
+  /**
+   * Gets migration object.
+   *
+   * @return \Drupal\migrate\Entity\MigrationInterface
+   *   The migration object being imported.
+   */
+  public function getMigration() {
+    return $this->migration;
+  }
+
+  /**
+   * Gets row object.
+   *
+   * @return \Drupal\migrate\Row
+   *   The row object just imported.
+   */
+  public function getRow() {
+    return $this->migration;
+  }
+
+  /**
+   * Gets destination ID values.
+   *
+   * @return array
+   *   The destination ID as an array.
+   */
+  public function getDestinationIdValues() {
+    return $this->destinationIdValues;
+  }
+
+}
diff --git a/core/modules/migrate/src/MigratePreImportEvent.php b/core/modules/migrate/src/MigratePreImportEvent.php
new file mode 100644
index 0000000..4c2d210
--- /dev/null
+++ b/core/modules/migrate/src/MigratePreImportEvent.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\MigratePreImportEvent.
+ */
+
+namespace Drupal\migrate;
+
+use Drupal\migrate\Entity\MigrationInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Wraps a pre-import event for event listeners.
+ */
+class MigratePreImportEvent extends Event {
+
+  /**
+   * Migration object.
+   *
+   * @var \Drupal\migrate\Entity\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * Constructs a pre-import event object.
+   *
+   * @param \Drupal\migrate\Entity\MigrationInterface $migration
+   *  Migration object.
+   */
+  public function __construct(MigrationInterface $migration) {
+    $this->migration = $migration;
+  }
+
+  /**
+   * Gets migration object.
+   *
+   * @return \Drupal\migrate\Entity\MigrationInterface
+   *   The migration object about to begin an import operation.
+   */
+  public function getMigration() {
+    return $this->migration;
+  }
+
+}
diff --git a/core/modules/migrate/src/MigratePreSaveEvent.php b/core/modules/migrate/src/MigratePreSaveEvent.php
new file mode 100644
index 0000000..d42a6c5
--- /dev/null
+++ b/core/modules/migrate/src/MigratePreSaveEvent.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\MigratePreSaveEvent.
+ */
+
+namespace Drupal\migrate;
+
+use Drupal\migrate\Entity\MigrationInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Wraps a pre-save event for event listeners.
+ */
+class MigratePreSaveEvent extends Event {
+
+  /**
+   * Migration object.
+   *
+   * @var \Drupal\migrate\Row
+   */
+  protected $row;
+
+  /**
+   * Row object.
+   *
+   * @var \Drupal\migrate\Entity\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * Constructs a pre-save event object.
+   *
+   * @param \Drupal\migrate\Entity\MigrationInterface $migration
+   *  Migration object.
+   */
+  public function __construct(MigrationInterface $migration, Row $row) {
+    $this->migration = $migration;
+    $this->row = $row;
+  }
+
+  /**
+   * Gets migration object.
+   *
+   * @return \Drupal\migrate\Entity\MigrationInterface
+   *   The migration object being imported.
+   */
+  public function getMigration() {
+    return $this->migration;
+  }
+
+  /**
+   * Gets row object.
+   *
+   * @return \Drupal\migrate\Row
+   *   The row object about to be imported.
+   */
+  public function getRow() {
+    return $this->migration;
+  }
+
+}
diff --git a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
index f1507a3..4f2653d 100644
--- a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
+++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
@@ -16,6 +16,10 @@
 use Drupal\migrate\MigrateMessageInterface;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Row;
+use Drupal\migrate\MigrateEvents;
+use Drupal\migrate\MigrateMapSaveEvent;
+use Drupal\migrate\MigrateMapDeleteEvent;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
 /**
  * Defines the sql based ID map implementation.
@@ -28,6 +32,13 @@
 class Sql extends PluginBase implements MigrateIdMapInterface {
 
   /**
+   * An event dispatcher instance to use for map events.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
    * The migration map table name.
    *
    * @var string
@@ -139,8 +150,8 @@ class Sql extends PluginBase implements MigrateIdMapInterface {
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
-
     $this->migration = $migration;
+    $this->eventDispatcher = $migration->getEventDispatcher();
   }
 
   /**
@@ -504,6 +515,8 @@ public function saveIdMapping(Row $row, array $destination_id_values, $source_ro
       $fields['last_imported'] = time();
     }
     if ($keys) {
+      // Notify anyone listening of the map row we're about to save.
+      $this->eventDispatcher->dispatch(MigrateEvents::MAP_SAVE, new MigrateMapSaveEvent($this, $keys + $fields));
       $this->getDatabase()->merge($this->mapTableName())
         ->key($keys)
         ->fields($fields)
@@ -620,6 +633,8 @@ public function delete(array $source_id_values, $messages_only = FALSE) {
     }
 
     if (!$messages_only) {
+      // Notify anyone listening of the map row we're about to delete.
+      $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id_values));
       $map_query->execute();
     }
     $message_query->execute();
@@ -638,6 +653,8 @@ public function deleteDestination(array $destination_id) {
         $map_query->condition('destid' . $count, $key_value);
         $count++;
       }
+      // Notify anyone listening of the map row we're about to delete.
+      $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id));
       $map_query->execute();
       $count = 1;
       foreach ($source_id as $key_value) {
@@ -673,6 +690,8 @@ public function deleteBulk(array $source_id_values) {
     if (count($this->migration->getSourcePlugin()->getIds()) == 1) {
       $sourceids = array();
       foreach ($source_id_values as $source_id) {
+        // Notify anyone listening of the map rows we're about to delete.
+        $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id));
         $sourceids[] = $source_id;
       }
       $this->getDatabase()->delete($this->mapTableName())
@@ -684,6 +703,8 @@ public function deleteBulk(array $source_id_values) {
     }
     else {
       foreach ($source_id_values as $source_id) {
+        // Notify anyone listening of the map rows we're deleting.
+        $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id));
         $map_query = $this->getDatabase()->delete($this->mapTableName());
         $message_query = $this->getDatabase()->delete($this->messageTableName());
         $count = 1;
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
index 2ebcbba..68a10e1 100644
--- a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
@@ -60,20 +60,6 @@
   protected $currentSourceIds;
 
   /**
-   * Number of rows intentionally ignored (prepareRow() returned FALSE)
-   *
-   * @var int
-   */
-  protected $numIgnored = 0;
-
-  /**
-   * Number of rows we've at least looked at.
-   *
-   * @var int
-   */
-  protected $numProcessed = 0;
-
-  /**
    * The high water mark at the beginning of the import operation.
    *
    * If the source has a property for tracking changes (like Drupal ha
@@ -214,7 +200,6 @@ public function prepareRow(Row $row) {
       $id_map->delete($this->currentSourceIds, TRUE);
       $this->migrateExecutable->saveQueuedMessages();
       $id_map->saveIdMapping($row, array(), MigrateIdMapInterface::STATUS_IGNORED, $this->migrateExecutable->rollbackAction);
-      $this->numIgnored++;
       $this->currentRow = NULL;
       $this->currentSourceIds = NULL;
       $result = FALSE;
@@ -226,7 +211,6 @@ public function prepareRow(Row $row) {
       // after hashes).
       $row->rehash();
     }
-    $this->numProcessed++;
     return $result;
   }
 
@@ -280,8 +264,6 @@ public function valid() {
    */
   public function rewind() {
     $this->idMap = $this->migration->getIdMap();
-    $this->numProcessed = 0;
-    $this->numIgnored = 0;
     $this->getIterator()->rewind();
     $this->next();
   }
@@ -378,27 +360,6 @@ public function getCurrentIds() {
   }
 
   /**
-   * Getter for numIgnored data member.
-   */
-  public function getIgnored() {
-    return $this->numIgnored;
-  }
-
-  /**
-   * Getter for numProcessed data member.
-   */
-  public function getProcessed() {
-    return $this->numProcessed;
-  }
-
-  /**
-   * Reset numIgnored back to 0.
-   */
-  public function resetStats() {
-    $this->numIgnored = 0;
-  }
-
-  /**
    * Get the source count.
    *
    * Return a count of available source records, from the cache if appropriate.
diff --git a/core/modules/migrate/tests/src/Unit/MigrateExecutableMemoryExceededTest.php b/core/modules/migrate/tests/src/Unit/MigrateExecutableMemoryExceededTest.php
deleted file mode 100644
index 477e890..0000000
--- a/core/modules/migrate/tests/src/Unit/MigrateExecutableMemoryExceededTest.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\migrate\Unit\MigrateExecutableMemoryExceededTest.
- */
-
-namespace Drupal\Tests\migrate\Unit;
-
-/**
- * Tests the \Drupal\migrate\MigrateExecutable::memoryExceeded() method.
- *
- * @group migrate
- */
-class MigrateExecutableMemoryExceededTest extends MigrateTestCase {
-
-  /**
-   * The mocked migration entity.
-   *
-   * @var \Drupal\migrate\Entity\MigrationInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $migration;
-
-  /**
-   * The mocked migrate message.
-   *
-   * @var \Drupal\migrate\MigrateMessageInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $message;
-
-  /**
-   * The tested migrate executable.
-   *
-   * @var \Drupal\Tests\migrate\Unit\TestMigrateExecutable
-   */
-  protected $executable;
-
-  /**
-   * The migration configuration, initialized to set the ID to test.
-   *
-   * @var array
-   */
-  protected $migrationConfiguration = array(
-    'id' => 'test',
-  );
-
-  /**
-   * php.init memory_limit value.
-   */
-  protected $memoryLimit = 10000000;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-    $this->migration = $this->getMigration();
-    $this->message = $this->getMock('Drupal\migrate\MigrateMessageInterface');
-
-    $this->executable = new TestMigrateExecutable($this->migration, $this->message);
-    $this->executable->setStringTranslation($this->getStringTranslationStub());
-  }
-
-  /**
-   * Runs the actual test.
-   *
-   * @param string $message
-   *   The second message to assert.
-   * @param bool $memory_exceeded
-   *   Whether to test the memory exceeded case.
-   * @param int $memory_usage_first
-   *   (optional) The first memory usage value.
-   * @param int $memory_usage_second
-   *   (optional) The fake amount of memory usage reported after memory reclaim.
-   * @param int $memory_limit
-   *   (optional) The memory limit.
-   */
-  protected function runMemoryExceededTest($message, $memory_exceeded, $memory_usage_first = NULL, $memory_usage_second = NULL, $memory_limit = NULL) {
-    $this->executable->setMemoryLimit($memory_limit ?: $this->memoryLimit);
-    $this->executable->setMemoryUsage($memory_usage_first ?: $this->memoryLimit, $memory_usage_second ?: $this->memoryLimit);
-    $this->executable->setMemoryThreshold(0.85);
-    if ($message) {
-      $this->executable->message->expects($this->at(0))
-        ->method('display')
-        ->with($this->stringContains('reclaiming memory'));
-      $this->executable->message->expects($this->at(1))
-        ->method('display')
-        ->with($this->stringContains($message));
-    }
-    else {
-      $this->executable->message->expects($this->never())
-        ->method($this->anything());
-    }
-    $result = $this->executable->memoryExceeded();
-    $this->assertEquals($memory_exceeded, $result);
-  }
-
-  /**
-   * Tests memoryExceeded method when a new batch is needed.
-   */
-  public function testMemoryExceededNewBatch() {
-    // First case try reset and then start new batch.
-    $this->runMemoryExceededTest('starting new batch', TRUE);
-  }
-
-  /**
-   * Tests memoryExceeded method when enough is cleared.
-   */
-  public function testMemoryExceededClearedEnough() {
-    $this->runMemoryExceededTest('reclaimed enough', FALSE, $this->memoryLimit, $this->memoryLimit * 0.75);
-  }
-
-  /**
-   * Tests memoryExceeded when memory usage is not exceeded.
-   */
-  public function testMemoryNotExceeded() {
-    $this->runMemoryExceededTest('', FALSE, floor($this->memoryLimit * 0.85) - 1);
-  }
-
-}
diff --git a/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php b/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php
index f862ae8..4384905 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php
@@ -53,8 +53,6 @@ protected function setUp() {
 
     $this->executable = new TestMigrateExecutable($this->migration, $this->message);
     $this->executable->setStringTranslation($this->getStringTranslationStub());
-    $this->executable->setTimeThreshold(0.1);
-    $this->executable->limit = array('unit' => 'second', 'value' => 1);
   }
 
   /**
@@ -120,11 +118,6 @@ public function testImportWithValidRow() {
       ->will($this->returnValue($destination));
 
     $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import());
-
-    $this->assertSame(1, $this->executable->getSuccessesSinceFeedback());
-    $this->assertSame(1, $this->executable->getTotalSuccesses());
-    $this->assertSame(1, $this->executable->getTotalProcessed());
-    $this->assertSame(1, $this->executable->getProcessedSinceFeedback());
   }
 
   /**
@@ -170,11 +163,6 @@ public function testImportWithValidRowWithoutDestinationId() {
       ->method('saveIdMapping');
 
     $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import());
-
-    $this->assertSame(1, $this->executable->getSuccessesSinceFeedback());
-    $this->assertSame(1, $this->executable->getTotalSuccesses());
-    $this->assertSame(1, $this->executable->getTotalProcessed());
-    $this->assertSame(1, $this->executable->getProcessedSinceFeedback());
   }
 
   /**
@@ -347,44 +335,6 @@ public function testImportWithValidRowWithException() {
   }
 
   /**
-   * Tests time limit option method.
-   */
-  public function testTimeOptionExceeded() {
-    // Assert time limit of one second (test configuration default) is exceeded.
-    $this->executable->setTimeElapsed(1);
-    $this->assertTrue($this->executable->timeOptionExceeded());
-    // Assert time limit not exceeded.
-    $this->executable->limit = array('unit' => 'seconds', 'value' => (int) $_SERVER['REQUEST_TIME'] - 3600);
-    $this->assertFalse($this->executable->timeOptionExceeded());
-    // Assert no time limit.
-    $this->executable->limit = array();
-    $this->assertFalse($this->executable->timeOptionExceeded());
-  }
-
-  /**
-   * Tests get time limit method.
-   */
-  public function testGetTimeLimit() {
-    // Assert time limit has a unit of one second (test configuration default).
-    $limit = $this->executable->limit;
-    $this->assertArrayHasKey('unit', $limit);
-    $this->assertSame('second', $limit['unit']);
-    $this->assertSame($limit['value'], $this->executable->getTimeLimit());
-    // Assert time limit has a unit of multiple seconds.
-    $this->executable->limit = array('unit' => 'seconds', 'value' => 30);
-    $limit = $this->executable->limit;
-    $this->assertArrayHasKey('unit', $limit);
-    $this->assertSame('seconds', $limit['unit']);
-    $this->assertSame($limit['value'], $this->executable->getTimeLimit());
-    // Assert no time limit.
-    $this->executable->limit = array();
-    $limit = $this->executable->limit;
-    $this->assertArrayNotHasKey('unit', $limit);
-    $this->assertArrayNotHasKey('value', $limit);
-    $this->assertNull($this->executable->getTimeLimit());
-  }
-
-  /**
    * Tests saving of queued messages.
    */
   public function testSaveQueuedMessages() {
@@ -436,22 +386,6 @@ public function testQueueMessage() {
   }
 
   /**
-   * Tests maximum execution time (max_execution_time) of an import.
-   */
-  public function testMaxExecTimeExceeded() {
-    // Assert no max_execution_time value.
-    $this->executable->setMaxExecTime(0);
-    $this->assertFalse($this->executable->maxExecTimeExceeded());
-    // Assert default max_execution_time value does not exceed.
-    $this->executable->setMaxExecTime(30);
-    $this->assertFalse($this->executable->maxExecTimeExceeded());
-    // Assert max_execution_time value is exceeded.
-    $this->executable->setMaxExecTime(1);
-    $this->executable->setTimeElapsed(2);
-    $this->assertTrue($this->executable->maxExecTimeExceeded());
-  }
-
-  /**
    * Tests the processRow method.
    */
   public function testProcessRow() {
diff --git a/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php b/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php
index c2f222c..1d0d278 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php
@@ -181,30 +181,30 @@ protected function runEnsureTablesTest($schema) {
       ->getMock();
     $database->expects($this->any())
       ->method('schema')
-      ->will($this->returnValue($schema));
+      ->willReturn($schema);
     $migration = $this->getMigration();
     $plugin = $this->getMock('Drupal\migrate\Plugin\MigrateSourceInterface');
     $plugin->expects($this->any())
       ->method('getIds')
-      ->will($this->returnValue(array(
+      ->willReturn(array(
       'source_id_property' => array(
         'type' => 'integer',
       ),
-    )));
+    ));
     $migration->expects($this->any())
       ->method('getSourcePlugin')
-      ->will($this->returnValue($plugin));
+      ->willReturn($plugin);
     $plugin = $this->getMock('Drupal\migrate\Plugin\MigrateSourceInterface');
     $plugin->expects($this->any())
       ->method('getIds')
-      ->will($this->returnValue(array(
+      ->willReturn(array(
       'destination_id_property' => array(
         'type' => 'string',
       ),
-    )));
+    ));
     $migration->expects($this->any())
       ->method('getDestinationPlugin')
-      ->will($this->returnValue($plugin));
+      ->willReturn($plugin);
     $map = new TestSqlIdMap($database, array(), 'sql', array(), $migration);
     $map->getDatabase();
   }
diff --git a/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapTest.php b/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapTest.php
index 3bb2be1..4e52ffa 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapTest.php
@@ -102,7 +102,11 @@ protected function getIdMap() {
     $migration
       ->method('getDestinationPlugin')
       ->willReturn($plugin);
-
+    $event_dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
+    $migration->expects($this->any())
+      ->method('getEventDispatcher')
+      ->will($this->returnValue($event_dispatcher));
+    
     $id_map = new TestSqlIdMap($this->database, [], 'sql', [], $migration);
     $migration
       ->method('getIdMap')
diff --git a/core/modules/migrate/tests/src/Unit/MigrateTestCase.php b/core/modules/migrate/tests/src/Unit/MigrateTestCase.php
index a6015d0..ce9a465 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateTestCase.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateTestCase.php
@@ -51,6 +51,10 @@ protected function getMigration() {
     $migration->expects($this->any())
       ->method('id')
       ->will($this->returnValue($configuration['id']));
+    $event_dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
+    $migration->expects($this->any())
+      ->method('getEventDispatcher')
+      ->willReturn($event_dispatcher);
     return $migration;
   }
 
diff --git a/core/modules/migrate/tests/src/Unit/TestMigrateExecutable.php b/core/modules/migrate/tests/src/Unit/TestMigrateExecutable.php
index f26bc56..0398251 100644
--- a/core/modules/migrate/tests/src/Unit/TestMigrateExecutable.php
+++ b/core/modules/migrate/tests/src/Unit/TestMigrateExecutable.php
@@ -16,27 +16,6 @@
 class TestMigrateExecutable extends MigrateExecutable {
 
   /**
-   * The (fake) number of seconds elapsed since the start of the test.
-   *
-   * @var int
-   */
-  protected $timeElapsed;
-
-  /**
-   * The fake memory usage in bytes.
-   *
-   * @var int
-   */
-  protected $memoryUsage;
-
-  /**
-   * The cleared memory usage.
-   *
-   * @var int
-   */
-  protected $clearedMemoryUsage;
-
-  /**
    * Sets the string translation service.
    *
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
@@ -47,86 +26,6 @@ public function setStringTranslation(TranslationInterface $string_translation) {
   }
 
   /**
-   * Allows access to protected timeOptionExceeded method.
-   *
-   * @return bool
-   *   A threshold exceeded value.
-   */
-  public function timeOptionExceeded() {
-    return parent::timeOptionExceeded();
-  }
-
-  /**
-   * Allows access to set protected maxExecTime property.
-   *
-   * @param int $max_exec_time
-   *   The value to set.
-   */
-  public function setMaxExecTime($max_exec_time) {
-    $this->maxExecTime = $max_exec_time;
-  }
-
-  /**
-   * Allows access to protected maxExecTime property.
-   *
-   * @return int
-   *   The value of the protected property.
-   */
-  public function getMaxExecTime() {
-    return $this->maxExecTime;
-  }
-
-  /**
-   * Allows access to protected successesSinceFeedback property.
-   *
-   * @return int
-   *   The value of the protected property.
-   */
-  public function getSuccessesSinceFeedback() {
-    return $this->successesSinceFeedback;
-  }
-
-  /**
-   * Allows access to protected totalSuccesses property.
-   *
-   * @return int
-   *   The value of the protected property.
-   */
-  public function getTotalSuccesses() {
-    return $this->totalSuccesses;
-  }
-
-  /**
-   * Allows access to protected totalProcessed property.
-   *
-   * @return int
-   *   The value of the protected property.
-   */
-  public function getTotalProcessed() {
-    return $this->totalProcessed;
-  }
-
-  /**
-   * Allows access to protected processedSinceFeedback property.
-   *
-   * @return int
-   *   The value of the protected property.
-   */
-  public function getProcessedSinceFeedback() {
-    return $this->processedSinceFeedback;
-  }
-
-  /**
-   * Allows access to protected maxExecTimeExceeded method.
-   *
-   * @return bool
-   *   The threshold exceeded value.
-   */
-  public function maxExecTimeExceeded() {
-    return parent::maxExecTimeExceeded();
-  }
-
-  /**
    * Allows access to set protected source property.
    *
    * @param \Drupal\migrate\Plugin\MigrateSourceInterface $source
@@ -147,23 +46,6 @@ public function setSourceIdValues($source_id_values) {
   }
 
   /**
-   * Allows setting a fake elapsed time.
-   *
-   * @param int $time
-   *   The time in seconds.
-   */
-  public function setTimeElapsed($time) {
-    $this->timeElapsed = $time;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getTimeElapsed() {
-    return $this->timeElapsed;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function handleException(\Exception $exception, $save = TRUE) {
@@ -175,73 +57,6 @@ public function handleException(\Exception $exception, $save = TRUE) {
   }
 
   /**
-   * Allows access to the protected memoryExceeded method.
-   *
-   * @return bool
-   *   The memoryExceeded value.
-   */
-  public function memoryExceeded() {
-    return parent::memoryExceeded();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function attemptMemoryReclaim() {
-    return $this->clearedMemoryUsage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getMemoryUsage() {
-    return $this->memoryUsage;
-  }
-
-  /**
-   * Sets the fake memory usage.
-   *
-   * @param int $memory_usage
-   *   The fake memory usage value.
-   * @param int $cleared_memory_usage
-   *   (optional) The fake cleared memory value.
-   */
-  public function setMemoryUsage($memory_usage, $cleared_memory_usage = NULL) {
-    $this->memoryUsage = $memory_usage;
-    $this->clearedMemoryUsage = $cleared_memory_usage;
-  }
-
-  /**
-   * Sets the memory limit.
-   *
-   * @param int $memory_limit
-   *   The memory limit.
-   */
-  public function setMemoryLimit($memory_limit) {
-    $this->memoryLimit = $memory_limit;
-  }
-
-  /**
-   * Sets the memory threshold.
-   *
-   * @param float $threshold
-   *   The new threshold.
-   */
-  public function setMemoryThreshold($threshold) {
-    $this->memoryThreshold = $threshold;
-  }
-
-  /**
-   * Sets the time threshold.
-   *
-   * @param float $threshold
-   *   The new threshold.
-   */
-  public function setTimeThreshold($threshold) {
-    $this->timeThreshold = $threshold;
-  }
-
-  /**
    * {@inheritdoc}
    */
   protected function formatSize($size) {
