diff --git a/src/Plugin/migrate/destination/EntityReferenceRevisions.php b/src/Plugin/migrate/destination/EntityReferenceRevisions.php
index a50f5a7..a874488 100644
--- a/src/Plugin/migrate/destination/EntityReferenceRevisions.php
+++ b/src/Plugin/migrate/destination/EntityReferenceRevisions.php
@@ -2,22 +2,64 @@
 
 namespace Drupal\entity_reference_revisions\Plugin\migrate\destination;
 
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Field\FieldTypePluginManagerInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\Plugin\migrate\destination\EntityRevision;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
+use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 
 /**
  * Provides entity_reference_revisions destination plugin.
  *
+ * Available configuration keys:
+ * - new_revisions: (optional) Flag to indicate if a new revision should be
+ *   created instead of updating a previous default record. Only applicable when
+ *   providing an entity id without a revision_id.
+ *
  * @MigrateDestination(
  *   id = "entity_reference_revisions",
  *   deriver = "Drupal\entity_reference_revisions\Plugin\Derivative\MigrateEntityReferenceRevisions"
  * )
  */
-class EntityReferenceRevisions extends EntityRevision {
+class EntityReferenceRevisions extends EntityRevision implements ConfigurablePluginInterface {
+
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager, $field_type_manager);
+    $this->setConfiguration($configuration);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = NestedArray::mergeDeep(
+      $this->defaultConfiguration(),
+      $configuration
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfiguration() {
+    return $this->configuration;
+  }
+
+  /**
+   * @inheritDoc
+   */
+  public function defaultConfiguration() {
+    return [
+      'new_revisions' => FALSE,
+    ];
+  }
 
   /**
    * {@inheritdoc}
@@ -32,7 +74,7 @@ protected static function getEntityTypeId($pluginId) {
   /**
    * {@inheritdoc}
    */
-  protected function save(ContentEntityInterface $entity, array $oldDestinationIdValues = array()) {
+  protected function save(ContentEntityInterface $entity, array $oldDestinationIdValues = []) {
     $entity->save();
 
     return [
@@ -70,12 +112,34 @@ public function getIds() {
    * {@inheritdoc}
    */
   protected function getEntity(Row $row, array $oldDestinationIdValues) {
+    $item_id = $oldDestinationIdValues ?
+      array_shift($oldDestinationIdValues) :
+      $this->getEntityId($row);
     $revision_id = $oldDestinationIdValues ?
       array_pop($oldDestinationIdValues) :
       $row->getDestinationProperty($this->getKey('revision'));
+
+    // If a specific revision_id is supplied and exists, assert the entity id
+    // matches (if supplied), and update the revision.
+    /** @var \Drupal\Core\Entity\RevisionableInterface|\Drupal\Core\Entity\EntityInterface $entity */
     if (!empty($revision_id) && ($entity = $this->storage->loadRevision($revision_id))) {
+      if (!empty($item_id) && $entity->id() != $item_id) {
+        throw new MigrateException("The revision_id exists for this entity type, but does not belong to the given entity id");
+      }
       $entity->setNewRevision(FALSE);
+      $entity = $this->updateEntity($entity, $row) ?: $entity;
     }
+    // If there is no revision supplied, but there is an entity_id
+    // supplied that exists, update it.
+    elseif (!empty($item_id) && ($entity = $this->storage->load($item_id))) {
+      // If so configured, create a new revision while updating.
+      if ($this->getConfiguration()['new_revisions']) {
+        $entity->setNewRevision(TRUE);
+      }
+      $entity = $this->updateEntity($entity, $row) ?: $entity;
+    }
+
+    // Otherwise, create a new (possibly stub) entity.
     else {
       // Attempt to ensure we always have a bundle.
       if ($bundle = $this->getBundle($row)) {
@@ -90,7 +154,6 @@ protected function getEntity(Row $row, array $oldDestinationIdValues) {
         ->enforceIsNew(TRUE);
       $entity->setNewRevision(TRUE);
     }
-    $entity = $this->updateEntity($entity, $row) ?: $entity;
     $this->rollbackAction = MigrateIdMapInterface::ROLLBACK_DELETE;
     return $entity;
   }
@@ -150,4 +213,5 @@ protected function rollbackNonTranslation(array $destination_identifiers) {
       }
     }
   }
+
 }
diff --git a/tests/src/Kernel/Plugin/migrate/destination/EntityReferenceRevisionsDestinationTest.php b/tests/src/Kernel/Plugin/migrate/destination/EntityReferenceRevisionsDestinationTest.php
index 02e02ec..d433d05 100644
--- a/tests/src/Kernel/Plugin/migrate/destination/EntityReferenceRevisionsDestinationTest.php
+++ b/tests/src/Kernel/Plugin/migrate/destination/EntityReferenceRevisionsDestinationTest.php
@@ -2,8 +2,6 @@
 
 namespace Drupal\Tests\entity_reference_revisions\Kernel\Plugin\migrate\destination;
 
-use Drupal\Core\Entity\EntityStorageBase;
-use Drupal\entity_reference_revisions\Plugin\migrate\destination\EntityReferenceRevisions;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\KernelTests\KernelTestBase;
@@ -21,9 +19,9 @@
 class EntityReferenceRevisionsDestinationTest extends KernelTestBase implements MigrateMessageInterface {
 
   /**
-   * @var \Drupal\migrate\Plugin\MigrationPluginManager $migrationManager
-   *
    * The migration plugin manager.
+   *
+   * @var \Drupal\migrate\Plugin\MigrationPluginManager
    */
   protected $migrationPluginManager;
 
@@ -59,12 +57,12 @@ protected function setUp() {
    * @covers ::getEntityTypeId
    */
   public function testGetEntityTypeId(array $definition, $expected) {
-    /** @var Migration $migration */
+    /** @var \Drupal\migrate\Plugin\Migration $migration */
     $migration = $this->migrationPluginManager->createStubMigration($definition);
-    /** @var EntityReferenceRevisions $destination */
+    /** @var \Drupal\entity_reference_revisions\Plugin\migrate\destination\EntityReferenceRevisions $destination */
     $destination = $migration->getDestinationPlugin();
 
-    /** @var EntityStorageBase $storage */
+    /** @var \Drupal\Core\Entity\EntityStorageBase $storage */
     $storage = $this->readAttribute($destination, 'storage');
     $actual = $this->readAttribute($storage, 'entityTypeId');
 
@@ -75,7 +73,7 @@ public function testGetEntityTypeId(array $definition, $expected) {
    * Provides multiple migration definitions for "getEntityTypeId" test.
    */
   public function getEntityTypeIdDataProvider() {
-    $datas  = $this->getEntityDataProvider();
+    $datas = $this->getEntityDataProvider();
 
     foreach ($datas as &$data) {
       $data['expected'] = 'entity_test_composite';
@@ -94,18 +92,19 @@ public function getEntityTypeIdDataProvider() {
    * @covers ::rollbackNonTranslation
    */
   public function testGetEntity(array $definition, array $expected) {
-    /** @var Migration $migration */
+    /** @var \Drupal\migrate\Plugin\Migration $migration */
     $migration = $this->migrationPluginManager->createStubMigration($definition);
     $migrationExecutable = (new MigrateExecutable($migration, $this));
-    /** @var EntityStorageBase $storage */
+    /** @var \Drupal\Core\Entity\EntityStorageBase $storage */
     $storage = $this->readAttribute($migration->getDestinationPlugin(), 'storage');
     // Test inserting and updating by looping twice.
     for ($i = 0; $i < 2; $i++) {
       $migrationExecutable->import();
       $migration->getIdMap()->prepareUpdate();
       foreach ($expected as $data) {
-        $entity = $storage->loadRevision($data['id']);
+        $entity = $storage->loadRevision($data['revision_id']);
         $this->assertEquals($data['label'], $entity->label());
+        $this->assertEquals($data['id'], $entity->id());
       }
     }
     $migrationExecutable->rollback();
@@ -142,12 +141,70 @@ public function getEntityDataProvider() {
           ],
         ],
         'expected' => [
-          ['id' => 1, 'label' => 'content item 1a'],
-          ['id' => 2, 'label' => 'content item 1b'],
-          ['id' => 3, 'label' => 'content item 2'],
+          ['id' => 1, 'revision_id' => 1, 'label' => 'content item 1a'],
+          ['id' => 2, 'revision_id' => 2, 'label' => 'content item 1b'],
+          ['id' => 3, 'revision_id' => 3, 'label' => 'content item 2'],
         ],
       ],
-      'with keys' => [
+      'with ids' => [
+        'definition' => [
+          'source' => [
+            'plugin' => 'embedded_data',
+            'data_rows' => [
+              ['id' => 1, 'name' => 'content item 1a'],
+              ['id' => 1, 'name' => 'content item 1b'],
+              ['id' => 2, 'name' => 'content item 2'],
+              ['id' => 3, 'name' => 'content item 3'],
+            ],
+            'ids' => [
+              'id' => ['type' => 'integer'],
+              'name' => ['type' => 'text'],
+            ],
+          ],
+          'process' => [
+            'name' => 'name',
+            'id' => 'id',
+          ],
+          'destination' => [
+            'plugin' => 'entity_reference_revisions:entity_test_composite',
+          ],
+        ],
+        'expected' => [
+          ['id' => 1, 'revision_id' => 1, 'label' => 'content item 1b'],
+          ['id' => 2, 'revision_id' => 2, 'label' => 'content item 2'],
+          ['id' => 3, 'revision_id' => 3, 'label' => 'content item 3'],
+        ],
+      ],
+      'with ids and new revisions' => [
+        'definition' => [
+          'source' => [
+            'plugin' => 'embedded_data',
+            'data_rows' => [
+              ['id' => 1, 'name' => 'content item 1a'],
+              ['id' => 1, 'name' => 'content item 1b'],
+              ['id' => 2, 'name' => 'content item 2'],
+            ],
+            'ids' => [
+              'id' => ['type' => 'integer'],
+              'name' => ['type' => 'text'],
+            ],
+          ],
+          'process' => [
+            'name' => 'name',
+            'id' => 'id',
+          ],
+          'destination' => [
+            'plugin' => 'entity_reference_revisions:entity_test_composite',
+            'new_revisions' => TRUE,
+          ],
+        ],
+        'expected' => [
+          ['id' => 1, 'revision_id' => 1, 'label' => 'content item 1a'],
+          ['id' => 1, 'revision_id' => 2, 'label' => 'content item 1b'],
+          ['id' => 2, 'revision_id' => 3, 'label' => 'content item 2'],
+        ],
+      ],
+      'with ids and revisions' => [
         'definition' => [
           'source' => [
             'plugin' => 'embedded_data',
@@ -171,9 +228,9 @@ public function getEntityDataProvider() {
           ],
         ],
         'expected' => [
-          ['id' => 1, 'label' => 'content item 1'],
-          ['id' => 2, 'label' => 'content item 2'],
-          ['id' => 3, 'label' => 'content item 3'],
+          ['id' => 1, 'revision_id' => 1, 'label' => 'content item 1'],
+          ['id' => 2, 'revision_id' => 2, 'label' => 'content item 2'],
+          ['id' => 3, 'revision_id' => 3, 'label' => 'content item 3'],
         ],
       ],
     ];
@@ -183,7 +240,6 @@ public function getEntityDataProvider() {
    * Tests multi-value and single-value destination field linkage.
    *
    * @dataProvider destinationFieldMappingDataProvider
-   *
    */
   public function testDestinationFieldMapping(array $datas) {
     $this->enableModules(['node', 'field']);
@@ -202,7 +258,7 @@ public function testDestinationFieldMapping(array $datas) {
       'entity_type' => 'node',
       'type' => 'entity_reference_revisions',
       'settings' => [
-        'target_type' => 'entity_test_composite'
+        'target_type' => 'entity_test_composite',
       ],
       'cardinality' => 1,
     ]);
@@ -219,7 +275,7 @@ public function testDestinationFieldMapping(array $datas) {
       'entity_type' => 'node',
       'type' => 'entity_reference_revisions',
       'settings' => [
-        'target_type' => 'entity_test_composite'
+        'target_type' => 'entity_test_composite',
       ],
       'cardinality' => -1,
     ]);
@@ -248,7 +304,7 @@ public function testDestinationFieldMapping(array $datas) {
     foreach ($datas as $data) {
       $migration = $this->migrationPluginManager->createInstance($data['definition']['id']);
       $migrationExecutable = (new MigrateExecutable($migration, $this));
-      /** @var EntityStorageBase $storage */
+      /** @var \Drupal\Core\Entity\EntityStorageBase $storage */
       $storage = $this->readAttribute($migration->getDestinationPlugin(), 'storage');
       $migrationExecutable->import();
       foreach ($data['expected'] as $expected) {
@@ -262,7 +318,7 @@ public function testDestinationFieldMapping(array $datas) {
             }
           }
           else {
-            $this->assertNotEmpty($entity, 'Entity with label ' . $expected[$property] .' is empty');
+            $this->assertNotEmpty($entity, 'Entity with label ' . $expected[$property] . ' is empty');
             $this->assertEquals($expected[$property], $entity->label());
           }
         }
