diff --git a/entity_reference_revisions.module b/entity_reference_revisions.module
index f7b7a35..c584af7 100644
--- a/entity_reference_revisions.module
+++ b/entity_reference_revisions.module
@@ -39,19 +39,6 @@ function entity_reference_revisions_help($route_name, RouteMatchInterface $route
 }
 
 /**
- * Implements hook_field_info_alter().
- */
-function entity_reference_revisions_field_info_alter(&$info) {
-  // Make the entity reference field configurable.
-  $info['entity_reference_revisions']['no_ui'] = FALSE;
-  $info['entity_reference_revisions']['class'] = '\Drupal\entity_reference_revisions\ConfigurableEntityReferenceRevisionsItem';
-  $info['entity_reference_revisions']['list_class'] = '\Drupal\entity_reference_revisions\EntityReferenceRevisionsFieldItemList';
-  $info['entity_reference_revisions']['default_formatter'] = 'entity_reference_revisions_entity_view';
-  $info['entity_reference_revisions']['default_widget'] = 'entity_reference_revisions_autocomplete';
-  $info['entity_reference_revisions']['provider'] = 'entity_reference_revisions';
-}
-
-/**
  * Implements hook_field_widget_info_alter().
  */
 function entity_reference_revisions_field_widget_info_alter(&$info) {
@@ -94,7 +81,7 @@ function entity_reference_revisions_field_storage_config_update(FieldStorageConf
   foreach ($field_storage->bundles() as $entity_type => $bundles) {
     foreach ($bundles as $bundle) {
       $field = FieldConfig::loadByName($entity_type, $bundle, $field_name);
-      $field->settings['handler_settings'] = array();
+      $field->setSetting('handler_settings', array());
       $field->save();
     }
   }
@@ -230,4 +217,4 @@ function entity_reference_revisions_form_field_ui_field_storage_add_form_alter(a
   // "Other".
   unset($form['add']['new_storage_type']['#options'][t('Reference revisions')]['entity_reference_revisions']);
   $form['add']['new_storage_type']['#options'][t('Reference revisions')]['entity_reference_revisions'] = t('Other…');
-}
\ No newline at end of file
+}
diff --git a/src/ConfigurableEntityReferenceRevisionsItem.php b/src/ConfigurableEntityReferenceRevisionsItem.php
deleted file mode 100644
index b577ec9..0000000
--- a/src/ConfigurableEntityReferenceRevisionsItem.php
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\entity_reference_revisions\ConfigurableEntityReferenceItem.
- */
-
-namespace Drupal\entity_reference_revisions;
-
-use Drupal\Component\Utility\SafeMarkup;
-use Drupal\Core\Field\FieldStorageDefinitionInterface;
-use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
-use Drupal\Core\Field\PreconfiguredFieldUiOptionsInterface;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Form\OptGroup;
-use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\TypedData\OptionsProviderInterface;
-use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint;
-use Drupal\field\FieldStorageConfigInterface;
-use Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem;
-use Drupal\Core\Entity\EntityTypeInterface;
-
-/**
- * Alternative plugin implementation of the 'entity_reference_revisions' field type.
- *
- * Replaces the Core 'entity_reference_revisions' entity field type implementation, this
- * supports configurable fields, auto-creation of referenced entities and more.
- *
- * Required settings are:
- *  - target_type: The entity type to reference.
- *
- * @see entity_reference_revisions_field_info_alter().
- */
-class ConfigurableEntityReferenceRevisionsItem extends EntityReferenceRevisionsItem implements OptionsProviderInterface, PreconfiguredFieldUiOptionsInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function defaultStorageSettings() {
-    $settings = parent::defaultStorageSettings();
-    // The target bundle is handled by the 'target_bundles' property in the
-    // 'handler_settings' instance setting.
-    unset($settings['target_bundle']);
-    return $settings;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function defaultFieldSettings() {
-    return array(
-      'handler_settings' => array(),
-    ) + parent::defaultFieldSettings();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPossibleValues(AccountInterface $account = NULL) {
-    return $this->getSettableValues($account);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPossibleOptions(AccountInterface $account = NULL) {
-    return $this->getSettableOptions($account);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getSettableValues(AccountInterface $account = NULL) {
-    // Flatten options first, because "settable options" may contain group
-    // arrays.
-    $flatten_options = OptGroup::flattenOptions($this->getSettableOptions($account));
-    return array_keys($flatten_options);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getSettableOptions(AccountInterface $account = NULL) {
-    $field_definition = $this->getFieldDefinition();
-    if (!$options = \Drupal::service('plugin.manager.entity_reference_selection')->getSelectionHandler($field_definition, $this->getEntity())->getReferenceableEntities()) {
-      return array();
-    }
-
-    // Rebuild the array by changing the bundle key into the bundle label.
-    $target_type = $field_definition->getSetting('target_type');
-    $bundles = \Drupal::entityManager()->getBundleInfo($target_type);
-
-    $return = array();
-    foreach ($options as $bundle => $entity_ids) {
-      $bundle_label = SafeMarkup::checkPlain($bundles[$bundle]['label']);
-      $return[$bundle_label] = $entity_ids;
-    }
-
-    return count($return) == 1 ? reset($return) : $return;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getConstraints() {
-    $constraints = parent::getConstraints();
-
-    // Remove the 'AllowedValuesConstraint' validation constraint because entity
-    // reference fields already use the 'ValidReference' constraint.
-    foreach ($constraints as $key => $constraint) {
-      if ($constraint instanceof AllowedValuesConstraint) {
-        unset($constraints[$key]);
-      }
-    }
-
-    return $constraints;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) {
-
-    $entity_types = \Drupal::entityManager()->getDefinitions();
-    $options = array();
-    foreach ($entity_types as $entity_type) {
-      if ($entity_type->isRevisionable()) {
-        $options[$entity_type->id()] = $entity_type->getLabel();
-      }
-    }
-
-    $element['target_type'] = array(
-      '#type' => 'select',
-      '#title' => t('Type of item to reference'),
-      '#options' => $options,
-      '#default_value' => $this->getSetting('target_type'),
-      '#required' => TRUE,
-      '#disabled' => $has_data,
-      '#size' => 1,
-    );
-
-    return $element;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
-    $field = $form_state->getFormObject()->getEntity();
-
-    // Get all selection plugins for this entity type.
-    $selection_plugins = \Drupal::service('plugin.manager.entity_reference_selection')->getSelectionGroups($this->getSetting('target_type'));
-    $handlers_options = array();
-    foreach (array_keys($selection_plugins) as $selection_group_id) {
-      // We only display base plugins (e.g. 'default', 'views', ...) and not
-      // entity type specific plugins (e.g. 'default:node', 'default:user',
-      // ...).
-      if (array_key_exists($selection_group_id, $selection_plugins[$selection_group_id])) {
-        $handlers_options[$selection_group_id] = SafeMarkup::checkPlain($selection_plugins[$selection_group_id][$selection_group_id]['label']);
-      }
-      elseif (array_key_exists($selection_group_id . ':' . $this->getSetting('target_type'), $selection_plugins[$selection_group_id])) {
-        $selection_group_plugin = $selection_group_id . ':' . $this->getSetting('target_type');
-        $handlers_options[$selection_group_plugin] = SafeMarkup::checkPlain($selection_plugins[$selection_group_id][$selection_group_plugin]['base_plugin_label']);
-      }
-    }
-
-    $form = array(
-      '#type' => 'container',
-      '#process' => array(
-        '_entity_reference_revisions_field_field_settings_ajax_process',
-      ),
-      '#element_validate' => array(array(get_class($this), 'fieldSettingsFormValidate')),
-    );
-    $form['handler'] = array(
-      '#type' => 'details',
-      '#title' => t('Reference type'),
-      '#open' => TRUE,
-      '#tree' => TRUE,
-      '#process' => array('_entity_reference_revisions_form_process_merge_parent'),
-    );
-
-    $form['handler']['handler'] = array(
-      '#type' => 'select',
-      '#title' => t('Reference method'),
-      '#options' => $handlers_options,
-      '#default_value' => $field->getSetting('handler'),
-      '#required' => TRUE,
-      '#ajax' => TRUE,
-      '#limit_validation_errors' => array(),
-    );
-    $form['handler']['handler_submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Change handler'),
-      '#limit_validation_errors' => array(),
-      '#attributes' => array(
-        'class' => array('js-hide'),
-      ),
-      '#submit' => array('entity_reference_revisions_settings_ajax_submit'),
-    );
-
-    $form['handler']['handler_settings'] = array(
-      '#type' => 'container',
-      '#attributes' => array('class' => array('entity_reference-settings')),
-    );
-
-    $handler = \Drupal::service('plugin.manager.entity_reference_selection')->getSelectionHandler($field);
-    $form['handler']['handler_settings'] += $handler->buildConfigurationForm(array(), $form_state);
-
-    return $form;
-  }
-
-  /**
-   * Form element validation handler; Stores the new values in the form state.
-   *
-   * @param array $form
-   *   The form where the settings form is being included in.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The form state of the (entire) configuration form.
-   */
-  public static function fieldSettingsFormValidate(array $form, FormStateInterface $form_state) {
-    if ($form_state->hasValue('field')) {
-      $form_state->unsetValue(array('field', 'settings', 'handler_submit'));
-      $form_state->get('field')->settings = $form_state->getValue(['field', 'settings']);
-
-      $handler = \Drupal::service('plugin.manager.entity_reference_selection')->getSelectionHandler($form_state->get('field'));
-      $handler->validateConfigurationForm($form, $form_state);
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getPreconfiguredOptions() {
-    $options = array();
-
-    // Add all the commonly referenced entity types as distinct pre-configured
-    // options.
-    $entity_types = \Drupal::entityManager()->getDefinitions();
-    $common_references = array_filter($entity_types, function (EntityTypeInterface $entity_type) {
-      return $entity_type->get('common_reference_revisions_target') && $entity_type->isRevisionable();
-    });
-
-    /** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
-    foreach ($common_references as $entity_type) {
-
-      $options[$entity_type->id()] = [
-        'label' => $entity_type->getLabel(),
-        'field_storage_config' => [
-          'settings' => [
-            'target_type' => $entity_type->id(),
-          ]
-        ]
-      ];
-      $default_reference_settings = $entity_type->get('default_reference_revision_settings');
-      if (is_array($default_reference_settings)) {
-        $options[$entity_type->id()] = array_merge($options[$entity_type->id()], $default_reference_settings);
-      }
-    }
-
-    return $options;
-  }
-}
diff --git a/src/Plugin/DataType/EntityReferenceRevisions.php b/src/Plugin/DataType/EntityReferenceRevisions.php
index 7f21b78..2042d31 100644
--- a/src/Plugin/DataType/EntityReferenceRevisions.php
+++ b/src/Plugin/DataType/EntityReferenceRevisions.php
@@ -118,7 +118,7 @@ class EntityReferenceRevisions extends EntityReference {
       throw new \InvalidArgumentException('Value is not a valid entity.');
     }
     else {
-      $this->id = $value['target_id'];;
+      $this->id = $value['target_id'];
       $this->revision_id = $value['target_revision_id'];
     }
     // Notify the parent of any changes.
diff --git a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php
index b188056..7d8060c 100644
--- a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php
+++ b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php
@@ -11,11 +11,13 @@ use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\TypedData\EntityDataDefinition;
 use Drupal\Core\Field\FieldDefinitionInterface;
-use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\Field\PreconfiguredFieldUiOptionsInterface;
+use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\TypedData\DataReferenceDefinition;
-use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
+use Drupal\Core\TypedData\OptionsProviderInterface;
+use Drupal\entity_reference\ConfigurableEntityReferenceItem;
 
 /**
  * Defines the 'entity_reference_revisions' entity field type.
@@ -32,38 +34,72 @@ use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
  *   description = @Translation("An entity field containing an entity reference."),
  *   category = @Translation("Reference revisions"),
  *   no_ui = TRUE,
+ *   class = "\Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem",
  *   list_class = "\Drupal\entity_reference_revisions\EntityReferenceRevisionsFieldItemList",
+ *   default_formatter = "entity_reference_revisions_entity_view",
+ *   default_widget = "entity_reference_revisions_autocomplete",
  *   constraints = {"ValidReference" = {}}
  * )
  */
-class EntityReferenceRevisionsItem extends FieldItemBase {
-
-
-  /**
-   * Marker value to identify a newly created entity.
-   *
-   * @var int
-   */
-  protected static $NEW_ENTITY_MARKER = -1;
+class EntityReferenceRevisionsItem extends ConfigurableEntityReferenceItem implements OptionsProviderInterface, PreconfiguredFieldUiOptionsInterface {
 
   /**
    * {@inheritdoc}
    */
-  public static function defaultStorageSettings() {
-    return array(
-      'target_type' => \Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user',
-      'target_bundle' => NULL,
-    ) + parent::defaultStorageSettings();
+  public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) {
+
+    $entity_types = \Drupal::entityManager()->getDefinitions();
+    $options = array();
+    foreach ($entity_types as $entity_type) {
+      if ($entity_type->isRevisionable()) {
+        $options[$entity_type->id()] = $entity_type->getLabel();
+      }
+    }
+
+    $element['target_type'] = array(
+      '#type' => 'select',
+      '#title' => t('Type of item to reference'),
+      '#options' => $options,
+      '#default_value' => $this->getSetting('target_type'),
+      '#required' => TRUE,
+      '#disabled' => $has_data,
+      '#size' => 1,
+    );
+
+    return $element;
   }
 
   /**
    * {@inheritdoc}
    */
-  public static function defaultFieldSettings() {
-    return array(
-      'handler' => 'default:' . (\Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user'),
-      'handler_settings' => array(),
-    ) + parent::defaultFieldSettings();
+  public static function getPreconfiguredOptions() {
+    $options = array();
+
+    // Add all the commonly referenced entity types as distinct pre-configured
+    // options.
+    $entity_types = \Drupal::entityManager()->getDefinitions();
+    $common_references = array_filter($entity_types, function (EntityTypeInterface $entity_type) {
+      return $entity_type->get('common_reference_revisions_target') && $entity_type->isRevisionable();
+    });
+
+    /** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
+    foreach ($common_references as $entity_type) {
+
+      $options[$entity_type->id()] = [
+        'label' => $entity_type->getLabel(),
+        'field_storage_config' => [
+          'settings' => [
+            'target_type' => $entity_type->id(),
+          ]
+        ]
+      ];
+      $default_reference_settings = $entity_type->get('default_reference_revision_settings');
+      if (is_array($default_reference_settings)) {
+        $options[$entity_type->id()] = array_merge($options[$entity_type->id()], $default_reference_settings);
+      }
+    }
+
+    return $options;
   }
 
   /**
@@ -72,20 +108,7 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
   public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
     $settings = $field_definition->getSettings();
     $target_type_info = \Drupal::entityManager()->getDefinition($settings['target_type']);
-
-    if ($target_type_info->isSubclassOf('\Drupal\Core\Entity\FieldableEntityInterface')) {
-      // @todo: Lookup the entity type's ID data type and use it here.
-      // https://drupal.org/node/2107249
-      $target_id_definition = DataDefinition::create('integer')
-        ->setLabel(t('@label ID', array($target_type_info->getLabel())))
-        ->setSetting('unsigned', TRUE);
-    }
-    else {
-      $target_id_definition = DataDefinition::create('string')
-        ->setLabel(t('@label ID', array($target_type_info->getLabel())));
-    }
-    $target_id_definition->setRequired(TRUE);
-    $properties['target_id'] = $target_id_definition;
+    $properties = parent::propertyDefinitions($field_definition);
 
     if ($target_type_info->getKey('revision')) {
       $target_revision_id_definition = DataDefinition::create('integer')
@@ -104,54 +127,17 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
       ->setReadOnly(FALSE)
       ->setTargetDefinition(EntityDataDefinition::create($settings['target_type']));
 
-    if (isset($settings['target_bundle'])) {
-      $properties['entity']->getTargetDefinition()->addConstraint('Bundle', $settings['target_bundle']);
-    }
-
     return $properties;
   }
 
   /**
    * {@inheritdoc}
    */
-  public static function mainPropertyName() {
-    return 'target_id';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public static function schema(FieldStorageDefinitionInterface $field_definition) {
     $target_type = $field_definition->getSetting('target_type');
     $target_type_info = \Drupal::entityManager()->getDefinition($target_type);
 
-    if ($target_type_info->isSubclassOf('\Drupal\Core\Entity\FieldableEntityInterface')) {
-      $columns = array(
-        'target_id' => array(
-          'description' => 'The ID of the target entity.',
-          'type' => 'int',
-          'unsigned' => TRUE,
-        ),
-      );
-    }
-    else {
-      $columns = array(
-        'target_id' => array(
-          'description' => 'The ID of the target entity.',
-          'type' => 'varchar',
-          // If the target entities act as bundles for another entity type,
-          // their IDs should not exceed the maximum length for bundles.
-          'length' => $target_type_info->getBundleOf() ? EntityTypeInterface::BUNDLE_MAX_LENGTH : 255,
-        ),
-      );
-    }
-
-    $schema = array(
-      'columns' => $columns,
-      'indexes' => array(
-        'target_id' => array('target_id'),
-      ),
-    );
+    $schema = parent::schema($field_definition);
 
     if ($target_type_info->getKey('revision')) {
       $schema['columns']['target_revision_id'] = array(
@@ -198,8 +184,8 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
         }
       }
       // Notify the parent if necessary.
-      if ($notify && $this->parent) {
-        $this->parent->onChange($this->getName());
+      if ($notify && $this->getParent()) {
+        $this->getParent()->onChange($this->getName());
       }
     }
 
@@ -208,20 +194,6 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
   /**
    * {@inheritdoc}
    */
-  public function getValue() {
-    $values = parent::getValue();
-
-    // If there is an unsaved entity, return it as part of the field item values
-    // to ensure idempotency of getValue() / setValue().
-    if ($this->hasNewEntity()) {
-      $values['entity'] = $this->entity;
-    }
-    return $values;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function onChange($property_name, $notify = TRUE) {
     // Make sure that the target ID and the target property stay in sync.
     if ($property_name == 'entity') {
@@ -241,7 +213,9 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
         'target_revision_id' => $this->target_revision_id,
       ));
     }
-    parent::onChange($property_name, $notify);
+    if ($notify && isset($this->parent)) {
+      $this->parent->onChange($this->name);
+    }
   }
 
   /**
@@ -265,42 +239,8 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
    * {@inheritdoc}
    */
   public function preSave() {
-    if ($this->hasNewEntity()) {
-      // Save the entity if it has not already been saved by some other code.
-      if ($this->entity->isNew()) {
-        $this->entity->save();
-      }
-      // Make sure the parent knows we are updating this property so it can
-      // react properly.
-      $this->target_id = $this->entity->id();
-      $this->target_revision_id = $this->entity->getRevisionId();
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
-    $manager = \Drupal::service('plugin.manager.entity_reference_selection');
-    if ($referenceable = $manager->getSelectionHandler($field_definition)->getReferenceableEntities()) {
-      $group = array_rand($referenceable);
-      $values['target_id'] = array_rand($referenceable[$group]);
-      return $values;
-    }
-  }
-
-  /**
-   * Determines whether the item holds an unsaved entity.
-   *
-   * This is notably used for "autocreate" widgets, and more generally to
-   * support referencing freshly created entities (they will get saved
-   * automatically as the hosting entity gets saved).
-   *
-   * @return bool
-   *   TRUE if the item holds an unsaved entity.
-   */
-  public function hasNewEntity() {
-    return $this->target_id === static::$NEW_ENTITY_MARKER;
+    parent::preSave();
+    $this->target_revision_id = $this->entity->getRevisionId();
   }
 
   /**
@@ -323,4 +263,12 @@ class EntityReferenceRevisionsItem extends FieldItemBase {
     }
     return $dependencies;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function onDependencyRemoval(FieldDefinitionInterface $field_definition, array $dependencies) {
+    return FALSE;
+  }
+
 }
