diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index f07936c..d555ee5 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -44,11 +44,11 @@ public function initTranslation($langcode);
   /**
    * Provides base field definitions for an entity type.
    *
-   * Implementations typically use the class \Drupal\Core\Field\FieldDefinition
+   * Implementations typically use the class \Drupal\Core\Field\BaseFieldDefinition
    * for creating the field definitions; for example a 'name' field could be
    * defined as the following:
    * @code
-   * $fields['name'] = FieldDefinition::create('string')
+   * $fields['name'] = BaseFieldDefinition::create('string')
    *   ->setLabel(t('Name'));
    * @endcode
    *
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index c827494..7b56b68 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -11,7 +11,7 @@
 use Drupal\Component\Plugin\Exception\PluginNotFoundException;
 use Drupal\Component\Utility\String;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
@@ -76,7 +76,7 @@ class EntityManager extends DefaultPluginManager implements EntityManagerInterfa
    * Static cache of field storage definitions per entity type.
    *
    * Elements of the array:
-   *  - $entity_type_id: \Drupal\Core\Field\FieldDefinition[]
+   *  - $entity_type_id: \Drupal\Core\Field\BaseFieldDefinition[]
    *
    * @var array
    */
@@ -382,7 +382,7 @@ protected function buildBaseFieldDefinitions($entity_type_id) {
     foreach ($base_field_definitions as $definition) {
       // @todo Remove this check once FieldDefinitionInterface exposes a proper
       //  provider setter. See https://drupal.org/node/2225961.
-      if ($definition instanceof FieldDefinition) {
+      if ($definition instanceof BaseFieldDefinition) {
         $definition->setProvider($provider);
       }
     }
@@ -396,7 +396,7 @@ protected function buildBaseFieldDefinitions($entity_type_id) {
         foreach ($module_definitions as $field_name => $definition) {
           // @todo Remove this check once FieldDefinitionInterface exposes a
           //  proper provider setter. See https://drupal.org/node/2225961.
-          if ($definition instanceof FieldDefinition && $definition->getProvider() == NULL) {
+          if ($definition instanceof BaseFieldDefinition && $definition->getProvider() == NULL) {
             $definition->setProvider($module);
           }
           $base_field_definitions[$field_name] = $definition;
@@ -407,7 +407,7 @@ protected function buildBaseFieldDefinitions($entity_type_id) {
     // Automatically set the field name, target entity type and bundle
     // for non-configurable fields.
     foreach ($base_field_definitions as $field_name => $base_field_definition) {
-      if ($base_field_definition instanceof FieldDefinition) {
+      if ($base_field_definition instanceof BaseFieldDefinition) {
         $base_field_definition->setName($field_name);
         $base_field_definition->setTargetEntityTypeId($entity_type_id);
         $base_field_definition->setBundle(NULL);
@@ -481,7 +481,7 @@ protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $
     foreach ($bundle_field_definitions as $definition) {
       // @todo Remove this check once FieldDefinitionInterface exposes a proper
       //  provider setter. See https://drupal.org/node/2225961.
-      if ($definition instanceof FieldDefinition) {
+      if ($definition instanceof BaseFieldDefinition) {
         $definition->setProvider($provider);
       }
     }
@@ -495,7 +495,7 @@ protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $
         foreach ($module_definitions as $field_name => $definition) {
           // @todo Remove this check once FieldDefinitionInterface exposes a
           //  proper provider setter. See https://drupal.org/node/2225961.
-          if ($definition instanceof FieldDefinition) {
+          if ($definition instanceof BaseFieldDefinition) {
             $definition->setProvider($module);
           }
           $bundle_field_definitions[$field_name] = $definition;
@@ -506,7 +506,7 @@ protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $
     // Automatically set the field name, target entity type and bundle
     // for non-configurable fields.
     foreach ($bundle_field_definitions as $field_name => $field_definition) {
-      if ($field_definition instanceof FieldDefinition) {
+      if ($field_definition instanceof BaseFieldDefinition) {
         $field_definition->setName($field_name);
         $field_definition->setTargetEntityTypeId($entity_type_id);
         $field_definition->setBundle($bundle);
@@ -617,7 +617,7 @@ protected function buildFieldStorageDefinitions($entity_type_id) {
         foreach ($module_definitions as $field_name => $definition) {
           // @todo Remove this check once FieldDefinitionInterface exposes a
           //  proper provider setter. See https://drupal.org/node/2225961.
-          if ($definition instanceof FieldDefinition) {
+          if ($definition instanceof BaseFieldDefinition) {
             $definition->setProvider($module);
           }
           $field_definitions[$field_name] = $definition;
diff --git a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
new file mode 100644
index 0000000..755f2ca
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
@@ -0,0 +1,635 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Field\BaseFieldDefinition.
+ */
+
+namespace Drupal\Core\Field;
+
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Field\TypedData\FieldItemDataDefinition;
+use Drupal\Core\TypedData\ListDataDefinition;
+use Drupal\field\FieldException;
+
+/**
+ * A class for defining entity fields.
+ */
+class BaseFieldDefinition extends ListDataDefinition implements FieldDefinitionInterface, FieldStorageDefinitionInterface {
+
+  /**
+   * The field type.
+   *
+   * @var string
+   */
+  protected $type;
+
+  /**
+   * An array of field property definitions.
+   *
+   * @var \Drupal\Core\TypedData\DataDefinitionInterface[]
+   *
+   * @see \Drupal\Core\TypedData\ComplexDataDefinitionInterface::getPropertyDefinitions()
+   */
+  protected $propertyDefinitions;
+
+  /**
+   * The field schema.
+   *
+   * @var array
+   */
+  protected $schema;
+
+  /**
+   * @var array
+   */
+  protected $indexes = array();
+
+  /**
+   * Creates a new field definition.
+   *
+   * @param string $type
+   *   The type of the field.
+   *
+   * @return static
+   *   A new field definition object.
+   */
+  public static function create($type) {
+    $field_definition = new static(array());
+    $field_definition->type = $type;
+    $field_definition->itemDefinition = FieldItemDataDefinition::create($field_definition);
+    // Create a definition for the items, and initialize it with the default
+    // settings for the field type.
+    // @todo Cleanup in https://drupal.org/node/2116341.
+    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
+    $default_settings = $field_type_manager->getDefaultSettings($type) + $field_type_manager->getDefaultInstanceSettings($type);
+    $field_definition->itemDefinition->setSettings($default_settings);
+    return $field_definition;
+  }
+
+  /**
+   * Creates a new field definition based upon a field storage definition.
+   *
+   * In cases where one needs a field storage definitions to act like full
+   * field definitions, this creates a new field definition based upon the
+   * (limited) information available. That way it is possible to use the field
+   * definition in places where a full field definition is required; e.g., with
+   * widgets or formatters.
+   *
+   * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $definition
+   *   The field storage definition to base the new field definition upon.
+   *
+   * @return $this
+   */
+  public static function createFromFieldStorageDefinition(FieldStorageDefinitionInterface $definition) {
+    return static::create($definition->getType())
+      ->setCardinality($definition->getCardinality())
+      ->setConstraints($definition->getConstraints())
+      ->setCustomStorage($definition->hasCustomStorage())
+      ->setDescription($definition->getDescription())
+      ->setLabel($definition->getLabel())
+      ->setName($definition->getName())
+      ->setProvider($definition->getProvider())
+      ->setQueryable($definition->isQueryable())
+      ->setRequired($definition->isRequired())
+      ->setRevisionable($definition->isRevisionable())
+      ->setSettings($definition->getSettings())
+      ->setTargetEntityTypeId($definition->getTargetEntityTypeId())
+      ->setTranslatable($definition->isTranslatable());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createFromItemType($item_type) {
+    // The data type of a field item is in the form of "field_item:$field_type".
+    $parts = explode(':', $item_type, 2);
+    return static::create($parts[1]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getName() {
+    return $this->definition['field_name'];
+  }
+
+  /**
+   * Sets the field name.
+   *
+   * @param string $name
+   *   The field name to set.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setName($name) {
+    $this->definition['field_name'] = $name;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getType() {
+    return $this->type;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSettings() {
+    return $this->getItemDefinition()->getSettings();
+  }
+
+  /**
+   * Sets field settings.
+   *
+   * @param array $settings
+   *   The value to set.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setSettings(array $settings) {
+    $this->getItemDefinition()->setSettings($settings);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSetting($setting_name) {
+    return $this->getItemDefinition()->getSetting($setting_name);
+  }
+
+  /**
+   * Sets a field setting.
+   *
+   * @param string $setting_name
+   *   The field setting to set.
+   * @param mixed $value
+   *   The value to set.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setSetting($setting_name, $value) {
+    $this->getItemDefinition()->setSetting($setting_name, $value);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getProvider() {
+    return isset($this->definition['provider']) ? $this->definition['provider'] : NULL;
+  }
+
+  /**
+   * Sets the name of the provider of this field.
+   *
+   * @param string $provider
+   *   The provider name to set.
+   *
+   * @return $this
+   */
+  public function setProvider($provider) {
+    $this->definition['provider'] = $provider;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isTranslatable() {
+    return !empty($this->definition['translatable']);
+  }
+
+  /**
+   * Sets whether the field is translatable.
+   *
+   * @param bool $translatable
+   *   Whether the field is translatable.
+   *
+   * @return $this
+   *   The object itself for chaining.
+   */
+  public function setTranslatable($translatable) {
+    $this->definition['translatable'] = $translatable;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isRevisionable() {
+    return !empty($this->definition['revisionable']);
+  }
+
+  /**
+   * Sets whether the field is revisionable.
+   *
+   * @param bool $revisionable
+   *   Whether the field is revisionable.
+   *
+   * @return $this
+   *   The object itself for chaining.
+   */
+  public function setRevisionable($revisionable) {
+    $this->definition['revisionable'] = $revisionable;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCardinality() {
+    // @todo: Allow to control this.
+    return isset($this->definition['cardinality']) ? $this->definition['cardinality'] : 1;
+  }
+
+  /**
+   * Sets the maximum number of items allowed for the field.
+   *
+   * Possible values are positive integers or
+   * FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED.
+   *
+   * @param int $cardinality
+   *  The field cardinality.
+   *
+   * @return $this
+   */
+  public function setCardinality($cardinality) {
+    $this->definition['cardinality'] = $cardinality;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isMultiple() {
+    $cardinality = $this->getCardinality();
+    return ($cardinality == static::CARDINALITY_UNLIMITED) || ($cardinality > 1);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isQueryable() {
+    return isset($this->definition['queryable']) ? $this->definition['queryable'] : !$this->isComputed();
+  }
+
+  /**
+   * Sets whether the field is queryable.
+   *
+   * @param bool $queryable
+   *   Whether the field is queryable.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setQueryable($queryable) {
+    $this->definition['queryable'] = $queryable;
+    return $this;
+  }
+
+  /**
+   * Sets constraints for a given field item property.
+   *
+   * @param string $name
+   *   The name of the property to set constraints for.
+   * @param array $constraints
+   *   The constraints to set.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setPropertyConstraints($name, array $constraints) {
+    $item_constraints = $this->getItemDefinition()->getConstraints();
+    $item_constraints['ComplexData'][$name] = $constraints;
+    $this->getItemDefinition()->setConstraints($item_constraints);
+    return $this;
+  }
+
+  /**
+   * Sets the display options for the field in forms or rendered entities.
+   *
+   * This enables generic rendering of the field with widgets / formatters,
+   * including automated support for "In place editing", and with optional
+   * configurability in the "Manage display" / "Manage form display" UI screens.
+   *
+   * Unless this method is called, the field remains invisible (or requires
+   * ad-hoc rendering logic).
+   *
+   * @param string $display_context
+   *   The display context. Either 'view' or 'form'.
+   * @param array $options
+   *   An array of display options. Refer to
+   *   \Drupal\Core\Field\FieldDefinitionInterface::getDisplayOptions() for
+   *   a list of supported keys. The options should include at least a 'weight',
+   *   or specify 'type' = 'hidden'. The 'default_widget' / 'default_formatter'
+   *   for the field type will be used if no 'type' is specified.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setDisplayOptions($display_context, array $options) {
+    $this->definition['display'][$display_context]['options'] = $options;
+    return $this;
+  }
+
+  /**
+   * Sets whether the display for the field can be configured.
+   *
+   * @param string $display_context
+   *   The display context. Either 'view' or 'form'.
+   * @param bool $configurable
+   *   Whether the display options can be configured (e.g., via the "Manage
+   *   display" / "Manage form display" UI screens). If TRUE, the options
+   *   specified via getDisplayOptions() act as defaults.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setDisplayConfigurable($display_context, $configurable) {
+    // If no explicit display options have been specified, default to 'hidden'.
+    if (empty($this->definition['display'][$display_context])) {
+      $this->definition['display'][$display_context]['options'] = array('type' => 'hidden');
+    }
+    $this->definition['display'][$display_context]['configurable'] = $configurable;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDisplayOptions($display_context) {
+    return isset($this->definition['display'][$display_context]['options']) ? $this->definition['display'][$display_context]['options'] : NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isDisplayConfigurable($display_context) {
+    return isset($this->definition['display'][$display_context]['configurable']) ? $this->definition['display'][$display_context]['configurable'] : FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultValue(ContentEntityInterface $entity) {
+    // Allow custom default values function.
+    if (!empty($this->definition['default_value_callback'])) {
+      $value = call_user_func($this->definition['default_value_callback'], $entity, $this);
+    }
+    else {
+      $value = isset($this->definition['default_value']) ? $this->definition['default_value'] : NULL;
+    }
+    // Allow the field type to process default values.
+    $field_item_list_class = $this->getClass();
+    return $field_item_list_class::processDefaultValue($value, $entity, $this);
+  }
+
+  /**
+   * Sets a custom default value callback.
+   *
+   * If set, the callback overrides any set default value.
+   *
+   * @param callable|null $callback
+   *   The callback to invoke for getting the default value (pass NULL to unset
+   *   a previously set callback). The callback will be invoked with the
+   *   following arguments:
+   *   - \Drupal\Core\Entity\ContentEntityInterface $entity
+   *     The entity being created.
+   *   - \Drupal\Core\Field\FieldDefinitionInterface $definition
+   *     The field definition.
+   *   It should return the default value as documented by
+   *   \Drupal\Core\Field\FieldDefinitionInterface::getDefaultValue().
+   *
+   * @return $this
+   */
+  public function setDefaultValueCallback($callback) {
+    $this->definition['default_value_callback'] = $callback;
+    return $this;
+  }
+
+  /**
+   * Sets a default value.
+   *
+   * Note that if a default value callback is set, it will take precedence over
+   * any value set here.
+   *
+   * @param mixed $value
+   *   The default value in the format as returned by
+   *   \Drupal\Core\Field\FieldDefinitionInterface::getDefaultValue().
+   *
+   * @return $this
+   */
+  public function setDefaultValue($value) {
+    $this->definition['default_value'] = $value;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPropertyDefinition($name) {
+    if (!isset($this->propertyDefinitions)) {
+      $this->getPropertyDefinitions();
+    }
+    if (isset($this->propertyDefinitions[$name])) {
+      return $this->propertyDefinitions[$name];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPropertyDefinitions() {
+    if (!isset($this->propertyDefinitions)) {
+      $class = $this->getFieldItemClass();
+      $this->propertyDefinitions = $class::propertyDefinitions($this);
+    }
+    return $this->propertyDefinitions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPropertyNames() {
+    return array_keys($this->getPropertyDefinitions());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getMainPropertyName() {
+    $class = $this->getFieldItemClass();
+    return $class::mainPropertyName();
+  }
+
+  /**
+   * Helper to retrieve the field item class.
+   *
+   * @todo: Remove once getClass() adds in defaults. See
+   * https://drupal.org/node/2116341.
+   */
+  protected function getFieldItemClass() {
+    if ($class = $this->getItemDefinition()->getClass()) {
+      return $class;
+    }
+    else {
+      $type_definition = \Drupal::typedDataManager()
+        ->getDefinition($this->getItemDefinition()->getDataType());
+      return $type_definition['class'];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __sleep() {
+    // Do not serialize the statically cached property definitions.
+    $vars = get_object_vars($this);
+    unset($vars['propertyDefinitions']);
+    return array_keys($vars);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTargetEntityTypeId() {
+    return isset($this->definition['entity_type']) ? $this->definition['entity_type'] : NULL;
+  }
+
+  /**
+   * Sets the ID of the type of the entity this field is attached to.
+   *
+   * @param string $entity_type_id
+   *   The name of the target entity type to set.
+   *
+   * @return $this
+   */
+  public function setTargetEntityTypeId($entity_type_id) {
+    $this->definition['entity_type'] = $entity_type_id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBundle() {
+    return isset($this->definition['bundle']) ? $this->definition['bundle'] : NULL;
+  }
+
+  /**
+   * Sets the bundle this field is defined for.
+   *
+   * @param string|null $bundle
+   *   The bundle, or NULL if the field is not bundle-specific.
+   *
+   * @return $this
+   */
+  public function setBundle($bundle) {
+    $this->definition['bundle'] = $bundle;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSchema() {
+    if (!isset($this->schema)) {
+      // Get the schema from the field item class.
+      $definition = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->getType());
+      $class = $definition['class'];
+      $schema = $class::schema($this);
+      // Fill in default values.
+      $schema += array(
+        'columns' => array(),
+        'unique keys' => array(),
+        'indexes' => array(),
+        'foreign keys' => array(),
+      );
+
+      // Check that the schema does not include forbidden column names.
+      if (array_intersect(array_keys($schema['columns']), static::getReservedColumns())) {
+        throw new FieldException('Illegal field type columns.');
+      }
+
+      // Merge custom indexes with those specified by the field type. Custom
+      // indexes prevail.
+      $schema['indexes'] = $this->indexes + $schema['indexes'];
+
+      $this->schema = $schema;
+    }
+
+    return $this->schema;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getColumns() {
+    $schema = $this->getSchema();
+    // A typical use case for the method is to iterate on the columns, while
+    // some other use cases rely on identifying the first column with the key()
+    // function. Since the schema is persisted in the Field object, we take care
+    // of resetting the array pointer so that the former does not interfere with
+    // the latter.
+    reset($schema['columns']);
+    return $schema['columns'];
+  }
+
+  /**
+   * A list of columns that can not be used as field type columns.
+   *
+   * @return array
+   */
+  public static function getReservedColumns() {
+    return array('deleted');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasCustomStorage() {
+    return !empty($this->definition['custom_storage']) || $this->isComputed();
+  }
+
+  /**
+   * Sets the storage behavior for this field.
+   *
+   * @param bool $custom_storage
+   *   Pass FALSE if the storage takes care of storing the field,
+   *   TRUE otherwise.
+   *
+   * @return $this
+   *
+   * @throws \LogicException
+   *   Thrown if custom storage is to be set to FALSE for a computed field.
+   */
+  public function setCustomStorage($custom_storage) {
+    if (!$custom_storage && $this->isComputed()) {
+      throw new \LogicException("Entity storage cannot store a computed field.");
+    }
+    $this->definition['custom_storage'] = $custom_storage;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFieldStorageDefinition() {
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getUniqueStorageIdentifier() {
+    return $this->getTargetEntityTypeId() . '-' . $this->getName();
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Field/FieldDefinition.php b/core/lib/Drupal/Core/Field/FieldDefinition.php
deleted file mode 100644
index 1c3496a..0000000
--- a/core/lib/Drupal/Core/Field/FieldDefinition.php
+++ /dev/null
@@ -1,635 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Field\FieldDefinition.
- */
-
-namespace Drupal\Core\Field;
-
-use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Field\TypedData\FieldItemDataDefinition;
-use Drupal\Core\TypedData\ListDataDefinition;
-use Drupal\field\FieldException;
-
-/**
- * A class for defining entity fields.
- */
-class FieldDefinition extends ListDataDefinition implements FieldDefinitionInterface, FieldStorageDefinitionInterface {
-
-  /**
-   * The field type.
-   *
-   * @var string
-   */
-  protected $type;
-
-  /**
-   * An array of field property definitions.
-   *
-   * @var \Drupal\Core\TypedData\DataDefinitionInterface[]
-   *
-   * @see \Drupal\Core\TypedData\ComplexDataDefinitionInterface::getPropertyDefinitions()
-   */
-  protected $propertyDefinitions;
-
-  /**
-   * The field schema.
-   *
-   * @var array
-   */
-  protected $schema;
-
-  /**
-   * @var array
-   */
-  protected $indexes = array();
-
-  /**
-   * Creates a new field definition.
-   *
-   * @param string $type
-   *   The type of the field.
-   *
-   * @return static
-   *   A new field definition object.
-   */
-  public static function create($type) {
-    $field_definition = new static(array());
-    $field_definition->type = $type;
-    $field_definition->itemDefinition = FieldItemDataDefinition::create($field_definition);
-    // Create a definition for the items, and initialize it with the default
-    // settings for the field type.
-    // @todo Cleanup in https://drupal.org/node/2116341.
-    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
-    $default_settings = $field_type_manager->getDefaultSettings($type) + $field_type_manager->getDefaultInstanceSettings($type);
-    $field_definition->itemDefinition->setSettings($default_settings);
-    return $field_definition;
-  }
-
-  /**
-   * Creates a new field definition based upon a field storage definition.
-   *
-   * In cases where one needs a field storage definitions to act like full
-   * field definitions, this creates a new field definition based upon the
-   * (limited) information available. That way it is possible to use the field
-   * definition in places where a full field definition is required; e.g., with
-   * widgets or formatters.
-   *
-   * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $definition
-   *   The field storage definition to base the new field definition upon.
-   *
-   * @return $this
-   */
-  public static function createFromFieldStorageDefinition(FieldStorageDefinitionInterface $definition) {
-    return static::create($definition->getType())
-      ->setCardinality($definition->getCardinality())
-      ->setConstraints($definition->getConstraints())
-      ->setCustomStorage($definition->hasCustomStorage())
-      ->setDescription($definition->getDescription())
-      ->setLabel($definition->getLabel())
-      ->setName($definition->getName())
-      ->setProvider($definition->getProvider())
-      ->setQueryable($definition->isQueryable())
-      ->setRequired($definition->isRequired())
-      ->setRevisionable($definition->isRevisionable())
-      ->setSettings($definition->getSettings())
-      ->setTargetEntityTypeId($definition->getTargetEntityTypeId())
-      ->setTranslatable($definition->isTranslatable());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function createFromItemType($item_type) {
-    // The data type of a field item is in the form of "field_item:$field_type".
-    $parts = explode(':', $item_type, 2);
-    return static::create($parts[1]);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getName() {
-    return $this->definition['field_name'];
-  }
-
-  /**
-   * Sets the field name.
-   *
-   * @param string $name
-   *   The field name to set.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setName($name) {
-    $this->definition['field_name'] = $name;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getType() {
-    return $this->type;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getSettings() {
-    return $this->getItemDefinition()->getSettings();
-  }
-
-  /**
-   * Sets field settings.
-   *
-   * @param array $settings
-   *   The value to set.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setSettings(array $settings) {
-    $this->getItemDefinition()->setSettings($settings);
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getSetting($setting_name) {
-    return $this->getItemDefinition()->getSetting($setting_name);
-  }
-
-  /**
-   * Sets a field setting.
-   *
-   * @param string $setting_name
-   *   The field setting to set.
-   * @param mixed $value
-   *   The value to set.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setSetting($setting_name, $value) {
-    $this->getItemDefinition()->setSetting($setting_name, $value);
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getProvider() {
-    return isset($this->definition['provider']) ? $this->definition['provider'] : NULL;
-  }
-
-  /**
-   * Sets the name of the provider of this field.
-   *
-   * @param string $provider
-   *   The provider name to set.
-   *
-   * @return $this
-   */
-  public function setProvider($provider) {
-    $this->definition['provider'] = $provider;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isTranslatable() {
-    return !empty($this->definition['translatable']);
-  }
-
-  /**
-   * Sets whether the field is translatable.
-   *
-   * @param bool $translatable
-   *   Whether the field is translatable.
-   *
-   * @return $this
-   *   The object itself for chaining.
-   */
-  public function setTranslatable($translatable) {
-    $this->definition['translatable'] = $translatable;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isRevisionable() {
-    return !empty($this->definition['revisionable']);
-  }
-
-  /**
-   * Sets whether the field is revisionable.
-   *
-   * @param bool $revisionable
-   *   Whether the field is revisionable.
-   *
-   * @return $this
-   *   The object itself for chaining.
-   */
-  public function setRevisionable($revisionable) {
-    $this->definition['revisionable'] = $revisionable;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCardinality() {
-    // @todo: Allow to control this.
-    return isset($this->definition['cardinality']) ? $this->definition['cardinality'] : 1;
-  }
-
-  /**
-   * Sets the maximum number of items allowed for the field.
-   *
-   * Possible values are positive integers or
-   * FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED.
-   *
-   * @param int $cardinality
-   *  The field cardinality.
-   *
-   * @return $this
-   */
-  public function setCardinality($cardinality) {
-    $this->definition['cardinality'] = $cardinality;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isMultiple() {
-    $cardinality = $this->getCardinality();
-    return ($cardinality == static::CARDINALITY_UNLIMITED) || ($cardinality > 1);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isQueryable() {
-    return isset($this->definition['queryable']) ? $this->definition['queryable'] : !$this->isComputed();
-  }
-
-  /**
-   * Sets whether the field is queryable.
-   *
-   * @param bool $queryable
-   *   Whether the field is queryable.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setQueryable($queryable) {
-    $this->definition['queryable'] = $queryable;
-    return $this;
-  }
-
-  /**
-   * Sets constraints for a given field item property.
-   *
-   * @param string $name
-   *   The name of the property to set constraints for.
-   * @param array $constraints
-   *   The constraints to set.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setPropertyConstraints($name, array $constraints) {
-    $item_constraints = $this->getItemDefinition()->getConstraints();
-    $item_constraints['ComplexData'][$name] = $constraints;
-    $this->getItemDefinition()->setConstraints($item_constraints);
-    return $this;
-  }
-
-  /**
-   * Sets the display options for the field in forms or rendered entities.
-   *
-   * This enables generic rendering of the field with widgets / formatters,
-   * including automated support for "In place editing", and with optional
-   * configurability in the "Manage display" / "Manage form display" UI screens.
-   *
-   * Unless this method is called, the field remains invisible (or requires
-   * ad-hoc rendering logic).
-   *
-   * @param string $display_context
-   *   The display context. Either 'view' or 'form'.
-   * @param array $options
-   *   An array of display options. Refer to
-   *   \Drupal\Core\Field\FieldDefinitionInterface::getDisplayOptions() for
-   *   a list of supported keys. The options should include at least a 'weight',
-   *   or specify 'type' = 'hidden'. The 'default_widget' / 'default_formatter'
-   *   for the field type will be used if no 'type' is specified.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setDisplayOptions($display_context, array $options) {
-    $this->definition['display'][$display_context]['options'] = $options;
-    return $this;
-  }
-
-  /**
-   * Sets whether the display for the field can be configured.
-   *
-   * @param string $display_context
-   *   The display context. Either 'view' or 'form'.
-   * @param bool $configurable
-   *   Whether the display options can be configured (e.g., via the "Manage
-   *   display" / "Manage form display" UI screens). If TRUE, the options
-   *   specified via getDisplayOptions() act as defaults.
-   *
-   * @return static
-   *   The object itself for chaining.
-   */
-  public function setDisplayConfigurable($display_context, $configurable) {
-    // If no explicit display options have been specified, default to 'hidden'.
-    if (empty($this->definition['display'][$display_context])) {
-      $this->definition['display'][$display_context]['options'] = array('type' => 'hidden');
-    }
-    $this->definition['display'][$display_context]['configurable'] = $configurable;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getDisplayOptions($display_context) {
-    return isset($this->definition['display'][$display_context]['options']) ? $this->definition['display'][$display_context]['options'] : NULL;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isDisplayConfigurable($display_context) {
-    return isset($this->definition['display'][$display_context]['configurable']) ? $this->definition['display'][$display_context]['configurable'] : FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getDefaultValue(ContentEntityInterface $entity) {
-    // Allow custom default values function.
-    if (!empty($this->definition['default_value_callback'])) {
-      $value = call_user_func($this->definition['default_value_callback'], $entity, $this);
-    }
-    else {
-      $value = isset($this->definition['default_value']) ? $this->definition['default_value'] : NULL;
-    }
-    // Allow the field type to process default values.
-    $field_item_list_class = $this->getClass();
-    return $field_item_list_class::processDefaultValue($value, $entity, $this);
-  }
-
-  /**
-   * Sets a custom default value callback.
-   *
-   * If set, the callback overrides any set default value.
-   *
-   * @param callable|null $callback
-   *   The callback to invoke for getting the default value (pass NULL to unset
-   *   a previously set callback). The callback will be invoked with the
-   *   following arguments:
-   *   - \Drupal\Core\Entity\ContentEntityInterface $entity
-   *     The entity being created.
-   *   - \Drupal\Core\Field\FieldDefinitionInterface $definition
-   *     The field definition.
-   *   It should return the default value as documented by
-   *   \Drupal\Core\Field\FieldDefinitionInterface::getDefaultValue().
-   *
-   * @return $this
-   */
-  public function setDefaultValueCallback($callback) {
-    $this->definition['default_value_callback'] = $callback;
-    return $this;
-  }
-
-  /**
-   * Sets a default value.
-   *
-   * Note that if a default value callback is set, it will take precedence over
-   * any value set here.
-   *
-   * @param mixed $value
-   *   The default value in the format as returned by
-   *   \Drupal\Core\Field\FieldDefinitionInterface::getDefaultValue().
-   *
-   * @return $this
-   */
-  public function setDefaultValue($value) {
-    $this->definition['default_value'] = $value;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPropertyDefinition($name) {
-    if (!isset($this->propertyDefinitions)) {
-      $this->getPropertyDefinitions();
-    }
-    if (isset($this->propertyDefinitions[$name])) {
-      return $this->propertyDefinitions[$name];
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPropertyDefinitions() {
-    if (!isset($this->propertyDefinitions)) {
-      $class = $this->getFieldItemClass();
-      $this->propertyDefinitions = $class::propertyDefinitions($this);
-    }
-    return $this->propertyDefinitions;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPropertyNames() {
-    return array_keys($this->getPropertyDefinitions());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getMainPropertyName() {
-    $class = $this->getFieldItemClass();
-    return $class::mainPropertyName();
-  }
-
-  /**
-   * Helper to retrieve the field item class.
-   *
-   * @todo: Remove once getClass() adds in defaults. See
-   * https://drupal.org/node/2116341.
-   */
-  protected function getFieldItemClass() {
-    if ($class = $this->getItemDefinition()->getClass()) {
-      return $class;
-    }
-    else {
-      $type_definition = \Drupal::typedDataManager()
-        ->getDefinition($this->getItemDefinition()->getDataType());
-      return $type_definition['class'];
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __sleep() {
-    // Do not serialize the statically cached property definitions.
-    $vars = get_object_vars($this);
-    unset($vars['propertyDefinitions']);
-    return array_keys($vars);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getTargetEntityTypeId() {
-    return isset($this->definition['entity_type']) ? $this->definition['entity_type'] : NULL;
-  }
-
-  /**
-   * Sets the ID of the type of the entity this field is attached to.
-   *
-   * @param string $entity_type_id
-   *   The name of the target entity type to set.
-   *
-   * @return $this
-   */
-  public function setTargetEntityTypeId($entity_type_id) {
-    $this->definition['entity_type'] = $entity_type_id;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getBundle() {
-    return isset($this->definition['bundle']) ? $this->definition['bundle'] : NULL;
-  }
-
-  /**
-   * Sets the bundle this field is defined for.
-   *
-   * @param string|null $bundle
-   *   The bundle, or NULL if the field is not bundle-specific.
-   *
-   * @return $this
-   */
-  public function setBundle($bundle) {
-    $this->definition['bundle'] = $bundle;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getSchema() {
-    if (!isset($this->schema)) {
-      // Get the schema from the field item class.
-      $definition = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->getType());
-      $class = $definition['class'];
-      $schema = $class::schema($this);
-      // Fill in default values.
-      $schema += array(
-        'columns' => array(),
-        'unique keys' => array(),
-        'indexes' => array(),
-        'foreign keys' => array(),
-      );
-
-      // Check that the schema does not include forbidden column names.
-      if (array_intersect(array_keys($schema['columns']), static::getReservedColumns())) {
-        throw new FieldException('Illegal field type columns.');
-      }
-
-      // Merge custom indexes with those specified by the field type. Custom
-      // indexes prevail.
-      $schema['indexes'] = $this->indexes + $schema['indexes'];
-
-      $this->schema = $schema;
-    }
-
-    return $this->schema;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getColumns() {
-    $schema = $this->getSchema();
-    // A typical use case for the method is to iterate on the columns, while
-    // some other use cases rely on identifying the first column with the key()
-    // function. Since the schema is persisted in the Field object, we take care
-    // of resetting the array pointer so that the former does not interfere with
-    // the latter.
-    reset($schema['columns']);
-    return $schema['columns'];
-  }
-
-  /**
-   * A list of columns that can not be used as field type columns.
-   *
-   * @return array
-   */
-  public static function getReservedColumns() {
-    return array('deleted');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function hasCustomStorage() {
-    return !empty($this->definition['custom_storage']) || $this->isComputed();
-  }
-
-  /**
-   * Sets the storage behavior for this field.
-   *
-   * @param bool $custom_storage
-   *   Pass FALSE if the storage takes care of storing the field,
-   *   TRUE otherwise.
-   *
-   * @return $this
-   *
-   * @throws \LogicException
-   *   Thrown if custom storage is to be set to FALSE for a computed field.
-   */
-  public function setCustomStorage($custom_storage) {
-    if (!$custom_storage && $this->isComputed()) {
-      throw new \LogicException("Entity storage cannot store a computed field.");
-    }
-    $this->definition['custom_storage'] = $custom_storage;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFieldStorageDefinition() {
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getUniqueStorageIdentifier() {
-    return $this->getTargetEntityTypeId() . '-' . $this->getName();
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php b/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php
index cf6947b..3de440e 100644
--- a/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php
@@ -39,7 +39,7 @@
  * However, entity base fields, such as $node->title, are not managed by
  * field.module and its "field_storage_config"/"field_instance_config"
  * configuration entities. Therefore, their definitions are provided by
- * different objects based on the class \Drupal\Core\Field\FieldDefinition,
+ * different objects based on the class \Drupal\Core\Field\BaseFieldDefinition,
  * which implements this interface as well.
  *
  * Field definitions may fully define a concrete data object (e.g.,
diff --git a/core/lib/Drupal/Core/Field/FieldItemInterface.php b/core/lib/Drupal/Core/Field/FieldItemInterface.php
index b3a9269..8577a04 100644
--- a/core/lib/Drupal/Core/Field/FieldItemInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldItemInterface.php
@@ -32,7 +32,7 @@
    *   An array of property definitions of contained properties, keyed by
    *   property name.
    *
-   * @see \Drupal\Core\Field\FieldDefinition
+   * @see \Drupal\Core\Field\BaseFieldDefinition
    */
   public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition);
 
@@ -46,7 +46,7 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel
    * @return string|null
    *   The name of the value property, or NULL if there is none.
    *
-   * @see \Drupal\Core\Field\FieldDefinition
+   * @see \Drupal\Core\Field\BaseFieldDefinition
    */
   public static function mainPropertyName();
 
diff --git a/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php b/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
index 19d44e4..ef15e33 100644
--- a/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
+++ b/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
@@ -78,7 +78,7 @@ public function getDerivativeDefinition($derivative_id, $base_plugin_definition)
   public function getDerivativeDefinitions($base_plugin_definition) {
     foreach ($this->fieldTypePluginManager->getDefinitions() as $plugin_id => $definition) {
       $definition['definition_class'] = '\Drupal\Core\Field\TypedData\FieldItemDataDefinition';
-      $definition['list_definition_class'] = '\Drupal\Core\Field\FieldDefinition';
+      $definition['list_definition_class'] = '\Drupal\Core\Field\BaseFieldDefinition';
       $this->derivatives[$plugin_id] = $definition;
     }
     return $this->derivatives;
diff --git a/core/lib/Drupal/Core/Field/TypedData/FieldItemDataDefinition.php b/core/lib/Drupal/Core/Field/TypedData/FieldItemDataDefinition.php
index c18e987..7b85e8c 100644
--- a/core/lib/Drupal/Core/Field/TypedData/FieldItemDataDefinition.php
+++ b/core/lib/Drupal/Core/Field/TypedData/FieldItemDataDefinition.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\Field\TypedData;
 
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
 use Drupal\Core\TypedData\DataDefinition;
 
@@ -38,7 +38,7 @@ public static function createFromDataType($data_type) {
       throw new \InvalidArgumentException('Data type must be in the form of "field_item:FIELD_TYPE".');
     }
 
-    $field_definition = FieldDefinition::create($parts[1]);
+    $field_definition = BaseFieldDefinition::create($parts[1]);
     return $field_definition->getItemDefinition();
   }
 
diff --git a/core/modules/aggregator/src/Entity/Feed.php b/core/modules/aggregator/src/Entity/Feed.php
index a01a055..6362d2d 100644
--- a/core/modules/aggregator/src/Entity/Feed.php
+++ b/core/modules/aggregator/src/Entity/Feed.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Symfony\Component\DependencyInjection\Container;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\aggregator\FeedInterface;
@@ -127,18 +127,18 @@ public static function postDelete(EntityStorageInterface $storage, array $entiti
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['fid'] = FieldDefinition::create('integer')
+    $fields['fid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Feed ID'))
       ->setDescription(t('The ID of the aggregator feed.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The aggregator feed UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['title'] = FieldDefinition::create('string')
+    $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Title'))
       ->setDescription(t('The name of the feed (or the name of the website providing the feed).'))
       ->setRequired(TRUE)
@@ -148,11 +148,11 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => -5,
       ));
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The feed language code.'));
 
-    $fields['url'] = FieldDefinition::create('uri')
+    $fields['url'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('URL'))
       ->setDescription(t('The fully-qualified URL of the feed.'))
       ->setRequired(TRUE)
@@ -165,7 +165,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $period = array_map(array(\Drupal::service('date.formatter'), 'formatInterval'), array_combine($intervals, $intervals));
     $period[AGGREGATOR_CLEAR_NEVER] = t('Never');
 
-    $fields['refresh'] = FieldDefinition::create('list_integer')
+    $fields['refresh'] = BaseFieldDefinition::create('list_integer')
       ->setLabel(t('Update interval'))
       ->setDescription(t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))))
       ->setSetting('unsigned', TRUE)
@@ -176,39 +176,39 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => -2,
       ));
 
-    $fields['checked'] = FieldDefinition::create('timestamp')
+    $fields['checked'] = BaseFieldDefinition::create('timestamp')
       ->setLabel(t('Checked'))
       ->setDescription(t('Last time feed was checked for new items, as Unix timestamp.'))
       ->setDefaultValue(0);
 
-    $fields['queued'] = FieldDefinition::create('timestamp')
+    $fields['queued'] = BaseFieldDefinition::create('timestamp')
       ->setLabel(t('Queued'))
       ->setDescription(t('Time when this feed was queued for refresh, 0 if not queued.'))
       ->setDefaultValue(0);
 
-    $fields['link'] = FieldDefinition::create('uri')
+    $fields['link'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('Link'))
       ->setDescription(t('The link of the feed.'));
 
-    $fields['description'] = FieldDefinition::create('string_long')
+    $fields['description'] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('Description'))
       ->setDescription(t("The parent website's description that comes from the !description element in the feed.", array('!description' => '<description>')));
 
-    $fields['image'] = FieldDefinition::create('uri')
+    $fields['image'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('Image'))
       ->setDescription(t('An image representing the feed.'));
 
-    $fields['hash'] = FieldDefinition::create('string')
+    $fields['hash'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Hash'))
       ->setDescription(t('Calculated hash of the feed data, used for validating cache.'));
 
-    $fields['etag'] = FieldDefinition::create('string')
+    $fields['etag'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Etag'))
       ->setDescription(t('Entity tag HTTP response header, used for validating cache.'));
 
     // This is updated by the fetcher and not when the feed is saved, therefore
     // it's a timestamp and not a changed field.
-    $fields['modified'] = FieldDefinition::create('timestamp')
+    $fields['modified'] = BaseFieldDefinition::create('timestamp')
       ->setLabel(t('Modified'))
       ->setDescription(t('When the feed was last modified, as a Unix timestamp.'));
 
diff --git a/core/modules/aggregator/src/Entity/Item.php b/core/modules/aggregator/src/Entity/Item.php
index 84244b4..5d6670c 100644
--- a/core/modules/aggregator/src/Entity/Item.php
+++ b/core/modules/aggregator/src/Entity/Item.php
@@ -12,7 +12,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\aggregator\ItemInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Url;
 
 /**
@@ -49,43 +49,43 @@ public function label() {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['iid'] = FieldDefinition::create('integer')
+    $fields['iid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Aggregator item ID'))
       ->setDescription(t('The ID of the feed item.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['fid'] = FieldDefinition::create('entity_reference')
+    $fields['fid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Aggregator feed ID'))
       ->setDescription(t('The ID of the aggregator feed.'))
       ->setSetting('target_type', 'aggregator_feed');
 
-    $fields['title'] = FieldDefinition::create('string')
+    $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Title'))
       ->setDescription(t('The title of the feed item.'));
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The feed item language code.'));
 
-    $fields['link'] = FieldDefinition::create('uri')
+    $fields['link'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('Link'))
       ->setDescription(t('The link of the feed item.'));
 
-    $fields['author'] = FieldDefinition::create('string')
+    $fields['author'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Author'))
       ->setDescription(t('The author of the feed item.'));
 
-    $fields['description'] = FieldDefinition::create('string_long')
+    $fields['description'] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('Description'))
       ->setDescription(t('The body of the feed item.'));
 
-    $fields['timestamp'] = FieldDefinition::create('created')
+    $fields['timestamp'] = BaseFieldDefinition::create('created')
       ->setLabel(t('Posted timestamp'))
       ->setDescription(t('Posted date of the feed item, as a Unix timestamp.'));
 
     // @todo Convert to a real UUID field in https://drupal.org/node/2149851.
-    $fields['guid'] = FieldDefinition::create('string_long')
+    $fields['guid'] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('GUID'))
       ->setDescription(t('Unique identifier for the feed item.'));
 
diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php
index c825620..a7a991c 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\block_content\BlockContentInterface;
 
 /**
@@ -138,29 +138,29 @@ public function delete() {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['id'] = FieldDefinition::create('integer')
+    $fields['id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Custom block ID'))
       ->setDescription(t('The custom block ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The custom block UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['revision_id'] = FieldDefinition::create('integer')
+    $fields['revision_id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Revision ID'))
       ->setDescription(t('The revision ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The custom block language code.'))
       ->setRevisionable(TRUE);
 
-    $fields['info'] = FieldDefinition::create('string')
+    $fields['info'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Block description'))
       ->setDescription(t('A brief description of your block.'))
       ->setRevisionable(TRUE)
@@ -172,17 +172,17 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['type'] = FieldDefinition::create('entity_reference')
+    $fields['type'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Block type'))
       ->setDescription(t('The block type.'))
       ->setSetting('target_type', 'block_content_type');
 
-    $fields['revision_log'] = FieldDefinition::create('string_long')
+    $fields['revision_log'] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('Revision log message'))
       ->setDescription(t('The log entry explaining the changes in this revision.'))
       ->setRevisionable(TRUE);
 
-    $fields['changed'] = FieldDefinition::create('changed')
+    $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
       ->setDescription(t('The time that the custom block was last edited.'))
       ->setRevisionable(TRUE);
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index 3d3c42f..1bb7ef0 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -12,7 +12,7 @@
 use Drupal\comment\CommentInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\user\UserInterface;
 
@@ -198,32 +198,32 @@ public function permalink() {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['cid'] = FieldDefinition::create('integer')
+    $fields['cid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Comment ID'))
       ->setDescription(t('The comment ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The comment UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['pid'] = FieldDefinition::create('entity_reference')
+    $fields['pid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Parent ID'))
       ->setDescription(t('The parent comment ID if this is a reply to a comment.'))
       ->setSetting('target_type', 'comment');
 
-    $fields['entity_id'] = FieldDefinition::create('entity_reference')
+    $fields['entity_id'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Entity ID'))
       ->setDescription(t('The ID of the entity of which this comment is a reply.'))
       ->setRequired(TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The comment language code.'));
 
-    $fields['subject'] = FieldDefinition::create('string')
+    $fields['subject'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Subject'))
       ->setTranslatable(TRUE)
       ->setSetting('max_length', 64)
@@ -234,14 +234,14 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['uid'] = FieldDefinition::create('entity_reference')
+    $fields['uid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('User ID'))
       ->setDescription(t('The user ID of the comment author.'))
       ->setTranslatable(TRUE)
       ->setSetting('target_type', 'user')
       ->setDefaultValue(0);
 
-    $fields['name'] = FieldDefinition::create('string')
+    $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t("The comment author's name."))
       ->setTranslatable(TRUE)
@@ -249,12 +249,12 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDefaultValue('')
       ->addConstraint('CommentName', array());
 
-    $fields['mail'] = FieldDefinition::create('email')
+    $fields['mail'] = BaseFieldDefinition::create('email')
       ->setLabel(t('Email'))
       ->setDescription(t("The comment author's email address."))
       ->setTranslatable(TRUE);
 
-    $fields['homepage'] = FieldDefinition::create('uri')
+    $fields['homepage'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('Homepage'))
       ->setDescription(t("The comment author's home page address."))
       ->setTranslatable(TRUE)
@@ -262,44 +262,44 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       // characters in our comment DB schema.
       ->setSetting('max_length', 255);
 
-    $fields['hostname'] = FieldDefinition::create('string')
+    $fields['hostname'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Hostname'))
       ->setDescription(t("The comment author's hostname."))
       ->setTranslatable(TRUE)
       ->setSetting('max_length', 128);
 
-    $fields['created'] = FieldDefinition::create('created')
+    $fields['created'] = BaseFieldDefinition::create('created')
       ->setLabel(t('Created'))
       ->setDescription(t('The time that the comment was created.'))
       ->setTranslatable(TRUE);
 
-    $fields['changed'] = FieldDefinition::create('changed')
+    $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
       ->setDescription(t('The time that the comment was last edited.'))
       ->setTranslatable(TRUE);
 
-    $fields['status'] = FieldDefinition::create('boolean')
+    $fields['status'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Publishing status'))
       ->setDescription(t('A boolean indicating whether the comment is published.'))
       ->setTranslatable(TRUE)
       ->setDefaultValue(TRUE);
 
-    $fields['thread'] = FieldDefinition::create('string')
+    $fields['thread'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Thread place'))
       ->setDescription(t("The alphadecimal representation of the comment's place in a thread, consisting of a base 36 string prefixed by an integer indicating its length."))
       ->setSetting('max_length', 255);
 
-    $fields['entity_type'] = FieldDefinition::create('string')
+    $fields['entity_type'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Entity type'))
       ->setDescription(t('The entity type to which this comment is attached.'))
       ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH);
 
-    $fields['comment_type'] = FieldDefinition::create('entity_reference')
+    $fields['comment_type'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Comment Type'))
       ->setDescription(t('The comment type.'))
       ->setSetting('target_type', 'comment_type');
 
-    $fields['field_name'] = FieldDefinition::create('string')
+    $fields['field_name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Comment field name'))
       ->setDescription(t('The field name through which this comment was added.'))
       ->setSetting('max_length', FieldStorageConfig::NAME_MAX_LENGTH);
diff --git a/core/modules/contact/src/Entity/Message.php b/core/modules/contact/src/Entity/Message.php
index b52b32a..96d3630 100644
--- a/core/modules/contact/src/Entity/Message.php
+++ b/core/modules/contact/src/Entity/Message.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\contact\MessageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Defines the contact message entity.
@@ -135,31 +135,31 @@ public function getPersonalRecipient() {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['category'] = FieldDefinition::create('entity_reference')
+    $fields['category'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Category ID'))
       ->setDescription(t('The ID of the associated category.'))
       ->setSetting('target_type', 'contact_category')
       ->setRequired(TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The message UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The comment language code.'));
 
-    $fields['name'] = FieldDefinition::create('string')
+    $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t("The sender's name"))
       ->setDescription(t('The name of the person that is sending the contact message.'));
 
-    $fields['mail'] = FieldDefinition::create('email')
+    $fields['mail'] = BaseFieldDefinition::create('email')
       ->setLabel(t("The sender's email"))
       ->setDescription(t('The email of the person that is sending the contact message.'));
 
     // The subject of the contact message.
-    $fields['subject'] = FieldDefinition::create('string')
+    $fields['subject'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Subject'))
       ->setRequired(TRUE)
       ->setSetting('max_length', 100)
@@ -170,7 +170,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDisplayConfigurable('form', TRUE);
 
     // The text of the contact message.
-    $fields['message'] = FieldDefinition::create('string_long')
+    $fields['message'] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('Message'))
       ->setRequired(TRUE)
       ->setDisplayOptions('form', array(
@@ -188,11 +188,11 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('view', TRUE);
 
-    $fields['copy'] = FieldDefinition::create('boolean')
+    $fields['copy'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Copy'))
       ->setDescription(t('Whether to send a copy of the message to the sender.'));
 
-    $fields['recipient'] = FieldDefinition::create('entity_reference')
+    $fields['recipient'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Recipient ID'))
       ->setDescription(t('The ID of the recipient user for personal contact messages.'))
       ->setSetting('target_type', 'user');
diff --git a/core/modules/contact/tests/modules/contact_storage_test/contact_storage_test.module b/core/modules/contact/tests/modules/contact_storage_test/contact_storage_test.module
index 65de9e5..3ef9d22 100644
--- a/core/modules/contact/tests/modules/contact_storage_test/contact_storage_test.module
+++ b/core/modules/contact/tests/modules/contact_storage_test/contact_storage_test.module
@@ -5,7 +5,7 @@
  * Contains custom contact message functionality for ContactStorageTest.
  */
 
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Implements hook_entity_base_field_info().
@@ -13,7 +13,7 @@
 function contact_storage_test_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
   if ($entity_type->id() == 'contact_message') {
     $fields = array();
-    $fields['id'] = FieldDefinition::create('integer')
+    $fields['id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Message ID'))
       ->setDescription(t('The message ID.'))
       ->setReadOnly(TRUE)
diff --git a/core/modules/field/src/Entity/FieldInstanceConfig.php b/core/modules/field/src/Entity/FieldInstanceConfig.php
index fb39fca..5a1b951 100644
--- a/core/modules/field/src/Entity/FieldInstanceConfig.php
+++ b/core/modules/field/src/Entity/FieldInstanceConfig.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\TypedData\FieldItemDataDefinition;
 use Drupal\field\FieldException;
 use Drupal\field\FieldStorageConfigInterface;
@@ -638,7 +638,7 @@ public function __sleep() {
   public static function createFromDataType($type) {
     // Forward to the field definition class for creating new data definitions
     // via the typed manager.
-    return FieldDefinition::createFromDataType($type);
+    return BaseFieldDefinition::createFromDataType($type);
   }
 
   /**
@@ -647,7 +647,7 @@ public static function createFromDataType($type) {
   public static function createFromItemType($item_type) {
     // Forward to the field definition class for creating new data definitions
     // via the typed manager.
-    return FieldDefinition::createFromItemType($item_type);
+    return BaseFieldDefinition::createFromItemType($item_type);
   }
 
   public function getDataType() {
diff --git a/core/modules/field/src/Plugin/views/field/Field.php b/core/modules/field/src/Plugin/views/field/Field.php
index 9605cf8..4705437 100644
--- a/core/modules/field/src/Plugin/views/field/Field.php
+++ b/core/modules/field/src/Plugin/views/field/Field.php
@@ -13,7 +13,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Field\FormatterPluginManager;
 use Drupal\Core\Form\FormStateInterface;
@@ -48,7 +48,7 @@ class Field extends FieldPluginBase {
    *
    * A field storage definition turned into a field definition, so it can be
    * used with widgets and formatters. See
-   * FieldDefinition::createFromFieldStorageDefinition().
+   * BaseFieldDefinition::createFromFieldStorageDefinition().
    *
    * @var \Drupal\Core\Field\FieldDefinitionInterface
    */
@@ -157,7 +157,7 @@ public static function create(ContainerInterface $container, array $configuratio
   protected function getFieldDefinition() {
     if (!$this->fieldDefinition) {
       $field_storage_config = $this->getFieldStorageConfig();
-      $this->fieldDefinition = FieldDefinition::createFromFieldStorageDefinition($field_storage_config);
+      $this->fieldDefinition = BaseFieldDefinition::createFromFieldStorageDefinition($field_storage_config);
     }
     return $this->fieldDefinition;
   }
diff --git a/core/modules/field/src/Tests/TestItemTest.php b/core/modules/field/src/Tests/TestItemTest.php
index 348a1fc..b1c9b6b 100644
--- a/core/modules/field/src/Tests/TestItemTest.php
+++ b/core/modules/field/src/Tests/TestItemTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\field\Tests;
 
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldItemInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 
@@ -92,7 +92,7 @@ public function testTestItem() {
       ),
       'foreign keys' => array(),
     );
-    $field_schema = FieldDefinition::create('test_field')->getSchema();
+    $field_schema = BaseFieldDefinition::create('test_field')->getSchema();
     $this->assertEqual($field_schema, $expected_schema);
   }
 
diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php
index 8f2bb27..996eb87 100644
--- a/core/modules/file/src/Entity/File.php
+++ b/core/modules/file/src/Entity/File.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\file\FileInterface;
 use Drupal\user\UserInterface;
@@ -231,54 +231,54 @@ public static function preDelete(EntityStorageInterface $storage, array $entitie
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['fid'] = FieldDefinition::create('integer')
+    $fields['fid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('File ID'))
       ->setDescription(t('The file ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The file UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The file language code.'));
 
-    $fields['uid'] = FieldDefinition::create('entity_reference')
+    $fields['uid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('User ID'))
       ->setDescription(t('The user ID of the file.'))
       ->setSetting('target_type', 'user');
 
-    $fields['filename'] = FieldDefinition::create('string')
+    $fields['filename'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Filename'))
       ->setDescription(t('Name of the file with no path components.'));
 
-    $fields['uri'] = FieldDefinition::create('uri')
+    $fields['uri'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('URI'))
       ->setDescription(t('The URI to access the file (either local or remote).'))
       ->setSetting('max_length', 255);
 
-    $fields['filemime'] = FieldDefinition::create('string')
+    $fields['filemime'] = BaseFieldDefinition::create('string')
       ->setLabel(t('File MIME type'))
       ->setDescription(t("The file's MIME type."));
 
-    $fields['filesize'] = FieldDefinition::create('integer')
+    $fields['filesize'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('File size'))
       ->setDescription(t('The size of the file in bytes.'))
       ->setSetting('unsigned', TRUE)
       ->setSetting('size', 'big');
 
-    $fields['status'] = FieldDefinition::create('boolean')
+    $fields['status'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Status'))
       ->setDescription(t('The status of the file, temporary (FALSE) and permanent (TRUE).'));
 
-    $fields['created'] = FieldDefinition::create('created')
+    $fields['created'] = BaseFieldDefinition::create('created')
       ->setLabel(t('Created'))
       ->setDescription(t('The timestamp that the file was created.'));
 
-    $fields['changed'] = FieldDefinition::create('changed')
+    $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
       ->setDescription(t('The timestamp that the file was last changed.'));
 
diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
index ae57007..162fd51 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Url;
 use Drupal\menu_link_content\MenuLinkContentInterface;
 
@@ -255,24 +255,24 @@ public static function preDelete(EntityStorageInterface $storage, array $entitie
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['id'] = FieldDefinition::create('integer')
+    $fields['id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Entity ID'))
       ->setDescription(t('The entity ID for this menu link content entity.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The content menu link UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['bundle'] = FieldDefinition::create('string')
+    $fields['bundle'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Bundle'))
       ->setDescription(t('The content menu link bundle.'))
       ->setSetting('max_length', EntityTypeInterface::BUNDLE_MAX_LENGTH)
       ->setReadOnly(TRUE);
 
-    $fields['title'] = FieldDefinition::create('string')
+    $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Menu link title'))
       ->setDescription(t('The text to be used for this link in the menu.'))
       ->setRequired(TRUE)
@@ -292,7 +292,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['description'] = FieldDefinition::create('string')
+    $fields['description'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Description'))
       ->setDescription(t('Shown when hovering over the menu link.'))
       ->setTranslatable(TRUE)
@@ -310,35 +310,35 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => 0,
       ));
 
-    $fields['menu_name'] = FieldDefinition::create('string')
+    $fields['menu_name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Menu name'))
       ->setDescription(t('The menu name. All links with the same menu name (such as "tools") are part of the same menu.'))
       ->setSetting('default_value', 'tools');
 
     // @todo Use a link field https://www.drupal.org/node/2302205.
-    $fields['route_name'] = FieldDefinition::create('string')
+    $fields['route_name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Route name'))
       ->setDescription(t('The machine name of a defined Symfony Route this menu item represents.'));
 
-    $fields['route_parameters'] = FieldDefinition::create('map')
+    $fields['route_parameters'] = BaseFieldDefinition::create('map')
       ->setLabel(t('Route parameters'))
       ->setDescription(t('A serialized array of route parameters of this menu link.'));
 
-    $fields['url'] = FieldDefinition::create('uri')
+    $fields['url'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('External link url'))
       ->setDescription(t('The url of the link, in case you have an external link.'));
 
-    $fields['options'] = FieldDefinition::create('map')
+    $fields['options'] = BaseFieldDefinition::create('map')
       ->setLabel(t('Options'))
       ->setDescription(t('A serialized array of options to be passed to the url() or l() function, such as a query string or HTML attributes.'))
       ->setSetting('default_value', array());
 
-    $fields['external'] = FieldDefinition::create('boolean')
+    $fields['external'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('External'))
       ->setDescription(t('A flag to indicate if the link points to a full URL starting with a protocol, like http:// (1 = external, 0 = internal).'))
       ->setSetting('default_value', FALSE);
 
-    $fields['weight'] = FieldDefinition::create('integer')
+    $fields['weight'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Weight'))
       ->setDescription(t('Link weight among links in the same menu at the same depth. In the menu, the links with high weight will sink and links with a low weight will be positioned nearer the top.'))
       ->setSetting('default_value', 0)
@@ -352,7 +352,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => 20,
       ));
 
-    $fields['expanded'] = FieldDefinition::create('boolean')
+    $fields['expanded'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Show as expanded'))
       ->setDescription(t('If selected and this menu link has children, the menu will always appear expanded.'))
       ->setSetting('default_value', FALSE)
@@ -369,16 +369,16 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     // @todo We manually create a form element for this, since the form logic is
     // is inverted to show enabled. Flip this to a status field and use the
     // normal entity Boolean widget. https://www.drupal.org/node/2305707
-    $fields['hidden'] = FieldDefinition::create('boolean')
+    $fields['hidden'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Hidden'))
       ->setDescription(t('A flag for whether the link should be hidden in menus or rendered normally.'))
       ->setSetting('default_value', FALSE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The node language code.'));
 
-    $fields['parent'] = FieldDefinition::create('string')
+    $fields['parent'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Parent plugin ID'))
       ->setDescription(t('The ID of the parent menu link plugin, or empty string when at the top level of the hierarchy.'));
 
diff --git a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
index 7977a0f..59e075c 100644
--- a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
+++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
@@ -9,7 +9,7 @@
 
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Database\Connection;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\migrate\Entity\MigrationInterface;
 use Drupal\migrate\MigrateException;
@@ -386,7 +386,7 @@ protected function getFieldSchema(array $id_definition) {
     if (count($type_parts) == 1) {
       $type_parts[] = 'value';
     }
-    $schema = FieldDefinition::create($type_parts[0])->getColumns();
+    $schema = BaseFieldDefinition::create($type_parts[0])->getColumns();
     return $schema[$type_parts[1]];
   }
 
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index b9d5a53..1cdc5c0 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\node\NodeInterface;
@@ -322,35 +322,35 @@ public function setRevisionAuthorId($uid) {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['nid'] = FieldDefinition::create('integer')
+    $fields['nid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Node ID'))
       ->setDescription(t('The node ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The node UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['vid'] = FieldDefinition::create('integer')
+    $fields['vid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Revision ID'))
       ->setDescription(t('The node revision ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['type'] = FieldDefinition::create('entity_reference')
+    $fields['type'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Type'))
       ->setDescription(t('The node type.'))
       ->setSetting('target_type', 'node_type')
       ->setReadOnly(TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The node language code.'))
       ->setRevisionable(TRUE);
 
-    $fields['title'] = FieldDefinition::create('string')
+    $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Title'))
       ->setDescription(t('The title of this node, always treated as non-markup plain text.'))
       ->setRequired(TRUE)
@@ -369,57 +369,57 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['uid'] = FieldDefinition::create('entity_reference')
+    $fields['uid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Author'))
       ->setDescription(t('The user that is the node author.'))
       ->setRevisionable(TRUE)
       ->setSetting('target_type', 'user')
       ->setTranslatable(TRUE);
 
-    $fields['status'] = FieldDefinition::create('boolean')
+    $fields['status'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Publishing status'))
       ->setDescription(t('A boolean indicating whether the node is published.'))
       ->setRevisionable(TRUE)
       ->setTranslatable(TRUE);
 
-    $fields['created'] = FieldDefinition::create('created')
+    $fields['created'] = BaseFieldDefinition::create('created')
       ->setLabel(t('Created'))
       ->setDescription(t('The time that the node was created.'))
       ->setRevisionable(TRUE)
       ->setTranslatable(TRUE);
 
-    $fields['changed'] = FieldDefinition::create('changed')
+    $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
       ->setDescription(t('The time that the node was last edited.'))
       ->setRevisionable(TRUE)
       ->setTranslatable(TRUE);
 
-    $fields['promote'] = FieldDefinition::create('boolean')
+    $fields['promote'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Promote'))
       ->setDescription(t('A boolean indicating whether the node should be displayed on the front page.'))
       ->setRevisionable(TRUE)
       ->setTranslatable(TRUE);
 
-    $fields['sticky'] = FieldDefinition::create('boolean')
+    $fields['sticky'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Sticky'))
       ->setDescription(t('A boolean indicating whether the node should be displayed at the top of lists in which it appears.'))
       ->setRevisionable(TRUE)
       ->setTranslatable(TRUE);
 
-    $fields['revision_timestamp'] = FieldDefinition::create('created')
+    $fields['revision_timestamp'] = BaseFieldDefinition::create('created')
       ->setLabel(t('Revision timestamp'))
       ->setDescription(t('The time that the current revision was created.'))
       ->setQueryable(FALSE)
       ->setRevisionable(TRUE);
 
-    $fields['revision_uid'] = FieldDefinition::create('entity_reference')
+    $fields['revision_uid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Revision user ID'))
       ->setDescription(t('The user ID of the author of the current revision.'))
       ->setSetting('target_type', 'user')
       ->setQueryable(FALSE)
       ->setRevisionable(TRUE);
 
-    $fields['revision_log'] = FieldDefinition::create('string_long')
+    $fields['revision_log'] = BaseFieldDefinition::create('string_long')
       ->setLabel(t('Revision log message'))
       ->setDescription(t('The log entry explaining the changes in this revision.'))
       ->setRevisionable(TRUE)
diff --git a/core/modules/path/path.module b/core/modules/path/path.module
index 7c48772..aeba50b 100644
--- a/core/modules/path/path.module
+++ b/core/modules/path/path.module
@@ -8,7 +8,7 @@
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 
@@ -80,7 +80,7 @@ function path_form_node_form_alter(&$form, FormStateInterface $form_state) {
  */
 function path_entity_base_field_info(EntityTypeInterface $entity_type) {
   if ($entity_type->id() === 'taxonomy_term' || $entity_type->id() === 'node') {
-    $fields['path'] = FieldDefinition::create('path')
+    $fields['path'] = BaseFieldDefinition::create('path')
       ->setLabel(t('URL alias'))
       ->setTranslatable(TRUE)
       ->setDisplayOptions('form', array(
diff --git a/core/modules/path/tests/src/Field/PathFieldDefinitionTest.php b/core/modules/path/tests/src/Field/PathFieldDefinitionTest.php
index a3adc68..47fd63f 100644
--- a/core/modules/path/tests/src/Field/PathFieldDefinitionTest.php
+++ b/core/modules/path/tests/src/Field/PathFieldDefinitionTest.php
@@ -7,13 +7,13 @@
 
 namespace Drupal\path\Tests\Field;
 
-use Drupal\Tests\Core\Field\FieldDefinitionTestBase;
+use Drupal\Tests\Core\Field\BaseFieldDefinitionTestBase;
 
 /**
- * @coversDefaultClass \Drupal\Core\Field\FieldDefinition
+ * @coversDefaultClass \Drupal\Core\Field\BaseFieldDefinition
  * @group path
  */
-class PathFieldDefinitionTest extends FieldDefinitionTestBase {
+class PathFieldDefinitionTest extends BaseFieldDefinitionTestBase {
 
   /**
    * {@inheritdoc}
@@ -30,9 +30,9 @@ protected function getModuleAndPath() {
   }
 
   /**
-   * Tests FieldDefinition::getColumns().
+   * Tests BaseFieldDefinition::getColumns().
    *
-   * @covers \Drupal\Core\Field\FieldDefinition::getColumns
+   * @covers \Drupal\Core\Field\BaseFieldDefinition::getColumns
    * @covers \Drupal\path\Plugin\Field\FieldType\PathItem::schema
    */
   public function testGetColumns() {
diff --git a/core/modules/shortcut/src/Entity/Shortcut.php b/core/modules/shortcut/src/Entity/Shortcut.php
index bec4cb6..6a3ec86 100644
--- a/core/modules/shortcut/src/Entity/Shortcut.php
+++ b/core/modules/shortcut/src/Entity/Shortcut.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Url;
 use Drupal\shortcut\ShortcutInterface;
 
@@ -152,24 +152,24 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['id'] = FieldDefinition::create('integer')
+    $fields['id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('ID'))
       ->setDescription(t('The ID of the shortcut.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The UUID of the shortcut.'))
       ->setReadOnly(TRUE);
 
-    $fields['shortcut_set'] = FieldDefinition::create('entity_reference')
+    $fields['shortcut_set'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Shortcut set'))
       ->setDescription(t('The bundle of the shortcut.'))
       ->setSetting('target_type', 'shortcut_set')
       ->setRequired(TRUE);
 
-    $fields['title'] = FieldDefinition::create('string')
+    $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t('The name of the shortcut.'))
       ->setRequired(TRUE)
@@ -184,23 +184,23 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         ),
       ));
 
-    $fields['weight'] = FieldDefinition::create('integer')
+    $fields['weight'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Weight'))
       ->setDescription(t('Weight among shortcuts in the same shortcut set.'));
 
-    $fields['route_name'] = FieldDefinition::create('string')
+    $fields['route_name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Route name'))
       ->setDescription(t('The machine name of a defined Route this shortcut represents.'));
 
-    $fields['route_parameters'] = FieldDefinition::create('map')
+    $fields['route_parameters'] = BaseFieldDefinition::create('map')
       ->setLabel(t('Route parameters'))
       ->setDescription(t('A serialized array of route parameters of this shortcut.'));
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The language code of the shortcut.'));
 
-    $fields['path'] = FieldDefinition::create('string')
+    $fields['path'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Path'))
       ->setDescription(t('The computed shortcut path.'))
       ->setComputed(TRUE)
diff --git a/core/modules/system/entity.api.php b/core/modules/system/entity.api.php
index e80f34e..734814e 100644
--- a/core/modules/system/entity.api.php
+++ b/core/modules/system/entity.api.php
@@ -7,7 +7,7 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Render\Element;
 
 /**
@@ -1621,7 +1621,7 @@ function hook_entity_form_display_alter(\Drupal\Core\Entity\Display\EntityFormDi
 function hook_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
   if ($entity_type->id() == 'node') {
     $fields = array();
-    $fields['mymodule_text'] = FieldDefinition::create('string')
+    $fields['mymodule_text'] = BaseFieldDefinition::create('string')
       ->setLabel(t('The text'))
       ->setDescription(t('A text property added by mymodule.'))
       ->setComputed(TRUE)
@@ -1679,7 +1679,7 @@ function hook_entity_bundle_field_info(\Drupal\Core\Entity\EntityTypeInterface $
   // Add a property only to nodes of the 'article' bundle.
   if ($entity_type->id() == 'node' && $bundle == 'article') {
     $fields = array();
-    $fields['mymodule_text_more'] = FieldDefinition::create('string')
+    $fields['mymodule_text_more'] = BaseFieldDefinition::create('string')
         ->setLabel(t('More text'))
         ->setComputed(TRUE)
         ->setClass('\Drupal\mymodule\EntityComputedMoreText');
diff --git a/core/modules/system/src/Tests/Entity/EntityFieldTest.php b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
index 2371957..c890ef3 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\system\Tests\Entity;
 
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\FieldItemInterface;
@@ -550,7 +550,7 @@ public function testEntityConstraintValidation() {
     $entity = $this->createTestEntity('entity_test');
     $entity->save();
     // Create a reference field item and let it reference the entity.
-    $definition = FieldDefinition::create('entity_reference')
+    $definition = BaseFieldDefinition::create('entity_reference')
       ->setLabel('Test entity')
       ->setSetting('target_type', 'entity_test');
     $reference_field = \Drupal::typedDataManager()->create($definition);
@@ -575,7 +575,7 @@ public function testEntityConstraintValidation() {
     // Test bundle validation.
     NodeType::create(array('type' => 'article'))
       ->save();
-    $definition = FieldDefinition::create('entity_reference')
+    $definition = BaseFieldDefinition::create('entity_reference')
       ->setLabel('Test entity')
       ->setSettings(array(
         'target_type' => 'node',
diff --git a/core/modules/system/src/Tests/Entity/EntityTypedDataDefinitionTest.php b/core/modules/system/src/Tests/Entity/EntityTypedDataDefinitionTest.php
index 04aaa66..36150a4 100644
--- a/core/modules/system/src/Tests/Entity/EntityTypedDataDefinitionTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTypedDataDefinitionTest.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Entity\TypedData\EntityDataDefinition;
 use Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
 use Drupal\Core\TypedData\DataReferenceDefinition;
@@ -47,7 +47,7 @@ public function setUp() {
    * Tests deriving metadata about fields.
    */
   public function testFields() {
-    $field_definition = FieldDefinition::create('integer');
+    $field_definition = BaseFieldDefinition::create('integer');
     // Fields are lists of complex data.
     $this->assertTrue($field_definition instanceof ListDataDefinitionInterface);
     $this->assertFalse($field_definition instanceof ComplexDataDefinitionInterface);
diff --git a/core/modules/system/src/Tests/TypedData/TypedDataTest.php b/core/modules/system/src/Tests/TypedData/TypedDataTest.php
index bc9bd8c..1adc2ff 100644
--- a/core/modules/system/src/Tests/TypedData/TypedDataTest.php
+++ b/core/modules/system/src/Tests/TypedData/TypedDataTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\system\Tests\TypedData;
 
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\TypedData\ListDataDefinition;
 use Drupal\Core\TypedData\MapDataDefinition;
@@ -539,7 +539,7 @@ public function testTypedDataValidation() {
 
     // Test validating property containers and make sure the NotNull and Null
     // constraints work with typed data containers.
-    $definition = FieldDefinition::create('integer')
+    $definition = BaseFieldDefinition::create('integer')
       ->setConstraints(array('NotNull' => array()));
     $field_item = $this->typedDataManager->create($definition, array('value' => 10));
     $violations = $field_item->validate();
@@ -556,7 +556,7 @@ public function testTypedDataValidation() {
     $this->assertEqual($violations->count(), 1);
 
     // Test the Null constraint with typed data containers.
-    $definition = FieldDefinition::create('float')
+    $definition = BaseFieldDefinition::create('float')
       ->setConstraints(array('Null' => array()));
     $field_item = $this->typedDataManager->create($definition, array('value' => 11.5));
     $violations = $field_item->validate();
@@ -586,7 +586,7 @@ public function testTypedDataValidation() {
 
     // Test validating a list of a values and make sure property paths starting
     // with "0" are created.
-    $definition = FieldDefinition::create('integer');
+    $definition = BaseFieldDefinition::create('integer');
     $violations = $this->typedDataManager->create($definition, array(array('value' => 10)))->validate();
     $this->assertEqual($violations->count(), 0);
     $violations = $this->typedDataManager->create($definition, array(array('value' => 'string')))->validate();
diff --git a/core/modules/system/tests/modules/entity_bundle_field_test/entity_bundle_field_test.module b/core/modules/system/tests/modules/entity_bundle_field_test/entity_bundle_field_test.module
index 55f5bff..7a39717 100644
--- a/core/modules/system/tests/modules/entity_bundle_field_test/entity_bundle_field_test.module
+++ b/core/modules/system/tests/modules/entity_bundle_field_test/entity_bundle_field_test.module
@@ -5,7 +5,7 @@
  * Test module for the entity API providing a bundle field.
  */
 
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Tracks whether the module is currently being uninstalled.
@@ -30,9 +30,9 @@ function entity_bundle_field_test_is_uninstalling($value = NULL) {
 function entity_bundle_field_test_entity_field_storage_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
   if ($entity_type->id() == 'entity_test' && !entity_bundle_field_test_is_uninstalling()) {
     // @todo: Make use of a FieldStorageDefinition class instead of
-    // FieldDefinition as this should not implement FieldDefinitionInterface.
+    // BaseFieldDefinition as this should not implement FieldDefinitionInterface.
     // See https://drupal.org/node/2280639.
-    $definitions['custom_field'] = FieldDefinition::create('string')
+    $definitions['custom_field'] = BaseFieldDefinition::create('string')
       ->setName('custom_field')
       ->setLabel(t('A custom field'))
       ->setTargetEntityTypeId($entity_type->id());
@@ -45,7 +45,7 @@ function entity_bundle_field_test_entity_field_storage_info(\Drupal\Core\Entity\
  */
 function entity_bundle_field_test_entity_bundle_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
   if ($entity_type->id() == 'entity_test' && $bundle == 'custom' && !entity_bundle_field_test_is_uninstalling()) {
-    $definitions['custom_field'] = FieldDefinition::create('string')
+    $definitions['custom_field'] = BaseFieldDefinition::create('string')
       ->setName('custom_field')
       ->setLabel(t('A custom field'));
     return $definitions;
@@ -58,7 +58,7 @@ function entity_bundle_field_test_entity_bundle_field_info(\Drupal\Core\Entity\E
 function entity_bundle_field_test_entity_bundle_delete($entity_type_id, $bundle) {
   if ($entity_type_id == 'entity_test' && $bundle == 'custom') {
     // Notify the entity storage that our field is gone.
-    $field_definition = FieldDefinition::create('string')
+    $field_definition = BaseFieldDefinition::create('string')
       ->setTargetEntityTypeId($entity_type_id)
       ->setBundle($bundle)
       ->setName('custom_field')
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
index 4e94184..6831f1c 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\user\UserInterface;
@@ -63,22 +63,22 @@ public static function preCreate(EntityStorageInterface $storage, array &$values
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['id'] = FieldDefinition::create('integer')
+    $fields['id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('ID'))
       ->setDescription(t('The ID of the test entity.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The UUID of the test entity.'))
       ->setReadOnly(TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The language code of the test entity.'));
 
-    $fields['name'] = FieldDefinition::create('string')
+    $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t('The name of the test entity.'))
       ->setTranslatable(TRUE)
@@ -90,12 +90,12 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ));
 
     // @todo: Add allowed values validation.
-    $fields['type'] = FieldDefinition::create('string')
+    $fields['type'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Type'))
       ->setDescription(t('The bundle of the test entity.'))
       ->setRequired(TRUE);
 
-    $fields['user_id'] = FieldDefinition::create('entity_reference')
+    $fields['user_id'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('User ID'))
       ->setDescription(t('The ID of the associated user.'))
       ->setSettings(array('target_type' => 'user'))
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestBaseFieldDisplay.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestBaseFieldDisplay.php
index e9e7123..e235f6c 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestBaseFieldDisplay.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestBaseFieldDisplay.php
@@ -8,7 +8,7 @@
 namespace Drupal\entity_test\Entity;
 
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Defines a test entity class for base fields display.
@@ -44,10 +44,10 @@ class EntityTestBaseFieldDisplay extends EntityTest {
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields = parent::baseFieldDefinitions($entity_type);
 
-    $fields['test_no_display'] = FieldDefinition::create('text')
+    $fields['test_no_display'] = BaseFieldDefinition::create('text')
       ->setLabel(t('Field with no display'));
 
-    $fields['test_display_configurable'] = FieldDefinition::create('text')
+    $fields['test_display_configurable'] = BaseFieldDefinition::create('text')
       ->setLabel(t('Field with configurable display'))
       ->setDisplayOptions('view', array(
         'type' => 'text_default',
@@ -60,7 +60,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['test_display_non_configurable'] = FieldDefinition::create('text')
+    $fields['test_display_non_configurable'] = BaseFieldDefinition::create('text')
       ->setLabel(t('Field with non-configurable display'))
       ->setDisplayOptions('view', array(
         'type' => 'text_default',
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultValue.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultValue.php
index 89fc15b..3779567 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultValue.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultValue.php
@@ -8,7 +8,7 @@
 namespace Drupal\entity_test\Entity;
 
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Defines a test entity class for testing default values.
@@ -33,7 +33,7 @@ class EntityTestDefaultValue extends EntityTest {
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields = parent::baseFieldDefinitions($entity_type);
 
-    $fields['description'] = FieldDefinition::create('string')
+    $fields['description'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Some custom description'))
       ->setDefaultValueCallback('entity_test_field_default_value');
 
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php
index c5227e4..b5ba803 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php
@@ -8,7 +8,7 @@
 namespace Drupal\entity_test\Entity;
 
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\entity_test\Entity\EntityTest;
 
 /**
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
index 477b651..f4ee307 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
@@ -8,7 +8,7 @@
 namespace Drupal\entity_test\Entity;
 
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\entity_test\Entity\EntityTestRev;
 
 /**
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
index 9424241..5f74c59 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
@@ -8,7 +8,7 @@
 namespace Drupal\entity_test\Entity;
 
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\entity_test\Entity\EntityTest;
 
 /**
@@ -50,7 +50,7 @@ class EntityTestRev extends EntityTest {
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields = parent::baseFieldDefinitions($entity_type);
 
-    $fields['revision_id'] = FieldDefinition::create('integer')
+    $fields['revision_id'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Revision ID'))
       ->setDescription(t('The version id of the test entity.'))
       ->setReadOnly(TRUE)
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestStringId.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestStringId.php
index dbe4a20..de9e47a 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestStringId.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestStringId.php
@@ -6,7 +6,7 @@
  */
 
 namespace Drupal\entity_test\Entity;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Entity\EntityTypeInterface;
 
 /**
@@ -44,7 +44,7 @@ class EntityTestStringId extends EntityTest {
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields = parent::baseFieldDefinitions($entity_type);
-    $fields['id'] = FieldDefinition::create('string')
+    $fields['id'] = BaseFieldDefinition::create('string')
       ->setLabel(t('ID'))
       ->setDescription(t('The ID of the test entity.'))
       ->setReadOnly(TRUE);
diff --git a/core/modules/taxonomy/src/Entity/Term.php b/core/modules/taxonomy/src/Entity/Term.php
index d01759f..597518e 100644
--- a/core/modules/taxonomy/src/Entity/Term.php
+++ b/core/modules/taxonomy/src/Entity/Term.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\taxonomy\TermInterface;
 
 /**
@@ -100,27 +100,27 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['tid'] = FieldDefinition::create('integer')
+    $fields['tid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Term ID'))
       ->setDescription(t('The term ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The term UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['vid'] = FieldDefinition::create('entity_reference')
+    $fields['vid'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Vocabulary'))
       ->setDescription(t('The vocabulary to which the term is assigned.'))
       ->setSetting('target_type', 'taxonomy_vocabulary');
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The term language code.'));
 
-    $fields['name'] = FieldDefinition::create('string')
+    $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t('The term name.'))
       ->setTranslatable(TRUE)
@@ -137,7 +137,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['description'] = FieldDefinition::create('text_long')
+    $fields['description'] = BaseFieldDefinition::create('text_long')
       ->setLabel(t('Description'))
       ->setDescription(t('A description of the term.'))
       ->setTranslatable(TRUE)
@@ -154,23 +154,23 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ))
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['weight'] = FieldDefinition::create('integer')
+    $fields['weight'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Weight'))
       ->setDescription(t('The weight of this term in relation to other terms.'))
       ->setDefaultValue(0);
 
     // @todo Convert this to an entity_reference field, see
     // https://drupal.org/node/1915056
-    $fields['parent'] = FieldDefinition::create('integer')
+    $fields['parent'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('Term Parents'))
       ->setDescription(t('The parents of this term.'))
-      ->setCardinality(FieldDefinition::CARDINALITY_UNLIMITED)
+      ->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
       // Save new terms with no parents by default.
       ->setDefaultValue(0)
       ->setSetting('unsigned', TRUE)
       ->addConstraint('TermParent', array());
 
-    $fields['changed'] = FieldDefinition::create('changed')
+    $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
       ->setDescription(t('The time that the term was last edited.'));
 
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index cd2fb48..979694b 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Entity\EntityMalformedException;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\user\UserInterface;
 
 /**
@@ -432,32 +432,32 @@ public function setUsername($username) {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields['uid'] = FieldDefinition::create('integer')
+    $fields['uid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('User ID'))
       ->setDescription(t('The user ID.'))
       ->setReadOnly(TRUE)
       ->setSetting('unsigned', TRUE);
 
-    $fields['uuid'] = FieldDefinition::create('uuid')
+    $fields['uuid'] = BaseFieldDefinition::create('uuid')
       ->setLabel(t('UUID'))
       ->setDescription(t('The user UUID.'))
       ->setReadOnly(TRUE);
 
-    $fields['langcode'] = FieldDefinition::create('language')
+    $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The user language code.'));
 
-    $fields['preferred_langcode'] = FieldDefinition::create('language')
+    $fields['preferred_langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Preferred admin language code'))
       ->setDescription(t("The user's preferred language code for receiving emails and viewing the site."));
 
-    $fields['preferred_admin_langcode'] = FieldDefinition::create('language')
+    $fields['preferred_admin_langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Preferred language code'))
       ->setDescription(t("The user's preferred language code for viewing administration pages."));
 
     // The name should not vary per language. The username is the visual
     // identifier for a user and needs to be consistent in all languages.
-    $fields['name'] = FieldDefinition::create('string')
+    $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t('The name of this user.'))
       ->setDefaultValue('')
@@ -468,59 +468,59 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'UserNameUnique' => array(),
       ));
 
-    $fields['pass'] = FieldDefinition::create('string')
+    $fields['pass'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Password'))
       ->setDescription(t('The password of this user (hashed).'));
 
-    $fields['mail'] = FieldDefinition::create('email')
+    $fields['mail'] = BaseFieldDefinition::create('email')
       ->setLabel(t('Email'))
       ->setDescription(t('The email of this user.'))
       ->setDefaultValue('')
       ->setPropertyConstraints('value', array('UserMailUnique' => array()));
 
     // @todo Convert to a text field in https://drupal.org/node/1548204.
-    $fields['signature'] = FieldDefinition::create('string')
+    $fields['signature'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Signature'))
       ->setDescription(t('The signature of this user.'));
-    $fields['signature_format'] = FieldDefinition::create('string')
+    $fields['signature_format'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Signature format'))
       ->setDescription(t('The signature format of this user.'));
 
-    $fields['timezone'] = FieldDefinition::create('string')
+    $fields['timezone'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Timezone'))
       ->setDescription(t('The timezone of this user.'))
       ->setSetting('max_length', 32);
 
-    $fields['status'] = FieldDefinition::create('boolean')
+    $fields['status'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('User status'))
       ->setDescription(t('Whether the user is active or blocked.'))
       ->setDefaultValue(FALSE);
 
-    $fields['created'] = FieldDefinition::create('created')
+    $fields['created'] = BaseFieldDefinition::create('created')
       ->setLabel(t('Created'))
       ->setDescription(t('The time that the user was created.'));
 
-    $fields['access'] = FieldDefinition::create('timestamp')
+    $fields['access'] = BaseFieldDefinition::create('timestamp')
       ->setLabel(t('Last access'))
       ->setDescription(t('The time that the user last accessed the site.'))
       ->setDefaultValue(0);
 
-    $fields['login'] = FieldDefinition::create('timestamp')
+    $fields['login'] = BaseFieldDefinition::create('timestamp')
       ->setLabel(t('Last login'))
       ->setDescription(t('The time that the user last logged in.'))
       ->setDefaultValue(0);
 
-    $fields['init'] = FieldDefinition::create('email')
+    $fields['init'] = BaseFieldDefinition::create('email')
       ->setLabel(t('Initial email'))
       ->setDescription(t('The email address used for initial account creation.'))
       ->setDefaultValue('');
 
     // @todo Convert this to entity_reference_field, see
     // https://drupal.org/node/2044859.
-    $fields['roles'] = FieldDefinition::create('string')
+    $fields['roles'] = BaseFieldDefinition::create('string')
       ->setCustomStorage(TRUE)
       ->setLabel(t('Roles'))
-      ->setCardinality(FieldDefinition::CARDINALITY_UNLIMITED)
+      ->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
       ->setDescription(t('The roles the user has.'));
 
     return $fields;
diff --git a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
new file mode 100644
index 0000000..03f2e4d
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
@@ -0,0 +1,225 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Entity\BaseFieldDefinitionTest.
+ */
+
+namespace Drupal\Tests\Core\Entity;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Unit test for BaseFieldDefinition.
+ *
+ * @group Entity
+ */
+class BaseFieldDefinitionTest extends UnitTestCase {
+
+  /**
+   * A dummy field type name.
+   *
+   * @var string
+   */
+  protected $fieldType;
+
+  /**
+   * A dummy field type definition.
+   *
+   * @var string
+   */
+  protected $fieldTypeDefinition;
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    // Mock the field type manager and place it in the container.
+    $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
+
+    $this->fieldType = $this->randomMachineName();
+    $this->fieldTypeDefinition = array(
+      'id' => $this->fieldType,
+      'settings' => array(
+        'some_setting' => 'value 1'
+      ),
+      'instance_settings' => array(
+        'some_instance_setting' => 'value 2',
+      ),
+    );
+
+    $field_type_manager->expects($this->any())
+      ->method('getDefinitions')
+      ->will($this->returnValue(array($this->fieldType => $this->fieldTypeDefinition)));
+    $field_type_manager->expects($this->any())
+      ->method('getDefinition')
+      ->with($this->fieldType)
+      ->will($this->returnValue($this->fieldTypeDefinition));
+    $field_type_manager->expects($this->any())
+      ->method('getDefaultSettings')
+      ->with($this->fieldType)
+      ->will($this->returnValue($this->fieldTypeDefinition['settings']));
+    $field_type_manager->expects($this->any())
+      ->method('getDefaultInstanceSettings')
+      ->with($this->fieldType)
+      ->will($this->returnValue($this->fieldTypeDefinition['instance_settings']));
+
+    $container = new ContainerBuilder();
+    $container->set('plugin.manager.field.field_type', $field_type_manager);
+    \Drupal::setContainer($container);
+  }
+
+  /**
+   * Tests field name methods.
+   */
+  public function testFieldName() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $field_name = $this->randomMachineName();
+    $definition->setName($field_name);
+    $this->assertEquals($field_name, $definition->getName());
+  }
+
+  /**
+   * Tests field label methods.
+   */
+  public function testFieldLabel() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $label = $this->randomMachineName();
+    $definition->setLabel($label);
+    $this->assertEquals($label, $definition->getLabel());
+  }
+
+  /**
+   * Tests field description methods.
+   */
+  public function testFieldDescription() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $description = $this->randomMachineName();
+    $definition->setDescription($description);
+    $this->assertEquals($description, $definition->getDescription());
+  }
+
+  /**
+   * Tests field type methods.
+   */
+  public function testFieldType() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertEquals($this->fieldType, $definition->getType());
+  }
+
+  /**
+   * Tests field settings methods.
+   */
+  public function testFieldSettings() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $setting = $this->randomMachineName();
+    $value = $this->randomMachineName();
+    $definition->setSetting($setting, $value);
+    $this->assertEquals($value, $definition->getSetting($setting));
+    $default_settings = $this->fieldTypeDefinition['settings'] + $this->fieldTypeDefinition['instance_settings'];
+    $this->assertEquals(array($setting => $value) + $default_settings, $definition->getSettings());
+  }
+
+  /**
+   * Tests the initialization of default field settings.
+   */
+  public function testDefaultFieldSettings() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $expected_settings = $this->fieldTypeDefinition['settings'] + $this->fieldTypeDefinition['instance_settings'];
+    $this->assertEquals($expected_settings, $definition->getSettings());
+    foreach ($expected_settings as $setting => $value) {
+      $this->assertEquals($value, $definition->getSetting($setting));
+    }
+  }
+
+  /**
+   * Tests field default value.
+   */
+  public function testFieldDefaultValue() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $value = $this->randomMachineName();
+    $definition->setDefaultValue($value);
+    $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
+      ->disableOriginalConstructor()
+      ->getMock();
+    // Set the field item list class to be used to avoid requiring the typed
+    // data manager to retrieve it.
+    $definition->setClass('Drupal\Core\Field\FieldItemList');
+    $this->assertEquals($value, $definition->getDefaultValue($entity));
+  }
+
+  /**
+   * Tests field translatable methods.
+   */
+  public function testFieldTranslatable() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertFalse($definition->isTranslatable());
+    $definition->setTranslatable(TRUE);
+    $this->assertTrue($definition->isTranslatable());
+    $definition->setTranslatable(FALSE);
+    $this->assertFalse($definition->isTranslatable());
+  }
+
+  /**
+   * Tests field revisionable methods.
+   */
+  public function testFieldRevisionable() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertFalse($definition->isRevisionable());
+    $definition->setRevisionable(TRUE);
+    $this->assertTrue($definition->isRevisionable());
+    $definition->setRevisionable(FALSE);
+    $this->assertFalse($definition->isRevisionable());
+  }
+
+  /**
+   * Tests field cardinality.
+   */
+  public function testFieldCardinality() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertEquals(1, $definition->getCardinality());
+    $definition->setCardinality(2);
+    $this->assertEquals(2, $definition->getCardinality());
+    $definition->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
+    $this->assertEquals(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, $definition->getCardinality());
+  }
+
+  /**
+   * Tests required.
+   */
+  public function testFieldRequired() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertFalse($definition->isRequired());
+    $definition->setRequired(TRUE);
+    $this->assertTrue($definition->isRequired());
+    $definition->setRequired(FALSE);
+    $this->assertFalse($definition->isRequired());
+  }
+
+  /**
+   * Tests provider.
+   */
+  public function testFieldProvider() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $provider = $this->randomMachineName();
+    $definition->setProvider($provider);
+    $this->assertEquals($provider, $definition->getProvider());
+  }
+
+  /**
+   * Tests custom storage.
+   */
+  public function testCustomStorage() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertFalse($definition->hasCustomStorage());
+    $definition->setCustomStorage(TRUE);
+    $this->assertTrue($definition->hasCustomStorage());
+    $definition->setCustomStorage(FALSE);
+    $this->assertFalse($definition->hasCustomStorage());
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php b/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php
index aeee601..cfa4933 100644
--- a/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\Tests\Core\Entity;
 
 use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldItemBase;
 use Drupal\Tests\UnitTestCase;
 use Drupal\Core\Language\Language;
@@ -92,7 +92,7 @@ class ContentEntityBaseUnitTest extends UnitTestCase {
   /**
    * Field definitions.
    *
-   * @var \Drupal\Core\Field\FieldDefinition[]
+   * @var \Drupal\Core\Field\BaseFieldDefinition[]
    */
   protected $fieldDefinitions;
 
@@ -158,8 +158,8 @@ public function setUp() {
     \Drupal::setContainer($container);
 
     $this->fieldDefinitions = array(
-      'id' => FieldDefinition::create('integer'),
-      'revision_id' => FieldDefinition::create('integer'),
+      'id' => BaseFieldDefinition::create('integer'),
+      'revision_id' => BaseFieldDefinition::create('integer'),
     );
 
     $this->entityManager->expects($this->any())
diff --git a/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
index 849d063..6437037 100644
--- a/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Entity\ContentEntityDatabaseStorage;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 
@@ -38,7 +38,7 @@ class ContentEntityDatabaseStorageTest extends UnitTestCase {
   /**
    * An array of field definitions used for this test, keyed by field name.
    *
-   * @var \Drupal\Core\Field\FieldDefinition[]|\PHPUnit_Framework_MockObject_MockObject[]
+   * @var \Drupal\Core\Field\BaseFieldDefinition[]|\PHPUnit_Framework_MockObject_MockObject[]
    */
   protected $fieldDefinitions = array();
 
@@ -972,9 +972,9 @@ public function testFieldSqlSchemaForEntityWithStringIdentifier() {
       ->method('getDefaultInstanceSettings')
       ->will($this->returnValue(array()));
 
-    $this->fieldDefinitions['id'] = FieldDefinition::create('string')
+    $this->fieldDefinitions['id'] = BaseFieldDefinition::create('string')
       ->setName('id');
-    $this->fieldDefinitions['revision'] = FieldDefinition::create('string')
+    $this->fieldDefinitions['revision'] = BaseFieldDefinition::create('string')
       ->setName('revision');
 
     $this->entityManager->expects($this->any())
diff --git a/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php b/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php
index 6539a2b..3389858 100644
--- a/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php
@@ -47,7 +47,7 @@ public function testView() {
       ->will($this->returnValue('name'));
 
     // Mock the 'name' field's definition.
-    $field_definition = $this->getMock('Drupal\Core\Field\FieldDefinition');
+    $field_definition = $this->getMock('Drupal\Core\Field\BaseFieldDefinition');
     $field_definition->expects($this->any())
       ->method('getDisplayOptions')
       ->with('view')
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
index c86a293..7ec941e 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
@@ -690,7 +690,7 @@ public function testGetFieldDefinitionsProvider() {
 
     // @todo Mock FieldDefinitionInterface once it exposes a proper provider
     //   setter. See https://drupal.org/node/2225961.
-    $field_definition = $this->getMockBuilder('Drupal\Core\Field\FieldDefinition')
+    $field_definition = $this->getMockBuilder('Drupal\Core\Field\BaseFieldDefinition')
       ->disableOriginalConstructor()
       ->getMock();
 
@@ -722,7 +722,7 @@ public function testGetFieldDefinitionsProvider() {
    * @param string $field_definition_id
    *   (optional) The ID to use for the field definition. Defaults to 'id'.
    *
-   * @return \Drupal\Core\Field\FieldDefinition|\PHPUnit_Framework_MockObject_MockObject
+   * @return \Drupal\Core\Field\BaseFieldDefinition|\PHPUnit_Framework_MockObject_MockObject
    *   A field definition object.
    */
   protected function setUpEntityWithFieldDefinition($custom_invoke_all = FALSE, $field_definition_id = 'id') {
@@ -742,7 +742,7 @@ protected function setUpEntityWithFieldDefinition($custom_invoke_all = FALSE, $f
       ->method('isSubclassOf')
       ->with($this->equalTo('\Drupal\Core\Entity\ContentEntityInterface'))
       ->will($this->returnValue(TRUE));
-    $field_definition = $this->getMockBuilder('Drupal\Core\Field\FieldDefinition')
+    $field_definition = $this->getMockBuilder('Drupal\Core\Field\BaseFieldDefinition')
       ->disableOriginalConstructor()
       ->getMock();
     $entity_class::$baseFieldDefinitions = array(
@@ -1080,7 +1080,7 @@ public function testGetFieldMap() {
 
 
     // Define an ID field definition as a base field.
-    $id_definition = $this->getMockBuilder('Drupal\Core\Field\FieldDefinition')
+    $id_definition = $this->getMockBuilder('Drupal\Core\Field\BaseFieldDefinition')
       ->disableOriginalConstructor()
       ->getMock();
     $id_definition->expects($this->exactly(2))
@@ -1092,7 +1092,7 @@ public function testGetFieldMap() {
     $entity_class::$baseFieldDefinitions = $base_field_definitions;
 
     // Set up a by bundle field definition that only exists on one bundle.
-    $bundle_definition = $this->getMockBuilder('Drupal\Core\Field\FieldDefinition')
+    $bundle_definition = $this->getMockBuilder('Drupal\Core\Field\BaseFieldDefinition')
       ->disableOriginalConstructor()
       ->getMock();
     $bundle_definition->expects($this->once())
@@ -1210,7 +1210,7 @@ public function testGetFieldMapByFieldType() {
 
 
     // Define an ID field definition as a base field.
-    $id_definition = $this->getMockBuilder('Drupal\Core\Field\FieldDefinition')
+    $id_definition = $this->getMockBuilder('Drupal\Core\Field\BaseFieldDefinition')
       ->disableOriginalConstructor()
       ->getMock();
     $id_definition->expects($this->exactly(2))
@@ -1222,7 +1222,7 @@ public function testGetFieldMapByFieldType() {
     $entity_class::$baseFieldDefinitions = $base_field_definitions;
 
     // Set up a by bundle field definition that only exists on one bundle.
-    $bundle_definition = $this->getMockBuilder('Drupal\Core\Field\FieldDefinition')
+    $bundle_definition = $this->getMockBuilder('Drupal\Core\Field\BaseFieldDefinition')
       ->disableOriginalConstructor()
       ->getMock();
     $bundle_definition->expects($this->once())
diff --git a/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php
deleted file mode 100644
index e206077..0000000
--- a/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\Core\Entity\FieldDefinitionTest.
- */
-
-namespace Drupal\Tests\Core\Entity;
-
-use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\Field\FieldDefinition;
-use Drupal\Core\Field\FieldStorageDefinitionInterface;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * Unit test for FieldDefinition.
- *
- * @group Entity
- */
-class FieldDefinitionTest extends UnitTestCase {
-
-  /**
-   * A dummy field type name.
-   *
-   * @var string
-   */
-  protected $fieldType;
-
-  /**
-   * A dummy field type definition.
-   *
-   * @var string
-   */
-  protected $fieldTypeDefinition;
-
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    // Mock the field type manager and place it in the container.
-    $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
-
-    $this->fieldType = $this->randomMachineName();
-    $this->fieldTypeDefinition = array(
-      'id' => $this->fieldType,
-      'settings' => array(
-        'some_setting' => 'value 1'
-      ),
-      'instance_settings' => array(
-        'some_instance_setting' => 'value 2',
-      ),
-    );
-
-    $field_type_manager->expects($this->any())
-      ->method('getDefinitions')
-      ->will($this->returnValue(array($this->fieldType => $this->fieldTypeDefinition)));
-    $field_type_manager->expects($this->any())
-      ->method('getDefinition')
-      ->with($this->fieldType)
-      ->will($this->returnValue($this->fieldTypeDefinition));
-    $field_type_manager->expects($this->any())
-      ->method('getDefaultSettings')
-      ->with($this->fieldType)
-      ->will($this->returnValue($this->fieldTypeDefinition['settings']));
-    $field_type_manager->expects($this->any())
-      ->method('getDefaultInstanceSettings')
-      ->with($this->fieldType)
-      ->will($this->returnValue($this->fieldTypeDefinition['instance_settings']));
-
-    $container = new ContainerBuilder();
-    $container->set('plugin.manager.field.field_type', $field_type_manager);
-    \Drupal::setContainer($container);
-  }
-
-  /**
-   * Tests field name methods.
-   */
-  public function testFieldName() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $field_name = $this->randomMachineName();
-    $definition->setName($field_name);
-    $this->assertEquals($field_name, $definition->getName());
-  }
-
-  /**
-   * Tests field label methods.
-   */
-  public function testFieldLabel() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $label = $this->randomMachineName();
-    $definition->setLabel($label);
-    $this->assertEquals($label, $definition->getLabel());
-  }
-
-  /**
-   * Tests field description methods.
-   */
-  public function testFieldDescription() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $description = $this->randomMachineName();
-    $definition->setDescription($description);
-    $this->assertEquals($description, $definition->getDescription());
-  }
-
-  /**
-   * Tests field type methods.
-   */
-  public function testFieldType() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $this->assertEquals($this->fieldType, $definition->getType());
-  }
-
-  /**
-   * Tests field settings methods.
-   */
-  public function testFieldSettings() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $setting = $this->randomMachineName();
-    $value = $this->randomMachineName();
-    $definition->setSetting($setting, $value);
-    $this->assertEquals($value, $definition->getSetting($setting));
-    $default_settings = $this->fieldTypeDefinition['settings'] + $this->fieldTypeDefinition['instance_settings'];
-    $this->assertEquals(array($setting => $value) + $default_settings, $definition->getSettings());
-  }
-
-  /**
-   * Tests the initialization of default field settings.
-   */
-  public function testDefaultFieldSettings() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $expected_settings = $this->fieldTypeDefinition['settings'] + $this->fieldTypeDefinition['instance_settings'];
-    $this->assertEquals($expected_settings, $definition->getSettings());
-    foreach ($expected_settings as $setting => $value) {
-      $this->assertEquals($value, $definition->getSetting($setting));
-    }
-  }
-
-  /**
-   * Tests field default value.
-   */
-  public function testFieldDefaultValue() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $value = $this->randomMachineName();
-    $definition->setDefaultValue($value);
-    $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
-      ->disableOriginalConstructor()
-      ->getMock();
-    // Set the field item list class to be used to avoid requiring the typed
-    // data manager to retrieve it.
-    $definition->setClass('Drupal\Core\Field\FieldItemList');
-    $this->assertEquals($value, $definition->getDefaultValue($entity));
-  }
-
-  /**
-   * Tests field translatable methods.
-   */
-  public function testFieldTranslatable() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $this->assertFalse($definition->isTranslatable());
-    $definition->setTranslatable(TRUE);
-    $this->assertTrue($definition->isTranslatable());
-    $definition->setTranslatable(FALSE);
-    $this->assertFalse($definition->isTranslatable());
-  }
-
-  /**
-   * Tests field revisionable methods.
-   */
-  public function testFieldRevisionable() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $this->assertFalse($definition->isRevisionable());
-    $definition->setRevisionable(TRUE);
-    $this->assertTrue($definition->isRevisionable());
-    $definition->setRevisionable(FALSE);
-    $this->assertFalse($definition->isRevisionable());
-  }
-
-  /**
-   * Tests field cardinality.
-   */
-  public function testFieldCardinality() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $this->assertEquals(1, $definition->getCardinality());
-    $definition->setCardinality(2);
-    $this->assertEquals(2, $definition->getCardinality());
-    $definition->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
-    $this->assertEquals(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, $definition->getCardinality());
-  }
-
-  /**
-   * Tests required.
-   */
-  public function testFieldRequired() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $this->assertFalse($definition->isRequired());
-    $definition->setRequired(TRUE);
-    $this->assertTrue($definition->isRequired());
-    $definition->setRequired(FALSE);
-    $this->assertFalse($definition->isRequired());
-  }
-
-  /**
-   * Tests provider.
-   */
-  public function testFieldProvider() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $provider = $this->randomMachineName();
-    $definition->setProvider($provider);
-    $this->assertEquals($provider, $definition->getProvider());
-  }
-
-  /**
-   * Tests custom storage.
-   */
-  public function testCustomStorage() {
-    $definition = FieldDefinition::create($this->fieldType);
-    $this->assertFalse($definition->hasCustomStorage());
-    $definition->setCustomStorage(TRUE);
-    $this->assertTrue($definition->hasCustomStorage());
-    $definition->setCustomStorage(FALSE);
-    $this->assertFalse($definition->hasCustomStorage());
-  }
-
-}
diff --git a/core/tests/Drupal/Tests/Core/Field/BaseFieldDefinitionTestBase.php b/core/tests/Drupal/Tests/Core/Field/BaseFieldDefinitionTestBase.php
new file mode 100644
index 0000000..a69f98e
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Field/BaseFieldDefinitionTestBase.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Fied\BaseFieldDefinitionTestBase.
+ */
+
+namespace Drupal\Tests\Core\Field;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\Field\FieldTypePluginManager;
+use Drupal\Core\Language\Language;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Provides a test base class for testing field definitions.
+ */
+abstract class BaseFieldDefinitionTestBase extends UnitTestCase {
+
+  /**
+   * The field definition used in this test.
+   *
+   * @var \Drupal\Core\Field\BaseFieldDefinition
+   */
+  protected $definition;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+
+    // getModuleAndPath() returns an array of the module name and directory.
+    list($module_name, $module_dir) = $this->getModuleAndPath();
+
+    $namespaces = new \ArrayObject();
+    $namespaces["Drupal\\$module_name"] = $module_dir . '/src';
+
+    $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
+    $module_handler->expects($this->once())
+      ->method('moduleExists')
+      ->with($module_name)
+      ->will($this->returnValue(TRUE));
+    $plugin_manager = new FieldTypePluginManager(
+      $namespaces,
+      $this->getMock('Drupal\Core\Cache\CacheBackendInterface'),
+      $module_handler
+    );
+
+    $container = new ContainerBuilder();
+    $container->set('plugin.manager.field.field_type', $plugin_manager);
+    // The 'string_translation' service is used by the @Translation annotation.
+    $container->set('string_translation', $this->getStringTranslationStub());
+    \Drupal::setContainer($container);
+
+    $this->definition = BaseFieldDefinition::create($this->getPluginId());
+  }
+
+  /**
+   * Returns the plugin ID of the tested field type.
+   *
+   * @return string
+   *   The plugin ID.
+   */
+  abstract protected function getPluginId();
+
+  /**
+   * Returns the module name and the module directory for the plugin.
+   *
+   * drupal_get_path() cannot be used here, because it is not available in
+   * Drupal PHPUnit tests.
+   *
+   * @return array
+   *   A one-dimensional array containing the following strings:
+   *   - The module name.
+   *   - The module directory, e.g. DRUPAL_CORE . 'core/modules/path'.
+   */
+  abstract protected function getModuleAndPath();
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Field/FieldDefinitionTestBase.php b/core/tests/Drupal/Tests/Core/Field/FieldDefinitionTestBase.php
deleted file mode 100644
index a77cc77..0000000
--- a/core/tests/Drupal/Tests/Core/Field/FieldDefinitionTestBase.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\Tests\Core\Fied\FieldDefinitionTestBase.
- */
-
-namespace Drupal\Tests\Core\Field;
-
-use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\Field\FieldDefinition;
-use Drupal\Core\Field\FieldTypePluginManager;
-use Drupal\Core\Language\Language;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * Provides a test base class for testing field definitions.
- */
-abstract class FieldDefinitionTestBase extends UnitTestCase {
-
-  /**
-   * The field definition used in this test.
-   *
-   * @var \Drupal\Core\Field\FieldDefinition
-   */
-  protected $definition;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-
-    // getModuleAndPath() returns an array of the module name and directory.
-    list($module_name, $module_dir) = $this->getModuleAndPath();
-
-    $namespaces = new \ArrayObject();
-    $namespaces["Drupal\\$module_name"] = $module_dir . '/src';
-
-    $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
-    $module_handler->expects($this->once())
-      ->method('moduleExists')
-      ->with($module_name)
-      ->will($this->returnValue(TRUE));
-    $plugin_manager = new FieldTypePluginManager(
-      $namespaces,
-      $this->getMock('Drupal\Core\Cache\CacheBackendInterface'),
-      $module_handler
-    );
-
-    $container = new ContainerBuilder();
-    $container->set('plugin.manager.field.field_type', $plugin_manager);
-    // The 'string_translation' service is used by the @Translation annotation.
-    $container->set('string_translation', $this->getStringTranslationStub());
-    \Drupal::setContainer($container);
-
-    $this->definition = FieldDefinition::create($this->getPluginId());
-  }
-
-  /**
-   * Returns the plugin ID of the tested field type.
-   *
-   * @return string
-   *   The plugin ID.
-   */
-  abstract protected function getPluginId();
-
-  /**
-   * Returns the module name and the module directory for the plugin.
-   *
-   * drupal_get_path() cannot be used here, because it is not available in
-   * Drupal PHPUnit tests.
-   *
-   * @return array
-   *   A one-dimensional array containing the following strings:
-   *   - The module name.
-   *   - The module directory, e.g. DRUPAL_CORE . 'core/modules/path'.
-   */
-  abstract protected function getModuleAndPath();
-
-}
