diff --git a/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php
index 5b9d8bb..d9830c9 100644
--- a/core/modules/migrate/src/MigrateExecutable.php
+++ b/core/modules/migrate/src/MigrateExecutable.php
@@ -108,6 +108,13 @@ class MigrateExecutable {
   public $limit = array();
 
   /**
+   * The row limit when executing the migration.
+   *
+   * @var int
+   */
+  protected $rowLimit = 0;
+
+  /**
    * The configuration values of the source.
    *
    * @var array
@@ -317,6 +324,9 @@ public function import() {
       if ($this->timeOptionExceeded()) {
         break;
       }
+      if ($this->rowLimitExceeded()) {
+        break;
+      }
       try {
         $source->next();
       }
@@ -434,6 +444,27 @@ protected function timeOptionExceeded() {
   }
 
   /**
+   * Tests whether we've exceeded the designated row limit.
+   *
+   * @return bool
+   *   TRUE if the row limit is exceeded, FALSE if not.
+   */
+  protected function rowLimitExceeded() {
+    // If there is no row limit, then it is not exceeded.
+    $rowLimit = $this->getRowLimit();
+    if (!$rowLimit) {
+      return FALSE;
+    }
+    // Calculate if the row limit is exceeded.
+    if ($this->totalProcessed >= $rowLimit) {
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
    * Returns the time limit.
    *
    * @return null|int
@@ -450,6 +481,16 @@ public function getTimeLimit() {
   }
 
   /**
+   * Returns the row limit.
+   *
+   * @return int
+   *   The current row limit counter.
+   */
+  public function getRowLimit() {
+    return $this->rowLimit;
+  }
+
+  /**
    * Passes messages through to the map class.
    *
    * @param string $message
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 e268c54..314c44c 100644
--- a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
+++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
@@ -712,7 +712,7 @@ public function destroy() {
    *
    * This is called before beginning a foreach loop.
    *
-   * @todo Support idlist, itemlimit.
+   * @todo Support idlist.
    */
   public function rewind() {
     $this->currentRow = NULL;
@@ -723,13 +723,6 @@ public function rewind() {
     foreach ($this->destinationIdFields() as $field) {
       $fields[] = $field;
     }
-
-    // @todo Make this work.
-    /*
-    if (isset($this->options['itemlimit'])) {
-      $query = $query->range(0, $this->options['itemlimit']);
-    }
-    */
     $this->result = $this->getDatabase()->select($this->mapTableName(), 'map')
       ->fields('map', $fields)
       ->execute();
diff --git a/core/modules/migrate/tests/src/MigrateExecutableTest.php b/core/modules/migrate/tests/src/MigrateExecutableTest.php
index fd0da23..24818d3 100644
--- a/core/modules/migrate/tests/src/MigrateExecutableTest.php
+++ b/core/modules/migrate/tests/src/MigrateExecutableTest.php
@@ -366,6 +366,64 @@ public function testImportWithValidRowWithException() {
   }
 
   /**
+   * Tests the import method with row limit.
+   */
+  public function testImportWithRowLimit() {
+
+    // Set row limit and assert it's value.
+    $this->executable->setRowLimit(1);
+    $this->assertSame(1, $this->executable->getRowLimit());
+
+    $source = $this->getMockSource();
+
+    $row = $this->getMockBuilder('Drupal\migrate\Row')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $row->expects($this->once())
+      ->method('getSourceIdValues')
+      ->will($this->returnValue(array('id' => 'test')));
+
+    $this->idMap->expects($this->once())
+      ->method('lookupDestinationId')
+      ->with(array('id' => 'test'))
+      ->will($this->returnValue(array('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()));
+
+    $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface');
+    $destination->expects($this->once())
+      ->method('import')
+      ->with($row, array('test'))
+      ->will($this->returnValue(array('id' => 'test')));
+
+    $this->migration->expects($this->once())
+      ->method('getDestinationPlugin')
+      ->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());
+
+    $this->assertTrue(FALSE, 'this will fail. see @todo.');
+    // @todo: determine if this is the best place to test, how to
+    // how to mock multiple rows, and how to access
+    // MigrateIdMapInterface::importedCount()
+
+  }
+
+  /**
    * Tests time limit option method.
    */
   public function testTimeOptionExceeded() {
@@ -404,6 +462,16 @@ public function testGetTimeLimit() {
   }
 
   /**
+   * Tests get row limit method.
+   */
+  public function testGetRowLimit() {
+    // Assert row limit default value of zero and is not exceeded.
+    $this->assertClassHasAttribute('rowLimit', 'Drupal\migrate\MigrateExecutable');
+    $this->assertSame(0, $this->executable->getRowLimit());
+    $this->assertFalse($this->executable->rowLimitExceeded());
+  }
+
+  /**
    * Tests saving of queued messages.
    */
   public function testSaveQueuedMessages() {
diff --git a/core/modules/migrate/tests/src/TestMigrateExecutable.php b/core/modules/migrate/tests/src/TestMigrateExecutable.php
index 8746236..438741c 100644
--- a/core/modules/migrate/tests/src/TestMigrateExecutable.php
+++ b/core/modules/migrate/tests/src/TestMigrateExecutable.php
@@ -77,6 +77,26 @@ public function getMaxExecTime() {
   }
 
   /**
+   * Allows access to set the protected rowLimit property.
+   *
+   * @param int $row_limit
+   *   The value to set.
+   */
+  public function setRowLimit($row_limit) {
+    $this->rowLimit = $row_limit;
+  }
+
+  /**
+   * Allows access to protected rowLimitExceeded method.
+   *
+   * @return bool
+   *   The row limit exceeded the designated row limit.
+   */
+  public function rowLimitExceeded() {
+    return parent::rowLimitExceeded();
+  }
+
+  /**
    * Allows access to protected successesSinceFeedback property.
    *
    * @return int
