diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml
index edd97ac..afbb142 100644
--- a/core/config/schema/core.data_types.schema.yml
+++ b/core/config/schema/core.data_types.schema.yml
@@ -356,9 +356,6 @@ base_entity_reference_field_settings:
     target_type:
       type: string
       label: 'Type of item to reference'
-    target_bundle:
-      type: string
-      label: 'Bundle of item to reference'
 
 field_config_base:
   type: config_entity
diff --git a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/SelectionBase.php b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/SelectionBase.php
index f33fe2a..496dceb 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/SelectionBase.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/SelectionBase.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Database\Query\SelectInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
@@ -132,7 +133,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#required' => TRUE,
         '#size' => 6,
         '#multiple' => TRUE,
-        '#element_validate' => array('_entity_reference_element_validate_filter'),
+        '#element_validate' => array(array(get_class($this), 'elementValidateFilter')),
       );
     }
     else {
@@ -179,7 +180,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       $form['sort']['settings'] = array(
         '#type' => 'container',
         '#attributes' => array('class' => array('entity_reference-settings')),
-        '#process' => array('_entity_reference_form_process_merge_parent'),
+        '#process' => array(array('\Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', 'formProcessMergeParent')),
       );
 
       if ($selection_handler_settings['sort']['field'] != '_none') {
@@ -215,6 +216,16 @@ public function validateConfigurationForm(array &$form, FormStateInterface $form
   public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { }
 
   /**
+   * Form element validation handler; Filters the #value property of an element.
+   *
+   * @todo Move some form of this to Form API itself?
+   */
+  public static function elementValidateFilter(&$element, FormStateInterface $form_state) {
+    $element['#value'] = array_filter($element['#value']);
+    $form_state->setValueForElement($element, $element['#value']);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
@@ -338,8 +349,8 @@ protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS')
     $query->addTag($target_type . '_access');
 
     // Add the Selection handler for
-    // entity_reference_query_entity_reference_alter().
-    $query->addTag('entity_reference');
+    // system_query_entity_reference_selection_alter().
+    $query->addTag('entity_reference_selection');
     $query->addMetaData('entity_reference_selection_handler', $this);
 
     // Add the sort option.
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
index 81664ba..9ddf794 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
@@ -7,35 +7,42 @@
 
 namespace Drupal\Core\Field\Plugin\Field\FieldType;
 
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Utility\String;
 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\Form\OptGroup;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\TypedData\DataReferenceDefinition;
+use Drupal\Core\TypedData\OptionsProviderInterface;
+use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint;
 
 /**
  * Defines the 'entity_reference' entity field type.
  *
  * Supported settings (below the definition's 'settings' key) are:
  * - target_type: The entity type to reference. Required.
- * - target_bundle: (optional): If set, restricts the entity bundles which may
- *   may be referenced. May be set to an single bundle, or to an array of
- *   allowed bundles.
  *
  * @FieldType(
  *   id = "entity_reference",
  *   label = @Translation("Entity reference"),
  *   description = @Translation("An entity field containing an entity reference."),
  *   category = @Translation("Reference"),
- *   no_ui = TRUE,
  *   list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList",
+ *   default_widget = "entity_reference_autocomplete",
+ *   default_formatter = "entity_reference_label",
  *   constraints = {"ValidReference" = {}}
  * )
  */
-class EntityReferenceItem extends FieldItemBase {
+class EntityReferenceItem extends FieldItemBase implements OptionsProviderInterface, PreconfiguredFieldUiOptionsInterface {
 
   /**
    * Marker value to identify a newly created entity.
@@ -50,7 +57,6 @@ class EntityReferenceItem extends FieldItemBase {
   public static function defaultStorageSettings() {
     return array(
       'target_type' => \Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user',
-      'target_bundle' => NULL,
     ) + parent::defaultStorageSettings();
   }
 
@@ -93,8 +99,11 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel
       ->setReadOnly(FALSE)
       ->setTargetDefinition(EntityDataDefinition::create($settings['target_type']));
 
-    if (isset($settings['target_bundle'])) {
-      $properties['entity']->getTargetDefinition()->addConstraint('Bundle', $settings['target_bundle']);
+    // @todo This is a problem, 'target_bundles' is now a field setting
+    // instead of a field storage setting. Clarify/fix this in
+    // https://www.drupal.org/node/2064191
+    if (isset($settings['handler_settings']['target_bundles'])) {
+      $properties['entity']->getTargetDefinition()->addConstraint('Bundle', $settings['handler_settings']['target_bundles']);
     }
 
     return $properties;
@@ -229,6 +238,24 @@ public function isEmpty() {
   /**
    * {@inheritdoc}
    */
+  public function getConstraints() {
+    $constraints = parent::getConstraints();
+    debug(array_keys($constraints));
+
+    // 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 preSave() {
     if ($this->hasNewEntity()) {
       // Save the entity if it has not already been saved by some other code.
@@ -254,6 +281,107 @@ public static function generateSampleValue(FieldDefinitionInterface $field_defin
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) {
+    $element['target_type'] = array(
+      '#type' => 'select',
+      '#title' => t('Type of item to reference'),
+      '#options' => \Drupal::entityManager()->getEntityTypeLabels(TRUE),
+      '#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->get('field');
+
+    // 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] = String::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] = String::checkPlain($selection_plugins[$selection_group_id][$selection_group_plugin]['base_plugin_label']);
+      }
+    }
+
+    $form = array(
+      '#type' => 'container',
+      '#process' => array(array(get_class($this), 'fieldSettingsAjaxProcess')),
+      '#element_validate' => array(array(get_class($this), 'fieldSettingsFormValidate')),
+
+    );
+    $form['handler'] = array(
+      '#type' => 'details',
+      '#title' => t('Reference type'),
+      '#open' => TRUE,
+      '#tree' => TRUE,
+      '#process' => array(array(get_class($this), 'formProcessMergeParent')),
+    );
+
+    $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(array(get_class($this), 'settingsAjaxSubmit')),
+    );
+
+    $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);
+    }
+  }
+
+  /**
    * Determines whether the item holds an unsaved entity.
    *
    * This is notably used for "autocreate" widgets, and more generally to
@@ -309,4 +437,141 @@ public static function onDependencyRemoval(FieldDefinitionInterface $field_defin
     return $changed;
   }
 
+  /**
+   * {@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 = String::checkPlain($bundles[$bundle]['label']);
+      $return[$bundle_label] = $entity_ids;
+    }
+
+    return count($return) == 1 ? reset($return) : $return;
+  }
+
+  /**
+   * Render API callback: Processes the field settings form and allows access to
+   * the form state.
+   *
+   * @see static::fieldSettingsForm()
+   */
+  public static function fieldSettingsAjaxProcess($form, FormStateInterface $form_state) {
+    static::fieldSettingsAjaxProcessElement($form, $form);
+    return $form;
+  }
+
+  /**
+   * Adds entity_reference specific properties to AJAX form elements from the
+   * field settings form.
+   *
+   * @see static::fieldSettingsAjaxProcess()
+   */
+  public static function fieldSettingsAjaxProcessElement(&$element, $main_form) {
+    if (!empty($element['#ajax'])) {
+      $element['#ajax'] = array(
+        'callback' => array(get_called_class(), 'settingsAjax'),
+        'wrapper' => $main_form['#id'],
+        'element' => $main_form['#array_parents'],
+      );
+    }
+
+    foreach (Element::children($element) as $key) {
+      static::fieldSettingsAjaxProcessElement($element[$key], $main_form);
+    }
+  }
+
+  /**
+   * Render API callback: Moves entity_reference specific Form API elements
+   * (i.e. 'handler_settings') up a level for easier processing by the validation
+   * and submission handlers.
+   *
+   * @see _entity_reference_field_settings_process()
+   */
+  public static function formProcessMergeParent($element) {
+    $parents = $element['#parents'];
+    array_pop($parents);
+    $element['#parents'] = $parents;
+    return $element;
+  }
+
+  /**
+   * Ajax callback for the handler settings form.
+   *
+   * @see static::fieldSettingsForm()
+   */
+  public static function settingsAjax($form, FormStateInterface $form_state) {
+    return NestedArray::getValue($form, $form_state->getTriggeringElement()['#ajax']['element']);
+  }
+
+  /**
+   * Submit handler for the non-JS case.
+   *
+   * @see static::fieldSettingsForm()
+   */
+  public static function settingsAjaxSubmit($form, FormStateInterface $form_state) {
+    $form_state->setRebuild();
+  }
+
+    /**
+   * {@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->isCommonReferenceTarget();
+    });
+
+    /** @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(),
+          ]
+        ]
+      ];
+    }
+
+    return $options;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php
index d993c67..51b8b29 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php
@@ -18,6 +18,7 @@
  *   label = @Translation("Check boxes/radio buttons"),
  *   field_types = {
  *     "boolean",
+ *     "entity_reference",
  *     "list_integer",
  *     "list_float",
  *     "list_string",
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php
index a5b68af..f4de43e 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php
@@ -18,6 +18,7 @@
  *   id = "options_select",
  *   label = @Translation("Select list"),
  *   field_types = {
+ *     "entity_reference",
  *     "list_integer",
  *     "list_float",
  *     "list_string"
diff --git a/core/modules/aggregator/aggregator.info.yml b/core/modules/aggregator/aggregator.info.yml
index 5814712..af55280 100644
--- a/core/modules/aggregator/aggregator.info.yml
+++ b/core/modules/aggregator/aggregator.info.yml
@@ -6,6 +6,5 @@ version: VERSION
 core: 8.x
 configure: aggregator.admin_settings
 dependencies:
-  - entity_reference
   - file
   - options
diff --git a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml
index 6cb424d..4564bfe 100644
--- a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml
+++ b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml
@@ -17,4 +17,3 @@ dependencies:
     - core.entity_view_mode.aggregator_item.summary
   module:
     - aggregator
-    - entity_reference
diff --git a/core/modules/book/config/install/core.entity_form_display.node.book.default.yml b/core/modules/book/config/install/core.entity_form_display.node.book.default.yml
index 0b7ccf6..4c2ea9d 100644
--- a/core/modules/book/config/install/core.entity_form_display.node.book.default.yml
+++ b/core/modules/book/config/install/core.entity_form_display.node.book.default.yml
@@ -5,7 +5,6 @@ dependencies:
     - field.field.node.book.body
     - node.type.book
   module:
-    - entity_reference
     - text
 id: node.book.default
 targetEntityType: node
diff --git a/core/modules/book/src/Tests/BookUninstallTest.php b/core/modules/book/src/Tests/BookUninstallTest.php
index dbd4de5..6b1cbcc 100644
--- a/core/modules/book/src/Tests/BookUninstallTest.php
+++ b/core/modules/book/src/Tests/BookUninstallTest.php
@@ -23,7 +23,7 @@ class BookUninstallTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('system', 'user', 'field', 'filter', 'text', 'entity_reference', 'node', 'book');
+  public static $modules = array('system', 'user', 'field', 'filter', 'text', 'node', 'book');
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/config/src/Tests/ConfigImportRecreateTest.php b/core/modules/config/src/Tests/ConfigImportRecreateTest.php
index 74aea5f..86c71ed 100644
--- a/core/modules/config/src/Tests/ConfigImportRecreateTest.php
+++ b/core/modules/config/src/Tests/ConfigImportRecreateTest.php
@@ -32,7 +32,7 @@ class ConfigImportRecreateTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('system', 'field', 'text', 'user', 'node', 'entity_reference');
+  public static $modules = array('system', 'field', 'text', 'user', 'node');
 
   protected function setUp() {
     parent::setUp();
diff --git a/core/modules/config/src/Tests/ConfigImportRenameValidationTest.php b/core/modules/config/src/Tests/ConfigImportRenameValidationTest.php
index 9341f21..7f7eea4 100644
--- a/core/modules/config/src/Tests/ConfigImportRenameValidationTest.php
+++ b/core/modules/config/src/Tests/ConfigImportRenameValidationTest.php
@@ -34,7 +34,7 @@ class ConfigImportRenameValidationTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('system', 'user', 'node', 'field', 'text', 'config_test', 'entity_reference');
+  public static $modules = array('system', 'user', 'node', 'field', 'text', 'config_test');
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/entity_reference/config/schema/entity_reference.views.schema.yml b/core/modules/entity_reference/config/schema/entity_reference.views.schema.yml
deleted file mode 100644
index 2660e53..0000000
--- a/core/modules/entity_reference/config/schema/entity_reference.views.schema.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-# Schema for the views plugins of the Entity Reference module.
-
-views.display.entity_reference:
-  type: views_display
-  label: 'Entity Reference'
-
-views.row.entity_reference:
-  type: views.row.fields
-  label: 'Entity Reference inline fields'
-
-views.style.entity_reference:
-  type: views_style
-  label: 'Entity Reference list'
-  mapping:
-    search_fields:
-      type: sequence
-      label: 'Search fields'
-      sequence:
-        type: string
-        label: 'Search field'
diff --git a/core/modules/entity_reference/entity_reference.info.yml b/core/modules/entity_reference/entity_reference.info.yml
deleted file mode 100644
index 0ff6b02..0000000
--- a/core/modules/entity_reference/entity_reference.info.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: 'Entity Reference'
-type: module
-description: 'Provides a field that can reference other entities.'
-package: Field types
-version: VERSION
-core: 8.x
-dependencies:
-  - field
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
deleted file mode 100644
index e6d764b..0000000
--- a/core/modules/entity_reference/entity_reference.module
+++ /dev/null
@@ -1,204 +0,0 @@
-<?php
-
-/**
- * @file
- * Provides a field that can reference other entities.
- */
-
-use Drupal\Component\Utility\NestedArray;
-use Drupal\Core\Database\Query\AlterableInterface;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Render\Element;
-use Drupal\Core\Routing\RouteMatchInterface;
-use Drupal\field\Entity\FieldStorageConfig;
-use Drupal\field\Entity\FieldConfig;
-use Drupal\field\FieldStorageConfigInterface;
-use Drupal\field\FieldConfigInterface;
-
-/**
- * Implements hook_help().
- */
-function entity_reference_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.entity_reference':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Entity Reference module allows you to create fields that contain links to other entities (such as content items, taxonomy terms, etc.) within the site. This allows you, for example, to include a link to a user within a content item. For more information, see <a href="!er_do">the online documentation for the Entity Reference module</a> and the <a href="!field_help">Field module help page</a>.', array('!field_help' => \Drupal::url('help.page', array('name' => 'field')), '!er_do' => 'https://drupal.org/documentation/modules/entityreference')) . '</p>';
-      $output .= '<h3>' . t('Uses') . '</h3>';
-      $output .= '<dl>';
-      $output .= '<dt>' . t('Managing and displaying entity reference fields') . '</dt>';
-      $output .= '<dd>' . t('The <em>settings</em> and the <em>display</em> of the entity reference field can be configured separately. See the <a href="!field_ui">Field UI help</a> for more information on how to manage fields and their display.', array('!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')))) . '</dd>';
-      $output .= '<dt>' . t('Selecting reference type') . '</dt>';
-      $output .= '<dd>' . t('In the field settings you can select which entity type you want to create a reference to.') . '</dd>';
-      $output .= '<dt>' . t('Filtering and sorting reference fields') . '</dt>';
-      $output .= '<dd>' . t('Depending on the chosen entity type, additional filtering and sorting options are available for the list of entities that can be referred to, in the field settings. For example, the list of users can be filtered by role and sorted by name or ID.') . '</dd>';
-      $output .= '<dt>' . t('Displaying a reference') . '</dt>';
-      $output .= '<dd>' . t('An entity reference can be displayed as a simple label with or without a link to the entity. Alternatively, the referenced entity can be displayed as a teaser (or any other available view mode) inside the referencing entity.') . '</dd>';
-      $output .= '</dl>';
-      return $output;
-  }
-}
-
-/**
- * Implements hook_field_info_alter().
- */
-function entity_reference_field_info_alter(&$info) {
-  // Make the entity reference field configurable.
-  $info['entity_reference']['no_ui'] = FALSE;
-  $info['entity_reference']['class'] = '\Drupal\entity_reference\ConfigurableEntityReferenceItem';
-  $info['entity_reference']['list_class'] = '\Drupal\Core\Field\EntityReferenceFieldItemList';
-  $info['entity_reference']['default_widget'] = 'entity_reference_autocomplete';
-  $info['entity_reference']['default_formatter'] = 'entity_reference_label';
-  $info['entity_reference']['provider'] = 'entity_reference';
-}
-
-/**
- * Implements hook_field_widget_info_alter().
- */
-function entity_reference_field_widget_info_alter(&$info) {
-  if (isset($info['options_select'])) {
-    $info['options_select']['field_types'][] = 'entity_reference';
-  }
-  if (isset($info['options_buttons'])) {
-    $info['options_buttons']['field_types'][] = 'entity_reference';
-  }
-}
-
-/**
- * Implements hook_ENTITY_TYPE_update() for 'field_storage_config'.
- *
- * Reset the instance handler settings, when the target type is changed.
- */
-function entity_reference_field_storage_config_update(FieldStorageConfigInterface $field_storage) {
-  if ($field_storage->getType() != 'entity_reference') {
-    // Only act on entity reference fields.
-    return;
-  }
-
-  if ($field_storage->isSyncing()) {
-    // Don't change anything during a configuration sync.
-    return;
-  }
-
-  if ($field_storage->getSetting('target_type') == $field_storage->original->getSetting('target_type')) {
-    // Target type didn't change.
-    return;
-  }
-
-  foreach ($field_storage->getBundles() as $bundle) {
-    $field = FieldConfig::loadByName($field_storage->getTargetEntityTypeId(), $bundle, $field_storage->getName());
-    $field->settings['handler_settings'] = array();
-    $field->save();
-  }
-}
-
-/**
- * Implements hook_ENTITY_TYPE_presave() for 'field_config'.
- *
- * Determine the selection handler plugin ID for an entity reference field.
- */
-function entity_reference_field_config_presave(FieldConfigInterface $field) {
-  if ($field->getType() != 'entity_reference') {
-    // Only act on entity reference fields.
-    return;
-  }
-
-  if ($field->isSyncing()) {
-    // Don't change anything during a configuration sync.
-    return;
-  }
-
-  $target_type = $field->getFieldStorageDefinition()->getSetting('target_type');
-  $selection_manager = \Drupal::service('plugin.manager.entity_reference_selection');
-  list($current_handler) = explode(':', $field->getSetting('handler'), 2);
-  $field->settings['handler'] = $selection_manager->getPluginId($target_type, $current_handler);
-}
-
-/**
- * Implements hook_form_FORM_ID_alter() for 'field_ui_field_storage_add_form'.
- */
-function entity_reference_form_field_ui_field_storage_add_form_alter(array &$form) {
-  // Move the "Entity reference" option to the end of the list and rename it to
-  // "Other".
-  unset($form['add']['new_storage_type']['#options'][t('Reference')]['entity_reference']);
-  $form['add']['new_storage_type']['#options'][t('Reference')]['entity_reference'] = t('Other…');
-}
-
-/**
- * Render API callback: Processes the field settings form and allows access to
- * the form state.
- *
- * @see entity_reference_field_field_settings_form()
- */
-function _entity_reference_field_field_settings_ajax_process($form, FormStateInterface $form_state) {
-  _entity_reference_field_field_settings_ajax_process_element($form, $form);
-  return $form;
-}
-
-/**
- * Adds entity_reference specific properties to AJAX form elements from the
- * field settings form.
- *
- * @see _entity_reference_field_field_settings_ajax_process()
- */
-function _entity_reference_field_field_settings_ajax_process_element(&$element, $main_form) {
-  if (!empty($element['#ajax'])) {
-    $element['#ajax'] = array(
-      'callback' => 'entity_reference_settings_ajax',
-      'wrapper' => $main_form['#id'],
-      'element' => $main_form['#array_parents'],
-    );
-  }
-
-  foreach (Element::children($element) as $key) {
-    _entity_reference_field_field_settings_ajax_process_element($element[$key], $main_form);
-  }
-}
-
-/**
- * Render API callback: Moves entity_reference specific Form API elements
- * (i.e. 'handler_settings') up a level for easier processing by the validation
- * and submission handlers.
- *
- * @see _entity_reference_field_settings_process()
- */
-function _entity_reference_form_process_merge_parent($element) {
-  $parents = $element['#parents'];
-  array_pop($parents);
-  $element['#parents'] = $parents;
-  return $element;
-}
-
-/**
- * Form element validation handler; Filters the #value property of an element.
- */
-function _entity_reference_element_validate_filter(&$element, FormStateInterface $form_state) {
-  $element['#value'] = array_filter($element['#value']);
-  $form_state->setValueForElement($element, $element['#value']);
-}
-
-/**
- * Ajax callback for the handler settings form.
- *
- * @see entity_reference_field_field_settings_form()
- */
-function entity_reference_settings_ajax($form, FormStateInterface $form_state) {
-  return NestedArray::getValue($form, $form_state->getTriggeringElement()['#ajax']['element']);
-}
-
-/**
- * Submit handler for the non-JS case.
- *
- * @see entity_reference_field_field_settings_form()
- */
-function entity_reference_settings_ajax_submit($form, FormStateInterface $form_state) {
-  $form_state->setRebuild();
-}
-
-/**
- * Implements hook_query_TAG_alter().
- */
-function entity_reference_query_entity_reference_alter(AlterableInterface $query) {
-  $handler = $query->getMetadata('entity_reference_selection_handler');
-  $handler->entityQueryAlter($query);
-}
diff --git a/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php
deleted file mode 100644
index 195365a..0000000
--- a/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php
+++ /dev/null
@@ -1,240 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\entity_reference\ConfigurableEntityReferenceItem.
- */
-
-namespace Drupal\entity_reference;
-
-use Drupal\Component\Utility\String;
-use Drupal\Core\Entity\EntityTypeInterface;
-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;
-
-/**
- * Alternative plugin implementation of the 'entity_reference' field type.
- *
- * Replaces the Core 'entity_reference' 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_field_info_alter().
- */
-class ConfigurableEntityReferenceItem extends EntityReferenceItem 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 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 = String::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) {
-    $element['target_type'] = array(
-      '#type' => 'select',
-      '#title' => t('Type of item to reference'),
-      '#options' => \Drupal::entityManager()->getEntityTypeLabels(TRUE),
-      '#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->get('field');
-
-    // 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] = String::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] = String::checkPlain($selection_plugins[$selection_group_id][$selection_group_plugin]['base_plugin_label']);
-      }
-    }
-
-    $form = array(
-      '#type' => 'container',
-      '#process' => array(
-        '_entity_reference_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_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_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->isCommonReferenceTarget();
-    });
-
-    /** @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(),
-          ]
-        ]
-      ];
-    }
-
-    return $options;
-  }
-
-}
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index d8be776..e95559d 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -13,6 +13,8 @@
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field\FieldConfigInterface;
+use Drupal\field\FieldStorageConfigInterface;
 
 /*
  * Load all public Field API functions. Drupal currently has no
@@ -129,6 +131,17 @@ function field_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dt>' . t('Provided by Drupal core') . '</dt>';
       $output .= '<dd>' . t('As mentioned previously, some field types, widgets, and formatters are provided by Drupal core. Here are some notes on how to use some of these:');
       $output .= '<ul>';
+      $output .= '<li><p>' . t('<strong>Entity Reference</strong> fields allow you to create fields that contain links to other entities (such as content items, taxonomy terms, etc.) within the site. This allows you, for example, to include a link to a user within a content item. For more information, see <a href="!er_do">the online documentation for the Entity Reference module</a>.', array('!er_do' => 'https://drupal.org/documentation/modules/entityreference')) . '</p>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Managing and displaying entity reference fields') . '</dt>';
+      $output .= '<dd>' . t('The <em>settings</em> and the <em>display</em> of the entity reference field can be configured separately. See the <a href="!field_ui">Field UI help</a> for more information on how to manage fields and their display.', array('!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')))) . '</dd>';
+      $output .= '<dt>' . t('Selecting reference type') . '</dt>';
+      $output .= '<dd>' . t('In the field settings you can select which entity type you want to create a reference to.') . '</dd>';
+      $output .= '<dt>' . t('Filtering and sorting reference fields') . '</dt>';
+      $output .= '<dd>' . t('Depending on the chosen entity type, additional filtering and sorting options are available for the list of entities that can be referred to, in the field settings. For example, the list of users can be filtered by role and sorted by name or ID.') . '</dd>';
+      $output .= '<dt>' . t('Displaying a reference') . '</dt>';
+      $output .= '<dd>' . t('An entity reference can be displayed as a simple label with or without a link to the entity. Alternatively, the referenced entity can be displayed as a teaser (or any other available view mode) inside the referencing entity.') . '</dd>';
+      $output .= '</dl></li>';
       $output .= '<li>' . t('<strong>Number fields</strong>: When you add a number field you can choose from three types: <em>decimal</em>, <em>float</em>, and <em>integer</em>. The <em>decimal</em> number field type allows users to enter exact decimal values, with fixed numbers of decimal places. The <em>float</em> number field type allows users to enter approximate decimal values. The <em>integer</em> number field type allows users to enter whole numbers, such as years (for example, 2012) or values (for example, 1, 2, 5, 305). It does not allow decimals.') . '</li>';
       $output .= '</ul></dd>';
       $output .= '</dl>';
@@ -264,6 +277,66 @@ function field_entity_bundle_delete($entity_type, $bundle) {
 }
 
 /**
+ * Implements hook_ENTITY_TYPE_update() for 'field_storage_config'.
+ *
+ * Reset the instance handler settings, when the target type is changed.
+ */
+function field_field_storage_config_update(FieldStorageConfigInterface $field_storage) {
+  if ($field_storage->getType() != 'entity_reference') {
+    // Only act on entity reference fields.
+    return;
+  }
+
+  if ($field_storage->isSyncing()) {
+    // Don't change anything during a configuration sync.
+    return;
+  }
+
+  if ($field_storage->getSetting('target_type') == $field_storage->original->getSetting('target_type')) {
+    // Target type didn't change.
+    return;
+  }
+
+  foreach ($field_storage->getBundles() as $bundle) {
+    $field = FieldConfig::loadByName($field_storage->getTargetEntityTypeId(), $bundle, $field_storage->getName());
+    $field->settings['handler_settings'] = array();
+    $field->save();
+  }
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_presave() for 'field_config'.
+ *
+ * Determine the selection handler plugin ID for an entity reference field.
+ */
+function field_field_config_presave(FieldConfigInterface $field) {
+  if ($field->getType() != 'entity_reference') {
+    // Only act on entity reference fields.
+    return;
+  }
+
+  if ($field->isSyncing()) {
+    // Don't change anything during a configuration sync.
+    return;
+  }
+
+  $target_type = $field->getFieldStorageDefinition()->getSetting('target_type');
+  $selection_manager = \Drupal::service('plugin.manager.entity_reference_selection');
+  list($current_handler) = explode(':', $field->getSetting('handler'), 2);
+  $field->settings['handler'] = $selection_manager->getPluginId($target_type, $current_handler);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for 'field_ui_field_storage_add_form'.
+ */
+function field_form_field_ui_field_storage_add_form_alter(array &$form) {
+  // Move the "Entity reference" option to the end of the list and rename it to
+  // "Other".
+  unset($form['add']['new_storage_type']['#options'][t('Reference')]['entity_reference']);
+  $form['add']['new_storage_type']['#options'][t('Reference')]['entity_reference'] = t('Other…');
+}
+
+/**
  * @} End of "defgroup field".
  */
 
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php
similarity index 98%
rename from core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php
rename to core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php
index e6718c0..ed7f9e3 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\EntityReferenceAdminTest.
+ * Contains \Drupal\field\Tests\EntityReference\EntityReferenceAdminTest.
  */
 
-namespace Drupal\entity_reference\Tests;
+namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\field_ui\Tests\FieldUiTestTrait;
 use Drupal\simpletest\WebTestBase;
@@ -28,8 +28,7 @@ class EntityReferenceAdminTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('node', 'field_ui', 'entity_reference', 'path', 'taxonomy', 'block', 'views');
-
+  public static $modules = array('node', 'field_ui', 'path', 'taxonomy', 'block', 'views');
 
   /**
    * The name of the content type created for testing purposes.
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceAutoCreateTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceAutoCreateTest.php
similarity index 95%
rename from core/modules/entity_reference/src/Tests/EntityReferenceAutoCreateTest.php
rename to core/modules/field/src/Tests/EntityReference/EntityReferenceAutoCreateTest.php
index dc87dc8..3822232 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceAutoCreateTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceAutoCreateTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\EntityReferenceAutoCreateTest.
+ * Contains \Drupal\field\Tests\EntityReference\EntityReferenceAutoCreateTest.
  */
 
-namespace Drupal\entity_reference\Tests;
+namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\simpletest\WebTestBase;
@@ -18,7 +18,7 @@
  */
 class EntityReferenceAutoCreateTest extends WebTestBase {
 
-  public static $modules = array('entity_reference', 'node');
+  public static $modules = array('node');
 
   /**
    * The name of a content type that will reference $referencedType.
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php
similarity index 97%
rename from core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php
rename to core/modules/field/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php
index c2ceed9..608503b 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\EntityReferenceFieldDefaultValueTest.
+ * Contains \Drupal\field\Tests\EntityReference\EntityReferenceFieldDefaultValueTest.
  */
 
-namespace Drupal\entity_reference\Tests;
+namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\Component\Utility\Unicode;
 use Drupal\config\Tests\SchemaCheckTestTrait;
@@ -25,7 +25,7 @@ class EntityReferenceFieldDefaultValueTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_reference', 'field_ui', 'node');
+  public static $modules = array('field_ui', 'node');
 
   /**
    * A user with permission to administer content types, node fields, etc.
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php
similarity index 98%
rename from core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php
rename to core/modules/field/src/Tests/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php
index 648920b..bf22ecf 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldTranslatedReferenceViewTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\EntityReferenceFieldTranslatedReferenceViewTest.
+ * Contains \Drupal\field\Tests\EntityReference\EntityReferenceFieldTranslatedReferenceViewTest.
  */
 
-namespace Drupal\entity_reference\Tests;
+namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
@@ -109,7 +109,6 @@ class EntityReferenceFieldTranslatedReferenceViewTest extends WebTestBase {
   public static $modules = array(
     'language',
     'content_translation',
-    'entity_reference',
     'node',
   );
 
diff --git a/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php
index 41f3fea..9bf4f77 100644
--- a/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php
@@ -9,7 +9,6 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\filter\Entity\FilterFormat;
 use Drupal\system\Tests\Entity\EntityUnitTestBase;
@@ -61,13 +60,6 @@ class EntityReferenceFormatterTest extends EntityUnitTestBase {
    */
   protected $unsavedReferencedEntity;
 
-  /**
-   * Modules to install.
-   *
-   * @var array
-   */
-  public static $modules = array('entity_reference');
-
   protected function setUp() {
     parent::setUp();
 
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceIntegrationTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceIntegrationTest.php
similarity index 97%
rename from core/modules/entity_reference/src/Tests/EntityReferenceIntegrationTest.php
rename to core/modules/field/src/Tests/EntityReference/EntityReferenceIntegrationTest.php
index 53fbcce..1033043 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceIntegrationTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceIntegrationTest.php
@@ -2,15 +2,14 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\EntityReferenceIntegrationTest.
+ * Contains \Drupal\field\Tests\EntityReference\EntityReferenceIntegrationTest.
  */
 
-namespace Drupal\entity_reference\Tests;
+namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\Component\Utility\String;
 use Drupal\config\Tests\AssertConfigEntityImportTrait;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\simpletest\WebTestBase;
 
@@ -50,7 +49,7 @@ class EntityReferenceIntegrationTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('config_test', 'entity_test', 'entity_reference', 'field_ui');
+  public static $modules = array('config_test', 'entity_test', 'field_ui');
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php
index 859551d..e10c5d3 100644
--- a/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php
@@ -11,7 +11,6 @@
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\FieldItemInterface;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field\Tests\FieldUnitTestBase;
@@ -33,7 +32,7 @@ class EntityReferenceItemTest extends FieldUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_reference', 'taxonomy', 'text', 'filter', 'views');
+  public static $modules = array('taxonomy', 'text', 'filter', 'views');
 
   /**
    * The taxonomy vocabulary to test with.
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceTestTrait.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceTestTrait.php
similarity index 86%
rename from core/modules/entity_reference/src/Tests/EntityReferenceTestTrait.php
rename to core/modules/field/src/Tests/EntityReference/EntityReferenceTestTrait.php
index 1882079..674a45d 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceTestTrait.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceTestTrait.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\EntityReferenceTestTrait.
+ * Contains \Drupal\field\Tests\EntityReference\EntityReferenceTestTrait.
  */
 
-namespace Drupal\entity_reference\Tests;
+namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -39,7 +39,7 @@
    *
    * @see \Drupal\Core\Entity\Plugin\EntityReferenceSelection\SelectionBase::buildConfigurationForm()
    */
-  protected function createEntityReferenceField($entity_type, $bundle, $field_name, $field_label, $target_entity_type, $selection_handler = 'default', $selection_handler_settings = array(), $cardinality = 1) {
+  public function createEntityReferenceField($entity_type, $bundle, $field_name, $field_label, $target_entity_type, $selection_handler = 'default', $selection_handler_settings = array(), $cardinality = 1) {
     // Look for or add the specified field to the requested entity bundle.
     if (!FieldStorageConfig::loadByName($entity_type, $field_name)) {
       FieldStorageConfig::create(array(
diff --git a/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php b/core/modules/field/src/Tests/EntityReference/Views/EntityReferenceRelationshipTest.php
similarity index 95%
rename from core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php
rename to core/modules/field/src/Tests/EntityReference/Views/EntityReferenceRelationshipTest.php
index 9ae79a7..c1dde1c 100644
--- a/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php
+++ b/core/modules/field/src/Tests/EntityReference/Views/EntityReferenceRelationshipTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\Views\EntityReferenceRelationshipTest.
+ * Contains \Drupal\field\Tests\EntityReference\Views\EntityReferenceRelationshipTest.
  */
 
-namespace Drupal\entity_reference\Tests\Views;
+namespace Drupal\field\Tests\EntityReference\Views;
 
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -18,7 +18,7 @@
  * Tests entity reference relationship data.
  *
  * @group entity_reference
- * @see entity_reference_field_views_data()
+ * @see system_field_views_data()
  */
 class EntityReferenceRelationshipTest extends ViewUnitTestBase {
 
@@ -34,7 +34,7 @@ class EntityReferenceRelationshipTest extends ViewUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('user', 'field', 'entity_test', 'entity_reference', 'views', 'entity_reference_test_views');
+  public static $modules = array('user', 'field', 'entity_test', 'views', 'entity_reference_test_views');
 
   /**
    * The entity_test entities used by the test.
diff --git a/core/modules/entity_reference/src/Tests/Views/SelectionTest.php b/core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php
similarity index 96%
rename from core/modules/entity_reference/src/Tests/Views/SelectionTest.php
rename to core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php
index d324b12..ce1659b 100644
--- a/core/modules/entity_reference/src/Tests/Views/SelectionTest.php
+++ b/core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Tests\Views\SelectionTest.
+ * Contains \Drupal\field\Tests\EntityReference\Views\SelectionTest.
  */
 
-namespace Drupal\entity_reference\Tests\Views;
+namespace Drupal\field\Tests\EntityReference\Views;
 
 use Drupal\simpletest\WebTestBase;
 use Drupal\views\Views;
@@ -17,7 +17,7 @@
  */
 class SelectionTest extends WebTestBase {
 
-  public static $modules = array('node', 'views', 'entity_reference', 'entity_reference_test', 'entity_test');
+  public static $modules = array('node', 'views', 'entity_reference_test', 'entity_test');
 
   /**
    * Nodes for testing.
diff --git a/core/modules/field/src/Tests/FieldUnitTestBase.php b/core/modules/field/src/Tests/FieldUnitTestBase.php
index 3c2b535..c6b1885 100644
--- a/core/modules/field/src/Tests/FieldUnitTestBase.php
+++ b/core/modules/field/src/Tests/FieldUnitTestBase.php
@@ -22,7 +22,7 @@
    *
    * @var array
    */
-  public static $modules = array('user', 'system', 'field', 'text', 'entity_test', 'field_test', 'entity_reference');
+  public static $modules = array('user', 'system', 'field', 'text', 'entity_test', 'field_test');
 
   /**
    * Bag of created field storages and fields.
diff --git a/core/modules/field_ui/src/Tests/EntityFormDisplayTest.php b/core/modules/field_ui/src/Tests/EntityFormDisplayTest.php
index 6e84b95..608e936 100644
--- a/core/modules/field_ui/src/Tests/EntityFormDisplayTest.php
+++ b/core/modules/field_ui/src/Tests/EntityFormDisplayTest.php
@@ -22,7 +22,7 @@ class EntityFormDisplayTest extends KernelTestBase {
    *
    * @var string[]
    */
-  public static $modules = array('field_ui', 'field', 'entity_test', 'field_test', 'user', 'text', 'entity_reference');
+  public static $modules = array('field_ui', 'field', 'entity_test', 'field_test', 'user', 'text');
 
   protected function setUp() {
     parent::setUp();
diff --git a/core/modules/forum/config/install/core.entity_form_display.node.forum.default.yml b/core/modules/forum/config/install/core.entity_form_display.node.forum.default.yml
index 8731335..a72b0e8 100644
--- a/core/modules/forum/config/install/core.entity_form_display.node.forum.default.yml
+++ b/core/modules/forum/config/install/core.entity_form_display.node.forum.default.yml
@@ -8,7 +8,6 @@ dependencies:
     - node.type.forum
   module:
     - comment
-    - entity_reference
     - text
 id: node.forum.default
 targetEntityType: node
diff --git a/core/modules/forum/config/install/field.field.node.forum.taxonomy_forums.yml b/core/modules/forum/config/install/field.field.node.forum.taxonomy_forums.yml
index 9847752..aec1434 100644
--- a/core/modules/forum/config/install/field.field.node.forum.taxonomy_forums.yml
+++ b/core/modules/forum/config/install/field.field.node.forum.taxonomy_forums.yml
@@ -18,5 +18,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   handler: default
+  handler_settings: {  }
 third_party_settings: {  }
 field_type: taxonomy_term_reference
diff --git a/core/modules/forum/config/install/field.storage.node.taxonomy_forums.yml b/core/modules/forum/config/install/field.storage.node.taxonomy_forums.yml
index e05c0df..2f1528b 100644
--- a/core/modules/forum/config/install/field.storage.node.taxonomy_forums.yml
+++ b/core/modules/forum/config/install/field.storage.node.taxonomy_forums.yml
@@ -15,7 +15,6 @@ settings:
       parent: 0
   target_type: taxonomy_term
   options_list_callback: null
-  target_bundle: null
 module: taxonomy
 locked: false
 cardinality: 1
diff --git a/core/modules/hal/src/Tests/NormalizerTestBase.php b/core/modules/hal/src/Tests/NormalizerTestBase.php
index 43f10b1..ed51ce0 100644
--- a/core/modules/hal/src/Tests/NormalizerTestBase.php
+++ b/core/modules/hal/src/Tests/NormalizerTestBase.php
@@ -33,7 +33,7 @@
    *
    * @var array
    */
-  public static $modules = array('entity_test', 'entity_reference', 'field', 'hal', 'language', 'rest', 'serialization', 'system', 'text', 'user', 'filter');
+  public static $modules = array('entity_test', 'field', 'hal', 'language', 'rest', 'serialization', 'system', 'text', 'user', 'filter');
 
   /**
    * The mock serializer.
diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index 9e8fe46..3143b62 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -395,18 +395,6 @@ public function isComplete() {
   /**
    * {@inheritdoc}
    */
-  public function set($property_name, $value) {
-    if ($property_name == 'source') {
-      // Invalidate the source plugin.
-      unset($this->sourcePlugin);
-    }
-    return parent::set($property_name, $value);
-  }
-
-
-  /**
-   * {@inheritdoc}
-   */
   public function getProcess() {
     return $this->getProcessNormalized($this->process);
   }
diff --git a/core/modules/migrate/src/Entity/MigrationInterface.php b/core/modules/migrate/src/Entity/MigrationInterface.php
index 793e719..bce1854 100644
--- a/core/modules/migrate/src/Entity/MigrationInterface.php
+++ b/core/modules/migrate/src/Entity/MigrationInterface.php
@@ -216,6 +216,8 @@ public function setProcess(array $process);
    *
    * @return $this
    *   The migration entity.
+   *
+   * @see Drupal\migrate_drupal\Plugin\migrate\load\LoadEntity::processLinkField().
    */
   public function setProcessOfProperty($property, $process_of_property);
 
diff --git a/core/modules/migrate/src/Plugin/MigratePluginManager.php b/core/modules/migrate/src/Plugin/MigratePluginManager.php
index f6eee47..67cce89 100644
--- a/core/modules/migrate/src/Plugin/MigratePluginManager.php
+++ b/core/modules/migrate/src/Plugin/MigratePluginManager.php
@@ -46,6 +46,13 @@ class MigratePluginManager extends DefaultPluginManager {
    *   The annotation class name.
    */
   public function __construct($type, \Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, $annotation = 'Drupal\Component\Annotation\PluginID') {
+    $plugin_interface_map = array(
+      'destination' => 'Drupal\migrate\Plugin\MigrateDestinationInterface',
+      'process' => 'Drupal\migrate\Plugin\MigrateProcessInterface',
+      'source' => 'Drupal\migrate\Plugin\MigrateSourceInterface',
+      'id_map' => 'Drupal\migrate\Plugin\MigrateIdMapInterface',
+      'entity_field' => 'Drupal\migrate\Plugin\MigrateEntityDestinationFieldInterface',
+    );
     $plugin_interface = isset($plugin_interface_map[$type]) ? $plugin_interface_map[$type] : NULL;
     parent::__construct("Plugin/migrate/$type", $namespaces, $module_handler, $plugin_interface, $annotation);
     $this->alterInfo('migrate_' . $type . '_info');
@@ -70,20 +77,4 @@ public function createInstance($plugin_id, array $configuration = array(), Migra
     return $plugin;
   }
 
-  /**
-   * Helper for the plugin type to interface map.
-   *
-   * @return array
-   *   An array map from plugin type to interface.
-   */
-  protected function getPluginInterfaceMap() {
-    return [
-      'destination' => 'Drupal\migrate\Plugin\MigrateDestinationInterface',
-      'process' => 'Drupal\migrate\Plugin\MigrateProcessInterface',
-      'source' => 'Drupal\migrate\Plugin\MigrateSourceInterface',
-      'id_map' => 'Drupal\migrate\Plugin\MigrateIdMapInterface',
-      'entity_field' => 'Drupal\migrate\Plugin\MigrateEntityDestinationFieldInterface',
-    ];
-  }
-
 }
diff --git a/core/modules/migrate_drupal/migrate_drupal.services.yml b/core/modules/migrate_drupal/migrate_drupal.services.yml
index 301ced8..2c8f00c 100644
--- a/core/modules/migrate_drupal/migrate_drupal.services.yml
+++ b/core/modules/migrate_drupal/migrate_drupal.services.yml
@@ -2,6 +2,3 @@ services:
   plugin.manager.migrate.load:
     class: Drupal\migrate_drupal\Plugin\MigratePluginManager
     arguments: [load, '@container.namespaces', '@cache.discovery', '@module_handler']
-  plugin.manager.migrate.cckfield:
-    class: Drupal\migrate_drupal\Plugin\MigratePluginManager
-    arguments: [cckfield, '@container.namespaces', '@cache.discovery', '@module_handler']
diff --git a/core/modules/migrate_drupal/src/MigrationStorage.php b/core/modules/migrate_drupal/src/MigrationStorage.php
index 7382605..e495122 100644
--- a/core/modules/migrate_drupal/src/MigrationStorage.php
+++ b/core/modules/migrate_drupal/src/MigrationStorage.php
@@ -10,7 +10,6 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityStorageException;
-use Drupal\migrate_drupal\Plugin\CckFieldMigrateSourceInterface;
 use Drupal\migrate\MigrationStorage as BaseMigrationStorage;
 
 /**
@@ -19,18 +18,6 @@
 class MigrationStorage extends BaseMigrationStorage {
 
   /**
-   * A cached array of cck field plugins.
-   *
-   * @var array
-   */
-  protected $cckFieldPlugins;
-
-  /**
-   * @var \Drupal\migrate_drupal\Plugin\MigratePluginManager
-   */
-  protected $cckPluginManager;
-
-  /**
    * {@inheritdoc}
    */
   public function loadMultiple(array $ids = NULL) {
@@ -97,10 +84,6 @@ public function loadMultiple(array $ids = NULL) {
       }
     }
 
-    // Allow modules providing cck field plugins to alter the required
-    // migrations to assist with the migration a custom field type.
-    $this->applyCckFieldProcessors($entities);
-
     // Build an array of dependencies and set the order of the migrations.
     return $this->buildDependencyMigration($entities, $dynamic_ids);
   }
@@ -130,83 +113,4 @@ public function save(EntityInterface $entity) {
     return parent::save($entity);
   }
 
-  /**
-   * Allow any field type plugins to adjust the migrations as required.
-   *
-   * @param \Drupal\migrate\Entity\Migration[] $entities
-   *   An array of migration entities.
-   */
-  protected function applyCckFieldProcessors(array $entities) {
-    $method_map = $this->getMigrationPluginMethodMap();
-
-    foreach ($entities as $entity_id => $migration) {
-
-      // Allow field plugins to process the required migrations.
-      if (isset($method_map[$entity_id])) {
-        $method = $method_map[$entity_id];
-        $cck_plugins = $this->getCckFieldPlugins();
-
-        array_walk($cck_plugins, function ($plugin) use ($method, $migration) {
-          $plugin->$method($migration);
-        });
-      }
-
-      // If this is a CCK bundle migration, allow the cck field plugins to add
-      // any field type processing.
-      $source_plugin = $migration->getSourcePlugin();
-      if ($source_plugin instanceof CckFieldMigrateSourceInterface && $source_plugin->getDerivativeId()) {
-        $plugins = $this->getCckFieldPlugins();
-        foreach ($source_plugin->fieldData() as $field_name => $data) {
-          if (isset($plugins[$data['type']])) {
-            $plugins[$data['type']]->processCckFieldValues($migration, $field_name, $data);
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Get an array of loaded cck field plugins.
-   *
-   * @return \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface[]
-   *   An array of cck field process plugins.
-   */
-  protected function getCckFieldPlugins() {
-    if (!isset($this->cckFieldPlugins)) {
-      $this->cckFieldPlugins = [];
-      foreach ($this->getCckPluginManager()->getDefinitions() as $definition) {
-        $this->cckFieldPlugins[$definition['id']] = $this->getCckPluginManager()->createInstance($definition['id']);
-      }
-    }
-    return $this->cckFieldPlugins;
-  }
-
-  /**
-   * Provides a map between migration ids and the cck field plugin method.
-   *
-   * @return array
-   *   The map between migrations and cck field plugin processing methods.
-   */
-  protected function getMigrationPluginMethodMap() {
-    return [
-      'd6_field' => 'processField',
-      'd6_field_instance' => 'processFieldInstance',
-      'd6_field_instance_widget_settings' => 'processFieldWidget',
-      'd6_field_formatter_settings' => 'processFieldFormatter',
-    ];
-  }
-
-  /**
-   * Get the cck field plugin manager.
-   *
-   * @return \Drupal\migrate_drupal\Plugin\MigratePluginManager
-   *   The loaded plugin manager.
-   */
-  protected function getCckPluginManager() {
-    if (!isset($this->cckPluginManager)) {
-      $this->cckPluginManager = \Drupal::service('plugin.manager.migrate.cckfield');
-    }
-    return $this->cckPluginManager;
-  }
-
 }
diff --git a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php
deleted file mode 100644
index c762768..0000000
--- a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
- */
-
-namespace Drupal\migrate_drupal\Plugin;
-
-use Drupal\Component\Plugin\PluginInspectionInterface;
-use Drupal\migrate\Entity\MigrationInterface;
-
-/**
- * Provides an interface for all CCK field type plugins.
- */
-interface MigrateCckFieldInterface extends PluginInspectionInterface {
-
-  /**
-   * Apply any custom processing to the field migration.
-   *
-   * @param \Drupal\migrate\Entity\MigrationInterface $migration
-   *   The migration entity.
-   */
-  public function processField(MigrationInterface $migration);
-
-  /**
-   * Apply any custom processing to the field instance migration.
-   *
-   * @param \Drupal\migrate\Entity\MigrationInterface $migration
-   *   The migration entity.
-   */
-  public function processFieldInstance(MigrationInterface $migration);
-
-  /**
-   * Apply any custom processing to the field widget migration.
-   *
-   * @param \Drupal\migrate\Entity\MigrationInterface $migration
-   *   The migration entity.
-   */
-  public function processFieldWidget(MigrationInterface $migration);
-
-  /**
-   * Apply any custom processing to the field formatter migration.
-   *
-   * @param \Drupal\migrate\Entity\MigrationInterface $migration
-   *   The migration entity.
-   */
-  public function processFieldFormatter(MigrationInterface $migration);
-
-  /**
-   * Get a map between D6 formatters and D8 formatters for this field type.
-   *
-   * This is used by static::processFieldFormatter() in the base class.
-   *
-   * @return array
-   *   The keys are D6 formatters and the values are D8 formatters.
-   */
-  public function getFieldFormatterMap();
-
-  /**
-   * Get a map between D6 and D8 widgets for this field type.
-   *
-   * @return array
-   *   The keys are D6 field widget types and the values D8 widgets.
-   */
-  public function getFieldWidgetMap();
-
-  /**
-   * Apply any custom processing to the cck bundle migrations.
-   *
-   * @param \Drupal\migrate\Entity\MigrationInterface $migration
-   *   The migration entity.
-   * @param string $field_name
-   *   The field name we're processing the value for.
-   * @param array $data
-   *   The array of field data from CckFieldValues::fieldData().
-   */
-  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data);
-
-}
diff --git a/core/modules/migrate_drupal/src/Plugin/MigratePluginManager.php b/core/modules/migrate_drupal/src/Plugin/MigratePluginManager.php
index 4a15e77..c93ff07 100644
--- a/core/modules/migrate_drupal/src/Plugin/MigratePluginManager.php
+++ b/core/modules/migrate_drupal/src/Plugin/MigratePluginManager.php
@@ -7,6 +7,9 @@
 
 namespace Drupal\migrate_drupal\Plugin;
 
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\Factory\ContainerFactory;
 use Drupal\migrate\Plugin\MigratePluginManager as BaseMigratePluginManager;
 
 /**
@@ -21,11 +24,11 @@ class MigratePluginManager extends BaseMigratePluginManager {
   /**
    * {@inheritdoc}
    */
-  protected function getPluginInterfaceMap() {
-    return parent::getPluginInterfaceMap() + [
-      'load' => 'Drupal\migrate_drupal\Plugin\MigrateLoadInterface',
-      'cckfield' => 'Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface',
-    ];
+  public function __construct($type, \Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, $annotation = 'Drupal\Component\Annotation\PluginID') {
+    parent::__construct($type, $namespaces, $cache_backend, $module_handler, $annotation);
+
+    $this->factory = new ContainerFactory($this, 'Drupal\migrate_drupal\Plugin\MigrateLoadInterface');
   }
 
+
 }
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php b/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php
deleted file mode 100644
index 301c6bd..0000000
--- a/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\migrate_drupal\Plugin\migrate\cckfield\MigrateCckFieldInterface.
- */
-
-namespace Drupal\migrate_drupal\Plugin\migrate\cckfield;
-
-use Drupal\Core\Plugin\PluginBase;
-use Drupal\migrate\Entity\MigrationInterface;
-use Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface;
-
-/**
- * The base class for all cck field plugins.
- *
- * @see \Drupal\migrate_drupal\Plugin\MigratePluginManager
- * @see \Drupal\migrate_drupal\Annotation\MigrateCckField
- * @see \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
- * @see plugin_api
- *
- * @ingroup migration
- */
-abstract class CckFieldPluginBase extends PluginBase implements MigrateCckFieldInterface  {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function processField(MigrationInterface $migration) {
-    $process[0]['map'][$this->pluginId][$this->pluginId] = $this->pluginId;
-    $migration->mergeProcessOfProperty('type', $process);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function processFieldInstance(MigrationInterface $migration) {
-    // Nothing to do by default with field instances.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function processFieldWidget(MigrationInterface $migration) {
-    $process = [];
-    foreach ($this->getFieldWidgetMap() as $source_widget => $destination_widget) {
-      $process['type']['map'][$source_widget] = $destination_widget;
-    }
-    $migration->mergeProcessOfProperty('options/type', $process);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFieldWidgetMap() {
-    // By default use the plugin id for the widget types.
-    return [
-      $this->pluginId => $this->pluginId . '_default',
-    ];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function processFieldFormatter(MigrationInterface $migration) {
-    $process = [];
-    foreach ($this->getFieldFormatterMap() as $source_format => $destination_format) {
-      $process[0]['map'][$this->pluginId][$source_format] = $destination_format;
-    }
-    $migration->mergeProcessOfProperty('options/type', $process);
-  }
-
-}
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php
index 2165619..154b5f2 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php
@@ -138,12 +138,10 @@ public function testFieldInstanceSettings() {
       // storages so we end up with the default value for this setting.
       'handler' => 'default:node',
       'handler_settings' => array(),
-      'target_bundle' => NULL,
     );
     $field_settings = $field->getSettings();
     ksort($expected);
     ksort($field_settings);
-    // This is the only way to compare arrays.
     $this->assertIdentical($expected, $field_settings);
 
     // Test a link field.
diff --git a/core/modules/node/node.info.yml b/core/modules/node/node.info.yml
index cdbef85..9b53d58 100644
--- a/core/modules/node/node.info.yml
+++ b/core/modules/node/node.info.yml
@@ -7,4 +7,3 @@ core: 8.x
 configure: entity.node_type.collection
 dependencies:
   - text
-  - entity_reference
diff --git a/core/modules/node/src/Tests/Config/NodeImportChangeTest.php b/core/modules/node/src/Tests/Config/NodeImportChangeTest.php
index 4e1fbc1..346e838 100644
--- a/core/modules/node/src/Tests/Config/NodeImportChangeTest.php
+++ b/core/modules/node/src/Tests/Config/NodeImportChangeTest.php
@@ -22,7 +22,7 @@ class NodeImportChangeTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('node', 'field', 'text', 'system', 'node_test_config', 'user', 'entity_reference');
+  public static $modules = array('node', 'field', 'text', 'system', 'node_test_config', 'user');
 
   /**
    * Set the default field storage backend for fields created during tests.
diff --git a/core/modules/node/src/Tests/Config/NodeImportCreateTest.php b/core/modules/node/src/Tests/Config/NodeImportCreateTest.php
index f6902e39..a16502b 100644
--- a/core/modules/node/src/Tests/Config/NodeImportCreateTest.php
+++ b/core/modules/node/src/Tests/Config/NodeImportCreateTest.php
@@ -23,7 +23,7 @@ class NodeImportCreateTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('node', 'field', 'text', 'system', 'user', 'entity_reference');
+  public static $modules = array('node', 'field', 'text', 'system', 'user');
 
   /**
    * Set the default field storage backend for fields created during tests.
diff --git a/core/modules/node/src/Tests/NodeBodyFieldStorageTest.php b/core/modules/node/src/Tests/NodeBodyFieldStorageTest.php
index 6e606f5..c0a01cf 100644
--- a/core/modules/node/src/Tests/NodeBodyFieldStorageTest.php
+++ b/core/modules/node/src/Tests/NodeBodyFieldStorageTest.php
@@ -27,7 +27,7 @@ class NodeBodyFieldStorageTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('user', 'system', 'field', 'node', 'text', 'filter', 'entity_reference');
+  public static $modules = array('user', 'system', 'field', 'node', 'text', 'filter');
 
   protected function setUp() {
     parent::setUp();
diff --git a/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml b/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml
index 6d0f3e8..19a2ef7 100644
--- a/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml
+++ b/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml
@@ -5,7 +5,6 @@ dependencies:
     - field.field.node.options_install_test.body
     - node.type.options_install_test
   module:
-    - entity_reference
     - text
 id: node.options_install_test.default
 targetEntityType: node
diff --git a/core/modules/quickedit/src/Tests/QuickEditTestBase.php b/core/modules/quickedit/src/Tests/QuickEditTestBase.php
index fbbd1a7..ff1ceae 100644
--- a/core/modules/quickedit/src/Tests/QuickEditTestBase.php
+++ b/core/modules/quickedit/src/Tests/QuickEditTestBase.php
@@ -19,7 +19,7 @@
    *
    * @var array
    */
-  public static $modules = array('system', 'entity_test', 'field', 'field_test', 'filter', 'user', 'text', 'quickedit', 'entity_reference');
+  public static $modules = array('system', 'entity_test', 'field', 'field_test', 'filter', 'user', 'text', 'quickedit');
 
   /**
    * Bag of created fields.
diff --git a/core/modules/rdf/src/Tests/Field/EntityReferenceRdfaTest.php b/core/modules/rdf/src/Tests/Field/EntityReferenceRdfaTest.php
index 31b8465..6e432d2 100644
--- a/core/modules/rdf/src/Tests/Field/EntityReferenceRdfaTest.php
+++ b/core/modules/rdf/src/Tests/Field/EntityReferenceRdfaTest.php
@@ -6,7 +6,7 @@
 
 namespace Drupal\rdf\Tests\Field;
 
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
+use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\user\Entity\Role;
 use Drupal\user\RoleInterface;
 
@@ -48,7 +48,7 @@ class EntityReferenceRdfaTest extends FieldRdfaTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = array('entity_reference', 'text', 'filter');
+  public static $modules = array('text', 'filter');
 
   protected function setUp() {
     parent::setUp();
diff --git a/core/modules/serialization/src/Tests/EntityResolverTest.php b/core/modules/serialization/src/Tests/EntityResolverTest.php
index 7d7c00d..9819137 100644
--- a/core/modules/serialization/src/Tests/EntityResolverTest.php
+++ b/core/modules/serialization/src/Tests/EntityResolverTest.php
@@ -20,7 +20,7 @@ class EntityResolverTest extends NormalizerTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_reference', 'hal', 'rest');
+  public static $modules = array('hal', 'rest');
 
   /**
    * The format being tested.
diff --git a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
index 3b382e1..466aa84 100644
--- a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
@@ -27,7 +27,7 @@
    *
    * @var array
    */
-  public static $modules = array('entity_reference', 'entity_test', 'field_test');
+  public static $modules = array('entity_test', 'field_test');
 
   /**
    * The main entity used for testing.
diff --git a/core/modules/system/src/Tests/Entity/EntityFieldTest.php b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
index 8be7a1d..11a208b 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
@@ -688,7 +688,9 @@ public function testEntityConstraintValidation() {
       ->setLabel('Test entity')
       ->setSettings(array(
         'target_type' => 'node',
-        'target_bundle' => 'article',
+        'handler_settings' => array(
+          'target_bundles' => array('article'),
+        ),
       ));
     $reference_field = \Drupal::TypedDataManager()->create($definition);
     $reference = $reference_field->appendItem(array('entity' => $node))->get('entity');
diff --git a/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php b/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php
index a0b8ea0..5345560 100644
--- a/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php
@@ -12,7 +12,7 @@
 use Drupal\Core\Entity\EntityStorageException;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
+use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\user\Entity\Role;
 use Drupal\user\Entity\User;
diff --git a/core/modules/system/src/Tests/Entity/EntityUnitTestBase.php b/core/modules/system/src/Tests/Entity/EntityUnitTestBase.php
index 89deb62..457ce8d 100644
--- a/core/modules/system/src/Tests/Entity/EntityUnitTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityUnitTestBase.php
@@ -20,7 +20,7 @@
    *
    * @var array
    */
-  public static $modules = array('user', 'system', 'field', 'text', 'filter', 'entity_test', 'entity_reference');
+  public static $modules = array('user', 'system', 'field', 'text', 'filter', 'entity_test');
 
   /**
    * The entity manager service.
diff --git a/core/modules/system/src/Tests/Entity/EntityViewBuilderTest.php b/core/modules/system/src/Tests/Entity/EntityViewBuilderTest.php
index 1588150..9ecdf17 100644
--- a/core/modules/system/src/Tests/Entity/EntityViewBuilderTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityViewBuilderTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\system\Tests\Entity;
 
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
+use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\user\Entity\Role;
 use Drupal\user\RoleInterface;
 
@@ -21,13 +21,6 @@ class EntityViewBuilderTest extends EntityUnitTestBase {
   use EntityReferenceTestTrait;
 
   /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('entity_reference');
-
-  /**
    * {@inheritdoc}
    */
   protected function setUp() {
diff --git a/core/modules/system/src/Tests/Entity/FieldAccessTest.php b/core/modules/system/src/Tests/Entity/FieldAccessTest.php
index b44d84a..17ce1d5 100644
--- a/core/modules/system/src/Tests/Entity/FieldAccessTest.php
+++ b/core/modules/system/src/Tests/Entity/FieldAccessTest.php
@@ -22,7 +22,7 @@ class FieldAccessTest extends KernelTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_test', 'field', 'system', 'text', 'filter', 'user', 'entity_reference');
+  public static $modules = array('entity_test', 'field', 'system', 'text', 'filter', 'user');
 
   /**
    * Holds the currently active global user ID that initiated the test run.
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index d2bda7f..064285d 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -8,6 +8,7 @@
 use Drupal\Component\Utility\UrlHelper;
 use Drupal\Core\Asset\AttachedAssetsInterface;
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Database\Query\AlterableInterface;
 use Drupal\Core\Extension\Extension;
 use Drupal\Core\Extension\ExtensionDiscovery;
 use Drupal\Core\Form\FormStateInterface;
@@ -1365,3 +1366,11 @@ function system_path_insert() {
 function system_path_delete($path) {
   \Drupal::service('path.alias_manager')->cacheClear();
 }
+
+/**
+ * Implements hook_query_TAG_alter() for entity reference selection handlers.
+ */
+function system_query_entity_reference_selection_alter(AlterableInterface $query) {
+  $handler = $query->getMetadata('entity_reference_selection_handler');
+  $handler->entityQueryAlter($query);
+}
diff --git a/core/modules/entity_reference/entity_reference.views.inc b/core/modules/system/system.views.inc
similarity index 79%
rename from core/modules/entity_reference/entity_reference.views.inc
rename to core/modules/system/system.views.inc
index 486fca1..9380072 100644
--- a/core/modules/entity_reference/entity_reference.views.inc
+++ b/core/modules/system/system.views.inc
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Provides views data for the entity_reference module.
+ * Provides views data for field types that do not have their own module.
  */
 
 use Drupal\field\FieldStorageConfigInterface;
@@ -10,10 +10,19 @@
 /**
  * Implements hook_field_views_data().
  */
-function entity_reference_field_views_data(FieldStorageConfigInterface $field_storage) {
+function core_field_views_data(FieldStorageConfigInterface $field_storage) {
   $data = views_field_default_views_data($field_storage);
+
+  // The code below only deals with the Entity reference field.
+  if ($field_storage->getType() != 'entity_reference') {
+    return $data;
+  }
+
   $entity_manager = \Drupal::entityManager();
-  $table_mapping = $entity_manager->getStorage($field_storage->getTargetEntityTypeId())->getTableMapping();
+  $entity_type_id = $field_storage->getTargetEntityTypeId();
+  /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
+  $table_mapping = $entity_manager->getStorage($entity_type_id)->getTableMapping();
+
   foreach ($data as $table_name => $table_data) {
     // Add a relationship to the target entity type.
     $target_entity_type_id = $field_storage->getSetting('target_type');
@@ -38,10 +47,7 @@ function entity_reference_field_views_data(FieldStorageConfigInterface $field_st
 
     // Provide a reverse relationship for the entity type that is referenced by
     // the field.
-    $entity_type_id = $field_storage->getTargetEntityTypeId();
     $pseudo_field_name = 'reverse__' . $entity_type_id . '__' . $field_storage->getName();
-    /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
-    $table_mapping = \Drupal::entityManager()->getStorage($entity_type_id)->getTableMapping();
     $data[$target_base_table][$pseudo_field_name]['relationship'] = array(
       'title' => t('@label using @field_name', $args),
       'help' => t('Relate each @label with a @field_name.', $args),
diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml b/core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
similarity index 99%
rename from core/modules/entity_reference/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
rename to core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
index 5b6ba8f..3665068 100644
--- a/core/modules/entity_reference/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
+++ b/core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
@@ -2,7 +2,6 @@ langcode: en
 status: true
 dependencies:
   module:
-    - entity_reference
     - entity_reference_test
     - node
     - user
diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test/entity_reference_test.info.yml b/core/modules/system/tests/modules/entity_reference_test/entity_reference_test.info.yml
similarity index 80%
rename from core/modules/entity_reference/tests/modules/entity_reference_test/entity_reference_test.info.yml
rename to core/modules/system/tests/modules/entity_reference_test/entity_reference_test.info.yml
index 67a5f48..9fa85b6 100644
--- a/core/modules/entity_reference/tests/modules/entity_reference_test/entity_reference_test.info.yml
+++ b/core/modules/system/tests/modules/entity_reference_test/entity_reference_test.info.yml
@@ -4,5 +4,3 @@ description: "Support module for the Entity Reference tests."
 core: 8.x
 package: Testing
 version: VERSION
-dependencies:
-  - entity_reference
diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test/entity_reference_test.module b/core/modules/system/tests/modules/entity_reference_test/entity_reference_test.module
similarity index 100%
rename from core/modules/entity_reference/tests/modules/entity_reference_test/entity_reference_test.module
rename to core/modules/system/tests/modules/entity_reference_test/entity_reference_test.module
diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml b/core/modules/system/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml
similarity index 90%
rename from core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml
rename to core/modules/system/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml
index 04fb33b..19678f8 100644
--- a/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml
+++ b/core/modules/system/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml
@@ -5,5 +5,4 @@ package: Testing
 version: VERSION
 core: 8.x
 dependencies:
- - entity_reference
  - views
diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml b/core/modules/system/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml
similarity index 100%
rename from core/modules/entity_reference/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml
rename to core/modules/system/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.info.yml b/core/modules/system/tests/modules/entity_test/entity_test.info.yml
index 8d3200c..bd4382e 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.info.yml
+++ b/core/modules/system/tests/modules/entity_test/entity_test.info.yml
@@ -7,4 +7,3 @@ core: 8.x
 dependencies:
   - field
   - text
-  - entity_reference
diff --git a/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
index 48fb389..a064a02 100644
--- a/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
+++ b/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
@@ -59,6 +59,19 @@ public static function defaultFieldSettings() {
   /**
    * {@inheritdoc}
    */
+  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+    $properties = parent::propertyDefinitions($field_definition);
+
+    foreach ($field_definition->getSetting('allowed_values') as $allowed_value) {
+      $properties['entity']->getTargetDefinition()->addConstraint('Bundle', $allowed_value['vocabulary']);
+    }
+
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getPossibleValues(AccountInterface $account = NULL) {
     // Flatten options firstly, because Possible Options may contain group
     // arrays.
diff --git a/core/modules/taxonomy/src/Tests/TaxonomyTermReferenceItemTest.php b/core/modules/taxonomy/src/Tests/TaxonomyTermReferenceItemTest.php
index ef5617e..dd12f25 100644
--- a/core/modules/taxonomy/src/Tests/TaxonomyTermReferenceItemTest.php
+++ b/core/modules/taxonomy/src/Tests/TaxonomyTermReferenceItemTest.php
@@ -27,7 +27,7 @@ class TaxonomyTermReferenceItemTest extends FieldUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('taxonomy', 'entity_reference', 'text', 'filter');
+  public static $modules = array('taxonomy', 'text', 'filter');
 
   /**
    * The term entity.
diff --git a/core/modules/taxonomy/src/Tests/TermEntityReferenceTest.php b/core/modules/taxonomy/src/Tests/TermEntityReferenceTest.php
index fc452ff..9fac367 100644
--- a/core/modules/taxonomy/src/Tests/TermEntityReferenceTest.php
+++ b/core/modules/taxonomy/src/Tests/TermEntityReferenceTest.php
@@ -22,7 +22,7 @@ class TermEntityReferenceTest extends TaxonomyTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_reference', 'entity_reference_test', 'entity_test');
+  public static $modules = array('entity_reference_test', 'entity_test');
 
   /**
    * Tests an entity reference field restricted to a single vocabulary.
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index c1896fd..558be5a 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -542,15 +542,6 @@ function taxonomy_field_widget_info_alter(&$info) {
 }
 
 /**
- * Implements hook_field_formatter_info_alter().
- */
-function taxonomy_field_formatter_info_alter(array &$info) {
-  if (!\Drupal::moduleHandler()->moduleExists('entity_reference')) {
-    unset($info['entity_reference_rss_category']);
-  }
-}
-
-/**
  * Title callback for term pages.
  *
  * @param \Drupal\taxonomy\Entity\Term $term
diff --git a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
index d766378..d92e9d5 100644
--- a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
+++ b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
@@ -112,7 +112,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
     $form['filter']['settings'] = array(
       '#type' => 'container',
       '#attributes' => array('class' => array('entity_reference-settings')),
-      '#process' => array('_entity_reference_form_process_merge_parent'),
+      '#process' => array(array('\Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', 'formProcessMergeParent')),
     );
 
     if ($selection_handler_settings['filter']['type'] == 'role') {
diff --git a/core/modules/user/src/Tests/UserEntityReferenceTest.php b/core/modules/user/src/Tests/UserEntityReferenceTest.php
index 1323fcd..9b327ce 100644
--- a/core/modules/user/src/Tests/UserEntityReferenceTest.php
+++ b/core/modules/user/src/Tests/UserEntityReferenceTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\user\Tests;
 
-use Drupal\entity_reference\Tests\EntityReferenceTestTrait;
+use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\system\Tests\Entity\EntityUnitTestBase;
 
@@ -35,13 +35,6 @@ class UserEntityReferenceTest extends EntityUnitTestBase {
   protected $role2;
 
   /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('entity_reference', 'user');
-
-  /**
    * {@inheritdoc}
    */
   protected function setUp() {
diff --git a/core/modules/views/config/schema/views.display.schema.yml b/core/modules/views/config/schema/views.display.schema.yml
index d31678f..16b0d1d 100644
--- a/core/modules/views/config/schema/views.display.schema.yml
+++ b/core/modules/views/config/schema/views.display.schema.yml
@@ -127,3 +127,7 @@ views.display.attachment:
     render_pager:
       type: boolean
       label: 'Render pager'
+
+views.display.entity_reference:
+  type: views_display
+  label: 'Entity Reference'
diff --git a/core/modules/views/config/schema/views.row.schema.yml b/core/modules/views/config/schema/views.row.schema.yml
index 4378f0c..3eae0c9 100644
--- a/core/modules/views/config/schema/views.row.schema.yml
+++ b/core/modules/views/config/schema/views.row.schema.yml
@@ -85,3 +85,7 @@ views.row.opml_fields:
     url_field:
       type: string
       label: 'URL attribute'
+
+views.row.entity_reference:
+  type: views.row.fields
+  label: 'Entity Reference inline fields'
diff --git a/core/modules/views/config/schema/views.style.schema.yml b/core/modules/views/config/schema/views.style.schema.yml
index f819aeb..ad0571b 100644
--- a/core/modules/views/config/schema/views.style.schema.yml
+++ b/core/modules/views/config/schema/views.style.schema.yml
@@ -143,3 +143,14 @@ views.style.unformatted_summary:
     separator:
       type: string
       label: 'Separator'
+
+views.style.entity_reference:
+  type: views_style
+  label: 'Entity Reference list'
+  mapping:
+    search_fields:
+      type: sequence
+      label: 'Search fields'
+      sequence:
+        type: string
+        label: 'Search field'
diff --git a/core/modules/entity_reference/src/Plugin/views/display/EntityReference.php b/core/modules/views/src/Plugin/views/display/EntityReference.php
similarity index 96%
rename from core/modules/entity_reference/src/Plugin/views/display/EntityReference.php
rename to core/modules/views/src/Plugin/views/display/EntityReference.php
index 83f998f..1c2dce7 100644
--- a/core/modules/entity_reference/src/Plugin/views/display/EntityReference.php
+++ b/core/modules/views/src/Plugin/views/display/EntityReference.php
@@ -2,12 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Plugin\views\display\EntityReference.
+ * Contains \Drupal\views\Plugin\views\display\EntityReference.
  */
 
-namespace Drupal\entity_reference\Plugin\views\display;
-
-use Drupal\views\Plugin\views\display\DisplayPluginBase;
+namespace Drupal\views\Plugin\views\display;
 
 /**
  * The plugin that handles an EntityReference display.
diff --git a/core/modules/entity_reference/src/Plugin/views/row/EntityReference.php b/core/modules/views/src/Plugin/views/row/EntityReference.php
similarity index 90%
rename from core/modules/entity_reference/src/Plugin/views/row/EntityReference.php
rename to core/modules/views/src/Plugin/views/row/EntityReference.php
index 3323933..abed3c2 100644
--- a/core/modules/entity_reference/src/Plugin/views/row/EntityReference.php
+++ b/core/modules/views/src/Plugin/views/row/EntityReference.php
@@ -2,13 +2,12 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Plugin\views\row\EntityReference.
+ * Contains \Drupal\views\Plugin\views\row\EntityReference.
  */
 
-namespace Drupal\entity_reference\Plugin\views\row;
+namespace Drupal\views\Plugin\views\row;
 
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\views\Plugin\views\row\Fields;
 
 /**
  * EntityReference row plugin.
diff --git a/core/modules/entity_reference/src/Plugin/views/style/EntityReference.php b/core/modules/views/src/Plugin/views/style/EntityReference.php
similarity index 94%
rename from core/modules/entity_reference/src/Plugin/views/style/EntityReference.php
rename to core/modules/views/src/Plugin/views/style/EntityReference.php
index 51c45a8..d4b34c7 100644
--- a/core/modules/entity_reference/src/Plugin/views/style/EntityReference.php
+++ b/core/modules/views/src/Plugin/views/style/EntityReference.php
@@ -2,14 +2,13 @@
 
 /**
  * @file
- * Contains \Drupal\entity_reference\Plugin\views\style\EntityReference.
+ * Contains \Drupal\views\Plugin\views\style\EntityReference.
  */
 
-namespace Drupal\entity_reference\Plugin\views\style;
+namespace Drupal\views\Plugin\views\style;
 
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\views\Plugin\views\style\StylePluginBase;
 
 /**
  * EntityReference style plugin.
diff --git a/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php b/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
index 1d83776..ccdae37 100644
--- a/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
+++ b/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
@@ -25,7 +25,7 @@ class RowEntityRenderersTest extends ViewUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('field', 'filter', 'text', 'node', 'user', 'language', 'entity_reference', 'views_test_language');
+  public static $modules = array('field', 'filter', 'text', 'node', 'user', 'language', 'views_test_language');
 
   /**
    * Views used by this test.
diff --git a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
index d96f666..2b38c91 100644
--- a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
+++ b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
@@ -31,7 +31,7 @@ class ViewEntityDependenciesTest extends ViewUnitTestBase {
    *
    * @var array
    */
-  public static $modules = ['node', 'comment', 'user', 'field', 'text', 'entity_reference', 'search'];
+  public static $modules = ['node', 'comment', 'user', 'field', 'text', 'search'];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/views/src/Tests/ViewExecutableTest.php b/core/modules/views/src/Tests/ViewExecutableTest.php
index b39abef..8b2069e 100644
--- a/core/modules/views/src/Tests/ViewExecutableTest.php
+++ b/core/modules/views/src/Tests/ViewExecutableTest.php
@@ -34,7 +34,7 @@ class ViewExecutableTest extends ViewUnitTestBase {
 
   use CommentTestTrait;
 
-  public static $modules = array('system', 'node', 'comment', 'user', 'filter', 'field', 'text', 'entity_reference');
+  public static $modules = array('system', 'node', 'comment', 'user', 'filter', 'field', 'text');
 
   /**
    * Views used by this test.
diff --git a/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml
index 9e54f2a..ce84299 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml
@@ -9,7 +9,6 @@ dependencies:
     - node.type.article
   module:
     - comment
-    - entity_reference
     - image
     - path
     - taxonomy
diff --git a/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml
index 967c74e..cfdb2a9 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml
@@ -5,7 +5,6 @@ dependencies:
     - field.field.node.page.body
     - node.type.page
   module:
-    - entity_reference
     - path
     - text
 id: node.page.default
diff --git a/core/profiles/standard/standard.info.yml b/core/profiles/standard/standard.info.yml
index a1c07b2..3e05954 100644
--- a/core/profiles/standard/standard.info.yml
+++ b/core/profiles/standard/standard.info.yml
@@ -19,7 +19,6 @@ dependencies:
   - block_content
   - quickedit
   - editor
-  - entity_reference
   - help
   - image
   - menu_ui
