diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php
index 69b2400..6c70241 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php
@@ -9,8 +9,8 @@
 
 use Drupal\Core\TypedData\Annotation\DataType;
 use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Entity\Field\FieldItemBase;
-use Drupal\Core\TypedData\TypedDataInterface;
+use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemBase;
+use Drupal\field\FieldInterface;
 
 /**
  * Defines the 'entity_reference_item' entity field item.
@@ -29,7 +29,7 @@
  *   constraints = {"ValidReference" = TRUE}
  * )
  */
-class EntityReferenceItem extends FieldItemBase {
+class EntityReferenceItem extends ConfigFieldItemBase {
 
   /**
    * Definitions of the contained properties.
@@ -41,7 +41,7 @@ class EntityReferenceItem extends FieldItemBase {
   static $propertyDefinitions;
 
   /**
-   * Implements \Drupal\Core\TypedData\ComplexDataInterface::getPropertyDefinitions().
+   * {@inheritdoc}
    */
   public function getPropertyDefinitions() {
     // Definitions vary by entity type and bundle, so key them accordingly.
@@ -76,7 +76,7 @@ public function getPropertyDefinitions() {
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\Field\FieldItemBase::__get().
+   * {@inheritdoc}
    */
   public function __get($name) {
     $name = ($name == 'value') ? 'target_id' : $name;
@@ -84,7 +84,7 @@ public function __get($name) {
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\Field\FieldItemBase::get().
+   * {@inheritdoc}
    */
   public function get($property_name) {
     $property_name = ($property_name == 'value') ? 'target_id' : $property_name;
@@ -92,7 +92,7 @@ public function get($property_name) {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\Field\FieldItemInterface::__isset().
+   * {@inheritdoc}
    */
   public function __isset($property_name) {
     $property_name = ($property_name == 'value') ? 'target_id' : $property_name;
@@ -100,7 +100,7 @@ public function __isset($property_name) {
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\Field\FieldItemBase::get().
+   * {@inheritdoc}
    */
   public function setValue($values, $notify = TRUE) {
     if (isset($values) && !is_array($values)) {
@@ -134,4 +134,40 @@ public function onChange($property_name) {
     }
     parent::onChange($property_name);
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEmpty() {
+    // Avoid loading the entity by first checking the 'target_id'.
+    $target_id = $this->get('target_id')->getValue();
+    if (!empty($target_id) && is_numeric($target_id)) {
+      return FALSE;
+    }
+    // Allow auto-create entities.
+    if (empty($target_id) && ($entity = $this->get('entity')->getValue()) && $entity->isNew()) {
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preSave() {
+    $entity = $this->get('entity')->getValue();
+    $target_id = $this->get('target_id')->getValue();
+
+    if (empty($target_id) && !empty($entity) && $entity->isNew()) {
+      $entity->save();
+      $this->set('target_id', $entity->id());
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldInterface $field) {
+    return array();
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index 0e786bd..408caa2 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -379,7 +379,7 @@ public function getConstraints($definition) {
     // definition for performing interface checks.
     $class = isset($definition['class']) ? $definition['class'] : $type_definition['class'];
     // Check if the class provides allowed values.
-    if (array_key_exists('Drupal\Core\TypedData\AllowedValuesInterface', class_implements($class))) {
+    if (array_key_exists('Drupal\Core\TypedData\AllowedValuesInterface', class_implements($class)) && array_key_exists('Drupal\Core\TypedData\PrimitiveInterface', class_implements($class))) {
       $constraints[] = $validation_manager->create('AllowedValues', array());
     }
 
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php
index ee5e79a..edf1530 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php
@@ -9,11 +9,7 @@
 
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Annotation\FieldType;
-use Drupal\Core\Entity\Field\Type\EntityReferenceItem;
-use Drupal\field\Plugin\Type\FieldType\ConfigEntityReferenceItemBase;
-use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemBase;
-use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemInterface;
-use Drupal\field\FieldInterface;
+use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
 
 /**
  * Plugin implementation of the 'entity_reference' field type.
@@ -40,60 +36,41 @@
  * Required settings (below the definition's 'settings' key) are:
  *  - target_type: The entity type to reference.
  */
-class ConfigurableEntityReferenceItem extends ConfigEntityReferenceItemBase implements ConfigFieldItemInterface {
+class ConfigurableEntityReferenceItem extends EntityReferenceItem {
 
   /**
    * {@inheritdoc}
    */
-  public static function schema(FieldInterface $field) {
-    $schema = array(
-      'columns' => array(
-        'target_id' => array(
-          'description' => 'The ID of the target entity.',
-          'type' => 'int',
-          'unsigned' => TRUE,
-          'not null' => TRUE,
+  public function getPropertyDefinitions() {
+    // Definitions vary by entity type and bundle, so key them accordingly.
+    $key = $this->definition['settings']['target_type'] . ':';
+    $key .= isset($this->definition['settings']['target_bundle']) ? $this->definition['settings']['target_bundle'] : '';
+
+    if (!isset(static::$propertyDefinitions[$key])) {
+      // Call the parent to define the target_id and entity properties.
+      parent::getPropertyDefinitions();
+
+      static::$propertyDefinitions[$key]['revision_id'] = array(
+
+        // @todo: Lookup the entity type's ID data type and use it here.
+        'type' => 'integer',
+        'label' => t('Revision ID'),
+        'constraints' => array(
+          'Range' => array('min' => 0),
         ),
-        'revision_id' => array(
-          'description' => 'The revision ID of the target entity.',
-          'type' => 'int',
-          'unsigned' => TRUE,
-          'not null' => FALSE,
-        ),
-      ),
-      'indexes' => array(
-        'target_id' => array('target_id'),
-      ),
-    );
-
-    // Create a foreign key to the target entity type base type.
-    $entity_manager = \Drupal::service('entity.manager');
-    if (is_subclass_of($entity_manager->getControllerClass($field['settings']['target_type'], 'storage'), 'Drupal\Core\Entity\DatabaseStorageController')) {
-      $entity_info = $entity_manager->getDefinition($field['settings']['target_type']);
-
-      $base_table = $entity_info['base_table'];
-      $id_column = $entity_info['entity_keys']['id'];
-
-      $schema['foreign keys'][$base_table] = array(
-        'table' => $base_table,
-        'columns' => array('target_id' => $id_column),
+      );
+      static::$propertyDefinitions[$key]['label'] = array(
+        'type' => 'string',
+        'label' => t('Label (auto-create)'),
+        'computed' => TRUE,
+      );
+      static::$propertyDefinitions[$key]['access'] = array(
+        'type' => 'boolean',
+        'label' => t('Access'),
+        'computed' => TRUE,
       );
     }
-
-    return $schema;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function preSave() {
-    $entity = $this->get('entity')->getValue();
-    $target_id = $this->get('target_id')->getValue();
-
-    if (empty($target_id) && !empty($entity) && $entity->isNew()) {
-      $entity->save();
-      $this->set('target_id', $entity->id());
-    }
+    return static::$propertyDefinitions[$key];
   }
 
   /**
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
deleted file mode 100644
index 6b3c137..0000000
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\field\Plugin\Type\FieldType\ConfigEntityReferenceItemBase.
- */
-
-namespace Drupal\field\Plugin\Type\FieldType;
-
-use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
-use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemInterface;
-use Drupal\field\FieldInterface;
-use Drupal\field\FieldInstanceInterface;
-
-/**
- * A common base class for configurable entity reference fields.
- *
- * Extends the Core 'entity_reference' entity field item with properties for
- * revision ids, labels (for autocreate) and access.
- *
- * Required settings (below the definition's 'settings' key) are:
- *  - target_type: The entity type to reference.
- */
-class ConfigEntityReferenceItemBase extends EntityReferenceItem implements ConfigFieldItemInterface {
-
-  /**
-   * Definitions of the contained properties.
-   *
-   * @see ConfigurableEntityReferenceItem::getPropertyDefinitions()
-   *
-   * @var array
-   */
-  static $propertyDefinitions;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPropertyDefinitions() {
-    // Definitions vary by entity type and bundle, so key them accordingly.
-    $key = $this->definition['settings']['target_type'] . ':';
-    $key .= isset($this->definition['settings']['target_bundle']) ? $this->definition['settings']['target_bundle'] : '';
-
-    if (!isset(static::$propertyDefinitions[$key])) {
-      // Call the parent to define the target_id and entity properties.
-      parent::getPropertyDefinitions();
-
-      static::$propertyDefinitions[$key]['revision_id'] = array(
-        // @todo: Lookup the entity type's ID data type and use it here.
-        'type' => 'integer',
-        'label' => t('Revision ID'),
-        'constraints' => array(
-          'Range' => array('min' => 0),
-        ),
-      );
-      static::$propertyDefinitions[$key]['label'] = array(
-        'type' => 'string',
-        'label' => t('Label (auto-create)'),
-        'computed' => TRUE,
-      );
-      static::$propertyDefinitions[$key]['access'] = array(
-        'type' => 'boolean',
-        'label' => t('Access'),
-        'computed' => TRUE,
-      );
-    }
-    return static::$propertyDefinitions[$key];
-  }
-
-  /**
-   * {@inheritdoc}
-   *
-   * Copied from \Drupal\field\Plugin\field\field_type\LegacyConfigFieldItem,
-   * since we cannot extend it.
-   */
-  public static function schema(FieldInterface $field) {
-    $definition = \Drupal::service('plugin.manager.entity.field.field_type')->getDefinition($field->type);
-    $module = $definition['provider'];
-    module_load_install($module);
-    $callback = "{$module}_field_schema";
-    if (function_exists($callback)) {
-      return $callback($field);
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isEmpty() {
-    // Avoid loading the entity by first checking the 'target_id'.
-    $target_id = $this->get('target_id')->getValue();
-    if (!empty($target_id) && is_numeric($target_id)) {
-      return FALSE;
-    }
-    // Allow auto-create entities.
-    if (empty($target_id) && ($entity = $this->get('entity')->getValue()) && $entity->isNew()) {
-      return FALSE;
-    }
-    return TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   *
-   * Copied from \Drupal\field\Plugin\field\field_type\LegacyConfigFieldItem,
-   * since we cannot extend it.
-   */
-  public function settingsForm(array $form, array &$form_state, $has_data) {
-    if ($callback = $this->getLegacyCallback('settings_form')) {
-      $instance = $this->getFieldDefinition();
-      if (!($instance instanceof FieldInstanceInterface)) {
-        throw new \UnexpectedValueException('ConfigEntityReferenceItemBase::settingsForm() called for a field whose definition is not a field instance.');
-      }
-      // hook_field_settings_form() used to receive the $instance (not actually
-      // needed), and the value of field_has_data().
-      return $callback($instance->getField(), $instance, $has_data);
-    }
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   *
-   * Copied from \Drupal\field\Plugin\field\field_type\LegacyConfigFieldItem,
-   * since we cannot extend it.
-   */
-  public function instanceSettingsForm(array $form, array &$form_state) {
-    if ($callback = $this->getLegacyCallback('instance_settings_form')) {
-      $instance = $this->getFieldDefinition();
-      if (!($instance instanceof FieldInstanceInterface)) {
-        throw new \UnexpectedValueException('ConfigEntityReferenceItemBase::instanceSettingsForm() called for a field whose definition is not a field instance.');
-      }
-      return $callback($instance->getField(), $instance, $form_state);
-    }
-    return array();
-  }
-
-  /**
-   * Returns options provided via the legacy callback hook_options_list().
-   *
-   * @todo: Convert all legacy callback implementations to methods.
-   *
-   * @see \Drupal\Core\TypedData\AllowedValuesInterface
-   */
-  public function getSettableOptions() {
-    $definition = $this->getPluginDefinition();
-    $callback = "{$definition['provider']}_options_list";
-    if (function_exists($callback)) {
-      // We are at the field item level, so we need to go two levels up to get
-      // to the entity object.
-      return $callback($this->getFieldDefinition(), $this->getEntity());
-    }
-  }
-
-  /**
-   * Returns the legacy callback for a given field type "hook".
-   *
-   * Copied from \Drupal\field\Plugin\field\field_type\LegacyConfigFieldItem,
-   * since we cannot extend it.
-   *
-   * @param string $hook
-   *   The name of the hook, e.g. 'settings_form', 'is_empty'.
-   *
-   * @return string|null
-   *   The name of the legacy callback, or NULL if it does not exist.
-   */
-  protected function getLegacyCallback($hook) {
-    $definition = $this->getPluginDefinition();
-    $module = $definition['provider'];
-    $callback = "{$module}_field_{$hook}";
-    if (function_exists($callback)) {
-      return $callback;
-    }
-  }
-
-}
diff --git a/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php b/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php
index 5de9a76..11e4911 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php
@@ -11,7 +11,6 @@
 use Drupal\Core\Entity\Annotation\FieldType;
 use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
 use Drupal\field\FieldInterface;
-use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemInterface;
 
 /**
  * Plugin implementation of the 'file' field type.
@@ -36,7 +35,7 @@
  *   list_class = "\Drupal\file\Plugin\field\field_type\FileField"
  * )
  */
-class FileItem extends EntityReferenceItem implements ConfigFieldItemInterface {
+class FileItem extends EntityReferenceItem {
 
   /**
    * Property definitions of the contained properties.
@@ -213,6 +212,13 @@ public function instanceSettingsForm(array $form, array &$form_state) {
   /**
    * {@inheritdoc}
    */
+  public function preSave() {
+    return;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function insert() {
     // @todo Move in FileField in https://drupal.org/node/2073033.
     $entity = $this->getRoot();
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/field_type/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/field_type/TaxonomyTermReferenceItem.php
new file mode 100644
index 0000000..a2bdd38
--- /dev/null
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/field_type/TaxonomyTermReferenceItem.php
@@ -0,0 +1,184 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\taxonomy\Plugin\field\field_type\TaxonomyTermReferenceItem.
+ */
+
+namespace Drupal\taxonomy\Plugin\field\field_type;
+
+use Drupal\Core\Entity\Annotation\FieldType;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\FieldInterface;
+use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\TypedData\AllowedValuesInterface;
+
+/**
+ *  Plugin implementation of the 'term_reference' field type.
+ *
+ * @FieldType(
+ *   id = "taxonomy_term_reference",
+ *   label = @Translation("Term Reference"),
+ *   description = @Translation("This field stores a reference to a taxonomy term."),
+ *   settings = {
+ *     "options_list_callback" = NULL,
+ *     "allowed_values" = {
+ *       {
+ *         "vocabulary" = "",
+ *         "parent" = "0"
+ *       }
+ *     }
+ *   },
+ *   instance_settings = { },
+ *   default_widget = "options_select",
+ *   default_formatter = "taxonomy_term_reference_link"
+ * )
+ */
+class TaxonomyTermReferenceItem extends EntityReferenceItem implements AllowedValuesInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPossibleValues(AccountInterface $account = NULL) {
+    // Flatten options firstly, because Possible Options may contain group
+    // arrays.
+    $flatten_options = $this->flattenOptions($this->getPossibleOptions($account));
+    return array_keys($flatten_options);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPossibleOptions(AccountInterface $account = NULL) {
+    return $this->getSettableOptions($account);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSettableValues(AccountInterface $account = NULL) {
+   // Flatten options firstly, because Settable Options may contain group
+   // arrays.
+    $flatten_options = $this->flattenOptions($this->getSettableOptions($account));
+    return array_keys($flatten_options);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSettableOptions(AccountInterface $account = NULL) {
+    $instance = $this->getFieldDefinition();
+    $entity = $this->getParent()->getParent();
+    $function = $this->getFieldSetting('options_list_callback') ?: 'taxonomy_allowed_values';
+    return $function($instance, $entity);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPropertyDefinitions() {
+    $this->definition['settings']['target_type'] = 'taxonomy_term';
+    return parent::getPropertyDefinitions();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, array &$form_state, $has_data) {
+    // Get proper values for 'allowed_values_function', which is a core setting.
+    $vocabularies = entity_load_multiple('taxonomy_vocabulary');
+    $options = array();
+    foreach ($vocabularies as $vocabulary) {
+      $options[$vocabulary->id()] = $vocabulary->name;
+    }
+
+    $settings = $this->getFieldSettings();
+    $element = array();
+    $element['#tree'] = TRUE;
+
+    foreach ($settings['allowed_values'] as $delta => $tree) {
+      $element['allowed_values'][$delta]['vocabulary'] = array(
+        '#type' => 'select',
+        '#title' => t('Vocabulary'),
+        '#default_value' => $tree['vocabulary'],
+        '#options' => $options,
+        '#required' => TRUE,
+        '#description' => t('The vocabulary which supplies the options for this field.'),
+        '#disabled' => $has_data,
+      );
+      $element['allowed_values'][$delta]['parent'] = array(
+        '#type' => 'value',
+        '#value' => $tree['parent'],
+      );
+    }
+
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldInterface $field) {
+    return array(
+      'columns' => array(
+        'target_id' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => FALSE,
+        ),
+      ),
+      'indexes' => array(
+        'target_id' => array('target_id'),
+      ),
+      'foreign keys' => array(
+        'target_id' => array(
+          'table' => 'taxonomy_term_data',
+          'columns' => array('target_id' => 'tid'),
+        ),
+      ),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Taxonomy field settings allow for either a single vocabulary ID, multiple
+   * vocabulary IDs, or sub-trees of a vocabulary to be specified as allowed
+   * values, although only the first of these is supported via the field UI.
+   * Confirm that terms entered as values meet at least one of these conditions.
+   */
+  public function getConstraints() {
+    $constraint_manager = \Drupal::typedData()->getValidationConstraintManager();
+    $constraints = parent::getConstraints();
+
+    $target_id = $this->get('target_id')->getValue();
+    $instance = $this->getFieldDefinition();
+    if (!empty($target_id) && $target_id != 'autocreate') {
+      $constraints[] = $constraint_manager->create('ComplexData', array(
+        'target_id' => array(
+           'AllowedValues' => array(
+             'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
+           ),
+        ),
+      ));
+    }
+    return $constraints;
+  }
+
+  /**
+  * Flattens an array of allowed values.
+  *
+  * @param array $array
+  *   A single or multidimensional array.
+  *
+  * @return array
+  *   The flattened array.
+  */
+  protected function flattenOptions(array $array) {
+    $result = array();
+    array_walk_recursive($array, function($a, $b) use (&$result) { $result[$b] = $a; });
+    return $result;
+  }
+
+}
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
deleted file mode 100644
index 21c210b..0000000
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\taxonomy\Type\TaxonomyTermReferenceItem.
- */
-
-namespace Drupal\taxonomy\Type;
-
-use Drupal\field\Plugin\Type\FieldType\ConfigEntityReferenceItemBase;
-
-/**
- * Defines the 'taxonomy_term_reference' entity field item.
- */
-class TaxonomyTermReferenceItem extends ConfigEntityReferenceItemBase {
-
-  /**
-   * Property definitions of the contained properties.
-   *
-   * @see TaxonomyTermReferenceItem::getPropertyDefinitions()
-   *
-   * @var array
-   */
-  static $propertyDefinitions;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPropertyDefinitions() {
-    $this->definition['settings']['target_type'] = 'taxonomy_term';
-    return parent::getPropertyDefinitions();
-  }
-
-}
diff --git a/core/modules/taxonomy/taxonomy.install b/core/modules/taxonomy/taxonomy.install
index 7648ba0..429b029 100644
--- a/core/modules/taxonomy/taxonomy.install
+++ b/core/modules/taxonomy/taxonomy.install
@@ -182,30 +182,6 @@ function taxonomy_schema() {
 }
 
 /**
- * Implements hook_field_schema().
- */
-function taxonomy_field_schema($field) {
-  return array(
-    'columns' => array(
-      'target_id' => array(
-        'type' => 'int',
-        'unsigned' => TRUE,
-        'not null' => FALSE,
-      ),
-    ),
-    'indexes' => array(
-      'target_id' => array('target_id'),
-    ),
-    'foreign keys' => array(
-      'target_id' => array(
-        'table' => 'taxonomy_term_data',
-        'columns' => array('target_id' => 'tid'),
-      ),
-    ),
-  );
-}
-
-/**
  * Implements hook_update_dependencies().
  */
 function taxonomy_update_dependencies() {
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 0827bef..4ca5676 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -858,38 +858,6 @@ function taxonomy_implode_tags($tags, $vid = NULL) {
 }
 
 /**
- * Implements hook_field_info().
- *
- * Field settings:
- * - allowed_values: a list array of one or more vocabulary trees:
- *   - vocabulary: a vocabulary machine name.
- *   - parent: a term ID of a term whose children are allowed. This should be
- *     '0' if all terms in a vocabulary are allowed. The allowed values do not
- *     include the parent term.
- *
- */
-function taxonomy_field_info() {
-  return array(
-    'taxonomy_term_reference' => array(
-      'label' => t('Term reference'),
-      'description' => t('This field stores a reference to a taxonomy term.'),
-      'default_widget' => 'options_select',
-      'default_formatter' => 'taxonomy_term_reference_link',
-      'class' => 'Drupal\taxonomy\Type\TaxonomyTermReferenceItem',
-      'settings' => array(
-        'options_list_callback' => NULL,
-        'allowed_values' => array(
-          array(
-            'vocabulary' => '',
-            'parent' => '0',
-          ),
-        ),
-      ),
-    ),
-  );
-}
-
-/**
  * Implements hook_field_widget_info_alter().
  */
 function taxonomy_field_widget_info_alter(&$info) {
@@ -898,80 +866,6 @@ function taxonomy_field_widget_info_alter(&$info) {
 }
 
 /**
- * Implements hook_options_list().
- */
-function taxonomy_options_list(FieldDefinitionInterface $field_definition, EntityInterface $entity) {
-  $function = $field_definition->getFieldSetting('options_list_callback') ?: 'taxonomy_allowed_values';
-  return $function($field_definition, $entity);
-}
-
-/**
- * Implements hook_field_validate().
- *
- * Taxonomy field settings allow for either a single vocabulary ID, multiple
- * vocabulary IDs, or sub-trees of a vocabulary to be specified as allowed
- * values, although only the first of these is supported via the field UI.
- * Confirm that terms entered as values meet at least one of these conditions.
- *
- * Possible error codes:
- * - 'taxonomy_term_illegal_value': The value is not part of the list of allowed values.
- */
-function taxonomy_field_validate(EntityInterface $entity = NULL, $field, $instance, $langcode, $items, &$errors) {
-  // Build an array of existing term IDs so they can be loaded with
-  // entity_load_multiple('taxonomy_term');
-  foreach ($items as $delta => $item) {
-    if (!empty($item['target_id']) && $item['target_id'] != 'autocreate') {
-      $tids[] = $item['target_id'];
-    }
-  }
-  if (!empty($tids)) {
-    $terms = entity_load_multiple('taxonomy_term', $tids);
-
-    // Check each existing item to ensure it can be found in the
-    // allowed values for this field.
-    foreach ($items as $delta => $item) {
-      $validate = TRUE;
-      if (!empty($item['target_id']) && $item['target_id'] != 'autocreate') {
-        $validate = FALSE;
-        foreach ($field['settings']['allowed_values'] as $settings) {
-          // If no parent is specified, check if the term is in the vocabulary.
-          if (isset($settings['vocabulary']) && empty($settings['parent'])) {
-            if ($settings['vocabulary'] == $terms[$item['target_id']]->bundle()) {
-              $validate = TRUE;
-              break;
-            }
-          }
-          // If a parent is specified, then to validate it must appear in the
-          // array returned by taxonomy_term_load_parents_all().
-          elseif (!empty($settings['parent'])) {
-            $ancestors = taxonomy_term_load_parents_all($item['target_id']);
-            foreach ($ancestors as $ancestor) {
-              if ($ancestor->id() == $settings['parent']) {
-                $validate = TRUE;
-                break 2;
-              }
-            }
-          }
-        }
-      }
-      if (!$validate) {
-        $errors[$field['field_name']][$langcode][$delta][] = array(
-          'error' => 'taxonomy_term_reference_illegal_value',
-          'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
-        );
-      }
-    }
-  }
-}
-
-/**
- * Implements hook_field_is_empty().
- */
-function taxonomy_field_is_empty($item, $field_type) {
-  return !is_array($item) || (empty($item['target_id']) && empty($item['entity']));
-}
-
-/**
  * Returns the set of valid terms for a taxonomy field.
  *
  * @param \Drupal\Core\Entity\Field\FieldDefinitionInterface $field_definition
@@ -1023,39 +917,6 @@ function taxonomy_autocomplete_validate($element, &$form_state) {
 }
 
 /**
- * Implements hook_field_settings_form().
- */
-function taxonomy_field_settings_form($field, $instance) {
-  // Get proper values for 'allowed_values_function', which is a core setting.
-  $vocabularies = entity_load_multiple('taxonomy_vocabulary');
-  $options = array();
-  foreach ($vocabularies as $vocabulary) {
-    $options[$vocabulary->id()] = $vocabulary->name;
-  }
-  $form['allowed_values'] = array(
-    '#tree' => TRUE,
-  );
-
-  foreach ($field['settings']['allowed_values'] as $delta => $tree) {
-    $form['allowed_values'][$delta]['vocabulary'] = array(
-      '#type' => 'select',
-      '#title' => t('Vocabulary'),
-      '#default_value' => $tree['vocabulary'],
-      '#options' => $options,
-      '#required' => TRUE,
-      '#description' => t('The vocabulary which supplies the options for this field.'),
-      '#disabled' => $field->hasData(),
-    );
-    $form['allowed_values'][$delta]['parent'] = array(
-      '#type' => 'value',
-      '#value' => $tree['parent'],
-    );
-  }
-
-  return $form;
-}
-
-/**
  * @defgroup taxonomy_index Taxonomy indexing
  * @{
  * Functions to maintain taxonomy indexing.
@@ -1074,20 +935,6 @@ function taxonomy_field_settings_form($field, $instance) {
  */
 
 /**
- * Implements hook_field_presave().
- *
- * Create any new terms defined in a freetagging vocabulary.
- */
-function taxonomy_field_presave(EntityInterface $entity, $field, $instance, $langcode, &$items) {
-  foreach ($items as $delta => $item) {
-    if (!$item['target_id'] && isset($item['target_id'])) {
-      $item['entity']->save();
-      $items[$delta]['target_id'] = $item['entity']->id();
-    }
-  }
-}
-
-/**
  * Implements hook_node_insert().
  */
 function taxonomy_node_insert(EntityInterface $node) {
