diff --git a/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php
index 6148ef9..511373f 100644
--- a/core/modules/migrate/src/MigrateExecutable.php
+++ b/core/modules/migrate/src/MigrateExecutable.php
@@ -255,6 +255,12 @@ public function import() {
         $this->processRow($row);
         $save = TRUE;
       }
+      catch (MigrateException $e) {
+        $this->migration->getIdMap()->saveIdMapping($row, array(), $e->getStatus(), $this->rollbackAction);
+        $level = $e->getLevel();
+        $this->saveMessage($e->getMessage(), $level);
+        $save = $level == MigrationInterface::MESSAGE_INFORMATIONAL || $level == MigrationInterface::MESSAGE_NOTICE;
+      }
       catch (MigrateSkipRowException $e) {
         $id_map->saveIdMapping($row, array(), MigrateIdMapInterface::STATUS_IGNORED, $this->rollbackAction);
         $save = FALSE;
@@ -283,7 +289,6 @@ public function import() {
         catch (MigrateException $e) {
           $this->migration->getIdMap()->saveIdMapping($row, array(), $e->getStatus(), $this->rollbackAction);
           $this->saveMessage($e->getMessage(), $e->getLevel());
-          $this->message->display($e->getMessage(), 'error');
         }
         catch (\Exception $e) {
           $this->migration->getIdMap()->saveIdMapping($row, array(), MigrateIdMapInterface::STATUS_FAILED, $this->rollbackAction);
diff --git a/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php b/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php
index eb1097c..1bae28e 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateExecutableTest.php
@@ -227,9 +227,10 @@ public function testImportWithValidRowNoDestinationValues() {
   }
 
   /**
-   * Tests the import method with a MigrateException being thrown.
+   * Tests the import method with a MigrateException being thrown from the
+   * destination.
    */
-  public function testImportWithValidRowWithMigrateException() {
+  public function testImportWithValidRowWithDestinationMigrateException() {
     $exception_message = $this->getRandomGenerator()->string();
     $source = $this->getMockSource();
 
@@ -268,10 +269,6 @@ public function testImportWithValidRowWithMigrateException() {
     $this->idMap->expects($this->once())
       ->method('saveMessage');
 
-    $this->message->expects($this->once())
-      ->method('display')
-      ->with($exception_message);
-
     $this->idMap->expects($this->once())
       ->method('lookupDestinationId')
       ->with(array('id' => 'test'))
@@ -281,6 +278,54 @@ public function testImportWithValidRowWithMigrateException() {
   }
 
   /**
+   * Tests the import method with a MigrateException being thrown from a process
+   * plugin.
+   */
+  public function testImportWithValidRowWithProcesMigrateException() {
+    $exception_message = $this->getRandomGenerator()->string();
+    $source = $this->getMockSource();
+
+    $row = $this->getMockBuilder('Drupal\migrate\Row')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $row->expects($this->once())
+      ->method('getSourceIdValues')
+      ->will($this->returnValue(array('id' => 'test')));
+
+    $source->expects($this->once())
+      ->method('current')
+      ->will($this->returnValue($row));
+
+    $this->executable->setSource($source);
+
+    $this->migration->expects($this->once())
+      ->method('getProcessPlugins')
+      ->will($this->returnValue(array()))
+      ->will($this->throwException(new MigrateException($exception_message)));
+
+    $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface');
+    $destination->expects($this->never())
+      ->method('import');
+
+    $this->migration->expects($this->once())
+      ->method('getDestinationPlugin')
+      ->will($this->returnValue($destination));
+
+    $this->idMap->expects($this->once())
+      ->method('saveIdMapping')
+      ->with($row, array(), MigrateIdMapInterface::STATUS_FAILED, NULL);
+
+    $this->idMap->expects($this->once())
+      ->method('saveMessage');
+
+    $this->idMap->expects($this->never())
+      ->method('lookupDestinationId');
+
+    $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import());
+  }
+
+  /**
    * Tests the import method with a regular Exception being thrown.
    */
   public function testImportWithValidRowWithException() {
