diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index 7c9c539..5b50f9a 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -84,54 +84,54 @@ function hook_entity_view_mode_info_alter(&$view_modes) {
 }
 
 /**
- * Describe the bundles for entity types.
+ * Describe the subtypes for entity types.
  *
  * @return array
- *   An associative array of all entity bundles, keyed by the entity
- *   type name, and then the bundle name, with the following keys:
- *   - label: The human-readable name of the bundle.
+ *   An associative array of all entity subtypes, keyed by the entity
+ *   type name, and then the subtype name, with the following keys:
+ *   - label: The human-readable name of the subtype.
  *   - uri_callback: The same as the 'uri_callback' key defined for the entity
- *     type in the EntityManager, but for the bundle only. When determining
+ *     type in the EntityManager, but for the subtype only. When determining
  *     the URI of an entity, if a 'uri_callback' is defined for both the
- *     entity type and the bundle, the one for the bundle is used.
+ *     entity type and the subtype, the one for the subtype is used.
  *   - admin: An array of information that allows Field UI pages to attach
- *     themselves to the existing administration pages for the bundle.
+ *     themselves to the existing administration pages for the subtype.
  *     Elements:
- *     - path: the path of the bundle's main administration page, as defined
- *       in hook_menu(). If the path includes a placeholder for the bundle,
- *       the 'bundle argument', 'bundle helper' and 'real path' keys below
+ *     - path: the path of the subtype's main administration page, as defined
+ *       in hook_menu(). If the path includes a placeholder for the subtype,
+ *       the 'subtype argument', 'subtype helper' and 'real path' keys below
  *       are required.
- *     - bundle argument: The position of the placeholder in 'path', if any.
- *     - real path: The actual path (no placeholder) of the bundle's main
+ *     - subtype argument: The position of the placeholder in 'path', if any.
+ *     - real path: The actual path (no placeholder) of the subtype's main
  *       administration page. This will be used to generate links.
  *     - access callback: As in hook_menu(). 'user_access' will be assumed if
  *       no value is provided.
  *     - access arguments: As in hook_menu().
  *
- * @see entity_get_bundles()
- * @see hook_entity_bundle_info_alter()
+ * @see entity_get_subtypes()
+ * @see hook_entity_subtype_info_alter()
  */
-function hook_entity_bundle_info() {
-  $bundles['user']['user'] = array(
+function hook_entity_subtype_info() {
+  $subtypes['user']['user'] = array(
     'label' => t('User'),
     'admin' => array(
       'path' => 'admin/config/people/accounts',
     ),
   );
-  return $bundles;
+  return $subtypes;
 }
 
 /**
- * Alter the bundles for entity types.
+ * Alter the subtypes for entity types.
  *
- * @param array $bundles
- *   An array of bundles, keyed first by entity type, then by bundle name.
+ * @param array $subtypes
+ *   An array of subtypes, keyed first by entity type, then by subtype name.
  *
- * @see entity_get_bundles()
- * @see hook_entity_bundle_info()
+ * @see entity_get_subtypes()
+ * @see hook_entity_subtype_info()
  */
-function hook_entity_bundle_info_alter(&$bundles) {
-  $bundles['user']['user']['label'] = t('Full account');
+function hook_entity_subtype_info_alter(&$subtypes) {
+  $subtypes['user']['user']['label'] = t('Full account');
 }
 
 /**
@@ -322,7 +322,7 @@ function hook_entity_query_alter(\Drupal\Core\Entity\Query\QueryInterface $query
 function hook_entity_view(\Drupal\Core\Entity\EntityInterface $entity, \Drupal\entity\Plugin\Core\Entity\EntityDisplay $display, $view_mode, $langcode) {
   // Only do the extra work if the component is configured to be displayed.
   // This assumes a 'mymodule_addition' extra field has been defined for the
-  // entity bundle in hook_field_extra_fields().
+  // entity subtype in hook_field_extra_fields().
   if ($display->getComponent('mymodule_addition')) {
     $entity->content['mymodule_addition'] = array(
       '#markup' => mymodule_addition($entity),
@@ -381,7 +381,7 @@ function hook_entity_view_alter(&$build, Drupal\Core\Entity\EntityInterface $ent
  *   The entities keyed by entity ID.
  * @param array $display
  *   The array of entity_display objects holding the display options configured
- *   for the entity components, keyed by bundle name.
+ *   for the entity components, keyed by subtype name.
  * @param string $view_mode
  *   The view mode.
  */
@@ -390,10 +390,10 @@ function hook_entity_prepare_view($entity_type, array $entities, array $displays
   if (!empty($entities) && $entity_type == 'user') {
     // Only do the extra work if the component is configured to be
     // displayed. This assumes a 'mymodule_addition' extra field has been
-    // defined for the entity bundle in hook_field_extra_fields().
+    // defined for the entity subtype in hook_field_extra_fields().
     $ids = array();
     foreach ($entities as $id => $entity) {
-      if ($displays[$entity->bundle()]->getComponent('mymodule_addition')) {
+      if ($displays[$entity->subtype()]->getComponent('mymodule_addition')) {
         $ids[] = $id;
       }
     }
@@ -433,7 +433,7 @@ function hook_entity_view_mode_alter(&$view_mode, Drupal\Core\Entity\EntityInter
  * @param array $context
  *   An associative array containing:
  *   - entity_type: The entity type, e.g., 'node' or 'user'.
- *   - bundle: The bundle, e.g., 'page' or 'article'.
+ *   - subtype: The subtype, e.g., 'page' or 'article'.
  *   - view_mode: The view mode, e.g. 'full', 'teaser'...
  */
 function hook_entity_display_alter(\Drupal\entity\Plugin\Core\Entity\EntityDisplay $display, array $context) {
@@ -462,9 +462,9 @@ function hook_entity_display_alter(\Drupal\entity\Plugin\Core\Entity\EntityDispl
  *     keys in property definitions.
  *   - optional: An array of property definitions for optional properties keyed
  *     by property name. Optional properties are properties that only exist for
- *     certain bundles of the entity type.
- *   - bundle map: An array keyed by bundle name containing the names of
- *     optional properties that entities of this bundle have.
+ *     certain subtypes of the entity type.
+ *   - subtype map: An array keyed by subtype name containing the names of
+ *     optional properties that entities of this subtype have.
  *
  * @see Drupal\Core\TypedData\TypedDataManager::create()
  * @see hook_entity_field_info_alter()
@@ -482,7 +482,7 @@ function hook_entity_field_info($entity_type) {
       'class' => '\Drupal\mymodule\EntityComputedText',
     );
     if ($entity_type == 'node') {
-      // Add a property only to entities of the 'article' bundle.
+      // Add a property only to entities of the 'article' subtype.
       $info['optional']['mymodule_text_more'] = array(
         'type' => 'string_item',
         'list' => TRUE,
@@ -490,7 +490,7 @@ function hook_entity_field_info($entity_type) {
         'computed' => TRUE,
         'class' => '\Drupal\mymodule\EntityComputedMoreText',
       );
-      $info['bundle map']['article'][0] = 'mymodule_text_more';
+      $info['subtype map']['article'][0] = 'mymodule_text_more';
     }
     return $info;
   }
diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 708706e..478177a 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -40,46 +40,46 @@ function entity_get_info($entity_type = NULL) {
  */
 function entity_info_cache_clear() {
   drupal_static_reset('entity_get_view_modes');
-  drupal_static_reset('entity_get_bundles');
+  drupal_static_reset('entity_get_subtypes');
   // Clear all languages.
   drupal_container()->get('plugin.manager.entity')->clearCachedDefinitions();
 }
 
 /**
- * Returns the entity bundle info.
+ * Returns the entity subtype info.
  *
  * @param string|null $entity_type
- *   The entity type whose bundle info should be returned, or NULL for all
- *   bundles info. Defaults to NULL.
+ *   The entity type whose subtype info should be returned, or NULL for all
+ *   subtypes info. Defaults to NULL.
  *
  * @return array
- *   The bundle info for a specific entity type, or all entity types.
+ *   The subtype info for a specific entity type, or all entity types.
  */
-function entity_get_bundles($entity_type = NULL) {
-  $bundles = &drupal_static(__FUNCTION__);
-  if (!$bundles) {
+function entity_get_subtypes($entity_type = NULL) {
+  $subtypes = &drupal_static(__FUNCTION__);
+  if (!$subtypes) {
     $langcode = language(LANGUAGE_TYPE_INTERFACE)->langcode;
-    if ($cache = cache()->get("entity_bundle_info:$langcode")) {
-      $bundles = $cache->data;
+    if ($cache = cache()->get("entity_subtype_info:$langcode")) {
+      $subtypes = $cache->data;
     }
     else {
-      $bundles = module_invoke_all('entity_bundle_info');
-      // If no bundles are provided, use the entity type name and label.
+      $subtypes = module_invoke_all('entity_subtype_info');
+      // If no subtypes are provided, use the entity type name and label.
       foreach (entity_get_info() as $type => $entity_info) {
-        if (!isset($bundles[$type])) {
-          $bundles[$type][$type]['label'] = $entity_info['label'];
+        if (!isset($subtypes[$type])) {
+          $subtypes[$type][$type]['label'] = $entity_info['label'];
         }
       }
-      drupal_alter('entity_bundle_info', $bundles);
-      cache()->set("entity_bundle_info:$langcode", $bundles, CacheBackendInterface::CACHE_PERMANENT, array('entity_info' => TRUE));
+      drupal_alter('entity_subtype_info', $subtypes);
+      cache()->set("entity_subtype_info:$langcode", $subtypes, CacheBackendInterface::CACHE_PERMANENT, array('entity_info' => TRUE));
     }
   }
 
   if (empty($entity_type)) {
-    return $bundles;
+    return $subtypes;
   }
-  elseif (isset($bundles[$entity_type])) {
-    return $bundles[$entity_type];
+  elseif (isset($subtypes[$entity_type])) {
+    return $subtypes[$entity_type];
   }
 
   return array();
@@ -323,7 +323,7 @@ function entity_delete_multiple($entity_type, array $ids) {
  *   The type of the entity.
  * @param $values
  *   An array of values to set, keyed by property name. If the entity type has
- *   bundles the bundle key has to be specified.
+ *   subtypes the subtype key has to be specified.
  *
  * @return Drupal\Core\Entity\EntityInterface
  *   A new entity object.
@@ -425,10 +425,10 @@ function entity_form_controller($entity_type, $operation = 'default') {
  */
 function entity_form_id(EntityInterface $entity, $operation = 'default') {
   $entity_type = $entity->entityType();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
   $form_id = $entity_type;
-  if ($bundle != $entity_type) {
-    $form_id = $bundle . '_' . $form_id;
+  if ($subtype != $entity_type) {
+    $form_id = $subtype . '_' . $form_id;
   }
   if ($operation != 'default') {
     $form_id = $form_id . '_' . $operation;
@@ -527,7 +527,7 @@ function entity_form_submit_build_entity($entity_type, $entity, $form, &$form_st
   // without changing existing entity properties that are not being edited by
   // this form. Copying field values must be done using
   // field_attach_extract_form_values().
-  $values_excluding_fields = $info['fieldable'] ? array_diff_key($form_state['values'], field_info_instances($entity_type, $entity->bundle())) : $form_state['values'];
+  $values_excluding_fields = $info['fieldable'] ? array_diff_key($form_state['values'], field_info_instances($entity_type, $entity->subtype())) : $form_state['values'];
   foreach ($values_excluding_fields as $key => $value) {
     $entity->set($key, $value);
   }
@@ -619,16 +619,16 @@ function entity_view_multiple(array $entities, $view_mode, $langcode = NULL) {
 }
 
 /**
- * Returns the entity_display object associated to a bundle and view mode.
+ * Returns the entity_display object associated to a subtype and view mode.
  *
  * Use this function when assigning suggested display options for a component
  * in a given view mode. Note that they will only be actually used at render
  * time if the view mode itself is configured to use dedicated display settings
- * for the bundle; if not, the 'default' display is used instead.
+ * for the subtype; if not, the 'default' display is used instead.
  *
  * The function reads the entity_display object from the current configuration,
  * or returns a ready-to-use empty one if configuration entry exists yet for
- * this bundle and view mode. This streamlines manipulation of display objects
+ * this subtype and view mode. This streamlines manipulation of display objects
  * by always returning a consistent object that reflects the current state of
  * the configuration.
  *
@@ -648,28 +648,28 @@ function entity_view_multiple(array $entities, $view_mode, $langcode = NULL) {
  *
  * @param string $entity_type
  *   The entity type.
- * @param string $bundle
- *   The bundle.
+ * @param string $subtype
+ *   The subtype.
  * @param string $view_mode
  *   The view mode, or 'default' to retrieve the 'default' display object for
- *   this bundle.
+ *   this subtype.
  *
  * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay
  *   The display object associated to the view mode.
  */
-function entity_get_display($entity_type, $bundle, $view_mode) {
+function entity_get_display($entity_type, $subtype, $view_mode) {
   // Try loading the display from configuration.
-  $display = entity_load('entity_display', $entity_type . '.' . $bundle . '.' . $view_mode);
+  $display = entity_load('entity_display', $entity_type . '.' . $subtype . '.' . $view_mode);
 
   // If not found, create a fresh display object. We do not preemptively create
   // new entity_display configuration entries for each existing entity type and
-  // bundle whenever a new view mode becomes available. Instead, configuration
+  // subtype whenever a new view mode becomes available. Instead, configuration
   // entries are only created when a display object is explicitly configured
   // and saved.
   if (!$display) {
     $display = entity_create('entity_display', array(
       'targetEntityType' => $entity_type,
-      'bundle' => $bundle,
+      'subtype' => $subtype,
       'viewMode' => $view_mode,
     ));
   }
@@ -680,7 +680,7 @@ function entity_get_display($entity_type, $bundle, $view_mode) {
 /**
  * Returns the entity_display object used to render an entity.
  *
- * Depending on the configuration of the view mode for the bundle, this can be
+ * Depending on the configuration of the view mode for the subtype, this can be
  * either the display object associated to the view mode, or the 'default'
  * display.
  *
@@ -703,15 +703,15 @@ function entity_get_display($entity_type, $bundle, $view_mode) {
  */
 function entity_get_render_display(EntityInterface $entity, $view_mode) {
   $entity_type = $entity->entityType();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
 
   // Determine the display to use for rendering this entity. Depending on the
-  // configuration of the view mode for this bundle, this will be either the
+  // configuration of the view mode for this subtype, this will be either the
   // display associated to the view mode, or the 'default' display.
-  $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+  $view_mode_settings = field_view_mode_settings($entity_type, $subtype);
   $render_view_mode = !empty($view_mode_settings[$view_mode]['custom_settings']) ? $view_mode : 'default';
 
-  $display = entity_get_display($entity_type, $bundle, $render_view_mode);
+  $display = entity_get_display($entity_type, $subtype, $render_view_mode);
   $display->originalViewMode = $view_mode;
 
   return $display;
@@ -769,7 +769,7 @@ function entity_page_access(EntityInterface $entity, $operation = 'view') {
 /**
  * Generic access callback for create entity pages.
  *
- * Some entity types might have create access per bundle or something else.
+ * Some entity types might have create access per subtype or something else.
  * In that case you have to create a custom access callback.
  *
  * @param string $entity_type
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index 1c7d9fd..6481517 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -56,7 +56,7 @@ class DatabaseStorageController implements EntityStorageControllerInterface {
   protected $entityFieldInfo;
 
   /**
-   * Static cache of field definitions per bundle.
+   * Static cache of field definitions per subtype.
    *
    * @var array
    */
@@ -682,11 +682,11 @@ public function getFieldDefinitions(array $constraints) {
     if (!isset($this->entityFieldInfo)) {
       $this->entityFieldInfo = array(
         'definitions' => $this->baseFieldDefinitions(),
-        // Contains definitions of optional (per-bundle) fields.
+        // Contains definitions of optional (per-subtype) fields.
         'optional' => array(),
-        // An array keyed by bundle name containing the optional fields added by
-        // the bundle.
-        'bundle map' => array(),
+        // An array keyed by subtype name containing the optional fields added by
+        // the subtype.
+        'subtype map' => array(),
       );
 
       // Invoke hooks.
@@ -707,17 +707,17 @@ public function getFieldDefinitions(array $constraints) {
       }
     }
 
-    $bundle = !empty($constraints['Bundle']) ? $constraints['Bundle'] : FALSE;
+    $subtype = !empty($constraints['Subtype']) ? $constraints['Subtype'] : FALSE;
 
-    // Add in per-bundle fields.
-    if (!isset($this->fieldDefinitions[$bundle])) {
-      $this->fieldDefinitions[$bundle] = $this->entityFieldInfo['definitions'];
+    // Add in per-subtype fields.
+    if (!isset($this->fieldDefinitions[$subtype])) {
+      $this->fieldDefinitions[$subtype] = $this->entityFieldInfo['definitions'];
 
-      if ($bundle && isset($this->entityFieldInfo['bundle map'][$bundle])) {
-        $this->fieldDefinitions[$bundle] += array_intersect_key($this->entityFieldInfo['optional'], array_flip($this->entityFieldInfo['bundle map'][$bundle]));
+      if ($subtype && isset($this->entityFieldInfo['subtype map'][$subtype])) {
+        $this->fieldDefinitions[$subtype] += array_intersect_key($this->entityFieldInfo['optional'], array_flip($this->entityFieldInfo['subtype map'][$subtype]));
       }
     }
-    return $this->fieldDefinitions[$bundle];
+    return $this->fieldDefinitions[$subtype];
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
index e8998f8..69912c1 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
@@ -35,11 +35,11 @@ class DatabaseStorageControllerNG extends DatabaseStorageController {
   protected $entityClass;
 
   /**
-   * The entity bundle key.
+   * The entity subtype key.
    *
    * @var string|bool
    */
-  protected $bundleKey;
+  protected $subtypeKey;
 
   /**
    * The table that stores properties, if the entity has multilingual support.
@@ -53,7 +53,7 @@ class DatabaseStorageControllerNG extends DatabaseStorageController {
    */
   public function __construct($entityType) {
     parent::__construct($entityType);
-    $this->bundleKey = !empty($this->entityInfo['entity_keys']['bundle']) ? $this->entityInfo['entity_keys']['bundle'] : FALSE;
+    $this->subtypeKey = !empty($this->entityInfo['entity_keys']['subtype']) ? $this->entityInfo['entity_keys']['subtype'] : FALSE;
     $this->entityClass = $this->entityInfo['class'];
 
     // Check if the entity type has a dedicated table for properties.
@@ -95,9 +95,9 @@ public function __construct($entityType) {
    *   A new entity object.
    */
   public function create(array $values) {
-    // We have to determine the bundle first.
-    $bundle = $this->bundleKey ? $values[$this->bundleKey] : FALSE;
-    $entity = new $this->entityClass(array(), $this->entityType, $bundle);
+    // We have to determine the subtype first.
+    $subtype = $this->subtypeKey ? $values[$this->subtypeKey] : FALSE;
+    $entity = new $this->entityClass(array(), $this->entityType, $subtype);
 
     // Set all other given values.
     foreach ($values as $name => $value) {
@@ -205,9 +205,9 @@ protected function mapFromStorageRecords(array $records, $load_revision = FALSE)
         // saves memory here.
         $values[$name][LANGUAGE_DEFAULT] = $value;
       }
-      $bundle = $this->bundleKey ? $record->{$this->bundleKey} : FALSE;
+      $subtype = $this->subtypeKey ? $record->{$this->subtypeKey} : FALSE;
       // Turn the record into an entity class.
-      $entities[$id] = new $this->entityClass($values, $this->entityType, $bundle);
+      $entities[$id] = new $this->entityClass($values, $this->entityType, $subtype);
     }
     $this->attachPropertyData($entities, $load_revision);
     return $entities;
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index fe00ef3..990ba5c 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -62,7 +62,7 @@ class Entity implements IteratorAggregate, EntityInterface {
    *
    * @param array $values
    *   An array of values to set, keyed by property name. If the entity type
-   *   has bundles, the bundle key has to be specified.
+   *   has subtypes, the subtype key has to be specified.
    * @param string $entity_type
    *   The type of the entity to create.
    */
@@ -125,9 +125,9 @@ public function entityType() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::bundle().
+   * Implements \Drupal\Core\Entity\EntityInterface::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return $this->entityType;
   }
 
@@ -150,13 +150,13 @@ public function label($langcode = NULL) {
    * Implements \Drupal\Core\Entity\EntityInterface::uri().
    */
   public function uri() {
-    $bundle = $this->bundle();
-    // A bundle-specific callback takes precedence over the generic one for the
+    $subtype = $this->subtype();
+    // A subtype-specific callback takes precedence over the generic one for the
     // entity type.
     $entity_info = $this->entityInfo();
-    $bundles = entity_get_bundles($this->entityType);
-    if (isset($bundles[$bundle]['uri_callback'])) {
-      $uri_callback = $bundles[$bundle]['uri_callback'];
+    $subtypes = entity_get_subtypes($this->entityType);
+    if (isset($subtypes[$subtype]['uri_callback'])) {
+      $uri_callback = $subtypes[$subtype]['uri_callback'];
     }
     elseif (isset($entity_info['uri_callback'])) {
       $uri_callback = $entity_info['uri_callback'];
@@ -309,7 +309,7 @@ public function getTranslationLanguages($include_default = TRUE) {
     if ($entity_info['fieldable']) {
       // Go through translatable properties and determine all languages for
       // which translated values are available.
-      foreach (field_info_instances($this->entityType, $this->bundle()) as $field_name => $instance) {
+      foreach (field_info_instances($this->entityType, $this->subtype()) as $field_name => $instance) {
         $field = field_info_field($field_name);
         if (field_is_translatable($this->entityType, $field) && isset($this->$field_name)) {
           foreach (array_filter($this->$field_name) as $langcode => $value)  {
diff --git a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
index 57215cb..f35f0eb 100644
--- a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
+++ b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
@@ -284,8 +284,8 @@ public function entityType() {
   /**
    * Forwards the call to the decorated entity.
    */
-  public function bundle() {
-    return $this->decorated->bundle();
+  public function subtype() {
+    return $this->decorated->subtype();
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 4a03975..f609b0e 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -285,7 +285,7 @@ protected function submitEntityLanguage(array $form, array &$form_state) {
       // in this case it is not supposed to change.
       $current_langcode = $entity->language()->langcode == $form_langcode ? $form_state['values']['langcode'] : $form_langcode;
 
-      foreach (field_info_instances($entity_type, $entity->bundle()) as $instance) {
+      foreach (field_info_instances($entity_type, $entity->subtype()) as $instance) {
         $field_name = $instance['field_name'];
         $field = field_info_field($field_name);
         $previous_langcode = $form[$field_name]['#language'];
diff --git a/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php b/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php
index ef9bc89..2a26a0e 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormControllerNG.php
@@ -74,7 +74,7 @@ public function buildEntity(array $form, array &$form_state) {
     // field API without changing existing entity fields that are not being
     // edited by this form. Values of fields handled by field API are copied
     // by field_attach_extract_form_values() below.
-    $values_excluding_fields = $info['fieldable'] ? array_diff_key($form_state['values'], field_info_instances($entity_type, $entity->bundle())) : $form_state['values'];
+    $values_excluding_fields = $info['fieldable'] ? array_diff_key($form_state['values'], field_info_instances($entity_type, $entity->subtype())) : $form_state['values'];
     $translation = $entity->getTranslation($this->getFormLangcode($form_state), FALSE);
     $definitions = $translation->getPropertyDefinitions();
     foreach ($values_excluding_fields as $key => $value) {
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index 34038e9..f83de0a 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -106,13 +106,13 @@ public function enforceIsNew($value = TRUE);
   public function entityType();
 
   /**
-   * Returns the bundle of the entity.
+   * Returns the subtype of the entity.
    *
    * @return
-   *   The bundle of the entity. Defaults to the entity type if the entity type
-   *   does not make use of different bundles.
+   *   The subtype of the entity. Defaults to the entity type if the entity type
+   *   does not make use of different subtypes.
    */
-  public function bundle();
+  public function subtype();
 
   /**
    * Returns the label of the entity.
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index a0d7c03..1019974 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -45,7 +45,7 @@
  *   multiple entity forms when the forms are similar. Defaults to
  *   Drupal\Core\Entity\EntityFormController.
  * - label: The human-readable name of the type.
- * - bundle_label: The human-readable name of the entity bundles, e.g.
+ * - subtype_label: The human-readable name of the entity subtypes, e.g.
  *   Vocabulary.
  * - label_callback: (optional) A function taking an entity and optional
  *   langcode argument, and returning the label of the entity. If langcode is
@@ -89,12 +89,12 @@
  *     revision ID of the entity. The Field API assumes that all revision IDs
  *     are unique across all entities of a type. This entry can be omitted if
  *     the entities of this type are not versionable.
- *   - bundle: (optional) The name of the property that contains the bundle
- *     name for the entity. The bundle name defines which set of fields are
+ *   - subtype: (optional) The name of the property that contains the subtype
+ *     name for the entity. The subtype name defines which set of fields are
  *     attached to the entity (e.g. what nodes call "content type"). This
- *     entry can be omitted if this entity type exposes a single bundle (such
+ *     entry can be omitted if this entity type exposes a single subtype (such
  *     that all entities have the same collection of fields). The name of
- *     this single bundle will be the same as the entity type.
+ *     this single subtype will be the same as the entity type.
  *   - label: The name of the property that contains the entity label. For
  *     example, if the entity's label is located in $entity->subject, then
  *     'subject' should be specified here. If complex logic is required to
@@ -103,12 +103,12 @@
  *   - uuid (optional): The name of the property that contains the universally
  *     unique identifier of the entity, which is used to distinctly identify
  *     an entity across different systems.
- * - bundle_keys: An array describing how the Field API can extract the
- *   information it needs from the bundle objects for this type (e.g
+ * - subtype_keys: An array describing how the Field API can extract the
+ *   information it needs from the subtype objects for this type (e.g
  *   Vocabulary objects for terms; not applicable for nodes). This entry can
- *   be omitted if this type's bundles do not exist as standalone objects.
+ *   be omitted if this type's subtypes do not exist as standalone objects.
  *   Elements:
- *   - bundle: The name of the property that contains the name of the bundle
+ *   - subtype: The name of the property that contains the name of the subtype
  *     object.
  * - menu_base_path: (optional) The base menu router path to which the entity
  *   administration user interface responds. It can be used to generate UI
@@ -122,8 +122,8 @@
  *   router path.
  * - permission_granularity: (optional) Specifies whether a module exposing
  *   permissions for the current entity type should use entity-type level
- *   granularity, bundle level granularity or just skip this entity. The allowed
- *   values are respectively "entity_type", "bundle" or FALSE. Defaults to
+ *   granularity, subtype level granularity or just skip this entity. The allowed
+ *   values are respectively "entity_type", "subtype" or FALSE. Defaults to
  *   "entity_type".
  *
  * The defaults for the plugin definition are provided in
@@ -152,7 +152,7 @@ class EntityManager extends PluginManagerBase {
     'controller_class' => 'Drupal\Core\Entity\DatabaseStorageController',
     'entity_keys' => array(
       'revision' => '',
-      'bundle' => '',
+      'subtype' => '',
     ),
     'fieldable' => FALSE,
     'field_cache' => TRUE,
diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index 8763f6d..b8530c4 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -28,11 +28,11 @@
 class EntityNG extends Entity {
 
   /**
-   * Local cache holding the value of the bundle field.
+   * Local cache holding the value of the subtype field.
    *
    * @var string
    */
-  protected $bundle;
+  protected $subtype;
 
   /**
    * The plain data values of the contained fields.
@@ -77,9 +77,9 @@ class EntityNG extends Entity {
   /**
    * Overrides Entity::__construct().
    */
-  public function __construct(array $values, $entity_type, $bundle = FALSE) {
+  public function __construct(array $values, $entity_type, $subtype = FALSE) {
     $this->entityType = $entity_type;
-    $this->bundle = $bundle ? $bundle : $this->entityType;
+    $this->subtype = $subtype ? $subtype : $this->entityType;
     foreach ($values as $key => $value) {
       $this->values[$key] = $value;
     }
@@ -118,10 +118,10 @@ public function id() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::bundle().
+   * Implements \Drupal\Core\Entity\EntityInterface::subtype().
    */
-  public function bundle() {
-    return $this->bundle;
+  public function subtype() {
+    return $this->subtype;
   }
 
   /**
@@ -220,7 +220,7 @@ public function getPropertyDefinitions() {
     if (!isset($this->fieldDefinitions)) {
       $this->fieldDefinitions = drupal_container()->get('plugin.manager.entity')->getStorageController($this->entityType)->getFieldDefinitions(array(
         'EntityType' => $this->entityType,
-        'Bundle' => $this->bundle,
+        'Subtype' => $this->subtype,
       ));
     }
     return $this->fieldDefinitions;
@@ -308,7 +308,7 @@ public function getTranslation($langcode, $strict = TRUE) {
       'type' => 'entity_translation',
       'constraints' => array(
         'entity type' => $this->entityType(),
-        'bundle' => $this->bundle(),
+        'subtype' => $this->subtype(),
       ),
     );
     $translation = typed_data()->create($translation_definition, $fields);
diff --git a/core/lib/Drupal/Core/Entity/EntityRenderController.php b/core/lib/Drupal/Core/Entity/EntityRenderController.php
index 53457aa..66b6057 100644
--- a/core/lib/Drupal/Core/Entity/EntityRenderController.php
+++ b/core/lib/Drupal/Core/Entity/EntityRenderController.php
@@ -36,7 +36,7 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang
       $entity->content = array(
         '#view_mode' => $view_mode,
       );
-      $entity->content += field_attach_view($entity, $displays[$entity->bundle()], $langcode);
+      $entity->content += field_attach_view($entity, $displays[$entity->subtype()], $langcode);
     }
   }
 
@@ -102,7 +102,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
     $displays = array();
     $context = array('langcode' => $langcode);
     foreach ($entities as $entity) {
-      $bundle = $entity->bundle();
+      $subtype = $entity->subtype();
 
       // Allow modules to change the view mode.
       $entity_view_mode = $view_mode;
@@ -111,19 +111,19 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
       $view_modes[$entity_view_mode][$entity->id()] = $entity;
 
       // Load the corresponding display settings if not stored yet.
-      if (!isset($displays[$entity_view_mode][$bundle])) {
-        // Get the display object for this bundle and view mode.
+      if (!isset($displays[$entity_view_mode][$subtype])) {
+        // Get the display object for this subtype and view mode.
         $display = entity_get_render_display($entity, $entity_view_mode);
 
         // Let modules alter the display.
         $display_context = array(
           'entity_type' => $this->entityType,
-          'bundle' => $bundle,
+          'subtype' => $subtype,
           'view_mode' => $entity_view_mode,
         );
         drupal_alter('entity_display', $display, $display_context);
 
-        $displays[$entity_view_mode][$bundle] = $display;
+        $displays[$entity_view_mode][$subtype] = $display;
       }
     }
 
@@ -136,7 +136,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
     $weight = 0;
     foreach ($entities as $key => $entity) {
       $entity_view_mode = isset($entity->content['#view_mode']) ? $entity->content['#view_mode'] : $view_mode;
-      $display = $displays[$entity_view_mode][$entity->bundle()];
+      $display = $displays[$entity_view_mode][$entity->subtype()];
       module_invoke_all($view_hook, $entity, $display, $entity_view_mode, $langcode);
       module_invoke_all('entity_view', $entity, $display, $entity_view_mode, $langcode);
 
diff --git a/core/lib/Drupal/Core/Entity/EntityRenderControllerInterface.php b/core/lib/Drupal/Core/Entity/EntityRenderControllerInterface.php
index 03ba014..7f9f31c 100644
--- a/core/lib/Drupal/Core/Entity/EntityRenderControllerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityRenderControllerInterface.php
@@ -19,7 +19,7 @@
    *   The entities, implementing EntityInterface, whose content is being built.
    * @param array $displays
    *   The array of entity_display objects holding the display options
-   *   configured for the entity components, keyed by bundle name.
+   *   configured for the entity components, keyed by subtype name.
    * @param string $view_mode
    *   The view mode in which the entity is being viewed.
    * @param string $langcode
diff --git a/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php b/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php
index 4ac5d9a..aa1b38f 100644
--- a/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php
@@ -92,7 +92,7 @@ public function loadByProperties(array $values = array());
    *
    * @param $values
    *   An array of values to set, keyed by property name. If the entity type has
-   *   bundles the bundle key has to be specified.
+   *   subtypes the subtype key has to be specified.
    *
    * @return \Drupal\Core\Entity\EntityInterface
    *   A new entity object.
@@ -128,19 +128,19 @@ public function save(EntityInterface $entity);
   /**
    * Gets an array of entity field definitions.
    *
-   * If a 'bundle' key is present in the given entity definition, fields
-   * specific to this bundle are included.
+   * If a 'subtype' key is present in the given entity definition, fields
+   * specific to this subtype are included.
    * Entity fields are always multi-valued, so 'list' is TRUE for each
    * returned field definition.
    *
    * @param array $constraints
    *   An array of entity constraints as used for entities in typed data
    *   definitions, i.e. an array having an 'entity type' and optionally a
-   *   'bundle' key. For example:
+   *   'subtype' key. For example:
    *   @code
    *   array(
    *     'EntityType' => 'node',
-   *     'Bundle' => 'article',
+   *     'Subtype' => 'article',
    *   )
    *   @endcode
    *
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
index 691868d..6d64992 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
@@ -31,7 +31,7 @@
  *
  * Supported constraints (below the definition's 'constraints' key) are:
  *  - EntityType: The entity type.
- *  - Bundle: The bundle or an array of possible bundles.
+ *  - Subtype: The subtype or an array of possible subtypes.
  *
  * Supported settings (below the definition's 'settings' key) are:
  *  - id source: If used as computed property, the ID property used to load
@@ -169,7 +169,7 @@ public function getPropertyDefinition($name) {
    * Implements \Drupal\Core\TypedData\ComplexDataInterface::getPropertyDefinitions().
    */
   public function getPropertyDefinitions() {
-    // @todo: Support getting definitions if multiple bundles are specified.
+    // @todo: Support getting definitions if multiple subtypes are specified.
     return drupal_container()->get('plugin.manager.entity')->getStorageController($this->entityType)->getFieldDefinitions($this->definition['constraints']);
   }
 
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/BundleConstraint.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/BundleConstraint.php
deleted file mode 100644
index 3884a1b..0000000
--- a/core/lib/Drupal/Core/Plugin/Validation/Constraint/BundleConstraint.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Validation\Constraint\BundleConstraint.
- */
-
-namespace Drupal\Core\Plugin\Validation\Constraint;
-
-use Symfony\Component\Validator\Constraint;
-use Drupal\Component\Annotation\Plugin;
-use Drupal\Core\Annotation\Translation;
-
-
-/**
- * Checks if a value is a valid entity type.
- *
- * @todo: Move this below the entity core component.
- *
- * @Plugin(
- *   id = "Bundle",
- *   label = @Translation("Bundle", context = "Validation"),
- *   type = "entity"
- * )
- */
-class BundleConstraint extends Constraint {
-
-  /**
-   * The default violation message.
-   *
-   * @var string
-   */
-  public $message = 'The entity must be of bundle %bundle.';
-
-  /**
-   * The bundle option.
-   *
-   * @var string|array
-   */
-  public $bundle;
-
-  /**
-   * Gets the bundle option as array.
-   *
-   * @return array
-   */
-  public function getBundleOption() {
-    // Support passing the bundle as string, but force it to be an array.
-    if (!is_array($this->bundle)) {
-      $this->bundle = array($this->bundle);
-    }
-    return $this->bundle;
-  }
-
-  /**
-   * Overrides Constraint::getDefaultOption().
-   */
-  public function getDefaultOption() {
-    return 'bundle';
-  }
-
-  /**
-   * Overrides Constraint::getRequiredOptions().
-   */
-  public function getRequiredOptions() {
-    return array('bundle');
-  }
-}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/BundleConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/BundleConstraintValidator.php
deleted file mode 100644
index d649ccf..0000000
--- a/core/lib/Drupal/Core/Plugin/Validation/Constraint/BundleConstraintValidator.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Plugin\Validation\Constraint\BundleConstraintValidator.
- */
-
-namespace Drupal\Core\Plugin\Validation\Constraint;
-
-use Symfony\Component\Validator\Constraint;
-use Symfony\Component\Validator\ConstraintValidator;
-
-/**
- * Validates the Bundle constraint.
- */
-class BundleConstraintValidator extends ConstraintValidator {
-
-  /**
-   * Implements \Symfony\Component\Validator\ConstraintValidatorInterface::validate().
-   */
-  public function validate($typed_data, Constraint $constraint) {
-    $entity = isset($typed_data) ? $typed_data->getValue() : FALSE;
-
-    if (!empty($entity) && !in_array($entity->bundle(), $constraint->getBundleOption())) {
-      $this->context->addViolation($constraint->message, array('%bundle', implode(', ', $constraint->getBundleOption())));
-    }
-  }
-}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/SubtypeConstraint.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/SubtypeConstraint.php
new file mode 100644
index 0000000..4f41526
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/SubtypeConstraint.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\Constraint\SubtypeConstraint.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Drupal\Component\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+
+/**
+ * Checks if a value is a valid entity type.
+ *
+ * @todo: Move this below the entity core component.
+ *
+ * @Plugin(
+ *   id = "Subtype",
+ *   label = @Translation("Subtype", context = "Validation"),
+ *   type = "entity"
+ * )
+ */
+class SubtypeConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The entity must be of subtype %subtype.';
+
+  /**
+   * The subtype option.
+   *
+   * @var string|array
+   */
+  public $subtype;
+
+  /**
+   * Gets the subtype option as array.
+   *
+   * @return array
+   */
+  public function getSubtypeOption() {
+    // Support passing the subtype as string, but force it to be an array.
+    if (!is_array($this->subtype)) {
+      $this->subtype = array($this->subtype);
+    }
+    return $this->subtype;
+  }
+
+  /**
+   * Overrides Constraint::getDefaultOption().
+   */
+  public function getDefaultOption() {
+    return 'subtype';
+  }
+
+  /**
+   * Overrides Constraint::getRequiredOptions().
+   */
+  public function getRequiredOptions() {
+    return array('subtype');
+  }
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/SubtypeConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/SubtypeConstraintValidator.php
new file mode 100644
index 0000000..c7a8b4c
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/SubtypeConstraintValidator.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\SubtypeConstraintValidator.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the Subtype constraint.
+ */
+class SubtypeConstraintValidator extends ConstraintValidator {
+
+  /**
+   * Implements \Symfony\Component\Validator\ConstraintValidatorInterface::validate().
+   */
+  public function validate($typed_data, Constraint $constraint) {
+    $entity = isset($typed_data) ? $typed_data->getValue() : FALSE;
+
+    if (!empty($entity) && !in_array($entity->subtype(), $constraint->getSubtypeOption())) {
+      $this->context->addViolation($constraint->message, array('%subtype', implode(', ', $constraint->getSubtypeOption())));
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index 8b5306d..a90c4e1 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -323,12 +323,12 @@ public function createValidationConstraint($name, $options) {
    * @code
    * $constraints = array(
    *   'EntityType' => 'node',
-   *   'Bundle' => 'article',
+   *   'Subtype' => 'article',
    * );
    * @endcode
    *
    * Note that the specified constraints must be compatible with the data type,
-   * e.g. for data of type 'entity' the 'EntityType' and 'Bundle' constraints
+   * e.g. for data of type 'entity' the 'EntityType' and 'Subtype' constraints
    * may be specified.
    *
    * @see \Drupal\Core\Validation\ConstraintManager
diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index 6e89fde..f59c34a 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -376,7 +376,7 @@ function aggregator_save_category($edit) {
     }
   }
   elseif (!empty($edit['title'])) {
-    // A single unique id for bundles and feeds, to use in blocks.
+    // A single unique id for subtypes and feeds, to use in blocks.
     $link_path .= db_insert('aggregator_category')
       ->fields(array(
         'title' => $edit['title'],
diff --git a/core/modules/ban/lib/Drupal/ban/BanBundle.php b/core/modules/ban/lib/Drupal/ban/BanBundle.php
index e9a92bb..bf7676e 100644
--- a/core/modules/ban/lib/Drupal/ban/BanBundle.php
+++ b/core/modules/ban/lib/Drupal/ban/BanBundle.php
@@ -12,7 +12,7 @@
 use Symfony\Component\HttpKernel\Bundle\Bundle;
 
 /**
- * Defines the Ban bundle.
+ * Defines the Ban subtype.
  */
 class BanBundle extends Bundle {
 
diff --git a/core/modules/block/block.install b/core/modules/block/block.install
index b1fc925..0f1c119 100644
--- a/core/modules/block/block.install
+++ b/core/modules/block/block.install
@@ -268,7 +268,7 @@ function block_update_8008() {
     $instance = array(
       'field_name' => 'block_body',
       'entity_type' => 'custom_block',
-      'bundle' => 'basic',
+      'subtype' => 'basic',
       'label' => 'Block body',
       'widget' => array('type' => 'text_textarea_with_summary'),
       'settings' => array('display_summary' => FALSE),
diff --git a/core/modules/block/custom_block/custom_block.module b/core/modules/block/custom_block/custom_block.module
index a3ce18c..3cd3b73 100644
--- a/core/modules/block/custom_block/custom_block.module
+++ b/core/modules/block/custom_block/custom_block.module
@@ -180,22 +180,22 @@ function custom_block_entity_info_alter(&$types) {
 }
 
 /**
- * Implements hook_entity_bundle_info().
+ * Implements hook_entity_subtype_info().
  */
-function custom_block_entity_bundle_info() {
-  $bundles = array();
+function custom_block_entity_subtype_info() {
+  $subtypes = array();
   foreach (config_get_storage_names_with_prefix('custom_block.type.') as $config_name) {
     $config = config($config_name);
-    $bundles['custom_block'][$config->get('id')] = array(
+    $subtypes['custom_block'][$config->get('id')] = array(
       'label' => $config->get('label'),
       'admin' => array(
         'path' => 'admin/structure/custom-blocks/manage/%',
         'real path' => 'admin/structure/custom-blocks/manage/' . $config->get('id'),
-        'bundle argument' => 4,
+        'subtype argument' => 4,
       ),
     );
   }
-  return $bundles;
+  return $subtypes;
 }
 
 /**
@@ -235,7 +235,7 @@ function custom_block_add_body_field($block_type_id, $label = 'Block body') {
     $instance = array(
       'field_name' => 'block_body',
       'entity_type' => 'custom_block',
-      'bundle' => $block_type_id,
+      'subtype' => $block_type_id,
       'label' => $label,
       'widget' => array('type' => 'text_textarea_with_summary'),
       'settings' => array('display_summary' => FALSE),
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
index 0094c42..d2b5292 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
@@ -161,7 +161,7 @@ public function save(array $form, array &$form_state) {
     $block = $this->getEntity($form_state);
     $insert = empty($block->id->value);
     $block->save();
-    $watchdog_args = array('@type' => $block->bundle(), '%info' => $block->label());
+    $watchdog_args = array('@type' => $block->subtype(), '%info' => $block->label());
     $block_type = entity_load('custom_block_type', $block->type->value);
     $t_args = array('@type' => $block_type->label(), '%info' => $block->label());
 
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
index 77664e9..bd981f5 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
@@ -66,7 +66,7 @@ public function form(array $form, array &$form_state, EntityInterface $block_typ
         '#type' => 'language_configuration',
         '#entity_information' => array(
           'entity_type' => 'custom_block',
-          'bundle' => $block_type->id(),
+          'subtype' => $block_type->id(),
         ),
         '#default_value' => $language_configuration,
       );
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeStorageController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeStorageController.php
index 1c8cbc2..82c29b0 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeStorageController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeStorageController.php
@@ -22,11 +22,11 @@ protected function postSave(EntityInterface $entity, $update) {
     parent::postSave($entity, $update);
 
     if (!$update) {
-      field_attach_create_bundle('custom_block', $entity->id());
+      field_attach_create_subtype('custom_block', $entity->id());
       custom_block_add_body_field($entity->id());
     }
     elseif ($entity->original->id() != $entity->id()) {
-      field_attach_rename_bundle('custom_block', $entity->original->id(), $entity->id());
+      field_attach_rename_subtype('custom_block', $entity->original->id(), $entity->id());
     }
   }
 
@@ -37,7 +37,7 @@ protected function postDelete($entities) {
     parent::postDelete($entities);
 
     foreach ($entities as $entity) {
-      field_attach_delete_bundle('custom_block', $entity->id());
+      field_attach_delete_subtype('custom_block', $entity->id());
     }
   }
 
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php
index c84a761..25e99cb 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php
@@ -18,7 +18,7 @@
  * @Plugin(
  *   id = "custom_block",
  *   label = @Translation("Custom Block"),
- *   bundle_label = @Translation("Custom Block type"),
+ *   subtype_label = @Translation("Custom Block type"),
  *   module = "custom_block",
  *   controller_class = "Drupal\custom_block\CustomBlockStorageController",
  *   access_controller_class = "Drupal\custom_block\CustomBlockAccessController",
@@ -34,12 +34,12 @@
  *   entity_keys = {
  *     "id" = "id",
  *     "revision" = "revision_id",
- *     "bundle" = "type",
+ *     "subtype" = "type",
  *     "label" = "info",
  *     "uuid" = "uuid"
  *   },
- *   bundle_keys = {
- *     "bundle" = "type"
+ *   subtype_keys = {
+ *     "subtype" = "type"
  *   }
  * )
  */
@@ -78,7 +78,7 @@ class CustomBlock extends EntityNG implements ContentEntityInterface {
   public $uuid;
 
   /**
-   * The custom block type (bundle).
+   * The custom block type (subtype).
    *
    * @var \Drupal\Core\Entity\Field\FieldInterface
    */
@@ -124,9 +124,9 @@ public function id() {
   }
 
   /**
-   * Implements Drupal\Core\Entity\EntityInterface::bundle().
+   * Implements Drupal\Core\Entity\EntityInterface::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return $this->type->value;
   }
 
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockLoadHooksTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockLoadHooksTest.php
index 717d659..5fb8442 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockLoadHooksTest.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockLoadHooksTest.php
@@ -34,12 +34,12 @@ public static function getInfo() {
    * Tests that hook_custom_block_load() is invoked correctly.
    */
   public function testHookCustomBlockLoad() {
-    $other_bundle = $this->createCustomBlockType('other');
+    $other_subtype = $this->createCustomBlockType('other');
     // Create some sample articles and pages.
     $custom_block1 = $this->createCustomBlock();
     $custom_block2 = $this->createCustomBlock();
     $custom_block3 = $this->createCustomBlock();
-    $custom_block4 = $this->createCustomBlock(FALSE, $other_bundle->id());
+    $custom_block4 = $this->createCustomBlock(FALSE, $other_subtype->id());
 
     // Check that when a set of custom blocks that only contains basic blocks is
     // loaded, the properties added to the custom block by
@@ -55,7 +55,7 @@ public function testHookCustomBlockLoad() {
     $this->assertEqual($loaded_custom_block->custom_block_test_loaded_types, array('basic'), 'hook_custom_block_load() received the correct list of custom block types the first time it was called.');
 
     // Now, as part of the same page request, load a set of custom_blocks that contain
-    // both basic and other bundle, and make sure the parameters passed to
+    // both basic and other subtype, and make sure the parameters passed to
     // custom_block_test_custom_block_load() are correctly updated.
     $custom_blocks = entity_load_multiple('custom_block', entity_query('custom_block')->execute(), TRUE);
     $loaded_custom_block = end($custom_blocks);
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTestBase.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTestBase.php
index 55d6bb9..6f9c483 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTestBase.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTestBase.php
@@ -56,17 +56,17 @@ protected function setUp() {
    * @param string $title
    *   (optional) Title of block. When no value is given uses a random name.
    *   Defaults to FALSE.
-   * @param string $bundle
-   *   (optional) Bundle name. Defaults to 'basic'.
+   * @param string $subtype
+   *   (optional) Subtype name. Defaults to 'basic'.
    *
    * @return Drupal\custom_block\Plugin\Core\Entity\CustomBlock
    *   Created custom block.
    */
-  protected function createCustomBlock($title = FALSE, $bundle = 'basic') {
+  protected function createCustomBlock($title = FALSE, $subtype = 'basic') {
     $title = ($title ? : $this->randomName());
     if ($custom_block = entity_create('custom_block', array(
       'info' => $title,
-      'type' => $bundle,
+      'type' => $subtype,
       'langcode' => 'en'
     ))) {
       $custom_block->save();
@@ -75,7 +75,7 @@ protected function createCustomBlock($title = FALSE, $bundle = 'basic') {
   }
 
   /**
-   * Creates a custom block type (bundle).
+   * Creates a custom block type (subtype).
    *
    * @param string $label
    *   The block type label.
@@ -84,13 +84,13 @@ protected function createCustomBlock($title = FALSE, $bundle = 'basic') {
    *   Created custom block type.
    */
   protected function createCustomBlockType($label) {
-    $bundle = entity_create('custom_block_type', array(
+    $subtype = entity_create('custom_block_type', array(
       'id' => $label,
       'label' => $label,
       'revision' => FALSE
     ));
-    $bundle->save();
-    return $bundle;
+    $subtype->save();
+    return $subtype;
   }
 
 }
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTranslationUITest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTranslationUITest.php
index 3ccac91..ea2d944 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTranslationUITest.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTranslationUITest.php
@@ -49,7 +49,7 @@ public static function getInfo() {
    */
   public function setUp() {
     $this->entityType = 'custom_block';
-    $this->bundle = 'basic';
+    $this->subtype = 'basic';
     $this->name = drupal_strtolower($this->randomName());
     $this->testLanguageSelector = FALSE;
     parent::setUp();
@@ -73,19 +73,19 @@ public function getTranslatorPermissions() {
    * @param string $title
    *   (optional) Title of block. When no value is given uses a random name.
    *   Defaults to FALSE.
-   * @param string $bundle
-   *   (optional) Bundle name. When no value is given, defaults to
-   *   $this->bundle. Defaults to FALSE.
+   * @param string $subtype
+   *   (optional) Subtype name. When no value is given, defaults to
+   *   $this->subtype. Defaults to FALSE.
    *
    * @return Drupal\custom_block\Plugin\Core\Entity\CustomBlock
    *   Created custom block.
    */
-  protected function createCustomBlock($title = FALSE, $bundle = FALSE) {
+  protected function createCustomBlock($title = FALSE, $subtype = FALSE) {
     $title = ($title ? : $this->randomName());
-    $bundle = ($bundle ? : $this->bundle);
+    $subtype = ($subtype ? : $this->subtype);
     $custom_block = entity_create('custom_block', array(
       'info' => $title,
-      'type' => $bundle,
+      'type' => $subtype,
       'langcode' => 'en'
     ));
     $custom_block->save();
@@ -100,21 +100,21 @@ protected function getNewEntityValues($langcode) {
   }
 
   /**
-   * Test that no metadata is stored for a disabled bundle.
+   * Test that no metadata is stored for a disabled subtype.
    */
-  public function testDisabledBundle() {
-    // Create a bundle that does not have translation enabled.
-    $disabled_bundle = $this->randomName();
-    $bundle = entity_create('custom_block_type', array(
-      'id' => $disabled_bundle,
-      'label' => $disabled_bundle,
+  public function testDisabledSubtype() {
+    // Create a subtype that does not have translation enabled.
+    $disabled_subtype = $this->randomName();
+    $subtype = entity_create('custom_block_type', array(
+      'id' => $disabled_subtype,
+      'label' => $disabled_subtype,
       'revision' => FALSE
     ));
-    $bundle->save();
+    $subtype->save();
 
-    // Create a node for each bundle.
+    // Create a node for each subtype.
     $enabled_custom_block = $this->createCustomBlock();
-    $disabled_custom_block = $this->createCustomBlock(FALSE, $bundle->id());
+    $disabled_custom_block = $this->createCustomBlock(FALSE, $subtype->id());
 
     // Make sure that only a single row was inserted into the
     // {translation_entity} table.
diff --git a/core/modules/comment/comment.install b/core/modules/comment/comment.install
index 48bb5a4..761efd7 100644
--- a/core/modules/comment/comment.install
+++ b/core/modules/comment/comment.install
@@ -16,7 +16,7 @@ function comment_uninstall() {
   variable_del('comment_block_count');
   $node_types = array_keys(node_type_get_types());
   foreach ($node_types as $node_type) {
-    field_attach_delete_bundle('comment', 'comment_node_' . $node_type);
+    field_attach_delete_subtype('comment', 'comment_node_' . $node_type);
     variable_del('comment_' . $node_type);
     variable_del('comment_anonymous_' . $node_type);
     variable_del('comment_controls_' . $node_type);
@@ -59,9 +59,9 @@ function comment_enable() {
  * react to node types of existing modules, and those of modules being enabled
  * both before and after the Comment module in the loop of module_enable().
  *
- * There is a separate comment bundle for each node type to allow for
- * per-node-type customization of comment fields. Each one of these bundles
- * needs a comment body field instance. A comment bundle is needed even for
+ * There is a separate comment subtype for each node type to allow for
+ * per-node-type customization of comment fields. Each one of these subtypes
+ * needs a comment body field instance. A comment subtype is needed even for
  * node types whose comments are disabled by default, because individual nodes
  * may override that default.
  *
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 9ee6f81..0d9fe9d 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -109,34 +109,34 @@ function comment_entity_view_mode_info() {
 }
 
 /**
- * Implements hook_entity_bundle_info().
+ * Implements hook_entity_subtype_info().
  */
-function comment_entity_bundle_info() {
-  $bundles = array();
+function comment_entity_subtype_info() {
+  $subtypes = array();
   foreach (node_type_get_names() as $type => $name) {
-    $bundles['comment']['comment_node_' . $type] = array(
+    $subtypes['comment']['comment_node_' . $type] = array(
       'label' => t('@node_type comment', array('@node_type' => $name)),
-      // Provide the node type/bundle name for other modules, so it does not
-      // have to be extracted manually from the bundle name.
-      'node bundle' => $type,
+      // Provide the node type/subtype name for other modules, so it does not
+      // have to be extracted manually from the subtype name.
+      'node subtype' => $type,
       'admin' => array(
         // Place the Field UI paths for comments one level below the
         // corresponding paths for nodes, so that they appear in the same set
         // of local tasks. Note that the paths use a different placeholder name
         // and thus a different menu loader callback, so that Field UI page
-        // callbacks get a comment bundle name from the node type in the URL.
+        // callbacks get a comment subtype name from the node type in the URL.
         // See comment_node_type_load() and comment_menu_alter().
         'path' => 'admin/structure/types/manage/%comment_node_type/comment',
-        'bundle argument' => 4,
+        'subtype argument' => 4,
         'real path' => 'admin/structure/types/manage/' . $type . '/comment',
       ),
     );
   }
-  return $bundles;
+  return $subtypes;
 }
 
 /**
- * Loads the comment bundle name corresponding a given content type.
+ * Loads the comment subtype name corresponding a given content type.
  *
  * This function is used as a menu loader callback in comment_menu().
  *
@@ -144,7 +144,7 @@ function comment_entity_bundle_info() {
  *   The machine name of the node type whose comment fields are to be edited.
  *
  * @return
- *   The comment bundle name corresponding to the node type.
+ *   The comment subtype name corresponding to the node type.
  *
  * @see comment_menu_alter()
  */
@@ -298,7 +298,7 @@ function comment_menu_alter(&$items) {
   $items['admin/content']['description'] = 'Administer content and comments.';
 
   // Adjust the Field UI tabs on admin/structure/types/manage/[node-type].
-  // See comment_entity_bundle_info().
+  // See comment_entity_subtype_info().
   $items['admin/structure/types/manage/%comment_node_type/comment/fields']['title'] = 'Comment fields';
   $items['admin/structure/types/manage/%comment_node_type/comment/fields']['weight'] = 3;
   $items['admin/structure/types/manage/%comment_node_type/comment/display']['title'] = 'Comment display';
@@ -333,7 +333,7 @@ function comment_node_type_insert($info) {
  */
 function comment_node_type_update($info) {
   if (!empty($info->old_type) && $info->type != $info->old_type) {
-    field_attach_rename_bundle('comment', 'comment_node_' . $info->old_type, 'comment_node_' . $info->type);
+    field_attach_rename_subtype('comment', 'comment_node_' . $info->old_type, 'comment_node_' . $info->type);
   }
 }
 
@@ -341,7 +341,7 @@ function comment_node_type_update($info) {
  * Implements hook_node_type_delete().
  */
 function comment_node_type_delete($info) {
-  field_attach_delete_bundle('comment', 'comment_node_' . $info->type);
+  field_attach_delete_subtype('comment', 'comment_node_' . $info->type);
   $settings = array(
     'comment',
     'comment_default_mode',
@@ -376,13 +376,13 @@ function _comment_body_field_create($info) {
   }
   // Create the instance if needed.
   if (!field_read_instance('comment', 'comment_body', 'comment_node_' . $info->type, array('include_inactive' => TRUE))) {
-    field_attach_create_bundle('comment', 'comment_node_' . $info->type);
+    field_attach_create_subtype('comment', 'comment_node_' . $info->type);
     // Attaches the body field by default.
     $instance = array(
       'field_name' => 'comment_body',
       'label' => 'Comment',
       'entity_type' => 'comment',
-      'bundle' => 'comment_node_' . $info->type,
+      'subtype' => 'comment_node_' . $info->type,
       'settings' => array('text_processing' => 1),
       'required' => TRUE,
     );
@@ -974,7 +974,7 @@ function comment_links(Comment $comment, Node $node) {
     }
   }
 
-  // Add translations link for translation-enabled comment bundles.
+  // Add translations link for translation-enabled comment subtypes.
   if (module_exists('translation_entity') && translation_entity_translate_access($comment)) {
     $links['comment-translations'] = array(
       'title' => t('translations'),
@@ -1105,7 +1105,7 @@ function comment_translation_configuration_element_submit($form, &$form_state) {
   $key = 'language_configuration';
   $comment_form_state = array(
     'translation_entity' => array('key' => $key),
-    'language' => array($key => array('entity_type' => 'comment', 'bundle' => 'comment_node_' . $form['#node_type']->type)),
+    'language' => array($key => array('entity_type' => 'comment', 'subtype' => 'comment_node_' . $form['#node_type']->type)),
     'values' => array($key => array('translation_entity' => $form_state['values']['translation_entity'])),
   );
   translation_entity_language_configuration_element_submit($form, $comment_form_state);
@@ -2019,7 +2019,7 @@ function comment_rdf_mapping() {
   return array(
     array(
       'type' => 'comment',
-      'bundle' => RDF_DEFAULT_BUNDLE,
+      'subtype' => RDF_DEFAULT_BUNDLE,
       'mapping' => array(
         'rdftype' => array('sioc:Post', 'sioct:Comment'),
         'title' => array(
diff --git a/core/modules/comment/lib/Drupal/comment/CommentRenderController.php b/core/modules/comment/lib/Drupal/comment/CommentRenderController.php
index dab8dc4..c5f16c8 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentRenderController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentRenderController.php
@@ -52,7 +52,7 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang
         throw new \InvalidArgumentException(t('Invalid node for comment.'));
       }
       $entity->content['#node'] = $node;
-      $entity->content['#theme'] = 'comment__node_' . $node->bundle();
+      $entity->content['#theme'] = 'comment__node_' . $node->subtype();
       $entity->content['links'] = array(
         '#theme' => 'links__comment',
         '#pre_render' => array('drupal_pre_render_links'),
@@ -77,7 +77,7 @@ protected function alterBuild(array &$build, EntityInterface $comment, EntityDis
     if (empty($comment->in_preview)) {
       $prefix = '';
       $is_threaded = isset($comment->divs)
-        && variable_get('comment_default_mode_' . $comment->bundle(), COMMENT_MODE_THREADED) == COMMENT_MODE_THREADED;
+        && variable_get('comment_default_mode_' . $comment->subtype(), COMMENT_MODE_THREADED) == COMMENT_MODE_THREADED;
 
       // Add 'new' anchor if needed.
       if (!empty($comment->first_new)) {
diff --git a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
index 274b37b..ca7fa85 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
@@ -74,7 +74,7 @@ protected function preSave(EntityInterface $comment) {
     if (!isset($comment->status->value)) {
       $comment->status->value = user_access('skip comment approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED;
     }
-    // Make sure we have a proper bundle name.
+    // Make sure we have a proper subtype name.
     if (!isset($comment->node_type->value)) {
       $comment->node_type->value = 'comment_node_' . $comment->nid->entity->type;
     }
@@ -341,7 +341,7 @@ public function baseFieldDefinitions() {
       'type' => 'string_field',
     );
     $properties['node_type'] = array(
-      // @todo: The bundle property should be stored so it's queryable.
+      // @todo: The subtype property should be stored so it's queryable.
       'label' => t('Node type'),
       'description' => t("The comment node type."),
       'type' => 'string_field',
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php b/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
index d80a844..7f910bd 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
@@ -18,7 +18,7 @@
  * @Plugin(
  *   id = "comment",
  *   label = @Translation("Comment"),
- *   bundle_label = @Translation("Content type"),
+ *   subtype_label = @Translation("Content type"),
  *   module = "comment",
  *   controller_class = "Drupal\comment\CommentStorageController",
  *   render_controller_class = "Drupal\comment\CommentRenderController",
@@ -32,7 +32,7 @@
  *   static_cache = FALSE,
  *   entity_keys = {
  *     "id" = "cid",
- *     "bundle" = "node_type",
+ *     "subtype" = "node_type",
  *     "label" = "subject",
  *     "uuid" = "uuid"
  *   }
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/entity_reference/selection/CommentSelection.php b/core/modules/comment/lib/Drupal/comment/Plugin/entity_reference/selection/CommentSelection.php
index 61dd1a3..9c94e94 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/entity_reference/selection/CommentSelection.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/entity_reference/selection/CommentSelection.php
@@ -55,9 +55,9 @@ public function entityQueryAlter(SelectInterface $query) {
     // Pass the query to the node access control.
     $this->reAlterQuery($query, 'node_access', $node_alias);
 
-    // Alas, the comment entity exposes a bundle, but doesn't have a bundle
+    // Alas, the comment entity exposes a subtype, but doesn't have a subtype
     // column in the database. We have to alter the query ourselves to go fetch
-    // the bundle.
+    // the subtype.
     $conditions = &$query->conditions();
     foreach ($conditions as $key => &$condition) {
       if ($key !== '#conjunction' && is_string($condition['field']) && $condition['field'] === 'node_type') {
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentCSSTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentCSSTest.php
index 1294de4..4da1231 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentCSSTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentCSSTest.php
@@ -50,7 +50,7 @@ function testCommentClasses() {
       // Add a comment.
       $comment = entity_create('comment', array(
         'nid' => $node->nid,
-        'node_type' => 'node_type_' . $node->bundle(),
+        'node_type' => 'node_type_' . $node->subtype(),
         'uid' => $case['comment_uid'],
         'status' => $case['comment_status'],
         'subject' => $this->randomName(),
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php
index a29db8c..ee8cc67 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php
@@ -35,7 +35,7 @@ function testCommentDefaultFields() {
     // installation profile, and create our own.
     $this->drupalCreateContentType(array('type' => 'test_node_type'));
 
-    // Check that the 'comment_body' field is present on all comment bundles.
+    // Check that the 'comment_body' field is present on all comment subtypes.
     $instances = field_info_instances('comment');
     foreach (node_type_get_types() as $type_name => $info) {
       $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), format_string('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
@@ -53,7 +53,7 @@ function testCommentDefaultFields() {
     $this->drupalCreateContentType(array('type' => $type_name));
 
     // Check that the 'comment_body' field exists and has an instance on the
-    // new comment bundle.
+    // new comment subtype.
     $field = field_info_field('comment_body');
     $this->assertTrue($field, 'The comment_body field exists');
     $instances = field_info_instances('comment');
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
index 100e02f..a4010c4 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
@@ -36,19 +36,19 @@ public static function getInfo() {
 
   function setUp() {
     $this->entityType = 'comment';
-    $this->nodeBundle = 'article';
-    $this->bundle = 'comment_node_' . $this->nodeBundle;
+    $this->nodeSubtype = 'article';
+    $this->subtype = 'comment_node_' . $this->nodeSubtype;
     $this->testLanguageSelector = FALSE;
     $this->subject = $this->randomName();
     parent::setUp();
   }
 
   /**
-   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::setupBundle().
+   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::setupSubtype().
    */
-  function setupBundle() {
-    parent::setupBundle();
-    $this->drupalCreateContentType(array('type' => $this->nodeBundle, 'name' => $this->nodeBundle));
+  function setupSubtype() {
+    parent::setupSubtype();
+    $this->drupalCreateContentType(array('type' => $this->nodeSubtype, 'name' => $this->nodeSubtype));
   }
 
   /**
@@ -71,11 +71,11 @@ function setupTestFields() {
   /**
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::createEntity().
    */
-  protected function createEntity($values, $langcode, $node_bundle = NULL) {
-    if (!isset($node_bundle)) {
-      $node_bundle = $this->nodeBundle;
+  protected function createEntity($values, $langcode, $node_subtype = NULL) {
+    if (!isset($node_subtype)) {
+      $node_subtype = $this->nodeSubtype;
     }
-    $node = $this->drupalCreateNode(array('type' => $node_bundle));
+    $node = $this->drupalCreateNode(array('type' => $node_subtype));
     $values['nid'] = $node->nid;
     $values['uid'] = $node->uid;
     return parent::createEntity($values, $langcode);
@@ -128,7 +128,7 @@ function testTranslateLinkCommentAdminPage() {
     $this->admin_user = $this->drupalCreateUser(array_merge(parent::getTranslatorPermissions(), array('access administration pages', 'administer comments')));
     $this->drupalLogin($this->admin_user);
 
-    $cid_translatable = $this->createEntity(array(), $this->langcodes[0], $this->nodeBundle);
+    $cid_translatable = $this->createEntity(array(), $this->langcodes[0], $this->nodeSubtype);
     $cid_untranslatable = $this->createEntity(array(), $this->langcodes[0], 'page');
 
     // Verify translation links.
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
index e93b79f..434c70d 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
@@ -45,7 +45,7 @@ function testCRUD() {
     // Verify ConfigEntity properties/methods on the newly created empty entity.
     $this->assertIdentical($empty->isNew(), TRUE);
     $this->assertIdentical($empty->getOriginalID(), NULL);
-    $this->assertIdentical($empty->bundle(), 'config_test');
+    $this->assertIdentical($empty->subtype(), 'config_test');
     $this->assertIdentical($empty->id(), NULL);
     $this->assertTrue($empty->uuid());
     $this->assertIdentical($empty->label(), NULL);
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index 4957052..8d59eb2 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -173,23 +173,23 @@ function _contact_personal_tab_access($account) {
 }
 
 /**
- * Implements hook_entity_bundle_info().
+ * Implements hook_entity_subtype_info().
  */
-function contact_entity_bundle_info() {
-  $bundles = array();
+function contact_entity_subtype_info() {
+  $subtypes = array();
   foreach (config_get_storage_names_with_prefix('contact.category.') as $config_name) {
     $config = config($config_name);
-    $bundles['contact_message'][$config->get('id')] = array(
+    $subtypes['contact_message'][$config->get('id')] = array(
       'label' => $config->get('label'),
       'admin' => array(
         'path' => 'admin/structure/contact/manage/%contact_category',
         'real path' => 'admin/structure/contact/manage/' . $config->get('id'),
-        'bundle argument' => 4,
+        'subtype argument' => 4,
         'access arguments' => array('administer contact forms'),
       ),
     );
   }
-  return $bundles;
+  return $subtypes;
 }
 
 /**
@@ -197,40 +197,40 @@ function contact_entity_bundle_info() {
  */
 function contact_field_extra_fields() {
   $fields = array();
-  foreach (array_keys(entity_get_bundles('contact_message')) as $bundle) {
-    $fields['contact_message'][$bundle]['form']['name'] = array(
+  foreach (array_keys(entity_get_subtypes('contact_message')) as $subtype) {
+    $fields['contact_message'][$subtype]['form']['name'] = array(
       'label' => t('Sender name'),
       'description' => t('Text'),
       'weight' => -50,
     );
-    $fields['contact_message'][$bundle]['form']['mail'] = array(
+    $fields['contact_message'][$subtype]['form']['mail'] = array(
       'label' => t('Sender e-mail'),
       'description' => t('E-mail'),
       'weight' => -40,
     );
-    // @todo Recipient only makes sense if user contact form is a bundle/category.
-    $fields['contact_message'][$bundle]['form']['recipient'] = array(
+    // @todo Recipient only makes sense if user contact form is a subtype/category.
+    $fields['contact_message'][$subtype]['form']['recipient'] = array(
       'label' => t('Recipient user name'),
       'description' => t('User'),
       'weight' => -30,
     );
-    $fields['contact_message'][$bundle]['form']['subject'] = array(
+    $fields['contact_message'][$subtype]['form']['subject'] = array(
       'label' => t('Subject'),
       'description' => t('Text'),
       'weight' => -10,
     );
-    $fields['contact_message'][$bundle]['form']['message'] = array(
+    $fields['contact_message'][$subtype]['form']['message'] = array(
       'label' => t('Message'),
       'description' => t('Long text'),
       'weight' => 0,
     );
-    $fields['contact_message'][$bundle]['form']['copy'] = array(
+    $fields['contact_message'][$subtype]['form']['copy'] = array(
       'label' => t('Send copy to sender'),
       'description' => t('Option'),
       'weight' => 50,
     );
 
-    $fields['contact_message'][$bundle]['display']['message'] = array(
+    $fields['contact_message'][$subtype]['display']['message'] = array(
       'label' => t('Message'),
       'description' => t('The main contact message'),
       'weight' => 0,
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryStorageController.php b/core/modules/contact/lib/Drupal/contact/CategoryStorageController.php
index bc31a24..2cc5938 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryStorageController.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryStorageController.php
@@ -22,10 +22,10 @@ protected function postSave(EntityInterface $entity, $update) {
     parent::postSave($entity, $update);
 
     if (!$update) {
-      field_attach_create_bundle('contact_message', $entity->id());
+      field_attach_create_subtype('contact_message', $entity->id());
     }
     elseif ($entity->original->id() != $entity->id()) {
-      field_attach_rename_bundle('contact_message', $entity->original->id(), $entity->id());
+      field_attach_rename_subtype('contact_message', $entity->original->id(), $entity->id());
     }
   }
 
@@ -36,7 +36,7 @@ protected function postDelete($entities) {
     parent::postDelete($entities);
 
     foreach ($entities as $entity) {
-      field_attach_delete_bundle('contact_message', $entity->id());
+      field_attach_delete_subtype('contact_message', $entity->id());
     }
   }
 
diff --git a/core/modules/contact/lib/Drupal/contact/MessageRenderController.php b/core/modules/contact/lib/Drupal/contact/MessageRenderController.php
index b3a8a31..6ed9d07 100644
--- a/core/modules/contact/lib/Drupal/contact/MessageRenderController.php
+++ b/core/modules/contact/lib/Drupal/contact/MessageRenderController.php
@@ -23,7 +23,7 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang
 
     foreach ($entities as $entity) {
       // Add the message extra field, if enabled.
-      $display = $displays[$entity->bundle()];
+      $display = $displays[$entity->subtype()];
       if (!empty($entity->message) && $display->getComponent('message')) {
         $entity->content['message'] = array(
           '#type' => 'item',
diff --git a/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php b/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php
index 19901b2..905fe49 100644
--- a/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php
+++ b/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php
@@ -23,11 +23,11 @@
  *   },
  *   render_controller_class = "Drupal\contact\MessageRenderController",
  *   entity_keys = {
- *     "bundle" = "category"
+ *     "subtype" = "category"
  *   },
  *   fieldable = TRUE,
- *   bundle_keys = {
- *     "bundle" = "id"
+ *   subtype_keys = {
+ *     "subtype" = "id"
  *   }
  * )
  */
@@ -102,9 +102,9 @@ public function id() {
   }
 
   /**
-   * Overrides Drupal\Core\Entity\Entity::bundle().
+   * Overrides Drupal\Core\Entity\Entity::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return $this->category;
   }
 
@@ -112,9 +112,9 @@ public function bundle() {
    * Overrides Drupal\Core\Entity\Entity::entityInfo().
    */
   public function entityInfo() {
-    // The user contact form is not a category/bundle currently, so it is not
+    // The user contact form is not a category/subtype currently, so it is not
     // fieldable. Prevent EntityFormController from calling into Field Attach
-    // functions, since those will throw errors without a bundle name.
+    // functions, since those will throw errors without a subtype name.
     $info = entity_get_info($this->entityType);
     if (isset($this->recipient)) {
       $info['fieldable'] = FALSE;
diff --git a/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactFieldsTest.php b/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactFieldsTest.php
index 07b5308..3c8ff58 100644
--- a/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactFieldsTest.php
+++ b/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactFieldsTest.php
@@ -49,7 +49,7 @@ protected function setUp() {
     $instance = array(
       'field_name' => $field['field_name'],
       'entity_type' => 'contact_message',
-      'bundle' => 'contact_message',
+      'subtype' => 'contact_message',
     );
     field_create_instance($instance);
   }
diff --git a/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php b/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php
index 232d019..a33c1df 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php
@@ -57,7 +57,7 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'datetime_default',
       ),
@@ -72,7 +72,7 @@ function setUp() {
       'label' => 'hidden',
       'settings' => array('format_type' => 'medium'),
     );
-    entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
+    entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'full')
       ->setComponent($this->field['field_name'], $this->display_options)
       ->save();
   }
@@ -83,7 +83,7 @@ function setUp() {
   function testDateField() {
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value][date]", '', 'Date element found.');
     $this->assertNoFieldByName("{$this->field['field_name']}[$langcode][0][value][time]", '', 'Time element not found.');
@@ -116,7 +116,7 @@ function testDateField() {
       foreach ($values as $new_value) {
         // Update the entity display settings.
         $this->display_options['settings'] = array($setting => $new_value);
-        $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
+        $display = entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'full')
           ->setComponent($this->instance['field_name'], $this->display_options)
           ->save();
 
@@ -134,7 +134,7 @@ function testDateField() {
 
     // Verify that the plain formatter works.
     $this->display_options['type'] = 'datetime_plain';
-    $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
+    $display = entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'full')
       ->setComponent($this->instance['field_name'], $this->display_options)
       ->save();
     $expected = $date->format(DATETIME_DATE_STORAGE_FORMAT);
@@ -152,7 +152,7 @@ function testDatetimeField() {
     field_update_field($this->field);
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value][date]", '', 'Date element found.');
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value][time]", '', 'Time element found.');
@@ -183,7 +183,7 @@ function testDatetimeField() {
       foreach ($values as $new_value) {
         // Update the entity display settings.
         $this->display_options['settings'] = array($setting => $new_value);
-        $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
+        $display = entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'full')
           ->setComponent($this->instance['field_name'], $this->display_options)
           ->save();
 
@@ -201,7 +201,7 @@ function testDatetimeField() {
 
     // Verify that the plain formatter works.
     $this->display_options['type'] = 'datetime_plain';
-    $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
+    $display = entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'full')
       ->setComponent($this->instance['field_name'], $this->display_options)
       ->save();
     $expected = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);
@@ -233,7 +233,7 @@ function testDatelistWidget() {
     field_cache_clear();
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $field_name = $this->field['field_name'];
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
@@ -292,7 +292,7 @@ function testDefaultValue() {
     // Display creation form.
     $date = new DrupalDateTime();
     $date_format = 'Y-m-d';
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // See if current date is set. We cannot test for the precise time because
@@ -308,7 +308,7 @@ function testDefaultValue() {
 
     // Display creation form.
     $date = new DrupalDateTime();
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
 
     // See that no date is set.
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value][date]", '', 'Date element found.');
@@ -325,7 +325,7 @@ function testInvalidField() {
     field_update_field($this->field);
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value][date]", '', 'Date element found.');
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value][time]", '', 'Time element found.');
@@ -416,8 +416,8 @@ protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) {
       entity_get_controller('test_entity')->resetCache(array($id));
     }
     $entity = field_test_entity_test_load($id);
-    $display = entity_get_display('test_entity', $entity->bundle(), 'full');
-    field_attach_prepare_view('test_entity', array($entity->id() => $entity), array($entity->bundle() => $display), $view_mode);
+    $display = entity_get_display('test_entity', $entity->subtype(), 'full');
+    field_attach_prepare_view('test_entity', array($entity->id() => $entity), array($entity->subtype() => $display), $view_mode);
     $entity->content = field_attach_view($entity, $display, $view_mode);
 
     $output = drupal_render($entity->content);
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
index 9eac5bc..b24fc27 100644
--- a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
@@ -67,7 +67,7 @@ protected function validateAndUpcastRequestAttributes(Request $request) {
 
     // Validate the field name and language.
     $field_name = $request->attributes->get('field_name');
-    if (!$field_name || !field_info_instance($entity->entityType(), $field_name, $entity->bundle())) {
+    if (!$field_name || !field_info_instance($entity->entityType(), $field_name, $entity->subtype())) {
       throw new NotFoundHttpException();
     }
     $langcode = $request->attributes->get('langcode');
diff --git a/core/modules/edit/lib/Drupal/edit/EditController.php b/core/modules/edit/lib/Drupal/edit/EditController.php
index e20d48f..492624e 100644
--- a/core/modules/edit/lib/Drupal/edit/EditController.php
+++ b/core/modules/edit/lib/Drupal/edit/EditController.php
@@ -54,7 +54,7 @@ public function metadata(Request $request) {
       }
 
       // Validate the field name and language.
-      if (!$field_name || !($instance = field_info_instance($entity->entityType(), $field_name, $entity->bundle()))) {
+      if (!$field_name || !($instance = field_info_instance($entity->entityType(), $field_name, $entity->subtype()))) {
         throw new NotFoundHttpException();
       }
       if (!$langcode || (field_valid_language($langcode) !== $langcode)) {
diff --git a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
index 1959ae7..958c407 100644
--- a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
+++ b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
@@ -50,7 +50,7 @@ protected function init(array &$form_state, EntityInterface $entity, $field_name
     // @todo Rather than special-casing $node->revision, invoke prepareEdit()
     //   once http://drupal.org/node/1863258 lands.
     if ($entity->entityType() == 'node') {
-      $entity->setNewRevision(in_array('revision', variable_get('node_options_' . $entity->bundle(), array())));
+      $entity->setNewRevision(in_array('revision', variable_get('node_options_' . $entity->subtype(), array())));
       $entity->log = NULL;
     }
 
@@ -88,7 +88,7 @@ protected function buildEntity(array $form, array &$form_state) {
     // @todo Refine automated log messages and abstract them to all entity
     //   types: http://drupal.org/node/1678002.
     if ($entity->entityType() == 'node' && $entity->isNewRevision() && !isset($entity->log)) {
-      $instance = field_info_instance($entity->entityType(), $form_state['field_name'], $entity->bundle());
+      $instance = field_info_instance($entity->entityType(), $form_state['field_name'], $entity->subtype());
       $entity->log = t('Updated the %field-name field through in-place editing.', array('%field-name' => $instance['label']));
     }
 
diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php b/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php
index c3a91fb..22e299f 100644
--- a/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php
+++ b/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php
@@ -70,7 +70,7 @@ function createFieldWithInstance($field_name, $type, $cardinality, $label, $inst
     $this->$instance = array(
       'field_name' => $field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $label,
       'description' => $label,
       'weight' => mt_rand(0, 127),
@@ -83,7 +83,7 @@ function createFieldWithInstance($field_name, $type, $cardinality, $label, $inst
     );
     field_create_instance($this->$instance);
 
-    entity_get_display('test_entity', 'test_bundle', 'default')
+    entity_get_display('test_entity', 'test_subtype', 'default')
       ->setComponent($field_name, array(
         'label' => 'above',
         'type' => $formatter_type,
diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php b/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
index fdddec0..1ea409c 100644
--- a/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
+++ b/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
@@ -49,8 +49,8 @@ function setUp() {
    * editor that Edit selects.
    */
   protected function getSelectedEditor($items, $field_name, $view_mode = 'default') {
-    $options = entity_get_display('test_entity', 'test_bundle', $view_mode)->getComponent($field_name);
-    $field_instance = field_info_instance('test_entity', $field_name, 'test_bundle');
+    $options = entity_get_display('test_entity', 'test_subtype', $view_mode)->getComponent($field_name);
+    $field_instance = field_info_instance('test_entity', $field_name, 'test_subtype');
     return $this->editorSelector->getEditor($options['type'], $field_instance, $items);
   }
 
diff --git a/core/modules/edit/lib/Drupal/edit/Tests/MetadataGeneratorTest.php b/core/modules/edit/lib/Drupal/edit/Tests/MetadataGeneratorTest.php
index 529d535..da26a24 100644
--- a/core/modules/edit/lib/Drupal/edit/Tests/MetadataGeneratorTest.php
+++ b/core/modules/edit/lib/Drupal/edit/Tests/MetadataGeneratorTest.php
@@ -104,7 +104,7 @@ function testSimpleEntityType() {
     $entity = entity_load('test_entity', $this->entity->ftid);
 
     // Verify metadata for field 1.
-    $instance_1 = field_info_instance($entity->entityType(), $field_1_name, $entity->bundle());
+    $instance_1 = field_info_instance($entity->entityType(), $field_1_name, $entity->subtype());
     $metadata_1 = $this->metadataGenerator->generate($entity, $instance_1, LANGUAGE_NOT_SPECIFIED, 'default');
     $expected_1 = array(
       'access' => TRUE,
@@ -115,7 +115,7 @@ function testSimpleEntityType() {
     $this->assertEqual($expected_1, $metadata_1, 'The correct metadata is generated for the first field.');
 
     // Verify metadata for field 2.
-    $instance_2 = field_info_instance($entity->entityType(), $field_2_name, $entity->bundle());
+    $instance_2 = field_info_instance($entity->entityType(), $field_2_name, $entity->subtype());
     $metadata_2 = $this->metadataGenerator->generate($entity, $instance_2, LANGUAGE_NOT_SPECIFIED, 'default');
     $expected_2 = array(
       'access' => TRUE,
@@ -171,7 +171,7 @@ function testEditorWithCustomMetadata() {
     $entity = entity_load('test_entity', $this->entity->ftid);
 
     // Verify metadata.
-    $instance = field_info_instance($entity->entityType(), $field_name, $entity->bundle());
+    $instance = field_info_instance($entity->entityType(), $field_name, $entity->subtype());
     $metadata = $this->metadataGenerator->generate($entity, $instance, LANGUAGE_NOT_SPECIFIED, 'default');
     $expected = array(
       'access' => TRUE,
diff --git a/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php b/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php
index c719c97..4cdcfad 100644
--- a/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php
+++ b/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php
@@ -53,7 +53,7 @@ function testEmailField() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'email_default',
         'settings' => array(
@@ -63,14 +63,14 @@ function testEmailField() {
     );
     field_create_instance($this->instance);
     // Create a display for the full view mode.
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field['field_name'], array(
         'type' => 'email_mailto',
       ))
       ->save();
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value]", '', 'Widget found.');
     $this->assertRaw('placeholder="example@example.com"');
@@ -88,7 +88,7 @@ function testEmailField() {
 
     // Verify that a mailto link is displayed.
     $entity = field_test_entity_test_load($id);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
     $entity->content = field_attach_view($entity, $display);
     $this->drupalSetContent(drupal_render($entity->content));
     $this->assertLinkByHref('mailto:test@example.com');
diff --git a/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php b/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php
index a402eac..a92f2d0 100644
--- a/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php
+++ b/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php
@@ -43,7 +43,7 @@ public function setUp() {
     $this->instance = array(
       'entity_type' => 'entity_test',
       'field_name' => 'field_email',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'email_default',
       ),
diff --git a/core/modules/entity/entity.install b/core/modules/entity/entity.install
index 2e1efd7..2215d31 100644
--- a/core/modules/entity/entity.install
+++ b/core/modules/entity/entity.install
@@ -15,16 +15,16 @@
  *
  * @param string $entity_type
  *   The entity type.
- * @param string $bundle
- *   The bundle name.
+ * @param string $subtype
+ *   The subtype name.
  * @param string $view_mode
  *   The view mode.
  *
  * @return \Drupal\Core\Config\Config
  *   The configuration object.
  */
-function _update_8000_entity_get_display($entity_type, $bundle, $view_mode) {
-  $id = $entity_type . '.' . $bundle . '.' . $view_mode;
+function _update_8000_entity_get_display($entity_type, $subtype, $view_mode) {
+  $id = $entity_type . '.' . $subtype . '.' . $view_mode;
   $config = config("entity.display.$id");
   if ($config->get()) {
     return $config;
@@ -36,7 +36,7 @@ function _update_8000_entity_get_display($entity_type, $bundle, $view_mode) {
     'id' => $id,
     'uuid' => $uuid->generate(),
     'targetEntityType' => $entity_type,
-    'bundle' => $bundle,
+    'subtype' => $subtype,
     'viewMode' => $view_mode,
     'content' => array(),
   );
diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php b/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php
index d88967f..481fd51 100644
--- a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php
+++ b/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php
@@ -51,11 +51,11 @@ class EntityDisplay extends ConfigEntityBase {
   public $targetEntityType;
 
   /**
-   * Bundle to be displayed.
+   * Subtype to be displayed.
    *
    * @var string
    */
-  public $bundle;
+  public $subtype;
 
   /**
    * View mode to be displayed.
@@ -91,10 +91,10 @@ class EntityDisplay extends ConfigEntityBase {
    */
   public function __construct(array $values, $entity_type) {
     // @todo See http://drupal.org/node/1825044#comment-6847792: contact.module
-    // currently produces invalid entities with a NULL bundle in some cases.
+    // currently produces invalid entities with a NULL subtype in some cases.
     // Add the validity checks back when http://drupal.org/node/1856556 is
     // fixed.
-    // if (!isset($values['targetEntityType']) || !isset($values['bundle']) || !isset($values['viewMode'])) {
+    // if (!isset($values['targetEntityType']) || !isset($values['subtype']) || !isset($values['viewMode'])) {
     //   throw new \InvalidArgumentException('Missing required properties for an EntiyDisplay entity.');
     // }
     parent::__construct($values, $entity_type);
@@ -106,7 +106,7 @@ public function __construct(array $values, $entity_type) {
    * Overrides \Drupal\Core\Entity\Entity::id().
    */
   public function id() {
-    return $this->targetEntityType . '.' . $this->bundle . '.' . $this->viewMode;
+    return $this->targetEntityType . '.' . $this->subtype . '.' . $this->viewMode;
   }
 
   /**
@@ -128,7 +128,7 @@ public function getExportProperties() {
       'id',
       'uuid',
       'targetEntityType',
-      'bundle',
+      'subtype',
       'viewMode',
       'content',
     );
@@ -142,7 +142,7 @@ public function getExportProperties() {
   /**
    * Creates a duplicate of the EntityDisplay object on a different view mode.
    *
-   * The new object necessarily has the same $targetEntityType and $bundle
+   * The new object necessarily has the same $targetEntityType and $subtype
    * properties than the original one.
    *
    * @param $view_mode
@@ -186,7 +186,7 @@ public function getComponents() {
    */
   public function getComponent($name) {
     // We always store 'extra fields', whether they are visible or hidden.
-    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display');
+    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->subtype, 'display');
     if (isset($extra_fields[$name])) {
       // If we have explicit settings, return an array or NULL depending on
       // visibility.
@@ -237,7 +237,7 @@ public function setComponent($name, array $options = array()) {
       $options['weight'] = isset($max) ? $max + 1 : 0;
     }
 
-    if ($instance = field_info_instance($this->targetEntityType, $name, $this->bundle)) {
+    if ($instance = field_info_instance($this->targetEntityType, $name, $this->subtype)) {
       $field = field_info_field($instance['field_name']);
       $options = drupal_container()->get('plugin.manager.field.formatter')->prepareConfiguration($field['type'], $options);
 
@@ -246,7 +246,7 @@ public function setComponent($name, array $options = array()) {
     }
 
     // We always store 'extra fields', whether they are visible or hidden.
-    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display');
+    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->subtype, 'display');
     if (isset($extra_fields[$name])) {
       $options['visible'] = TRUE;
     }
@@ -266,7 +266,7 @@ public function setComponent($name, array $options = array()) {
    *   The EntityDisplay object.
    */
   public function removeComponent($name) {
-    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display');
+    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->subtype, 'display');
     if (isset($extra_fields[$name])) {
       // 'Extra fields' are exposed in hooks and can appear at any given time.
       // Therefore we store extra fields that are explicitly being hidden, so
@@ -302,7 +302,7 @@ public function getHighestWeight() {
     }
 
     // Let other modules feedback about their own additions.
-    $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $this->targetEntityType, $this->bundle, $this->viewMode));
+    $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $this->targetEntityType, $this->subtype, $this->viewMode));
 
     return $weights ? max($weights) : NULL;
   }
@@ -324,7 +324,7 @@ public function getFormatter($field_name) {
 
     // Instantiate the formatter object from the stored display properties.
     if ($configuration = $this->getComponent($field_name)) {
-      $instance = field_info_instance($this->targetEntityType, $field_name, $this->bundle);
+      $instance = field_info_instance($this->targetEntityType, $field_name, $this->subtype);
       $formatter = drupal_container()->get('plugin.manager.field.formatter')->getInstance(array(
         'instance' => $instance,
         'view_mode' => $this->originalViewMode,
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php
index 3396f89..e0eb0fa 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php
@@ -36,7 +36,7 @@ protected function setUp() {
   public function testEntityDisplayCRUD() {
     $display = entity_create('entity_display', array(
       'targetEntityType' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'viewMode' => 'default',
     ));
 
@@ -81,7 +81,7 @@ public function testEntityDisplayCRUD() {
     $new_display->save();
     $new_display = entity_load('entity_display', $new_display->id());
     $this->assertEqual($new_display->targetEntityType, $display->targetEntityType);
-    $this->assertEqual($new_display->bundle, $display->bundle);
+    $this->assertEqual($new_display->subtype, $display->subtype);
     $this->assertEqual($new_display->viewMode, 'other_view_mode');
     $this->assertEqual($new_display->getComponents(), $display->getComponents());
   }
@@ -112,7 +112,7 @@ public function testEntityGetDisplay() {
   public function testExtraFieldComponent() {
     $display = entity_create('entity_display', array(
       'targetEntityType' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'viewMode' => 'default',
     ));
 
@@ -136,7 +136,7 @@ public function testFieldComponent() {
 
     $display = entity_create('entity_display', array(
       'targetEntityType' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'viewMode' => 'default',
     ));
 
@@ -149,7 +149,7 @@ public function testFieldComponent() {
     $instance = array(
       'field_name' => $field['field_name'],
       'entity_type' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
     );
     field_create_instance($instance);
 
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
index f5e968c..42fd842 100644
--- a/core/modules/entity_reference/entity_reference.module
+++ b/core/modules/entity_reference/entity_reference.module
@@ -43,7 +43,7 @@ function entity_reference_field_info() {
  */
 function entity_reference_entity_field_info($entity_type) {
   $property_info = array();
-  foreach (field_info_instances($entity_type) as $bundle_name => $instances) {
+  foreach (field_info_instances($entity_type) as $subtype_name => $instances) {
     foreach ($instances as $field_name => $instance) {
       $field = field_info_field($field_name);
       if ($field['type'] != 'entity_reference') {
@@ -115,23 +115,23 @@ function entity_reference_field_presave(EntityInterface $entity, $field, $instan
   global $user;
   $target_type = $field['settings']['target_type'];
   $entity_info = entity_get_info($target_type);
-  $bundles = entity_get_bundles($target_type);
+  $subtypes = entity_get_subtypes($target_type);
 
-  // Get the bundle.
-  if (!empty($instance['settings']['handler_settings']['target_bundles']) && count($instance['settings']['handler_settings']['target_bundles']) == 1) {
-    $bundle = reset($instance['settings']['handler_settings']['target_bundles']);
+  // Get the subtype.
+  if (!empty($instance['settings']['handler_settings']['target_subtypes']) && count($instance['settings']['handler_settings']['target_subtypes']) == 1) {
+    $subtype = reset($instance['settings']['handler_settings']['target_subtypes']);
   }
   else {
-    $bundle = reset($bundles);
+    $subtype = reset($subtypes);
   }
 
   foreach ($items as $delta => $item) {
     if ($item['target_id'] == 'auto_create') {
-      $bundle_key = $entity_info['entity_keys']['bundle'];
+      $subtype_key = $entity_info['entity_keys']['subtype'];
       $label_key = $entity_info['entity_keys']['label'];
       $values = array(
         $label_key => $item['label'],
-        $bundle_key => $bundle,
+        $subtype_key => $subtype,
         // @todo: Use wrapper to get the user if exists or needed.
         'uid' => isset($entity->uid) ? $entity->uid : $user->uid,
       );
@@ -214,16 +214,16 @@ function entity_reference_field_update_field($field, $prior_field, $has_data) {
     return;
   }
 
-  if (empty($field['bundles'])) {
+  if (empty($field['subtypes'])) {
     // Field has no instances.
     return;
   }
 
   $field_name = $field['field_name'];
 
-  foreach ($field['bundles'] as $entity_type => $bundles) {
-    foreach ($bundles as $bundle) {
-      $instance = field_info_instance($entity_type, $field_name, $bundle);
+  foreach ($field['subtypes'] as $entity_type => $subtypes) {
+    foreach ($subtypes as $subtype) {
+      $instance = field_info_instance($entity_type, $field_name, $subtype);
       $instance['settings']['handler_settings'] = array();
       field_update_instance($instance);
     }
@@ -398,14 +398,14 @@ function entity_reference_options_list($field, $instance, $entity_type = NULL, $
     return array();
   }
 
-  // Rebuild the array by changing the bundle key into the bundle label.
+  // Rebuild the array by changing the subtype key into the subtype label.
   $target_type = $field['settings']['target_type'];
-  $bundles = entity_get_bundles($target_type);
+  $subtypes = entity_get_subtypes($target_type);
 
   $return = array();
-  foreach ($options as $bundle => $entity_ids) {
-    $bundle_label = check_plain($bundles[$bundle]['label']);
-    $return[$bundle_label] = $entity_ids;
+  foreach ($options as $subtype => $entity_ids) {
+    $subtype_label = check_plain($subtypes[$subtype]['label']);
+    $return[$subtype_label] = $entity_ids;
   }
 
   return count($return) == 1 ? reset($return) : $return;
@@ -420,12 +420,12 @@ function entity_reference_query_entity_reference_alter(AlterableInterface $query
 }
 
 /**
- * Creates an instance of a entity reference field on the specified bundle.
+ * Creates an instance of a entity reference field on the specified subtype.
  *
  * @param string $entity_type
  *   The type of entity the field instance will be attached to.
- * @param string $bundle
- *   The bundle name of the entity the field instance will be attached to.
+ * @param string $subtype
+ *   The subtype name of the entity the field instance will be attached to.
  * @param string $field_name
  *   The name of the field; if it already exists, a new instance of the existing
  *   field will be created.
@@ -437,19 +437,19 @@ function entity_reference_query_entity_reference_alter(AlterableInterface $query
  *   The selection handler used by this field.
  * @param array $selection_handler_settings
  *   An array of settings supported by the selection handler specified above.
- *   (e.g. 'target_bundles', 'sort', 'auto_create', etc).
+ *   (e.g. 'target_subtypes', 'sort', 'auto_create', etc).
  *
  * @see \Drupal\entity_reference\Plugin\entity_reference\selection\SelectionBase::settingsForm()
  */
-function entity_reference_create_instance($entity_type, $bundle, $field_name, $field_label, $target_entity_type, $selection_handler = 'default', $selection_handler_settings = array()) {
+function entity_reference_create_instance($entity_type, $subtype, $field_name, $field_label, $target_entity_type, $selection_handler = 'default', $selection_handler_settings = array()) {
   // If a field type we know should exist isn't found, clear the field cache.
   if (!field_info_field_types('entity_reference')) {
     field_cache_clear();
   }
 
-  // Look for or add the specified field to the requested entity bundle.
+  // Look for or add the specified field to the requested entity subtype.
   $field = field_info_field($field_name);
-  $instance = field_info_instance($entity_type, $field_name, $bundle);
+  $instance = field_info_instance($entity_type, $field_name, $subtype);
 
   if (empty($field)) {
     $field = array(
@@ -467,7 +467,7 @@ function entity_reference_create_instance($entity_type, $bundle, $field_name, $f
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => $entity_type,
-      'bundle' => $bundle,
+      'subtype' => $subtype,
       'label' => $field_label,
       'settings' => array(
         'handler' => $selection_handler,
@@ -487,17 +487,17 @@ function entity_reference_create_instance($entity_type, $bundle, $field_name, $f
  *   The name of the entity reference field.
  * @param string $entity_type
  *   The entity type.
- * @param string $bundle_name
- *   The bundle name.
+ * @param string $subtype_name
+ *   The subtype name.
  *
  * @return bool
  *   TRUE if user can access this menu item, FALSE otherwise.
  */
-function entity_reference_autocomplete_access_callback($type, $field_name, $entity_type, $bundle_name) {
+function entity_reference_autocomplete_access_callback($type, $field_name, $entity_type, $subtype_name) {
   if (!$field = field_info_field($field_name)) {
     return FALSE;
   }
-  if (!$instance = field_info_instance($entity_type, $field_name, $bundle_name)){
+  if (!$instance = field_info_instance($entity_type, $field_name, $subtype_name)){
     return FALSE;
   }
 
@@ -517,17 +517,17 @@ function entity_reference_autocomplete_access_callback($type, $field_name, $enti
  *   The name of the entity reference field.
  * @param string $entity_type
  *   The entity type.
- * @param string $bundle_name
- *   The bundle name.
+ * @param string $subtype_name
+ *   The subtype name.
  * @param string $entity_id
  *   (optional) The entity ID the entity reference field is attached to.
  *   Defaults to ''.
  *
  * @return \Symfony\Component\HttpFoundation\JsonResponse
  */
-function entity_reference_autocomplete_callback($type, $field_name, $entity_type, $bundle_name, $entity_id = '') {
+function entity_reference_autocomplete_callback($type, $field_name, $entity_type, $subtype_name, $entity_id = '') {
   $field = field_info_field($field_name);
-  $instance = field_info_instance($entity_type, $field_name, $bundle_name);
+  $instance = field_info_instance($entity_type, $field_name, $subtype_name);
   $prefix = '';
 
   // Get the typed string, if exists from the URL.
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php
index fc5106e..bafecf7 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php
@@ -64,47 +64,47 @@ public function __construct($field, $instance, EntityInterface $entity = NULL) {
    */
   public static function settingsForm(&$field, &$instance) {
     $entity_info = entity_get_info($field['settings']['target_type']);
-    $bundles = entity_get_bundles($field['settings']['target_type']);
+    $subtypes = entity_get_subtypes($field['settings']['target_type']);
 
     // Merge-in default values.
     if (!isset($instance['settings']['handler_settings'])) {
       $instance['settings']['handler_settings'] = array();
     }
     $instance['settings']['handler_settings'] += array(
-      'target_bundles' => array(),
+      'target_subtypes' => array(),
       'sort' => array(
         'field' => '_none',
       ),
       'auto_create' => FALSE,
     );
 
-    if (!empty($entity_info['entity_keys']['bundle'])) {
-      $bundle_options = array();
-      foreach ($bundles as $bundle_name => $bundle_info) {
-        $bundle_options[$bundle_name] = $bundle_info['label'];
+    if (!empty($entity_info['entity_keys']['subtype'])) {
+      $subtype_options = array();
+      foreach ($subtypes as $subtype_name => $subtype_info) {
+        $subtype_options[$subtype_name] = $subtype_info['label'];
       }
 
-      $target_bundles_title = t('Bundles');
+      $target_subtypes_title = t('Subtypes');
       // Default core entity types with sensible labels.
       if ($field['settings']['target_type'] == 'node') {
-        $target_bundles_title = t('Content types');
+        $target_subtypes_title = t('Content types');
       }
       elseif ($field['settings']['target_type'] == 'taxonomy_term') {
-        $target_bundles_title = t('Vocabularies');
+        $target_subtypes_title = t('Vocabularies');
       }
 
-      $form['target_bundles'] = array(
+      $form['target_subtypes'] = array(
         '#type' => 'checkboxes',
-        '#title' => $target_bundles_title,
-        '#options' => $bundle_options,
-        '#default_value' => (!empty($instance['settings']['handler_settings']['target_bundles'])) ? $instance['settings']['handler_settings']['target_bundles'] : array_keys($bundle_options),
+        '#title' => $target_subtypes_title,
+        '#options' => $subtype_options,
+        '#default_value' => (!empty($instance['settings']['handler_settings']['target_subtypes'])) ? $instance['settings']['handler_settings']['target_subtypes'] : array_keys($subtype_options),
         '#size' => 6,
         '#multiple' => TRUE,
         '#element_validate' => array('_entity_reference_element_validate_filter'),
       );
     }
     else {
-      $form['target_bundles'] = array(
+      $form['target_subtypes'] = array(
         '#type' => 'value',
         '#value' => array(),
       );
@@ -113,8 +113,8 @@ public static function settingsForm(&$field, &$instance) {
     // @todo Use Entity::getPropertyDefinitions() when all entity types are
     // converted to the new Field API.
     $fields = drupal_map_assoc($entity_info['schema_fields_sql']['base_table']);
-    foreach (field_info_instances($field['settings']['target_type']) as $bundle_instances) {
-      foreach ($bundle_instances as $instance_name => $instance_info) {
+    foreach (field_info_instances($field['settings']['target_type']) as $subtype_instances) {
+      foreach ($subtype_instances as $instance_name => $instance_info) {
         $field_info = field_info_field($instance_name);
         foreach ($field_info['columns'] as $column_name => $column_info) {
           $fields[$instance_name . '.' . $column_name] = t('@label (@column)', array('@label' => $instance_info['label'], '@column' => $column_name));
@@ -180,8 +180,8 @@ public function getReferencableEntities($match = NULL, $match_operator = 'CONTAI
     $options = array();
     $entities = entity_load_multiple($target_type, $result);
     foreach ($entities as $entity_id => $entity) {
-      $bundle = $entity->bundle();
-      $options[$bundle][$entity_id] = check_plain($entity->label());
+      $subtype = $entity->subtype();
+      $options[$subtype][$entity_id] = check_plain($entity->label());
     }
 
     return $options;
@@ -267,8 +267,8 @@ public function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
     $entity_info = entity_get_info($target_type);
 
     $query = entity_query($target_type);
-    if (!empty($this->instance['settings']['handler_settings']['target_bundles'])) {
-      $query->condition($entity_info['entity_keys']['bundle'], $this->instance['settings']['handler_settings']['target_bundles'], 'IN');
+    if (!empty($this->instance['settings']['handler_settings']['target_subtypes'])) {
+      $query->condition($entity_info['entity_keys']['subtype'], $this->instance['settings']['handler_settings']['target_subtypes'], 'IN');
     }
 
     if (isset($match) && isset($entity_info['entity_keys']['label'])) {
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php
index a88f2ea..59a3a7f 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php
@@ -40,7 +40,7 @@ public function elementValidate($element, &$form_state, $form) {
     $value = array();
     // If a value was entered into the autocomplete.
     $handler = entity_reference_get_selection_handler($this->field, $this->instance);
-    $bundles = entity_get_bundles($this->field['settings']['target_type']);
+    $subtypes = entity_get_subtypes($this->field['settings']['target_type']);
     $auto_create = isset($this->instance['settings']['handler_settings']['auto_create']) ? $this->instance['settings']['handler_settings']['auto_create'] : FALSE;
 
     if (!empty($element['#value'])) {
@@ -62,7 +62,7 @@ public function elementValidate($element, &$form_state, $form) {
         if ($match) {
           $value[] = array('target_id' => $match);
         }
-        elseif ($auto_create && (count($this->instance['settings']['handler_settings']['target_bundles']) == 1 || count($bundles) == 1)) {
+        elseif ($auto_create && (count($this->instance['settings']['handler_settings']['target_subtypes']) == 1 || count($subtypes) == 1)) {
           // Auto-create item. see entity_reference_field_presave().
           $value[] = array('target_id' => 'auto_create', 'label' => $entity);
         }
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php
index 57c4b7b..b89bb31 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php
@@ -73,7 +73,7 @@ public function elementValidate($element, &$form_state, $form) {
         $value = $handler->validateAutocompleteInput($element['#value'], $element, $form_state, $form, !$auto_create);
       }
 
-      if (!$value && $auto_create && (count($this->instance['settings']['handler_settings']['target_bundles']) == 1)) {
+      if (!$value && $auto_create && (count($this->instance['settings']['handler_settings']['target_subtypes']) == 1)) {
         // Auto-create item. see entity_reference_field_presave().
         $value = array(
           'target_id' => 'auto_create',
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php
index c057447..9ad243b 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php
@@ -59,7 +59,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
 
     // Prepare the autocomplete path.
     $autocomplete_path = $this->getSetting('autocomplete_path');
-    $autocomplete_path .= '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['bundle'] . '/';
+    $autocomplete_path .= '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['subtype'] . '/';
 
     // Use <NULL> as a placeholder in the URL when we don't have an entity.
     // Most web servers collapse two consecutive slashes.
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAdminTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAdminTest.php
index bbfd49a..61f41c0 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAdminTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAdminTest.php
@@ -63,10 +63,10 @@ protected function getAllOptionsList($element) {
   }
 
   public function testFieldAdminHandler() {
-    $bundle_path = 'admin/structure/types/manage/' . $this->type;
+    $subtype_path = 'admin/structure/types/manage/' . $this->type;
 
     // First step: 'Add new field' on the 'Manage fields' page.
-    $this->drupalPost($bundle_path . '/fields', array(
+    $this->drupalPost($subtype_path . '/fields', array(
       'fields[_add_new_field][label]' => 'Test label',
       'fields[_add_new_field][field_name]' => 'test',
       'fields[_add_new_field][type]' => 'entity_reference',
@@ -84,9 +84,9 @@ public function testFieldAdminHandler() {
 
     // The base handler settings should be displayed.
     $entity_type = 'node';
-    $bundles = entity_get_bundles($entity_type);
-    foreach ($bundles as $bundle_name => $bundle_info) {
-      $this->assertFieldByName('instance[settings][handler_settings][target_bundles][' . $bundle_name . ']');
+    $subtypes = entity_get_subtypes($entity_type);
+    foreach ($subtypes as $subtype_name => $subtype_info) {
+      $this->assertFieldByName('instance[settings][handler_settings][target_subtypes][' . $subtype_name . ']');
     }
 
     // Test the sort settings.
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php
index d7b2d84..6ed8a99 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php
@@ -51,12 +51,12 @@ function setUp() {
       'label' => 'Entity reference field',
       'field_name' => 'test_field',
       'entity_type' => 'node',
-      'bundle' => $referencing->type,
+      'subtype' => $referencing->type,
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
           // Reference a single vocabulary.
-          'target_bundles' => array(
+          'target_subtypes' => array(
             $referenced->type,
           ),
           // Enable auto-create.
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php
index 70961b0..34355b6 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php
@@ -42,7 +42,7 @@ function setUp() {
 
     $this->instance = array(
       'field_name' => $this->field_name,
-      'bundle' => 'article',
+      'subtype' => 'article',
       'entity_type' => 'node',
       'widget' => array(
         'type' => 'options_select',
@@ -50,7 +50,7 @@ function setUp() {
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
-          'target_bundles' => array(
+          'target_subtypes' => array(
             $this->vocabulary->id(),
           ),
           'auto_create' => TRUE,
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php
index cf1c619..e0d6a13 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php
@@ -41,8 +41,8 @@ protected function assertReferencable($field, $instance, $tests, $handler_name)
 
         $result = call_user_func_array(array($handler, 'countReferencableEntities'), $arguments);
         if (!empty($test['result'])) {
-          $bundle = key($test['result']);
-          $count = count($test['result'][$bundle]);
+          $subtype = key($test['result']);
+          $count = count($test['result'][$subtype]);
         }
         else {
           $count = 0;
@@ -72,7 +72,7 @@ public function testNodeHandler() {
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
-          'target_bundles' => array(),
+          'target_subtypes' => array(),
         ),
       ),
     );
@@ -210,7 +210,7 @@ public function testUserHandler() {
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
-          'target_bundles' => array(),
+          'target_subtypes' => array(),
         ),
       ),
     );
@@ -350,7 +350,7 @@ public function testCommentHandler() {
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
-          'target_bundles' => array(),
+          'target_subtypes' => array(),
         ),
       ),
     );
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php
index cc768e2..eabe571 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php
@@ -47,7 +47,7 @@ public function testSort() {
       'label' => 'Text Field',
       'field_name' => 'field_text',
       'entity_type' => 'node',
-      'bundle' => 'article',
+      'subtype' => 'article',
       'settings' => array(),
       'required' => FALSE,
     );
@@ -70,7 +70,7 @@ public function testSort() {
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
-          'target_bundles' => array(),
+          'target_subtypes' => array(),
           // Add sorting.
           'sort' => array(
             'field' => 'field_text.value',
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/SelectionTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/SelectionTest.php
index 6998209..92ff8d6 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/SelectionTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/SelectionTest.php
@@ -54,7 +54,7 @@ public function testSelectionHandler() {
       'settings' => array(
         'handler' => 'views',
         'handler_settings' => array(
-          'target_bundles' => array(),
+          'target_subtypes' => array(),
           'view' => array(
             'view_name' => 'test_entity_reference',
             'display_name' => 'entity_reference_1',
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 16b0143..bce8496 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -26,7 +26,7 @@
  *
  * @return
  *   A nested array of 'pseudo-field' components. Each list is nested within the
- *   following keys: entity type, bundle name, context (either 'form' or
+ *   following keys: entity type, subtype name, context (either 'form' or
  *   'display'). The keys are the name of the elements as appearing in the
  *   renderable array (either the entity form or the displayed entity). The
  *   value is an associative array:
@@ -41,30 +41,30 @@ function hook_field_extra_fields() {
   $module_language_enabled = module_exists('language');
   $description = t('Node module element');
 
-  foreach (node_type_get_types() as $bundle) {
-    if ($bundle->has_title) {
-      $extra['node'][$bundle->type]['form']['title'] = array(
-        'label' => $bundle->title_label,
+  foreach (node_type_get_types() as $subtype) {
+    if ($subtype->has_title) {
+      $extra['node'][$subtype->type]['form']['title'] = array(
+        'label' => $subtype->title_label,
         'description' => $description,
         'weight' => -5,
       );
     }
 
     // Add also the 'language' select if Language module is enabled and the
-    // bundle has multilingual support.
+    // subtype has multilingual support.
     // Visibility of the ordering of the language selector is the same as on the
     // node/add form.
     if ($module_language_enabled) {
-      $configuration = language_get_default_configuration('node', $bundle->type);
+      $configuration = language_get_default_configuration('node', $subtype->type);
       if ($configuration['language_show']) {
-        $extra['node'][$bundle->type]['form']['language'] = array(
+        $extra['node'][$subtype->type]['form']['language'] = array(
           'label' => t('Language'),
           'description' => $description,
           'weight' => 0,
         );
       }
     }
-    $extra['node'][$bundle->type]['display']['language'] = array(
+    $extra['node'][$subtype->type]['display']['language'] = array(
       'label' => t('Language'),
       'description' => $description,
       'weight' => 0,
@@ -85,9 +85,9 @@ function hook_field_extra_fields() {
  */
 function hook_field_extra_fields_alter(&$info) {
   // Force node title to always be at the top of the list by default.
-  foreach (node_type_get_types() as $bundle) {
-    if (isset($info['node'][$bundle->type]['form']['title'])) {
-      $info['node'][$bundle->type]['form']['title']['weight'] = -20;
+  foreach (node_type_get_types() as $subtype) {
+    if (isset($info['node'][$subtype->type]['form']['title'])) {
+      $info['node'][$subtype->type]['form']['title']['weight'] = -20;
     }
   }
 }
@@ -377,7 +377,7 @@ function hook_field_prepare_view($entity_type, $entities, $field, $instances, $l
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -414,7 +414,7 @@ function hook_field_validate(\Drupal\Core\Entity\EntityInterface $entity = NULL,
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -447,7 +447,7 @@ function hook_field_presave(\Drupal\Core\Entity\EntityInterface $entity, $field,
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -486,7 +486,7 @@ function hook_field_insert(\Drupal\Core\Entity\EntityInterface $entity, $field,
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -573,7 +573,7 @@ function hook_field_storage_update_field($field, $prior_field, $has_data) {
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -601,7 +601,7 @@ function hook_field_delete(\Drupal\Core\Entity\EntityInterface $entity, $field,
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -622,7 +622,7 @@ function hook_field_delete_revision(\Drupal\Core\Entity\EntityInterface $entity,
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field on $entity's bundle.
+ *   The instance structure for $field on $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -793,7 +793,7 @@ function hook_field_widget_WIDGET_TYPE_form_alter(&$element, &$form_state, $cont
  * @param array $context
  *   An associative array containing:
  *   - entity_type: The entity type, e.g., 'node' or 'user'.
- *   - bundle: The bundle, e.g., 'page' or 'article'.
+ *   - subtype: The subtype, e.g., 'page' or 'article'.
  *   - field: The field that the widget belongs to.
  *   - instance: The instance of the field.
  *
@@ -1161,63 +1161,63 @@ function hook_field_available_languages_alter(&$langcodes, $context) {
 }
 
 /**
- * Act on field_attach_create_bundle().
+ * Act on field_attach_create_subtype().
  *
  * This hook is invoked after the field module has performed the operation.
  *
  * @param string $entity_type
  *   The type of $entity; e.g. 'node' or 'user'.
- * @param string $bundle
- *   The name of the bundle.
+ * @param string $subtype
+ *   The name of the subtype.
  */
-function hook_field_attach_create_bundle($entity_type, $bundle) {
-  // When a new bundle is created, the menu needs to be rebuilt to add the
+function hook_field_attach_create_subtype($entity_type, $subtype) {
+  // When a new subtype is created, the menu needs to be rebuilt to add the
   // Field UI menu item tabs.
   state()->set('menu_rebuild_needed', TRUE);
 }
 
 /**
- * Act on field_attach_rename_bundle().
+ * Act on field_attach_rename_subtype().
  *
  * This hook is invoked after the field module has performed the operation.
  *
  * @param $entity_type
- *   The entity type to which the bundle is bound.
- * @param $bundle_old
- *   The previous name of the bundle.
- * @param $bundle_new
- *   The new name of the bundle.
+ *   The entity type to which the subtype is bound.
+ * @param $subtype_old
+ *   The previous name of the subtype.
+ * @param $subtype_new
+ *   The new name of the subtype.
  */
-function hook_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+function hook_field_attach_rename_subtype($entity_type, $subtype_old, $subtype_new) {
   // Update the extra weights variable with new information.
-  if ($bundle_old !== $bundle_new) {
+  if ($subtype_old !== $subtype_new) {
     $extra_weights = variable_get('field_extra_weights', array());
-    if (isset($info[$entity_type][$bundle_old])) {
-      $extra_weights[$entity_type][$bundle_new] = $extra_weights[$entity_type][$bundle_old];
-      unset($extra_weights[$entity_type][$bundle_old]);
+    if (isset($info[$entity_type][$subtype_old])) {
+      $extra_weights[$entity_type][$subtype_new] = $extra_weights[$entity_type][$subtype_old];
+      unset($extra_weights[$entity_type][$subtype_old]);
       variable_set('field_extra_weights', $extra_weights);
     }
   }
 }
 
 /**
- * Act on field_attach_delete_bundle.
+ * Act on field_attach_delete_subtype.
  *
  * This hook is invoked after the field module has performed the operation.
  *
  * @param $entity_type
  *   The type of entity; for example, 'node' or 'user'.
- * @param $bundle
- *   The bundle that was just deleted.
+ * @param $subtype
+ *   The subtype that was just deleted.
  * @param $instances
- *   An array of all instances that existed for the bundle before it was
+ *   An array of all instances that existed for the subtype before it was
  *   deleted.
  */
-function hook_field_attach_delete_bundle($entity_type, $bundle, $instances) {
-  // Remove the extra weights variable information for this bundle.
+function hook_field_attach_delete_subtype($entity_type, $subtype, $instances) {
+  // Remove the extra weights variable information for this subtype.
   $extra_weights = variable_get('field_extra_weights', array());
-  if (isset($extra_weights[$entity_type][$bundle])) {
-    unset($extra_weights[$entity_type][$bundle]);
+  if (isset($extra_weights[$entity_type][$subtype])) {
+    unset($extra_weights[$entity_type][$subtype]);
     variable_set('field_extra_weights', $extra_weights);
   }
 }
@@ -1431,7 +1431,7 @@ function hook_field_storage_load($entity_type, $entities, $age, $fields, $option
 function hook_field_storage_write(\Drupal\Core\Entity\EntityInterface $entity, $op, $fields) {
   $id = $entity->id();
   $vid = $entity->getRevisionId();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
   if (!isset($vid)) {
     $vid = $id;
   }
@@ -1467,7 +1467,7 @@ function hook_field_storage_write(\Drupal\Core\Entity\EntityInterface $entity, $
 
     // Prepare the multi-insert query.
     $do_insert = FALSE;
-    $columns = array('entity_type', 'entity_id', 'revision_id', 'bundle', 'delta', 'langcode');
+    $columns = array('entity_type', 'entity_id', 'revision_id', 'subtype', 'delta', 'langcode');
     foreach ($field['columns'] as $column => $attributes) {
       $columns[] = _field_sql_storage_columnname($field_name, $column);
     }
@@ -1484,7 +1484,7 @@ function hook_field_storage_write(\Drupal\Core\Entity\EntityInterface $entity, $
           'entity_type' => $entity->entityType(),
           'entity_id' => $id,
           'revision_id' => $vid,
-          'bundle' => $bundle,
+          'subtype' => $subtype,
           'delta' => $delta,
           'langcode' => $langcode,
         );
@@ -1523,7 +1523,7 @@ function hook_field_storage_write(\Drupal\Core\Entity\EntityInterface $entity, $
  *   array are field IDs.
  */
 function hook_field_storage_delete(\Drupal\Core\Entity\EntityInterface $entity, $fields) {
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     if (isset($fields[$instance['field_id']])) {
       $field = field_info_field_by_id($instance['field_id']);
       field_sql_storage_field_storage_purge($entity, $field, $instance);
@@ -1599,7 +1599,7 @@ function hook_field_storage_query($query) {
       $select_query = db_select($tablename, $table_alias);
       $select_query->addTag('entity_field_access');
       $select_query->addMetaData('base_table', $tablename);
-      $select_query->fields($table_alias, array('entity_type', 'entity_id', 'revision_id', 'bundle'));
+      $select_query->fields($table_alias, array('entity_type', 'entity_id', 'revision_id', 'subtype'));
       $field_base_table = $table_alias;
     }
     if ($field['cardinality'] != 1) {
@@ -1737,12 +1737,12 @@ function hook_field_storage_delete_instance($instance) {
   db_update($table_name)
     ->fields(array('deleted' => 1))
     ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('subtype', $instance['subtype'])
     ->execute();
   db_update($revision_name)
     ->fields(array('deleted' => 1))
     ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('subtype', $instance['subtype'])
     ->execute();
 }
 
@@ -1754,7 +1754,7 @@ function hook_field_storage_delete_instance($instance) {
  *
  * This lets 3rd party modules override, mirror, share, or otherwise store a
  * subset of fields in a different way than the current storage engine. Possible
- * use cases include per-bundle storage, per-combo-field storage, etc.
+ * use cases include per-subtype storage, per-combo-field storage, etc.
  *
  * Modules implementing this hook should load field values and add them to
  * objects in $entities. Fields with no values should be added as empty arrays.
@@ -1875,8 +1875,8 @@ function hook_field_storage_pre_update(\Drupal\Core\Entity\EntityInterface $enti
  *
  * @param $entity_type
  *   The type of entity; e.g. 'node' or 'user'.
- * @param $bundle
- *   The bundle name.
+ * @param $subtype
+ *   The subtype name.
  * @param $context
  *   The context for which the maximum weight is requested. Either 'form', or
  *   the name of a view mode.
@@ -1884,10 +1884,10 @@ function hook_field_storage_pre_update(\Drupal\Core\Entity\EntityInterface $enti
  *   The maximum weight of the entity's components, or NULL if no components
  *   were found.
  */
-function hook_field_info_max_weight($entity_type, $bundle, $context) {
+function hook_field_info_max_weight($entity_type, $subtype, $context) {
   $weights = array();
 
-  foreach (my_module_entity_additions($entity_type, $bundle, $context) as $addition) {
+  foreach (my_module_entity_additions($entity_type, $subtype, $context) as $addition) {
     $weights[] = $addition['weight'];
   }
 
@@ -1911,7 +1911,7 @@ function hook_field_info_max_weight($entity_type, $bundle, $context) {
  * @param array $context
  *   An associative array containing:
  *   - entity_type: The entity type, e.g., 'node' or 'user'.
- *   - bundle: The bundle, e.g., 'page' or 'article'.
+ *   - subtype: The subtype, e.g., 'page' or 'article'.
  *   - field: The field that the widget belongs to.
  *   - instance: The instance of the field.
  *
diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc
index 69102f4..8b82c6c 100644
--- a/core/modules/field/field.attach.inc
+++ b/core/modules/field/field.attach.inc
@@ -65,22 +65,22 @@
  * Field API should operate on their entity objects. Notably, the 'fieldable'
  * property needs to be set to TRUE.
  *
- * The Field Attach API uses the concept of bundles: the set of fields for a
- * given entity is defined on a per-bundle basis. The collection of bundles for
+ * The Field Attach API uses the concept of subtypes: the set of fields for a
+ * given entity is defined on a per-subtype basis. The collection of subtypes for
  * an entity type is added to the entity definition with
  * hook_entity_info_alter(). For instance, node_entity_info_alter() exposes
- * each node type as its own bundle. This means that the set of fields of a
+ * each node type as its own subtype. This means that the set of fields of a
  * node is determined by the node type.
  *
- * The Field API reads the bundle name for a given entity from a particular
+ * The Field API reads the subtype name for a given entity from a particular
  * property of the entity object, and hook_entity_info_alter() defines which
  * property to use. For instance, node_entity_info_alter() specifies:
  * @code
- *   $info['entity_keys']['bundle'] = 'type'
+ *   $info['entity_keys']['subtype'] = 'type'
  * @endcode
- * This indicates that for a particular node object, the bundle name can be
+ * This indicates that for a particular node object, the subtype name can be
  * found in $node->type. This property can be omitted if the entity type only
- * exposes a single bundle (all entities of this type have the same collection
+ * exposes a single subtype (all entities of this type have the same collection
  * of fields). This is the case for the 'user' entity type.
  *
  * Most Field Attach API functions define a corresponding hook function that
@@ -133,11 +133,11 @@
  *   keys:
  *   - field_name: The name of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's
- *     bundle. NOTE: This option is not compatible with the 'deleted' option;
+ *     subtype. NOTE: This option is not compatible with the 'deleted' option;
  *     the 'field_id' option should be used instead.
  *   - field_id: The ID of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's'
- *     bundles.
+ *     subtypes.
  *   - deleted: If TRUE, the function will operate on deleted fields as well
  *     as non-deleted fields. If unset or FALSE, only non-deleted fields are
  *     operated on.
@@ -158,7 +158,7 @@ function field_invoke_method($method, $target_function, EntityInterface $entity,
 
   $entity_type = $entity->entityType();
   // Determine the list of instances to iterate on.
-  $instances = _field_invoke_get_instances($entity_type, $entity->bundle(), $options);
+  $instances = _field_invoke_get_instances($entity_type, $entity->subtype(), $options);
 
   // Iterate through the instances and collect results.
   $return = array();
@@ -223,11 +223,11 @@ function field_invoke_method($method, $target_function, EntityInterface $entity,
  *   keys:
  *   - field_name: The name of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's
- *     bundle. NOTE: This option is not compatible with the 'deleted' option;
+ *     subtype. NOTE: This option is not compatible with the 'deleted' option;
  *     the 'field_id' option should be used instead.
  *   - field_id: The ID of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's'
- *     bundles.
+ *     subtypes.
  *   - deleted: If TRUE, the function will operate on deleted fields as well
  *     as non-deleted fields. If unset or FALSE, only non-deleted fields are
  *     operated on.
@@ -261,7 +261,7 @@ function field_invoke_method_multiple($method, $target_function, array $entities
     $entity_type = $entity->entityType();
 
     // Determine the list of instances to iterate on.
-    $entity_instances = _field_invoke_get_instances($entity_type, $entity->bundle(), $options);
+    $entity_instances = _field_invoke_get_instances($entity_type, $entity->subtype(), $options);
 
     foreach ($entity_instances as $instance) {
       $instance_id = $instance['id'];
@@ -361,12 +361,12 @@ function field_invoke_method_multiple($method, $target_function, array $entities
  *   An associative array of additional options, with the following keys:
  *  - 'field_name': The name of the field whose operation should be
  *    invoked. By default, the operation is invoked on all the fields
- *    in the entity's bundle. NOTE: This option is not compatible with
+ *    in the entity's subtype. NOTE: This option is not compatible with
  *    the 'deleted' option; the 'field_id' option should be used
  *    instead.
  *  - 'field_id': The id of the field whose operation should be
  *    invoked. By default, the operation is invoked on all the fields
- *    in the entity's' bundles.
+ *    in the entity's' subtypes.
  *  - 'default': A boolean value, specifying which implementation of
  *    the operation should be invoked.
  *    - if FALSE (default), the field types implementation of the operation
@@ -392,7 +392,7 @@ function _field_invoke($op, EntityInterface $entity, &$a = NULL, &$b = NULL, $op
   $options += $default_options;
 
   // Determine the list of instances to iterate on.
-  $instances = _field_invoke_get_instances($entity->entityType(), $entity->bundle(), $options);
+  $instances = _field_invoke_get_instances($entity->entityType(), $entity->subtype(), $options);
 
   // Iterate through the instances and collect results.
   $return = array();
@@ -455,11 +455,11 @@ function _field_invoke($op, EntityInterface $entity, &$a = NULL, &$b = NULL, $op
  *   An associative array of additional options, with the following keys:
  *   - field_name: The name of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's
- *     bundle. NOTE: This option is not compatible with the 'deleted' option;
+ *     subtype. NOTE: This option is not compatible with the 'deleted' option;
  *     the 'field_id' option should be used instead.
  *   - field_id: The ID of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's
- *     bundles.
+ *     subtypes.
  *   - default: A boolean value, specifying which implementation of the
  *     operation should be invoked.
  *     - if FALSE (default), the field types implementation of the operation
@@ -503,7 +503,7 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b =
   // $entity->$field_name property.
   foreach ($entities as $entity) {
     // Determine the list of instances to iterate on.
-    $instances = _field_invoke_get_instances($entity_type, $entity->bundle(), $options);
+    $instances = _field_invoke_get_instances($entity_type, $entity->subtype(), $options);
     $id = $entity->id();
 
     foreach ($instances as $instance) {
@@ -614,11 +614,11 @@ function _field_invoke_default($op, EntityInterface $entity, &$a = NULL, &$b = N
  *   An associative array of additional options, with the following keys:
  *   - field_name: The name of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's
- *     bundle. NOTE: This option is not compatible with the 'deleted' option;
+ *     subtype. NOTE: This option is not compatible with the 'deleted' option;
  *     the 'field_id' option should be used instead.
  *   - field_id: The ID of the field whose operation should be invoked. By
  *     default, the operation is invoked on all the fields in the entity's
- *     bundles.
+ *     subtypes.
  *   - default': A boolean value, specifying which implementation of the
  *     operation should be invoked.
  *     - if FALSE (default), the field types implementation of the operation
@@ -651,8 +651,8 @@ function _field_invoke_multiple_default($op, $entity_type, $entities, &$a = NULL
  *
  * @param $entity_type
  *   The entity type.
- * @param $bundle
- *   The bundle name.
+ * @param $subtype
+ *   The subtype name.
  * @param $options
  *   An associative array of options, as provided to _field_invoke(). Only the
  *   following keys are considered:
@@ -664,11 +664,11 @@ function _field_invoke_multiple_default($op, $entity_type, $entities, &$a = NULL
  * @return
  *   The array of selected instance definitions.
  */
-function _field_invoke_get_instances($entity_type, $bundle, $options) {
+function _field_invoke_get_instances($entity_type, $subtype, $options) {
   if ($options['deleted']) {
     // Deleted fields are not included in field_info_instances(), and need to
     // be fetched from the database with field_read_instances().
-    $params = array('entity_type' => $entity_type, 'bundle' => $bundle);
+    $params = array('entity_type' => $entity_type, 'subtype' => $subtype);
     if (isset($options['field_id'])) {
       // Single-field mode by field id: field_read_instances() does the filtering.
       // Single-field mode by field name is not compatible with the 'deleted'
@@ -680,10 +680,10 @@ function _field_invoke_get_instances($entity_type, $bundle, $options) {
   elseif (isset($options['field_name'])) {
     // Single-field mode by field name: field_info_instance() does the
     // filtering.
-    $instances = array(field_info_instance($entity_type, $options['field_name'], $bundle));
+    $instances = array(field_info_instance($entity_type, $options['field_name'], $subtype));
   }
   else {
-    $instances = field_info_instances($entity_type, $bundle);
+    $instances = field_info_instances($entity_type, $subtype);
     if (isset($options['field_id'])) {
       // Single-field mode by field id: we need to loop on each instance to
       // find the right one.
@@ -734,7 +734,7 @@ function _field_invoke_widget_target() {
  * @code
  *   '#parents' => The location of field values in $form_state['values'],
  *   '#entity_type' => The name of the entity type,
- *   '#bundle' => The name of the bundle,
+ *   '#subtype' => The name of the subtype,
  *   // One sub-array per field appearing in the entity, keyed by field name.
  *   // The structure of the array differs slightly depending on whether the
  *   // widget is 'single-value' (provides the input for one field value,
@@ -765,7 +765,7 @@ function _field_invoke_widget_target() {
  *       // One sub-array per copy of the widget, keyed by delta.
  *       0 => array(
  *         '#entity_type' => The name of the entity type,
- *         '#bundle' => The name of the bundle,
+ *         '#subtype' => The name of the subtype,
  *         '#field_name' => The name of the field,
  *         '#field_parents' => The 'parents' space for the field in the form,
  *            equal to the #parents property of the $form parameter received by
@@ -785,7 +785,7 @@ function _field_invoke_widget_target() {
  *
  *       // Only for multiple widgets:
  *       '#entity_type' => The name of the entity type,
- *       '#bundle' => $instance['bundle'],
+ *       '#subtype' => $instance['subtype'],
  *       '#columns'  => array_keys($field['columns']),
  *       // The remaining elements in the sub-array depend on the widget.
  *       '#type' => The type of the widget,
@@ -831,7 +831,7 @@ function field_attach_form(EntityInterface $entity, &$form, &$form_state, $langc
   // Add custom weight handling.
   $form['#pre_render'][] = '_field_extra_fields_pre_render';
   $form['#entity_type'] = $entity->entityType();
-  $form['#bundle'] = $entity->bundle();
+  $form['#subtype'] = $entity->subtype();
 
   // Let other modules make changes to the form.
   // Avoid module_invoke_all() to let parameters be taken by reference.
@@ -855,7 +855,7 @@ function field_attach_form(EntityInterface $entity, &$form, &$form_state, $langc
  *   The type of entities in $entities; e.g., 'node' or 'user'.
  * @param $entities
  *   An array of entities for which to load fields, keyed by entity ID. Each
- *   entity needs to have its 'bundle', 'id' and (if applicable) 'revision' keys
+ *   entity needs to have its 'subtype', 'id' and (if applicable) 'revision' keys
  *   filled in. The function adds the loaded field data directly in the entity
  *   objects of the $entities array.
  * @param $age
@@ -938,7 +938,7 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
     // Collect the storage backends used by the remaining fields in the entities.
     $storages = array();
     foreach ($queried_entities as $entity) {
-      $instances = _field_invoke_get_instances($entity_type, $entity->bundle(), $options);
+      $instances = _field_invoke_get_instances($entity_type, $entity->subtype(), $options);
       $id = $entity->id();
       $vid = $entity->getRevisionId();
       foreach ($instances as $instance) {
@@ -974,7 +974,7 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
     if ($cache_write) {
       foreach ($queried_entities as $id => $entity) {
         $data = array();
-        $instances = field_info_instances($entity_type, $entity->bundle());
+        $instances = field_info_instances($entity_type, $entity->subtype());
         foreach ($instances as $instance) {
           $data[$instance['field_name']] = $queried_entities[$id]->{$instance['field_name']};
         }
@@ -999,7 +999,7 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
  *   The type of entities in $entities; e.g. 'node' or 'user'.
  * @param $entities
  *   An array of entities for which to load fields, keyed by entity ID. Each
- *   entity needs to have its 'bundle', 'id' and (if applicable) 'revision' keys
+ *   entity needs to have its 'subtype', 'id' and (if applicable) 'revision' keys
  *   filled. The function adds the loaded field data directly in the entity
  *   objects of the $entities array.
  * @param $options
@@ -1168,7 +1168,7 @@ function field_attach_insert(EntityInterface $entity) {
 
   // Collect the storage backends used by the remaining fields in the entities.
   $storages = array();
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     $field = field_info_field_by_id($instance['field_id']);
     $field_id = $field['id'];
     $field_name = $field['field_name'];
@@ -1209,7 +1209,7 @@ function field_attach_update(EntityInterface $entity) {
 
   // Collect the storage backends used by the remaining fields in the entities.
   $storages = array();
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     $field = field_info_field_by_id($instance['field_id']);
     $field_id = $field['id'];
     $field_name = $field['field_name'];
@@ -1252,7 +1252,7 @@ function field_attach_delete(EntityInterface $entity) {
 
   // Collect the storage backends used by the fields in the entities.
   $storages = array();
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     $field = field_info_field_by_id($instance['field_id']);
     $field_id = $field['id'];
     $storages[$field['storage']['type']][$field_id] = $field_id;
@@ -1285,7 +1285,7 @@ function field_attach_delete_revision(EntityInterface $entity) {
 
   // Collect the storage backends used by the fields in the entities.
   $storages = array();
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     $field = field_info_field_by_id($instance['field_id']);
     $field_id = $field['id'];
     $storages[$field['storage']['type']][$field_id] = $field_id;
@@ -1320,7 +1320,7 @@ function field_attach_delete_revision(EntityInterface $entity) {
  * @param array $entities
  *   An array of entities, keyed by entity ID.
  * @param array $displays
- *   An array of entity display objects, keyed by bundle name.
+ *   An array of entity display objects, keyed by subtype name.
  * @param $langcode
  *   (Optional) The language the field values are to be shown in. If no language
  *   is provided the current language is used.
@@ -1359,8 +1359,8 @@ function field_attach_prepare_view($entity_type, array $entities, array $display
   // instance, call the prepareView() method on the formatter object handed by
   // the entity display.
   $target_function = function ($instance) use ($displays) {
-    if (isset($displays[$instance['bundle']])) {
-      return $displays[$instance['bundle']]->getFormatter($instance['field_name']);
+    if (isset($displays[$instance['subtype']])) {
+      return $displays[$instance['subtype']]->getFormatter($instance['field_name']);
     }
   };
   field_invoke_method_multiple('prepareView', $target_function, $prepare, $null, $null, $options);
@@ -1467,7 +1467,7 @@ function field_attach_view(EntityInterface $entity, EntityDisplay $display, $lan
 function field_attach_preprocess(EntityInterface $entity, $element, &$variables) {
   // Enable BC if necessary.
   $entity = $entity->getBCEntity();
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     $field_name = $instance['field_name'];
     if (isset($element[$field_name]['#language'])) {
       $langcode = $element[$field_name]['#language'];
@@ -1520,56 +1520,56 @@ function field_attach_prepare_translation(EntityInterface $entity, $langcode, En
 }
 
 /**
- * Notifies field.module that a new bundle was created.
+ * Notifies field.module that a new subtype was created.
  *
  * The default SQL-based storage doesn't need to do anything about it, but
  * others might.
  *
  * @param $entity_type
- *   The entity type to which the bundle is bound.
- * @param $bundle
- *   The name of the newly created bundle.
+ *   The entity type to which the subtype is bound.
+ * @param $subtype
+ *   The name of the newly created subtype.
  */
-function field_attach_create_bundle($entity_type, $bundle) {
+function field_attach_create_subtype($entity_type, $subtype) {
   // Clear the cache.
   field_cache_clear();
 
-  // Let other modules act on creating the bundle.
-  module_invoke_all('field_attach_create_bundle', $entity_type, $bundle);
+  // Let other modules act on creating the subtype.
+  module_invoke_all('field_attach_create_subtype', $entity_type, $subtype);
 }
 
 /**
- * Notifies field.module that a bundle was renamed.
+ * Notifies field.module that a subtype was renamed.
  *
  * @param $entity_type
- *   The entity type to which the bundle is bound.
- * @param $bundle_old
- *   The previous name of the bundle.
- * @param $bundle_new
- *   The new name of the bundle.
+ *   The entity type to which the subtype is bound.
+ * @param $subtype_old
+ *   The previous name of the subtype.
+ * @param $subtype_new
+ *   The new name of the subtype.
  */
-function field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+function field_attach_rename_subtype($entity_type, $subtype_old, $subtype_new) {
   db_update('field_config_instance')
-    ->fields(array('bundle' => $bundle_new))
+    ->fields(array('subtype' => $subtype_new))
     ->condition('entity_type', $entity_type)
-    ->condition('bundle', $bundle_old)
+    ->condition('subtype', $subtype_old)
     ->execute();
 
   // Clear the cache.
   field_cache_clear();
   entity_info_cache_clear();
 
-  // Update bundle settings.
-  $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle_old, array());
-  variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle_new, $settings);
-  variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle_old);
+  // Update subtype settings.
+  $settings = variable_get('field_subtype_settings_' . $entity_type . '__' . $subtype_old, array());
+  variable_set('field_subtype_settings_' . $entity_type . '__' . $subtype_new, $settings);
+  variable_del('field_subtype_settings_' . $entity_type . '__' . $subtype_old);
 
-  // Let other modules act on renaming the bundle.
-  module_invoke_all('field_attach_rename_bundle', $entity_type, $bundle_old, $bundle_new);
+  // Let other modules act on renaming the subtype.
+  module_invoke_all('field_attach_rename_subtype', $entity_type, $subtype_old, $subtype_new);
 }
 
 /**
- * Notifies field.module the a bundle was deleted.
+ * Notifies field.module the a subtype was deleted.
  *
  * This deletes the data for the field instances as well as the field instances
  * themselves. This function actually just marks the data and field instances as
@@ -1579,15 +1579,15 @@ function field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
  * simple DELETE query).
  *
  * @param $entity_type
- *   The entity type to which the bundle is bound.
- * @param $bundle
- *   The bundle to delete.
+ *   The entity type to which the subtype is bound.
+ * @param $subtype
+ *   The subtype to delete.
  */
-function field_attach_delete_bundle($entity_type, $bundle) {
+function field_attach_delete_subtype($entity_type, $subtype) {
   // First, delete the instances themselves. field_read_instances() must be
   // used here since field_info_instances() does not return instances for
-  // disabled entity types or bundles.
-  $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle), array('include_inactive' => 1));
+  // disabled entity types or subtypes.
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'subtype' => $subtype), array('include_inactive' => 1));
   foreach ($instances as $instance) {
     field_delete_instance($instance);
   }
@@ -1595,11 +1595,11 @@ function field_attach_delete_bundle($entity_type, $bundle) {
   // Clear the cache.
   field_cache_clear();
 
-  // Clear bundle display settings.
-  variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle);
+  // Clear subtype display settings.
+  variable_del('field_subtype_settings_' . $entity_type . '__' . $subtype);
 
-  // Let other modules act on deleting the bundle.
-  module_invoke_all('field_attach_delete_bundle', $entity_type, $bundle, $instances);
+  // Let other modules act on deleting the subtype.
+  module_invoke_all('field_attach_delete_subtype', $entity_type, $subtype, $instances);
 }
 
 
diff --git a/core/modules/field/field.crud.inc b/core/modules/field/field.crud.inc
index f6ee8a2..25f7391 100644
--- a/core/modules/field/field.crud.inc
+++ b/core/modules/field/field.crud.inc
@@ -11,7 +11,7 @@
 /**
  * @defgroup field_crud Field CRUD API
  * @{
- * Creates, updates, and deletes Field API fields, bundles, and instances.
+ * Creates, updates, and deletes Field API fields, subtypes, and instances.
  *
  * Modules use this API, often in hook_install(), to create custom data
  * structures. UI modules will use it to create a user interface.
@@ -25,7 +25,7 @@
 /**
  * Creates a field.
  *
- * This function does not bind the field to any bundle; use
+ * This function does not bind the field to any subtype; use
  * field_create_instance() for that.
  *
  * @param $field
@@ -154,9 +154,9 @@ function field_create_field($field) {
   // read.
   $data = $field;
   unset($data['columns'], $data['field_name'], $data['type'], $data['active'], $data['module'], $data['storage_type'], $data['storage_active'], $data['storage_module'], $data['locked'], $data['cardinality'], $data['deleted']);
-  // Additionally, do not save the 'bundles' property populated by
+  // Additionally, do not save the 'subtypes' property populated by
   // field_info_field().
-  unset($data['bundles']);
+  unset($data['subtypes']);
 
   $record = array(
     'field_name' => $field['field_name'],
@@ -281,9 +281,9 @@ function field_update_field($field) {
   // read.
   $data = $field;
   unset($data['columns'], $data['field_name'], $data['type'], $data['locked'], $data['module'], $data['cardinality'], $data['active'], $data['deleted']);
-  // Additionally, do not save the 'bundles' property populated by
+  // Additionally, do not save the 'subtypes' property populated by
   // field_info_field().
-  unset($data['bundles']);
+  unset($data['subtypes']);
 
   $field['data'] = $data;
 
@@ -327,9 +327,9 @@ function field_read_field($field_name, $include_additional = array()) {
  * @param array $params
  *   An array of conditions to match against. Keys are columns from the
  *   'field_config' table, values are conditions to match. Additionally,
- *   conditions on the 'entity_type' and 'bundle' columns from the
+ *   conditions on the 'entity_type' and 'subtype' columns from the
  *   'field_config_instance' table are supported (select fields having an
- *   instance on a given bundle).
+ *   instance on a given subtype).
  * @param array $include_additional
  *   The default behavior of this function is to not return fields that are
  *   inactive or have been deleted. Setting
@@ -347,9 +347,9 @@ function field_read_fields($params = array(), $include_additional = array()) {
 
   // Turn the conditions into a query.
   foreach ($params as $key => $value) {
-    // Allow filtering on the 'entity_type' and 'bundle' columns of the
+    // Allow filtering on the 'entity_type' and 'subtype' columns of the
     // field_config_instance table.
-    if ($key == 'entity_type' || $key == 'bundle') {
+    if ($key == 'entity_type' || $key == 'subtype') {
       if (empty($fci_join)) {
         $fci_join = $query->join('field_config_instance', 'fci', 'fc.id = fci.field_id');
       }
@@ -415,10 +415,10 @@ function field_read_fields($params = array(), $include_additional = array()) {
 function field_delete_field($field_name) {
   // Delete all non-deleted instances.
   $field = field_info_field($field_name);
-  if (isset($field['bundles'])) {
-    foreach ($field['bundles'] as $entity_type => $bundles) {
-      foreach ($bundles as $bundle) {
-        $instance = field_info_instance($entity_type, $field_name, $bundle);
+  if (isset($field['subtypes'])) {
+    foreach ($field['subtypes'] as $entity_type => $subtypes) {
+      foreach ($subtypes as $subtype) {
+        $instance = field_info_instance($entity_type, $field_name, $subtype);
         field_delete_instance($instance, FALSE);
       }
     }
@@ -440,11 +440,11 @@ function field_delete_field($field_name) {
 }
 
 /**
- * Creates an instance of a field, binding it to a bundle.
+ * Creates an instance of a field, binding it to a subtype.
  *
  * @param $instance
  *   A field instance definition array. The field_name, entity_type and
- *   bundle properties are required. Other properties, if omitted,
+ *   subtype properties are required. Other properties, if omitted,
  *   will be given the following default values:
  *   - label: the field name
  *   - description: empty string
@@ -483,8 +483,8 @@ function field_create_instance(&$instance) {
   if (empty($instance['entity_type'])) {
     throw new FieldException(t('Attempt to create an instance of field @field_name without an entity type.', array('@field_name' => $instance['field_name'])));
   }
-  if (empty($instance['bundle'])) {
-    throw new FieldException(t('Attempt to create an instance of field @field_name without a bundle.', array('@field_name' => $instance['field_name'])));
+  if (empty($instance['subtype'])) {
+    throw new FieldException(t('Attempt to create an instance of field @field_name without a subtype.', array('@field_name' => $instance['field_name'])));
   }
   // Check that the field can be attached to this entity type.
   if (!empty($field['entity_types']) && !in_array($instance['entity_type'], $field['entity_types'])) {
@@ -494,7 +494,7 @@ function field_create_instance(&$instance) {
   // Set the field id.
   $instance['field_id'] = $field['id'];
 
-  // Note that we do *not* prevent creating a field on non-existing bundles,
+  // Note that we do *not* prevent creating a field on non-existing subtypes,
   // because that would break the 'Body as field' upgrade for contrib
   // node types.
 
@@ -504,12 +504,12 @@ function field_create_instance(&$instance) {
   // Those checks should probably happen in _field_write_instance() ?
   // Problem : this would mean that a UI module cannot update an instance with a disabled formatter.
 
-  // Ensure the field instance is unique within the bundle.
+  // Ensure the field instance is unique within the subtype.
   // We only check for instances of active fields, since adding an instance of
   // a disabled field is not supported.
-  $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);
+  $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['subtype']);
   if (!empty($prior_instance)) {
-    $message = t('Attempt to create an instance of field @field_name on bundle @bundle that already has an instance of that field.', array('@field_name' => $instance['field_name'], '@bundle' => $instance['bundle']));
+    $message = t('Attempt to create an instance of field @field_name on subtype @subtype that already has an instance of that field.', array('@field_name' => $instance['field_name'], '@subtype' => $instance['subtype']));
     throw new FieldException($message);
   }
 
@@ -531,7 +531,7 @@ function field_create_instance(&$instance) {
  *   An associative array representing an instance structure. The required keys
  *   and values are:
  *   - entity_type: The type of the entity the field is attached to.
- *   - bundle: The bundle this field belongs to.
+ *   - subtype: The subtype this field belongs to.
  *   - field_name: The name of an existing field.
  *   Read-only ID properties are assigned automatically. Any other properties
  *   properties specified in $instance overwrite the existing values for
@@ -550,9 +550,9 @@ function field_update_instance($instance) {
 
   // Check that the field instance exists (even if it is inactive, since we
   // want to be able to replace inactive widgets with new ones).
-  $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle'], array('include_inactive' => TRUE));
+  $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['subtype'], array('include_inactive' => TRUE));
   if (empty($prior_instance)) {
-    throw new FieldException(t("Attempt to update an instance of field @field on bundle @bundle that doesn't exist.", array('@field' => $instance['field_name'], '@bundle' => $instance['bundle'])));
+    throw new FieldException(t("Attempt to update an instance of field @field on subtype @subtype that doesn't exist.", array('@field' => $instance['field_name'], '@subtype' => $instance['subtype'])));
   }
 
   $instance['id'] = $prior_instance['id'];
@@ -607,7 +607,7 @@ function _field_write_instance(&$instance, $update = FALSE) {
   );
   // If no weight specified, make sure the field sinks at the bottom.
   if (!isset($instance['widget']['weight'])) {
-    $max_weight = field_info_max_weight($instance['entity_type'], $instance['bundle'], 'form');
+    $max_weight = field_info_max_weight($instance['entity_type'], $instance['subtype'], 'form');
     $instance['widget']['weight'] = isset($max_weight) ? $max_weight + 1 : 0;
   }
   // Check widget module.
@@ -619,13 +619,13 @@ function _field_write_instance(&$instance, $update = FALSE) {
   // not have its own column and is not automatically populated when the
   // instance is read.
   $data = $instance;
-  unset($data['id'], $data['field_id'], $data['field_name'], $data['entity_type'], $data['bundle'], $data['deleted']);
+  unset($data['id'], $data['field_id'], $data['field_name'], $data['entity_type'], $data['subtype'], $data['deleted']);
 
   $record = array(
     'field_id' => $instance['field_id'],
     'field_name' => $instance['field_name'],
     'entity_type' => $instance['entity_type'],
-    'bundle' => $instance['bundle'],
+    'subtype' => $instance['subtype'],
     'data' => $data,
     'deleted' => $instance['deleted'],
   );
@@ -652,8 +652,8 @@ function _field_write_instance(&$instance, $update = FALSE) {
  *   The type of entity to which the field is bound.
  * @param $field_name
  *   The field name to read.
- * @param $bundle
- *   The bundle to which the field is bound.
+ * @param $subtype
+ *   The subtype to which the field is bound.
  * @param array $include_additional
  *   The default behavior of this function is to not return an instance that has
  *   been deleted, or whose field is inactive. Setting
@@ -663,8 +663,8 @@ function _field_write_instance(&$instance, $update = FALSE) {
  * @return
  *   An instance structure, or FALSE.
  */
-function field_read_instance($entity_type, $field_name, $bundle, $include_additional = array()) {
-  $instances = field_read_instances(array('entity_type' => $entity_type, 'field_name' => $field_name, 'bundle' => $bundle), $include_additional);
+function field_read_instance($entity_type, $field_name, $subtype, $include_additional = array()) {
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'field_name' => $field_name, 'subtype' => $subtype), $include_additional);
   return $instances ? current($instances) : FALSE;
 }
 
@@ -719,7 +719,7 @@ function field_read_instances($params = array(), $include_additional = array())
       $instance['field_id'] = $record['field_id'];
       $instance['field_name'] = $record['field_name'];
       $instance['entity_type'] = $record['entity_type'];
-      $instance['bundle'] = $record['bundle'];
+      $instance['subtype'] = $record['subtype'];
       $instance['deleted'] = $record['deleted'];
 
       module_invoke_all('field_read_instance', $instance);
@@ -745,7 +745,7 @@ function field_delete_instance($instance, $field_cleanup = TRUE) {
     ->fields(array('deleted' => 1))
     ->condition('field_name', $instance['field_name'])
     ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('subtype', $instance['subtype'])
     ->execute();
 
   // Clear the cache.
@@ -759,7 +759,7 @@ function field_delete_instance($instance, $field_cleanup = TRUE) {
   module_invoke_all('field_delete_instance', $instance);
 
   // Delete the field itself if we just deleted its last instance.
-  if ($field_cleanup && count($field['bundles']) == 0) {
+  if ($field_cleanup && count($field['subtypes']) == 0) {
     field_delete_field($field['field_name']);
   }
 }
@@ -785,16 +785,16 @@ function field_delete_instance($instance, $field_cleanup = TRUE) {
  *   uploaded files from the filesystem.
  * - Invoking the Field Storage API hook_field_storage_delete() to remove data
  *   from the primary field storage. The hook implementation receives the entity
- *   being deleted and deletes data for all of the entity's bundle's fields.
+ *   being deleted and deletes data for all of the entity's subtype's fields.
  * - Invoking the global Field Attach API hook_field_attach_delete() for all
  *   modules that implement it. Each hook implementation receives the entity
- *   being deleted and can operate on whichever subset of the entity's bundle's
+ *   being deleted and can operate on whichever subset of the entity's subtype's
  *   fields it chooses to.
  *
  * These hooks are invoked immediately when field_attach_delete() is called.
  * Similar operations are performed for field_attach_delete_revision().
  *
- * When a field, bundle, or field instance is deleted, it is not practical to
+ * When a field, subtype, or field instance is deleted, it is not practical to
  * invoke these hooks immediately on every affected entity in a single page
  * request; there could be thousands or millions of them. Instead, the
  * appropriate field data items, instances, and/or fields are marked as deleted
@@ -813,7 +813,7 @@ function field_delete_instance($instance, $field_cleanup = TRUE) {
  *
  * Field API resolves this problem by using "pseudo-entities" during purge
  * operations. A pseudo-entity contains only the information from the original
- * entity that Field API knows about: entity type, ID, revision ID, and bundle.
+ * entity that Field API knows about: entity type, ID, revision ID, and subtype.
  * It also contains the field data for whichever field instance is currently
  * being purged. For example, suppose that the node type 'story' used to contain
  * a field called 'subtitle' but the field was deleted. If node 37 was a story
@@ -860,7 +860,7 @@ function field_purge_batch($batch_size) {
     $entity_type = $instance['entity_type'];
     $ids = (object) array(
       'entity_type' => $entity_type,
-      'bundle' => $instance['bundle'],
+      'subtype' => $instance['subtype'],
     );
     // field_purge_data() will need the field array.
     $field = field_info_field_by_id($instance['field_id']);
@@ -868,9 +868,9 @@ function field_purge_batch($batch_size) {
     $query = $factory->get($entity_type)
       ->condition('id:' . $field['id'] . '.deleted', 1)
       ->range(0, $batch_size);
-    // If there's no bundle key, all results will have the same bundle.
-    if (!empty($info[$entity_type]['entity_keys']['bundle'])) {
-      $query->condition($info[$entity_type]['entity_keys']['bundle'], $ids->bundle);
+    // If there's no subtype key, all results will have the same subtype.
+    if (!empty($info[$entity_type]['entity_keys']['subtype'])) {
+      $query->condition($info[$entity_type]['entity_keys']['subtype'], $ids->subtype);
     }
     $results = $query->execute();
 
diff --git a/core/modules/field/field.default.inc b/core/modules/field/field.default.inc
index 27ba32c..fd8fd25 100644
--- a/core/modules/field/field.default.inc
+++ b/core/modules/field/field.default.inc
@@ -25,7 +25,7 @@
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field in $entity's bundle.
+ *   The instance structure for $field in $entity's subtype.
  * @param $langcode
  *   The language associated with $items.
  * @param $items
@@ -61,7 +61,7 @@ function field_default_validate(EntityInterface $entity, $field, $instance, $lan
  * @param $field
  *   The field structure for the operation.
  * @param $instance
- *   The instance structure for $field in $entity's bundle.
+ *   The instance structure for $field in $entity's subtype.
  * @param $langcode
  *   The language the entity has to be translated to.
  * @param $items
diff --git a/core/modules/field/field.info.inc b/core/modules/field/field.info.inc
index b422b47..e4a109d 100644
--- a/core/modules/field/field.info.inc
+++ b/core/modules/field/field.info.inc
@@ -38,7 +38,7 @@ function _field_info_field_cache() {
  * Obtains information about Field API configuration.
  *
  * The Field Info API exposes information about field types, fields, instances,
- * bundles, widget types, display formatters, behaviors, and settings defined by
+ * subtypes, widget types, display formatters, behaviors, and settings defined by
  * or with the Field API.
  *
  * See @link field Field API @endlink for information about the other parts of
@@ -55,7 +55,7 @@ function field_info_cache_clear() {
   drupal_static_reset('field_view_mode_settings');
   drupal_static_reset('field_available_languages');
 
-  // @todo: Remove this when field_attach_*_bundle() bundle management
+  // @todo: Remove this when field_attach_*_subtype() subtype management
   // functions are moved to the entity API.
   entity_info_cache_clear();
 
@@ -171,15 +171,15 @@ function field_behaviors_widget($op, $instance) {
 }
 
 /**
- * Returns a lightweight map of fields across bundles.
+ * Returns a lightweight map of fields across subtypes.
  *
  * The function only returns active, non deleted fields.
  *
  * @return
  *   An array keyed by field name. Each value is an array with two entries:
  *   - type: The field type.
- *   - bundles: The bundles in which the field appears, as an array with entity
- *     types as keys and the array of bundle names as values.
+ *   - subtypes: The subtypes in which the field appears, as an array with entity
+ *     types as keys and the array of subtype names as values.
  */
 function field_info_field_map() {
   $cache = _field_info_field_cache();
@@ -282,13 +282,13 @@ function field_info_storage_types($storage_type = NULL) {
  * statically caches a potentially large array of information. Use
  * field_info_field_map() instead.
  *
- * When iterating over the fields present in a given bundle after a call to
- * field_info_instances($entity_type, $bundle), it is recommended to use
+ * When iterating over the fields present in a given subtype after a call to
+ * field_info_instances($entity_type, $subtype), it is recommended to use
  * field_info_field() on each individual field instead.
  *
  * @return
  *   An array of field definitions, keyed by field name. Each field has an
- *   additional property, 'bundles', which is an array of all the bundles to
+ *   additional property, 'subtypes', which is an array of all the subtypes to
  *   which this field belongs, keyed by entity type.
  *
  * @see field_info_field_map()
@@ -318,7 +318,7 @@ function field_info_fields() {
  *
  * @return
  *   The field array, as returned by field_read_fields(), with an
- *   additional element 'bundles', whose value is an array of all the bundles
+ *   additional element 'subtypes', whose value is an array of all the subtypes
  *   this field belongs to keyed by entity type. NULL if the field was not
  *   found.
  *
@@ -338,7 +338,7 @@ function field_info_field($field_name) {
  *
  * @return
  *   The field array, as returned by field_read_fields(), with an additional
- *   element 'bundles', whose value is an array of all the bundles this field
+ *   element 'subtypes', whose value is an array of all the subtypes this field
  *   belongs to.
  *
  * @see field_info_field()
@@ -354,14 +354,14 @@ function field_info_field_by_id($field_id) {
  * Use of this function should be avoided when possible, since it loads and
  * statically caches a potentially large array of information.
  *
- * When iterating over the fields present in a given bundle after a call to
- * field_info_instances($entity_type, $bundle), it is recommended to use
+ * When iterating over the fields present in a given subtype after a call to
+ * field_info_instances($entity_type, $subtype), it is recommended to use
  * field_info_field() on each individual field instead.
  *
  * @return
  *   An array, each key is a field ID and the values are field arrays as
- *   returned by field_read_fields(), with an additional element 'bundles',
- *   whose value is an array of all the bundle this field belongs to.
+ *   returned by field_read_fields(), with an additional element 'subtypes',
+ *   whose value is an array of all the subtype this field belongs to.
  *
  * @see field_info_field()
  * @see field_info_field_by_id()
@@ -374,70 +374,70 @@ function field_info_field_by_ids() {
 /**
  * Retrieves information about field instances.
  *
- * Use of this function to retrieve instances across separate bundles (i.e.
- * when the $bundle parameter is NULL) should be avoided when possible, since
+ * Use of this function to retrieve instances across separate subtypes (i.e.
+ * when the $subtype parameter is NULL) should be avoided when possible, since
  * it loads and statically caches a potentially large array of information.
  * Use field_info_field_map() instead.
  *
- * When retrieving the instances of a specific bundle (i.e. when both
- * $entity_type and $bundle_name are provided), the function also populates a
+ * When retrieving the instances of a specific subtype (i.e. when both
+ * $entity_type and $subtype_name are provided), the function also populates a
  * static cache with the corresponding field definitions, allowing fast
  * retrieval of field_info_field() later in the request.
  *
  * @param $entity_type
  *   (optional) The entity type for which to return instances.
- * @param $bundle_name
- *   (optional) The bundle name for which to return instances. If $entity_type
- *   is NULL, the $bundle_name parameter is ignored.
+ * @param $subtype_name
+ *   (optional) The subtype name for which to return instances. If $entity_type
+ *   is NULL, the $subtype_name parameter is ignored.
  *
  * @return
  *   If $entity_type is not set, return all instances keyed by entity type and
- *   bundle name. If $entity_type is set, return all instances for that entity
- *   type, keyed by bundle name. If $entity_type and $bundle_name are set,
- *   return all instances for that bundle.
+ *   subtype name. If $entity_type is set, return all instances for that entity
+ *   type, keyed by subtype name. If $entity_type and $subtype_name are set,
+ *   return all instances for that subtype.
  */
-function field_info_instances($entity_type = NULL, $bundle_name = NULL) {
+function field_info_instances($entity_type = NULL, $subtype_name = NULL) {
   $cache = _field_info_field_cache();
 
   if (!isset($entity_type)) {
     return $cache->getInstances();
   }
 
-  if (!isset($bundle_name)) {
+  if (!isset($subtype_name)) {
     return $cache->getInstances($entity_type);
   }
 
-  return $cache->getBundleInstances($entity_type, $bundle_name);
+  return $cache->getSubtypeInstances($entity_type, $subtype_name);
 }
 
 /**
- * Returns an array of instance data for a specific field and bundle.
+ * Returns an array of instance data for a specific field and subtype.
  *
  * The function populates a static cache with all fields and instances used in
- * the bundle, allowing fast retrieval of field_info_field() or
+ * the subtype, allowing fast retrieval of field_info_field() or
  * field_info_instance() later in the request.
  *
  * @param $entity_type
  *   The entity type for the instance.
  * @param $field_name
  *   The field name for the instance.
- * @param $bundle_name
- *   The bundle name for the instance.
+ * @param $subtype_name
+ *   The subtype name for the instance.
  *
  * @return
- *   An associative array of instance data for the specific field and bundle;
+ *   An associative array of instance data for the specific field and subtype;
  *   NULL if the instance does not exist.
  */
-function field_info_instance($entity_type, $field_name, $bundle_name) {
+function field_info_instance($entity_type, $field_name, $subtype_name) {
   $cache = _field_info_field_cache();
-  $info = $cache->getBundleInstances($entity_type, $bundle_name);
+  $info = $cache->getSubtypeInstances($entity_type, $subtype_name);
   if (isset($info[$field_name])) {
     return $info[$field_name];
   }
 }
 
 /**
- * Returns a list and settings of pseudo-field elements in a given bundle.
+ * Returns a list and settings of pseudo-field elements in a given subtype.
  *
  * If $context is 'form', an array with the following structure:
  * @code
@@ -480,18 +480,18 @@ function field_info_instance($entity_type, $field_name, $bundle_name) {
  *
  * @param $entity_type
  *   The type of entity; e.g. 'node' or 'user'.
- * @param $bundle
- *   The bundle name.
+ * @param $subtype
+ *   The subtype name.
  * @param $context
  *   The context for which the list of pseudo-fields is requested. Either 'form'
  *   or 'display'.
  *
  * @return
- *   The array of pseudo-field elements in the bundle.
+ *   The array of pseudo-field elements in the subtype.
  */
-function field_info_extra_fields($entity_type, $bundle, $context) {
+function field_info_extra_fields($entity_type, $subtype, $context) {
   $cache = _field_info_field_cache();
-  $info = $cache->getBundleExtraFields($entity_type, $bundle);
+  $info = $cache->getSubtypeExtraFields($entity_type, $subtype);
 
   return isset($info[$context]) ? $info[$context] : array();
 }
@@ -504,27 +504,27 @@ function field_info_extra_fields($entity_type, $bundle, $context) {
  *
  * @param $entity_type
  *   The type of entity; e.g. 'node' or 'user'.
- * @param $bundle
- *   The bundle name.
+ * @param $subtype
+ *   The subtype name.
  *
  * @return
  *   The maximum weight of the entity's components, or NULL if no components
  *   were found.
  */
-function field_info_max_weight($entity_type, $bundle) {
+function field_info_max_weight($entity_type, $subtype) {
   $weights = array();
 
   // Collect weights for fields.
-  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+  foreach (field_info_instances($entity_type, $subtype) as $instance) {
     $weights[] = $instance['widget']['weight'];
   }
   // Collect weights for extra fields.
-  foreach (field_info_extra_fields($entity_type, $bundle, 'form') as $extra) {
+  foreach (field_info_extra_fields($entity_type, $subtype, 'form') as $extra) {
     $weights[] = $extra['weight'];
   }
 
   // Let other modules feedback about their own additions.
-  $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $entity_type, $bundle, 'form'));
+  $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $entity_type, $subtype, 'form'));
   $max_weight = $weights ? max($weights) : NULL;
 
   return $max_weight;
diff --git a/core/modules/field/field.install b/core/modules/field/field.install
index 695fd89..dc47f3e 100644
--- a/core/modules/field/field.install
+++ b/core/modules/field/field.install
@@ -134,7 +134,7 @@ function field_schema() {
         'not null' => TRUE,
         'default' => ''
       ),
-      'bundle' => array(
+      'subtype' => array(
         'type' => 'varchar',
         'length' => 128,
         'not null' => TRUE,
@@ -156,7 +156,7 @@ function field_schema() {
     'primary key' => array('id'),
     'indexes' => array(
       // Used by field_delete_instance().
-      'field_name_bundle' => array('field_name', 'entity_type', 'bundle'),
+      'field_name_subtype' => array('field_name', 'entity_type', 'subtype'),
       // Used by field_read_instances().
       'deleted' => array('deleted'),
     ),
@@ -209,9 +209,9 @@ function _update_7000_field_create_field(&$field) {
   // read.
   $data = $field;
   unset($data['columns'], $data['field_name'], $data['type'], $data['active'], $data['module'], $data['storage_type'], $data['storage_active'], $data['storage_module'], $data['locked'], $data['cardinality'], $data['deleted']);
-  // Additionally, do not save the 'bundles' property populated by
+  // Additionally, do not save the 'subtypes' property populated by
   // field_info_field().
-  unset($data['bundles']);
+  unset($data['subtypes']);
 
   // Write the field to the database.
   $record = array(
@@ -279,22 +279,22 @@ function _update_7000_field_delete_field($field_name) {
  *
  * @ingroup update_api
  */
-function _update_7000_field_delete_instance($field_name, $entity_type, $bundle) {
+function _update_7000_field_delete_instance($field_name, $entity_type, $subtype) {
   // Delete field instance configuration data.
   db_delete('field_config_instance')
     ->condition('field_name', $field_name)
     ->condition('entity_type', $entity_type)
-    ->condition('bundle', $bundle)
+    ->condition('subtype', $subtype)
     ->execute();
 
   // Nuke data.
   db_delete('field_data_' . $field_name)
     ->condition('entity_type', $entity_type)
-    ->condition('bundle', $bundle)
+    ->condition('subtype', $subtype)
     ->execute();
   db_delete('field_revision_' . $field_name)
     ->condition('entity_type', $entity_type)
-    ->condition('bundle', $bundle)
+    ->condition('subtype', $subtype)
     ->execute();
 }
 
@@ -361,13 +361,13 @@ function _update_7000_field_create_instance($field, &$instance) {
   // not have its own column and is not automatically populated when the
   // instance is read.
   $data = $instance;
-  unset($data['id'], $data['field_id'], $data['field_name'], $data['entity_type'], $data['bundle'], $data['deleted']);
+  unset($data['id'], $data['field_id'], $data['field_name'], $data['entity_type'], $data['subtype'], $data['deleted']);
 
   $record = array(
     'field_id' => $instance['field_id'],
     'field_name' => $instance['field_name'],
     'entity_type' => $instance['entity_type'],
-    'bundle' => $instance['bundle'],
+    'subtype' => $instance['subtype'],
     'data' => serialize($data),
     'deleted' => (int) $instance['deleted'],
   );
@@ -417,9 +417,9 @@ function field_update_8002() {
     foreach ($data['display'] as $view_mode => $display_options) {
       // Determine name and create initial entry in the $displays array if it
       // does not exist yet.
-      $display_id = $record->entity_type . '.' . $record->bundle . '.' . $view_mode;
+      $display_id = $record->entity_type . '.' . $record->subtype . '.' . $view_mode;
       if (!isset($displays[$display_id])) {
-        $displays[$display_id] = _update_8000_entity_get_display($record->entity_type, $record->bundle, $view_mode);
+        $displays[$display_id] = _update_8000_entity_get_display($record->entity_type, $record->subtype, $view_mode);
       }
 
       // The display object does not store hidden fields.
@@ -443,19 +443,19 @@ function field_update_8002() {
   // Migration of 'extra_fields' display settings. Avoid calling
   // entity_get_info() by fetching the relevant variables directly in the
   // cariables table.
-  $variables = array_map('unserialize', db_query("SELECT name, value FROM {variable} WHERE name LIKE '%field_bundle_settings_%'")->fetchAllKeyed());
+  $variables = array_map('unserialize', db_query("SELECT name, value FROM {variable} WHERE name LIKE '%field_subtype_settings_%'")->fetchAllKeyed());
   foreach ($variables as $variable_name => $variable_value) {
-    if (preg_match('/field_bundle_settings_(.*)__(.*)/', $variable_name, $matches)) {
+    if (preg_match('/field_subtype_settings_(.*)__(.*)/', $variable_name, $matches)) {
       $entity_type = $matches[1];
-      $bundle = $matches[2];
+      $subtype = $matches[2];
       if (isset($variable_value['extra_fields']['display'])) {
         foreach ($variable_value['extra_fields']['display'] as $field_name => $field_settings) {
           foreach ($field_settings as $view_mode => $display_options) {
             // Determine name and create initial entry in the $displays array
             // if it does not exist yet.
-            $display_id =  $entity_type . '.' . $bundle . '.' . $view_mode;
+            $display_id =  $entity_type . '.' . $subtype . '.' . $view_mode;
             if (!isset($displays[$display_id])) {
-              $displays[$display_id] = _update_8000_entity_get_display($entity_type, $bundle, $view_mode);
+              $displays[$display_id] = _update_8000_entity_get_display($entity_type, $subtype, $view_mode);
             }
 
             // Set options in the display.
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 6cdd628..1f7a79f 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -32,22 +32,22 @@
  * flexible variety of data type, form element, and display format capabilities.
  *
  * The Field API defines two primary data structures, Field and Instance, and
- * the concept of a Bundle. A Field defines a particular type of data that can
+ * the concept of a Subtype. A Field defines a particular type of data that can
  * be attached to entities. A Field Instance is a Field attached to a single
- * Bundle. A Bundle is a set of fields that are treated as a group by the Field
+ * Subtype. A Subtype is a set of fields that are treated as a group by the Field
  * Attach API and is related to a single fieldable entity type.
  *
  * For example, suppose a site administrator wants Article nodes to have a
  * subtitle and photo. Using the Field API or Field UI module, the administrator
  * creates a field named 'subtitle' of type 'text' and a field named 'photo' of
  * type 'image'. The administrator (again, via a UI) creates two Field
- * Instances, one attaching the field 'subtitle' to the 'node' bundle 'article'
- * and one attaching the field 'photo' to the 'node' bundle 'article'. When the
+ * Instances, one attaching the field 'subtitle' to the 'node' subtype 'article'
+ * and one attaching the field 'photo' to the 'node' subtype 'article'. When the
  * node system uses the Field Attach API to load all fields for an Article node,
  * it passes the node's entity type (which is 'node') and content type (which is
- * 'article') as the node's bundle. field_attach_load() then loads the
+ * 'article') as the node's subtype. field_attach_load() then loads the
  * 'subtitle' and 'photo' fields because they are both attached to the 'node'
- * bundle 'article'.
+ * subtype 'article'.
  *
  * Field definitions are represented as an array of key/value pairs.
  *
@@ -112,21 +112,21 @@
  * - id: (integer, read-only) The primary identifier of this field instance. It
  *   is assigned automatically by field_create_instance().
  * - field_id: (integer, read-only) The foreign key of the field attached to the
- *   bundle by this instance. It is populated automatically by
+ *   subtype by this instance. It is populated automatically by
  *   field_create_instance().
- * - field_name: (string) The name of the field attached to the bundle by this
+ * - field_name: (string) The name of the field attached to the subtype by this
  *   instance.
  * - entity_type: (string) The name of the entity type the instance is attached
  *   to.
- * - bundle: (string) The name of the bundle that the field is attached to.
+ * - subtype: (string) The name of the subtype that the field is attached to.
  * - label: (string) A human-readable label for the field when used with this
- *   bundle. For example, the label will be the title of Form API elements for
+ *   subtype. For example, the label will be the title of Form API elements for
  *   this instance.
  * - description: (string)A human-readable description for the field when used
- *   with this bundle. For example, the description will be the help text of
+ *   with this subtype. For example, the description will be the help text of
  *   Form API elements for this instance.
  * - required: (integer) TRUE if a value for this field is required when used
- *   with this bundle, FALSE otherwise. Currently, required-ness is only
+ *   with this subtype, FALSE otherwise. Currently, required-ness is only
  *   enforced during Form API operations, not by field_attach_load(),
  *   field_attach_insert(), or field_attach_update().
  * - default_value_function: (string) The name of the function, if any, that
@@ -141,7 +141,7 @@
  *   instance settings. Each field type module defines and documents its own
  *   instance settings.
  * - widget: (array) A sub-array of key/value pairs identifying the Form API
- *   input widget for the field when used by this bundle.
+ *   input widget for the field when used by this subtype.
  *   - type: (string) The type of the widget, such as text_textfield. Widget
  *     types are defined by modules that implement hook_field_widget_info().
  *   - settings: (array) A sub-array of key/value pairs of widget-type-specific
@@ -177,7 +177,7 @@
  *   - some_mode: A sub-array of key/value pairs describing the display options
  *     to be used when the field is being displayed in the 'some_mode' view
  *     mode. Those options will only be actually applied at run time if the view
- *     mode is not configured to use default settings for this bundle.
+ *     mode is not configured to use default settings for this subtype.
  *     - ...
  *   - other_mode:
  *     - ...
@@ -185,7 +185,7 @@
  * The (default) render arrays produced for field instances are documented at
  * field_attach_view().
  *
- * Bundles are represented by two strings, an entity type and a bundle name.
+ * Subtypes are represented by two strings, an entity type and a subtype name.
  *
  * - @link field_types Field Types API @endlink: Defines field types, widget
  *   types, and display formatters. Field modules use this API to provide field
@@ -193,7 +193,7 @@
  *   and display formatters.
  *
  * - @link field_crud Field CRUD API @endlink: Create, updates, and deletes
- *   fields, bundles (a.k.a. "content types"), and instances. Modules use this
+ *   fields, subtypes (a.k.a. "content types"), and instances. Modules use this
  *   API, often in hook_install(), to create custom data structures.
  *
  * - @link field_attach Field Attach API @endlink: Connects entity types to the
@@ -410,7 +410,7 @@ function field_entity_create(EntityInterface $entity) {
 function field_populate_default_values(EntityInterface $entity, $langcode = NULL) {
   $entity_type = $entity->entityType();
   $langcode = $langcode ?: $entity->language()->langcode;
-  foreach (field_info_instances($entity_type, $entity->bundle()) as $field_name => $instance) {
+  foreach (field_info_instances($entity_type, $entity->subtype()) as $field_name => $instance) {
     $field = field_info_field($field_name);
     $field_langcode = field_is_translatable($entity_type, $field) ? $langcode : LANGUAGE_NOT_SPECIFIED;
     // We need to preserve existing values.
@@ -430,8 +430,8 @@ function field_entity_field_info($entity_type) {
   $property_info = array();
   $field_types = field_info_field_types();
 
-  foreach (field_info_instances($entity_type) as $bundle_name => $instances) {
-    $optional = $bundle_name != $entity_type;
+  foreach (field_info_instances($entity_type) as $subtype_name => $instances) {
+    $optional = $subtype_name != $entity_type;
 
     foreach ($instances as $field_name => $instance) {
       $field = field_info_field($field_name);
@@ -448,7 +448,7 @@ function field_entity_field_info($entity_type) {
 
         if ($optional) {
           $property_info['optional'][$field_name] = $definition;
-          $property_info['bundle map'][$bundle_name][] = $field_name;
+          $property_info['subtype map'][$subtype_name][] = $field_name;
         }
         else {
           $property_info['definitions'][$field_name] = $definition;
@@ -673,12 +673,12 @@ function _field_sort_items_value_helper($a, $b) {
 }
 
 /**
- * Gets or sets administratively defined bundle settings.
+ * Gets or sets administratively defined subtype settings.
  *
  * @param string $entity_type
  *   The type of $entity; e.g., 'node' or 'user'.
- * @param string $bundle
- *   The bundle name.
+ * @param string $subtype
+ *   The subtype name.
  * @param array|null $settings
  *   (optional) The settings to store, an associative array with the following
  *   elements:
@@ -704,13 +704,13 @@ function _field_sort_items_value_helper($a, $b) {
  * @return array|null
  *   If no $settings are passed, the current settings are returned.
  */
-function field_bundle_settings($entity_type, $bundle, $settings = NULL) {
+function field_subtype_settings($entity_type, $subtype, $settings = NULL) {
   if (isset($settings)) {
-    variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle, $settings);
+    variable_set('field_subtype_settings_' . $entity_type . '__' . $subtype, $settings);
     field_info_cache_clear();
   }
   else {
-    $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle, array());
+    $settings = variable_get('field_subtype_settings_' . $entity_type . '__' . $subtype, array());
     $settings += array(
       'view_modes' => array(),
       'extra_fields' => array(),
@@ -724,12 +724,12 @@ function field_bundle_settings($entity_type, $bundle, $settings = NULL) {
 }
 
 /**
- * Returns view mode settings in a given bundle.
+ * Returns view mode settings in a given subtype.
  *
  * @param $entity_type
  *   The type of entity; e.g. 'node' or 'user'.
- * @param $bundle
- *   The bundle name to return view mode settings for.
+ * @param $subtype
+ *   The subtype name to return view mode settings for.
  *
  * @return
  *   An array keyed by view mode, with the following key/value pairs:
@@ -737,12 +737,12 @@ function field_bundle_settings($entity_type, $bundle, $settings = NULL) {
  *     dedicated set of display options (TRUE), or the 'default' options
  *     (FALSE). Defaults to FALSE.
  */
-function field_view_mode_settings($entity_type, $bundle) {
+function field_view_mode_settings($entity_type, $subtype) {
   $cache = &drupal_static(__FUNCTION__, array());
 
-  if (!isset($cache[$entity_type][$bundle])) {
-    $bundle_settings = field_bundle_settings($entity_type, $bundle);
-    $settings = $bundle_settings['view_modes'];
+  if (!isset($cache[$entity_type][$subtype])) {
+    $subtype_settings = field_subtype_settings($entity_type, $subtype);
+    $settings = $subtype_settings['view_modes'];
     // Include view modes for which nothing has been stored yet, but whose
     // definition in hook_entity_info_alter() specify they should use custom
     // settings by default.
@@ -752,10 +752,10 @@ function field_view_mode_settings($entity_type, $bundle) {
         $settings[$view_mode]['custom_settings'] = TRUE;
       }
     }
-    $cache[$entity_type][$bundle] = $settings;
+    $cache[$entity_type][$subtype] = $settings;
   }
 
-  return $cache[$entity_type][$bundle];
+  return $cache[$entity_type][$subtype];
 }
 
 /**
@@ -763,9 +763,9 @@ function field_view_mode_settings($entity_type, $bundle) {
  */
 function _field_extra_fields_pre_render($elements) {
   $entity_type = $elements['#entity_type'];
-  $bundle = $elements['#bundle'];
+  $subtype = $elements['#subtype'];
 
-  $extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
+  $extra_fields = field_info_extra_fields($entity_type, $subtype, 'form');
   foreach ($extra_fields as $name => $settings) {
     if (isset($elements[$name])) {
       $elements[$name]['#weight'] = $settings['weight'];
@@ -886,7 +886,7 @@ function field_view_value(EntityInterface $entity, $field_name, $item, $display
  *   Can be either:
  *   - The name of a view mode. The field will be displayed according to the
  *     display settings specified for this view mode in the $instance
- *     definition for the field in the entity's bundle. If no display settings
+ *     definition for the field in the entity's subtype. If no display settings
  *     are found for the view mode, the settings for the 'default' view mode
  *     will be used.
  *   - An array of display options. The following key/value pairs are allowed:
@@ -914,10 +914,10 @@ function field_view_value(EntityInterface $entity, $field_name, $item, $display
  */
 function field_view_field(EntityInterface $entity, $field_name, $display_options = array(), $langcode = NULL) {
   $output = array();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
 
   // Return nothing if the field doesn't exist.
-  $instance = field_info_instance($entity->entityType(), $field_name, $bundle);
+  $instance = field_info_instance($entity->entityType(), $field_name, $subtype);
   if (!$instance) {
     return $output;
   }
@@ -1014,7 +1014,7 @@ function field_has_data($field) {
   $field = field_info_field_by_id($field['id']);
   $columns = array_keys($field['columns']);
   $factory = drupal_container()->get('entity.query');
-  foreach ($field['bundles'] as $entity_type => $bundle) {
+  foreach ($field['subtypes'] as $entity_type => $subtype) {
     // Entity Query throws an exception if there is no base table.
     $entity_info = entity_get_info($entity_type);
     if (!isset($entity_info['base_table'])) {
@@ -1077,25 +1077,25 @@ function field_access($op, $field, $entity_type, $entity = NULL, $account = NULL
 }
 
 /**
- * Extracts the bundle name from a bundle object.
+ * Extracts the subtype name from a subtype object.
  *
  * @param $entity_type
  *   The type of $entity; e.g., 'node' or 'user'.
- * @param $bundle
- *   The bundle object (or string if bundles for this entity type do not exist
+ * @param $subtype
+ *   The subtype object (or string if subtypes for this entity type do not exist
  *   as standalone objects).
  *
  * @return
- *   The bundle name.
+ *   The subtype name.
  */
-function field_extract_bundle($entity_type, $bundle) {
-  if (is_string($bundle)) {
-    return $bundle;
+function field_extract_subtype($entity_type, $subtype) {
+  if (is_string($subtype)) {
+    return $subtype;
   }
 
   $info = entity_get_info($entity_type);
-  if (is_object($bundle) && isset($info['bundle_keys']['bundle']) && isset($bundle->{$info['bundle_keys']['bundle']})) {
-    return $bundle->{$info['bundle_keys']['bundle']};
+  if (is_object($subtype) && isset($info['subtype_keys']['subtype']) && isset($subtype->{$info['subtype_keys']['subtype']})) {
+    return $subtype->{$info['subtype_keys']['subtype']};
   }
 }
 
@@ -1158,8 +1158,8 @@ function template_preprocess_field(&$variables, $hook) {
   $variables['theme_hook_suggestions'] = array(
     'field__' . $element['#field_type'],
     'field__' . $element['#field_name'],
-    'field__' . $element['#bundle'],
-    'field__' . $element['#field_name'] . '__' . $element['#bundle'],
+    'field__' . $element['#subtype'],
+    'field__' . $element['#field_name'] . '__' . $element['#subtype'],
   );
 }
 
@@ -1279,7 +1279,7 @@ function theme_field($variables) {
  *
  * @param stdClass $ids
  *   An object with the properties entity_type (required), entity_id (required),
- *   revision_id (optional) and bundle (optional).
+ *   revision_id (optional) and subtype (optional).
  *
  * @return \Drupal\Core\Entity\EntityInterface
  *   An entity, initialized with the provided IDs.
@@ -1293,8 +1293,8 @@ function _field_create_entity_from_ids($ids) {
   if (!empty($info['entity_keys']['revision']) && isset($ids->revision_id)) {
     $id_properties[$info['entity_keys']['revision']] = $ids->revision_id;
   }
-  if (!empty($info['entity_keys']['bundle']) && isset($ids->bundle)) {
-    $id_properties[$info['entity_keys']['bundle']] = $ids->bundle;
+  if (!empty($info['entity_keys']['subtype']) && isset($ids->subtype)) {
+    $id_properties[$info['entity_keys']['subtype']] = $ids->subtype;
   }
   return entity_create($ids->entity_type, $id_properties);
 }
diff --git a/core/modules/field/field.multilingual.inc b/core/modules/field/field.multilingual.inc
index a9b33ac..8acb8ac 100644
--- a/core/modules/field/field.multilingual.inc
+++ b/core/modules/field/field.multilingual.inc
@@ -302,7 +302,7 @@ function field_valid_language($langcode, $default = TRUE) {
 function field_language(EntityInterface $entity, $field_name = NULL, $langcode = NULL) {
   $display_langcodes = &drupal_static(__FUNCTION__, array());
   $id = $entity->id();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
   $entity_type = $entity->entityType();
   $langcode = field_valid_language($langcode, FALSE);
   if (!isset($display_langcodes[$entity_type][$id][$langcode])) {
@@ -311,7 +311,7 @@ function field_language(EntityInterface $entity, $field_name = NULL, $langcode =
     // By default, display language is set to one of the locked languages
     // if the field translation is not available. It is up to translation
     // handlers to implement language fallback rules.
-    foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    foreach (field_info_instances($entity_type, $subtype) as $instance) {
       if (isset($entity->{$instance['field_name']}[$langcode])) {
         $display_langcode[$instance['field_name']] = $langcode;
       }
diff --git a/core/modules/field/field.views.inc b/core/modules/field/field.views.inc
index 6c769cd..3002b83 100644
--- a/core/modules/field/field.views.inc
+++ b/core/modules/field/field.views.inc
@@ -62,7 +62,7 @@ function field_views_data_alter(&$data) {
 /**
  * Returns the label of a certain field.
  *
- * Therefore it looks up in all bundles to find the most used instance.
+ * Therefore it looks up in all subtypes to find the most used instance.
  */
 function field_views_field_label($field_name) {
   $label_counter = array();
@@ -70,10 +70,10 @@ function field_views_field_label($field_name) {
   // Count the amount of instances per label per field.
   $instances = field_info_instances();
   foreach ($instances as $entity_name => $entity_type) {
-    foreach ($entity_type as $bundle) {
-      if (isset($bundle[$field_name])) {
-        $label_counter[$bundle[$field_name]['label']] = isset($label_counter[$bundle[$field_name]['label']]) ? ++$label_counter[$bundle[$field_name]['label']] : 1;
-        $all_labels[$entity_name][$bundle[$field_name]['label']] = TRUE;
+    foreach ($entity_type as $subtype) {
+      if (isset($subtype[$field_name])) {
+        $label_counter[$subtype[$field_name]['label']] = isset($label_counter[$subtype[$field_name]['label']]) ? ++$label_counter[$subtype[$field_name]['label']] : 1;
+        $all_labels[$entity_name][$subtype[$field_name]['label']] = TRUE;
       }
     }
   }
@@ -102,18 +102,18 @@ function field_views_field_default_views_data($field) {
   $current_table = _field_sql_storage_tablename($field);
   $revision_table = _field_sql_storage_revision_tablename($field);
 
-  // The list of entity:bundle that this field is used in.
-  $bundles_names = array();
+  // The list of entity:subtype that this field is used in.
+  $subtypes_names = array();
   $supports_revisions = FALSE;
   $entity_tables = array();
   $current_tables = array();
   $revision_tables = array();
   $groups = array();
 
-  $group_name = count($field['bundles']) > 1 ? t('Field') : NULL;
+  $group_name = count($field['subtypes']) > 1 ? t('Field') : NULL;
 
   // Build the relationships between the field table and the entity tables.
-  foreach ($field['bundles'] as $entity => $bundles) {
+  foreach ($field['subtypes'] as $entity => $subtypes) {
     $entity_info = entity_get_info($entity);
     $groups[$entity] = $entity_info['label'];
 
@@ -122,7 +122,7 @@ function field_views_field_default_views_data($field) {
       $groups[$entity] = t('Content');
     }
 
-    // If only one bundle use this as the default name.
+    // If only one subtype use this as the default name.
     if (empty($group_name)) {
       $group_name = $groups[$entity];
     }
@@ -159,8 +159,8 @@ function field_views_field_default_views_data($field) {
       $supports_revisions = TRUE;
     }
 
-    foreach ($bundles as $bundle) {
-      $bundles_names[] = t('@entity:@bundle', array('@entity' => $entity, '@bundle' => $bundle));
+    foreach ($subtypes as $subtype) {
+      $subtypes_names[] = t('@entity:@subtype', array('@entity' => $entity, '@subtype' => $subtype));
     }
   }
 
@@ -170,7 +170,7 @@ function field_views_field_default_views_data($field) {
     $tables[FIELD_LOAD_REVISION] = $revision_table;
   }
 
-  $add_fields = array('delta', 'langcode', 'bundle');
+  $add_fields = array('delta', 'langcode', 'subtype');
   foreach ($field['columns'] as $column_name => $attributes) {
     $add_fields[] = _field_sql_storage_columnname($field['field_name'], $column_name);
   }
@@ -196,7 +196,7 @@ function field_views_field_default_views_data($field) {
       'group' => $group,
       'title' => $label,
       'title short' => $label,
-      'help' =>  t('Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
+      'help' =>  t('Appears in: @subtypes.', array('@subtypes' => implode(', ', $subtypes_names))),
     );
 
     // Go through and create a list of aliases for all possible combinations of
@@ -305,7 +305,7 @@ function field_views_field_default_views_data($field) {
         'group' => $group,
         'title' => $title,
         'title short' => $title_short,
-        'help' =>  t('Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
+        'help' =>  t('Appears in: @subtypes.', array('@subtypes' => implode(', ', $subtypes_names))),
       );
 
       // Go through and create a list of aliases for all possible combinations of
@@ -370,7 +370,7 @@ function field_views_field_default_views_data($field) {
           'group' => $group,
           'title' => $title_delta,
           'title short' => $title_short_delta,
-          'help' => t('Delta - Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
+          'help' => t('Delta - Appears in: @subtypes.', array('@subtypes' => implode(', ', $subtypes_names))),
         );
         $data[$table]['delta']['field'] = array(
           'id' => 'numeric',
@@ -409,7 +409,7 @@ function field_views_field_default_views_data($field) {
           'group' => $group,
           'title' => $title_language,
           'title short' => $title_short_language,
-          'help' => t('Language - Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
+          'help' => t('Language - Appears in: @subtypes.', array('@subtypes' => implode(', ', $subtypes_names))),
         );
         $data[$table]['language']['field'] = array(
           'id' => 'language',
diff --git a/core/modules/field/lib/Drupal/field/FieldInfo.php b/core/modules/field/lib/Drupal/field/FieldInfo.php
index 7ff6850..9b4bf07 100644
--- a/core/modules/field/lib/Drupal/field/FieldInfo.php
+++ b/core/modules/field/lib/Drupal/field/FieldInfo.php
@@ -16,13 +16,13 @@
  * the request by the _field_info_field_cache() function. The object properties
  * act as a "static cache" of fields and instances definitions.
  *
- * The preferred way to access definitions is through the getBundleInstances()
- * method, which keeps cache entries per bundle, storing both fields and
- * instances for a given bundle. Fields used in multiple bundles are duplicated
+ * The preferred way to access definitions is through the getSubtypeInstances()
+ * method, which keeps cache entries per subtype, storing both fields and
+ * instances for a given subtype. Fields used in multiple subtypes are duplicated
  * in several cache entries, and are merged into a single list in the memory
- * cache. Cache entries are loaded for bundles as a whole, optimizing memory
+ * cache. Cache entries are loaded for subtypes as a whole, optimizing memory
  * and CPU usage for the most common pattern of iterating over all instances of
- * a bundle rather than accessing a single instance.
+ * a subtype rather than accessing a single instance.
  *
  * The getFields() and getInstances() methods, which return all existing field
  * and instance definitions, are kept mainly for backwards compatibility, and
@@ -33,7 +33,7 @@
 class FieldInfo {
 
   /**
-   * Lightweight map of fields across entity types and bundles.
+   * Lightweight map of fields across entity types and subtypes.
    *
    * @var array
    */
@@ -68,32 +68,32 @@ class FieldInfo {
   protected $unknownFields = array();
 
   /**
-   * Instance definitions by bundle.
+   * Instance definitions by subtype.
    *
    * @var array
    */
-  protected $bundleInstances = array();
+  protected $subtypeInstances = array();
 
   /**
-   * Whether $bundleInstances contains all instances definitions or a subset.
+   * Whether $subtypeInstances contains all instances definitions or a subset.
    *
    * @var bool
    */
   protected $loadedAllInstances = FALSE;
 
   /**
-   * Separately tracks requested bundles that are empty (or do not exist).
+   * Separately tracks requested subtypes that are empty (or do not exist).
    *
    * @var array
    */
-  protected $emptyBundles = array();
+  protected $emptySubtypes = array();
 
   /**
-   * Extra fields by bundle.
+   * Extra fields by subtype.
    *
    * @var array
    */
-  protected $bundleExtraFields = array();
+  protected $subtypeExtraFields = array();
 
   /**
    * Clears the "static" and persistent caches.
@@ -106,23 +106,23 @@ public function flush() {
     $this->loadedAllFields = FALSE;
     $this->unknownFields = array();
 
-    $this->bundleInstances = array();
+    $this->subtypeInstances = array();
     $this->loadedAllInstances = FALSE;
-    $this->emptyBundles = array();
+    $this->emptySubtypes = array();
 
-    $this->bundleExtraFields = array();
+    $this->subtypeExtraFields = array();
 
     cache('field')->deleteTags(array('field_info' => TRUE));
   }
 
   /**
-   * Collects a lightweight map of fields across bundles.
+   * Collects a lightweight map of fields across subtypes.
    *
    * @return
    *   An array keyed by field name. Each value is an array with two entries:
    *   - type: The field type.
-   *   - bundles: The bundles in which the field appears, as an array with
-   *     entity types as keys and the array of bundle names as values.
+   *   - subtypes: The subtypes in which the field appears, as an array with
+   *     entity types as keys and the array of subtype names as values.
    */
   public function getFieldMap() {
     // Read from the "static" cache.
@@ -145,13 +145,13 @@ public function getFieldMap() {
     $query = db_select('field_config_instance', 'fci');
     $query->join('field_config', 'fc', 'fc.id = fci.field_id');
     $query->fields('fc', array('type'));
-    $query->fields('fci', array('field_name', 'entity_type', 'bundle'))
+    $query->fields('fci', array('field_name', 'entity_type', 'subtype'))
       ->condition('fc.active', 1)
       ->condition('fc.storage_active', 1)
       ->condition('fc.deleted', 0)
       ->condition('fci.deleted', 0);
     foreach ($query->execute() as $row) {
-      $map[$row->field_name]['bundles'][$row->entity_type][] = $row->bundle;
+      $map[$row->field_name]['subtypes'][$row->entity_type][] = $row->subtype;
       $map[$row->field_name]['type'] = $row->type;
     }
 
@@ -207,9 +207,9 @@ public function getFields() {
    *   (optional) The entity type.
    *
    * @return
-   *   If $entity_type is not set, all instances keyed by entity type and bundle
+   *   If $entity_type is not set, all instances keyed by entity type and subtype
    *   name. If $entity_type is set, all instances for that entity type, keyed
-   *   by bundle name.
+   *   by subtype name.
    */
   public function getInstances($entity_type = NULL) {
     // If the full list is not present in "static" cache yet.
@@ -217,33 +217,33 @@ public function getInstances($entity_type = NULL) {
 
       // Read from persistent cache.
       if ($cached = cache('field')->get('field_info:instances')) {
-        $this->bundleInstances = $cached->data;
+        $this->subtypeInstances = $cached->data;
       }
       else {
         // Collect and prepare instances.
 
         // We also need to populate the static field cache, since it will not
-        // be set by subsequent getBundleInstances() calls.
+        // be set by subsequent getSubtypeInstances() calls.
         $this->getFields();
 
         foreach (field_read_instances() as $instance) {
           $field = $this->getField($instance['field_name']);
           $instance = $this->prepareInstance($instance, $field['type']);
-          $this->bundleInstances[$instance['entity_type']][$instance['bundle']][$instance['field_name']] = new FieldInstance($instance);
+          $this->subtypeInstances[$instance['entity_type']][$instance['subtype']][$instance['field_name']] = new FieldInstance($instance);
         }
 
         // Store in persistent cache.
-        cache('field')->set('field_info:instances', $this->bundleInstances, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
+        cache('field')->set('field_info:instances', $this->subtypeInstances, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
       }
 
       $this->loadedAllInstances = TRUE;
     }
 
     if (isset($entity_type)) {
-      return isset($this->bundleInstances[$entity_type]) ? $this->bundleInstances[$entity_type] : array();
+      return isset($this->subtypeInstances[$entity_type]) ? $this->subtypeInstances[$entity_type] : array();
     }
     else {
-      return $this->bundleInstances;
+      return $this->subtypeInstances;
     }
   }
 
@@ -306,7 +306,7 @@ public function getFieldById($field_id) {
     }
 
     // No persistent cache, fields are only persistently cached as part of a
-    // bundle.
+    // subtype.
 
     // Cache miss: read from definition.
     if ($fields = field_read_fields(array('id' => $field_id), array('include_deleted' => TRUE))) {
@@ -327,30 +327,30 @@ public function getFieldById($field_id) {
   }
 
   /**
-   * Retrieves the instances for a bundle.
+   * Retrieves the instances for a subtype.
    *
    * The function also populates the corresponding field definitions in the
    * "static" cache.
    *
    * @param $entity_type
    *   The entity type.
-   * @param $bundle
-   *   The bundle name.
+   * @param $subtype
+   *   The subtype name.
    *
    * @return
    *   The array of instance definitions, keyed by field name.
    */
-  public function getBundleInstances($entity_type, $bundle) {
+  public function getSubtypeInstances($entity_type, $subtype) {
     // Read from the "static" cache.
-    if (isset($this->bundleInstances[$entity_type][$bundle])) {
-      return $this->bundleInstances[$entity_type][$bundle];
+    if (isset($this->subtypeInstances[$entity_type][$subtype])) {
+      return $this->subtypeInstances[$entity_type][$subtype];
     }
-    if (isset($this->emptyBundles[$entity_type][$bundle])) {
+    if (isset($this->emptySubtypes[$entity_type][$subtype])) {
       return array();
     }
 
     // Read from the persistent cache.
-    if ($cached = cache('field')->get("field_info:bundle:$entity_type:$bundle")) {
+    if ($cached = cache('field')->get("field_info:subtype:$entity_type:$subtype")) {
       $info = $cached->data;
 
       // Extract the field definitions and save them in the "static" cache.
@@ -365,13 +365,13 @@ public function getBundleInstances($entity_type, $bundle) {
       unset($info['fields']);
 
       // Store the instance definitions in the "static" cache'. Empty (or
-      // non-existent) bundles are stored separately, so that they do not
+      // non-existent) subtypes are stored separately, so that they do not
       // pollute the global list returned by getInstances().
       if ($info['instances']) {
-        $this->bundleInstances[$entity_type][$bundle] = $info['instances'];
+        $this->subtypeInstances[$entity_type][$subtype] = $info['instances'];
       }
       else {
-        $this->emptyBundles[$entity_type][$bundle] = TRUE;
+        $this->emptySubtypes[$entity_type][$subtype] = TRUE;
       }
       return $info['instances'];
     }
@@ -380,8 +380,8 @@ public function getBundleInstances($entity_type, $bundle) {
 
     $instances = array();
 
-    // Collect the fields in the bundle.
-    $params = array('entity_type' => $entity_type, 'bundle' => $bundle);
+    // Collect the fields in the subtype.
+    $params = array('entity_type' => $entity_type, 'subtype' => $subtype);
     $fields = field_read_fields($params);
 
     // This iterates on non-deleted instances, so deleted fields are kept out of
@@ -401,18 +401,18 @@ public function getBundleInstances($entity_type, $bundle) {
       }
     }
 
-    // Store in the 'static' cache'. Empty (or non-existent) bundles are stored
+    // Store in the 'static' cache'. Empty (or non-existent) subtypes are stored
     // separately, so that they do not pollute the global list returned by
     // getInstances().
     if ($instances) {
-      $this->bundleInstances[$entity_type][$bundle] = $instances;
+      $this->subtypeInstances[$entity_type][$subtype] = $instances;
     }
     else {
-      $this->emptyBundles[$entity_type][$bundle] = TRUE;
+      $this->emptySubtypes[$entity_type][$subtype] = TRUE;
     }
 
     // The persistent cache additionally contains the definitions of the fields
-    // involved in the bundle.
+    // involved in the subtype.
     $cache = array(
       'instances' => $instances,
       'fields' => array()
@@ -420,50 +420,50 @@ public function getBundleInstances($entity_type, $bundle) {
     foreach ($instances as $instance) {
       $cache['fields'][] = $this->fieldsById[$instance['field_id']];
     }
-    cache('field')->set("field_info:bundle:$entity_type:$bundle", $cache, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
+    cache('field')->set("field_info:subtype:$entity_type:$subtype", $cache, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
 
     return $instances;
   }
 
   /**
-   * Retrieves the "extra fields" for a bundle.
+   * Retrieves the "extra fields" for a subtype.
    *
    * @param $entity_type
    *   The entity type.
-   * @param $bundle
-   *   The bundle name.
+   * @param $subtype
+   *   The subtype name.
    *
    * @return
    *   The array of extra fields.
    */
-  public function getBundleExtraFields($entity_type, $bundle) {
+  public function getSubtypeExtraFields($entity_type, $subtype) {
     // Read from the "static" cache.
-    if (isset($this->bundleExtraFields[$entity_type][$bundle])) {
-      return $this->bundleExtraFields[$entity_type][$bundle];
+    if (isset($this->subtypeExtraFields[$entity_type][$subtype])) {
+      return $this->subtypeExtraFields[$entity_type][$subtype];
     }
 
     // Read from the persistent cache.
-    if ($cached = cache('field')->get("field_info:bundle_extra:$entity_type:$bundle")) {
-      $this->bundleExtraFields[$entity_type][$bundle] = $cached->data;
-      return $this->bundleExtraFields[$entity_type][$bundle];
+    if ($cached = cache('field')->get("field_info:subtype_extra:$entity_type:$subtype")) {
+      $this->subtypeExtraFields[$entity_type][$subtype] = $cached->data;
+      return $this->subtypeExtraFields[$entity_type][$subtype];
     }
 
     // Cache miss: read from hook_field_extra_fields(). Note: given the current
     // shape of the hook, we have no other way than collecting extra fields on
-    // all bundles.
+    // all subtypes.
     $info = array();
     $extra = module_invoke_all('field_extra_fields');
     drupal_alter('field_extra_fields', $extra);
     // Merge in saved settings.
-    if (isset($extra[$entity_type][$bundle])) {
-      $info = $this->prepareExtraFields($extra[$entity_type][$bundle], $entity_type, $bundle);
+    if (isset($extra[$entity_type][$subtype])) {
+      $info = $this->prepareExtraFields($extra[$entity_type][$subtype], $entity_type, $subtype);
     }
 
     // Store in the 'static' and persistent caches.
-    $this->bundleExtraFields[$entity_type][$bundle] = $info;
-    cache('field')->set("field_info:bundle_extra:$entity_type:$bundle", $info, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
+    $this->subtypeExtraFields[$entity_type][$subtype] = $info;
+    cache('field')->set("field_info:subtype_extra:$entity_type:$subtype", $info, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
 
-    return $this->bundleExtraFields[$entity_type][$bundle];
+    return $this->subtypeExtraFields[$entity_type][$subtype];
   }
 
   /**
@@ -485,12 +485,12 @@ public function prepareField($field) {
     drupal_alter('field_storage_details', $details, $field);
     $field['storage']['details'] = $details;
 
-    // Populate the list of bundles using the field.
-    $field['bundles'] = array();
+    // Populate the list of subtypes using the field.
+    $field['subtypes'] = array();
     if (!$field['deleted']) {
       $map = $this->getFieldMap();
       if (isset($map[$field['field_name']])) {
-        $field['bundles'] = $map[$field['field_name']]['bundles'];
+        $field['subtypes'] = $map[$field['field_name']]['subtypes'];
       }
     }
 
@@ -527,21 +527,21 @@ public function prepareInstance($instance, $field_type) {
    *   The array of extra fields, as collected in hook_field_extra_fields().
    * @param $entity_type
    *   The entity type.
-   * @param $bundle
-   *   The bundle name.
+   * @param $subtype
+   *   The subtype name.
    *
    * @return
    *   The list of extra fields completed for the current runtime context.
    */
-  public function prepareExtraFields($extra_fields, $entity_type, $bundle) {
+  public function prepareExtraFields($extra_fields, $entity_type, $subtype) {
     $entity_type_info = entity_get_info($entity_type);
-    $bundle_settings = field_bundle_settings($entity_type, $bundle);
+    $subtype_settings = field_subtype_settings($entity_type, $subtype);
     $extra_fields += array('form' => array(), 'display' => array());
 
     $result = array();
     // Extra fields in forms.
     foreach ($extra_fields['form'] as $name => $field_data) {
-      $settings = isset($bundle_settings['extra_fields']['form'][$name]) ? $bundle_settings['extra_fields']['form'][$name] : array();
+      $settings = isset($subtype_settings['extra_fields']['form'][$name]) ? $subtype_settings['extra_fields']['form'][$name] : array();
       if (isset($settings['weight'])) {
         $field_data['weight'] = $settings['weight'];
       }
diff --git a/core/modules/field/lib/Drupal/field/FieldInstance.php b/core/modules/field/lib/Drupal/field/FieldInstance.php
index ba6ea44..bc9633c 100644
--- a/core/modules/field/lib/Drupal/field/FieldInstance.php
+++ b/core/modules/field/lib/Drupal/field/FieldInstance.php
@@ -49,7 +49,7 @@ public function getWidget() {
       // Let modules alter the widget properties.
       $context = array(
         'entity_type' => $this->definition['entity_type'],
-        'bundle' => $this->definition['bundle'],
+        'subtype' => $this->definition['subtype'],
         'field' => field_info_field($this->definition['field_name']),
         'instance' => $this,
       );
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php
index 04a038d..c45fc4e 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php
@@ -102,7 +102,7 @@ public function view(EntityInterface $entity, $langcode, array $items) {
         '#field_type' => $field['type'],
         '#field_translatable' => $field['translatable'],
         '#entity_type' => $entity_type,
-        '#bundle' => $entity->bundle(),
+        '#subtype' => $entity->subtype(),
         '#object' => $entity,
         '#items' => $items,
         '#formatter' => $this->getPluginId(),
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
index 12118f8..f8ef73f 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
@@ -274,7 +274,7 @@ protected function formSingleElement(EntityInterface $entity, array $items, $del
 
     $element += array(
       '#entity_type' => $entity->entityType(),
-      '#bundle' => $entity->bundle(),
+      '#subtype' => $entity->subtype(),
       '#entity' => $entity,
       '#field_name' => $field['field_name'],
       '#language' => $langcode,
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php
index c0ffc95..a49550b 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php
@@ -76,7 +76,7 @@ public function settingsForm(array $form, array &$form_state);
    * @param array $element
    *   A form element array containing basic properties for the widget:
    *   - #entity_type: The name of the entity the field is attached to.
-   *   - #bundle: The name of the field bundle the field is contained in.
+   *   - #subtype: The name of the field subtype the field is contained in.
    *   - #entity: The entity the field is attached to.
    *   - #field_name: The name of the field.
    *   - #language: The language the field is being edited in.
diff --git a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
index 976aa05..db86203 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
@@ -429,10 +429,10 @@ function fakeFieldInstance($formatter, $formatter_settings) {
     $field_type = field_info_field_types($field['type']);
 
     return array(
-      // Build a fake entity type and bundle.
+      // Build a fake entity type and subtype.
       'field_name' => $field_name,
       'entity_type' => 'views_fake',
-      'bundle' => 'views_fake',
+      'subtype' => 'views_fake',
 
       // Use the default field settings for settings and widget.
       'settings' => field_info_instance_settings($field['type']),
@@ -600,7 +600,7 @@ public function buildGroupByForm(&$form, &$form_state) {
       '#options' => $group_columns,
     );
 
-    $options = drupal_map_assoc(array('bundle', 'language', 'entity_type'), 'ucfirst');
+    $options = drupal_map_assoc(array('subtype', 'language', 'entity_type'), 'ucfirst');
 
     // Add on defined fields, noting that they're prefixed with the field name.
     $form['group_columns'] = array(
diff --git a/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php b/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php
index c365961..b46e989 100644
--- a/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php
@@ -51,7 +51,7 @@ protected function convertToPartialEntities($entities, $field_name) {
       $ids = (object) array(
         'entity_id' => $entity->ftid,
         'revision_id' => $entity->ftvid,
-        'bundle' => $entity->fttype,
+        'subtype' => $entity->fttype,
         'entity_type' => 'test_entity',
       );
       $partial_entities[$id] = _field_create_entity_from_ids($ids);
@@ -98,12 +98,12 @@ function setUp() {
     $this->fields = array();
     $this->instances = array();
     $this->entities = array();
-    $this->entities_by_bundles = array();
+    $this->entities_by_subtypes = array();
 
-    // Create two bundles.
-    $this->bundles = array('bb_1' => 'bb_1', 'bb_2' => 'bb_2');
-    foreach ($this->bundles as $name => $desc) {
-      field_test_create_bundle($name, $desc);
+    // Create two subtypes.
+    $this->subtypes = array('bb_1' => 'bb_1', 'bb_2' => 'bb_2');
+    foreach ($this->subtypes as $name => $desc) {
+      field_test_create_subtype($name, $desc);
     }
 
     // Create two fields.
@@ -112,16 +112,16 @@ function setUp() {
     $field = array('field_name' => 'bf_2', 'type' => 'test_field', 'cardinality' => 4);
     $this->fields[] = field_create_field($field);
 
-    // For each bundle, create an instance of each field, and 10
+    // For each subtype, create an instance of each field, and 10
     // entities with values for each field.
     $id = 1;
     $this->entity_type = 'test_entity';
-    foreach ($this->bundles as $bundle) {
+    foreach ($this->subtypes as $subtype) {
       foreach ($this->fields as $field) {
         $instance = array(
           'field_name' => $field['field_name'],
           'entity_type' => $this->entity_type,
-          'bundle' => $bundle,
+          'subtype' => $subtype,
           'widget' => array(
             'type' => 'test_field_widget',
           )
@@ -130,7 +130,7 @@ function setUp() {
       }
 
       for ($i = 0; $i < 10; $i++) {
-        $entity = field_test_create_entity($id, $id, $bundle);
+        $entity = field_test_create_entity($id, $id, $subtype);
         foreach ($this->fields as $field) {
           $entity->{$field['field_name']}[LANGUAGE_NOT_SPECIFIED] = $this->_generateTestFieldValues($field['cardinality']);
         }
@@ -140,8 +140,8 @@ function setUp() {
     }
     $this->entities = entity_load_multiple($this->entity_type, range(1, $id));
     foreach ($this->entities as $entity) {
-      // Also keep track of the entities per bundle.
-      $this->entities_by_bundles[$entity->fttype][$entity->ftid] = $entity;
+      // Also keep track of the entities per subtype.
+      $this->entities_by_subtypes[$entity->fttype][$entity->ftid] = $entity;
     }
   }
 
@@ -155,43 +155,43 @@ function setUp() {
    * but depends on this class's setUp().
    */
   function testDeleteFieldInstance() {
-    $bundle = reset($this->bundles);
+    $subtype = reset($this->subtypes);
     $field = reset($this->fields);
     $field_name = $field['field_name'];
     $factory = drupal_container()->get('entity.query');
 
-    // There are 10 entities of this bundle.
+    // There are 10 entities of this subtype.
     $found = $factory->get('test_entity')
-      ->condition('fttype', $bundle)
+      ->condition('fttype', $subtype)
       ->execute();
     $this->assertEqual(count($found), 10, 'Correct number of entities found before deleting');
 
     // Delete the instance.
-    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $subtype);
     field_delete_instance($instance);
 
     // The instance still exists, deleted.
     $instances = field_read_instances(array('field_id' => $field['id'], 'deleted' => 1), array('include_deleted' => 1, 'include_inactive' => 1));
     $this->assertEqual(count($instances), 1, 'There is one deleted instance');
-    $this->assertEqual($instances[0]['bundle'], $bundle, 'The deleted instance is for the correct bundle');
+    $this->assertEqual($instances[0]['subtype'], $subtype, 'The deleted instance is for the correct subtype');
 
-    // There are 0 entities of this bundle with non-deleted data.
+    // There are 0 entities of this subtype with non-deleted data.
     $found = $factory->get('test_entity')
-      ->condition('fttype', $bundle)
+      ->condition('fttype', $subtype)
       ->condition("$field_name.deleted", 0)
       ->execute();
     $this->assertFalse($found, 'No entities found after deleting');
 
-    // There are 10 entities of this bundle when deleted fields are allowed, and
+    // There are 10 entities of this subtype when deleted fields are allowed, and
     // their values are correct.
     $found = $factory->get('test_entity')
-      ->condition('fttype', $bundle)
+      ->condition('fttype', $subtype)
       ->condition("$field_name.deleted", 1)
       ->sort('ftid')
       ->execute();
     $ids = (object) array(
       'entity_type' => 'test_entity',
-      'bundle' => $bundle,
+      'subtype' => $subtype,
     );
     $entities = array();
     foreach ($found as $entity_id) {
@@ -213,11 +213,11 @@ function testPurgeInstance() {
     // Start recording hook invocations.
     field_test_memorize();
 
-    $bundle = reset($this->bundles);
+    $subtype = reset($this->subtypes);
     $field = reset($this->fields);
 
     // Delete the instance.
-    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $subtype);
     field_delete_instance($instance);
 
     // No field hooks were called.
@@ -231,7 +231,7 @@ function testPurgeInstance() {
 
       // There are $count deleted entities left.
       $found = entity_query('test_entity')
-        ->condition('fttype', $bundle)
+        ->condition('fttype', $subtype)
         ->condition($field['field_name'] . '.deleted', 1)
         ->execute();
       $this->assertEqual(count($found), $count, 'Correct number of entities found after purging 2');
@@ -241,10 +241,10 @@ function testPurgeInstance() {
     // - hook_field_load() (multiple hook) should have been called on all
     // entities by pairs of two.
     // - hook_field_delete() should have been called once for each entity in the
-    // bundle.
+    // subtype.
     $actual_hooks = field_test_memorize();
     $hooks = array();
-    $entities = $this->convertToPartialEntities($this->entities_by_bundles[$bundle], $field['field_name']);
+    $entities = $this->convertToPartialEntities($this->entities_by_subtypes[$subtype], $field['field_name']);
     foreach (array_chunk($entities, $batch_size, TRUE) as $chunk_entity) {
       $hooks['field_test_field_load'][] = $chunk_entity;
     }
@@ -280,8 +280,8 @@ function testPurgeField() {
     $field = reset($this->fields);
 
     // Delete the first instance.
-    $bundle = reset($this->bundles);
-    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    $subtype = reset($this->subtypes);
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $subtype);
     field_delete_instance($instance);
 
     // Assert that hook_field_delete() was not called yet.
@@ -293,12 +293,12 @@ function testPurgeField() {
 
     // Check hooks invocations.
     // - hook_field_load() (multiple hook) should have been called once, for all
-    // entities in the bundle.
+    // entities in the subtype.
     // - hook_field_delete() should have been called once for each entity in the
-    // bundle.
+    // subtype.
     $actual_hooks = field_test_memorize();
     $hooks = array();
-    $entities = $this->convertToPartialEntities($this->entities_by_bundles[$bundle], $field['field_name']);
+    $entities = $this->convertToPartialEntities($this->entities_by_subtypes[$subtype], $field['field_name']);
     $hooks['field_test_field_load'][] = $entities;
     $hooks['field_test_field_delete'] = $entities;
     $this->checkHooksInvocations($hooks, $actual_hooks);
@@ -311,8 +311,8 @@ function testPurgeField() {
     $this->assertTrue(isset($fields[$field['id']]) && !$fields[$field['id']]['deleted'], 'The field exists and is not deleted');
 
     // Delete the second instance.
-    $bundle = next($this->bundles);
-    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    $subtype = next($this->subtypes);
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $subtype);
     field_delete_instance($instance);
 
     // Assert that hook_field_delete() was not called yet.
@@ -322,10 +322,10 @@ function testPurgeField() {
     // Purge the data.
     field_purge_batch(10);
 
-    // Check hooks invocations (same as above, for the 2nd bundle).
+    // Check hooks invocations (same as above, for the 2nd subtype).
     $actual_hooks = field_test_memorize();
     $hooks = array();
-    $entities = $this->convertToPartialEntities($this->entities_by_bundles[$bundle], $field['field_name']);
+    $entities = $this->convertToPartialEntities($this->entities_by_subtypes[$subtype], $field['field_name']);
     $hooks['field_test_field_load'][] = $entities;
     $hooks['field_test_field_delete'] = $entities;
     $this->checkHooksInvocations($hooks, $actual_hooks);
diff --git a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
index 1c539da..9cbf9e9 100644
--- a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
@@ -216,12 +216,12 @@ function testReadFields() {
     $instance_definition = array(
       'field_name' => $field_definition['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
     field_create_instance($instance_definition);
 
     // Check that criteria spanning over the field_config_instance table work.
-    $fields = field_read_fields(array('entity_type' => $instance_definition['entity_type'], 'bundle' => $instance_definition['bundle']));
+    $fields = field_read_fields(array('entity_type' => $instance_definition['entity_type'], 'subtype' => $instance_definition['subtype']));
     $this->assertTrue(count($fields) == 1 && isset($fields[$field_definition['field_name']]), 'The field was properly read.');
     $fields = field_read_fields(array('entity_type' => $instance_definition['entity_type'], 'field_name' => $instance_definition['field_name']));
     $this->assertTrue(count($fields) == 1 && isset($fields[$field_definition['field_name']]), 'The field was properly read.');
@@ -286,7 +286,7 @@ function testDeleteField() {
     $this->instance_definition = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'test_field_widget',
       ),
@@ -308,7 +308,7 @@ function testDeleteField() {
 
     // Make sure that this field's instance is marked as deleted when it is
     // specifically loaded.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype'], array('include_deleted' => TRUE));
     $this->assertTrue(!empty($instance['deleted']), 'An instance for a deleted field is marked for deletion.');
 
     // Try to load the field normally and make sure it does not show up.
@@ -316,13 +316,13 @@ function testDeleteField() {
     $this->assertTrue(empty($field), 'A deleted field is not loaded by default.');
 
     // Try to load the instance normally and make sure it does not show up.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $this->assertTrue(empty($instance), 'An instance for a deleted field is not loaded by default.');
 
     // Make sure the other field (and its field instance) are not deleted.
     $another_field = field_read_field($this->another_field['field_name']);
     $this->assertTrue(!empty($another_field) && empty($another_field['deleted']), 'A non-deleted field is not marked for deletion.');
-    $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
+    $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['subtype']);
     $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), 'An instance of a non-deleted field is not marked for deletion.');
 
     // Try to create a new field the same name as a deleted field and
@@ -331,11 +331,11 @@ function testDeleteField() {
     field_create_instance($this->instance_definition);
     $field = field_read_field($this->field['field_name']);
     $this->assertTrue(!empty($field) && empty($field['deleted']), 'A new field with a previously used name is created.');
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $this->assertTrue(!empty($instance) && empty($instance['deleted']), 'A new instance for a previously used field name is created.');
 
     // Save an entity with data for the field
-    $entity = field_test_create_entity(0, 0, $instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $values[0]['value'] = mt_rand(1, 127);
     $entity->{$field['field_name']}[$langcode] = $values;
@@ -343,7 +343,7 @@ function testDeleteField() {
     field_attach_insert($entity);
 
     // Verify the field is present on load
-    $entity = field_test_create_entity(0, 0, $this->instance_definition['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance_definition['subtype']);
     field_attach_load($entity_type, array(0 => $entity));
     $this->assertIdentical(count($entity->{$field['field_name']}[$langcode]), count($values), "Data in previously deleted field saves and loads correctly");
     foreach ($values as $delta => $value) {
@@ -393,14 +393,14 @@ function testUpdateField() {
     $instance = array(
       'field_name' => 'field_update',
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
     $instance = field_create_instance($instance);
 
     do {
       // We need a unique ID for our entity. $cardinality will do.
       $id = $cardinality;
-      $entity = field_test_create_entity($id, $id, $instance['bundle']);
+      $entity = field_test_create_entity($id, $id, $instance['subtype']);
       // Fill in the entity with more values than $cardinality.
       for ($i = 0; $i < 20; $i++) {
         $entity->field_update[LANGUAGE_NOT_SPECIFIED][$i]['value'] = $i;
@@ -408,7 +408,7 @@ function testUpdateField() {
       // Save the entity.
       field_attach_insert($entity);
       // Load back and assert there are $cardinality number of values.
-      $entity = field_test_create_entity($id, $id, $instance['bundle']);
+      $entity = field_test_create_entity($id, $id, $instance['subtype']);
       field_attach_load('test_entity', array($id => $entity));
       $this->assertEqual(count($entity->field_update[LANGUAGE_NOT_SPECIFIED]), $field_definition['cardinality'], 'Cardinality is kept');
       // Now check the values themselves.
diff --git a/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php b/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
index 8c28727..72a13ef 100644
--- a/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
@@ -40,7 +40,7 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->label,
     );
 
@@ -62,11 +62,11 @@ function setUp() {
     field_create_field($this->field);
     field_create_instance($this->instance);
     // Create a display for the default view mode.
-    entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'default')
       ->setComponent($this->field_name, $this->display_options['default'])
       ->save();
     // Create a display for the teaser view mode.
-    entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'teaser')
+    entity_get_display($this->instance['entity_type'], $this->instance['subtype'], 'teaser')
       ->setComponent($this->field_name, $this->display_options['teaser'])
       ->save();
 
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php
index bc1a380..dbb8cd3 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php
@@ -45,7 +45,7 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'node',
-      'bundle' => $this->content_type,
+      'subtype' => $this->content_type,
       'widget' => array(
         'type' => 'text_textfield',
       ),
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
index 89e07c6..dbd326e 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
@@ -40,8 +40,8 @@ function testFieldAttachView() {
 
     // Simple formatter, label displayed.
     $entity = clone($entity_init);
-    $display = entity_get_display($entity_type, $entity->bundle(), 'full');
-    $displays = array($entity->bundle() => $display);
+    $display = entity_get_display($entity_type, $entity->subtype(), 'full');
+    $displays = array($entity->subtype() => $display);
 
     $formatter_setting = $this->randomName();
     $display_options = array(
@@ -179,18 +179,18 @@ function testFieldAttachPrepareViewMultiple() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Set the instance to be hidden.
-    $display = entity_get_display('test_entity', 'test_bundle', 'full')
+    $display = entity_get_display('test_entity', 'test_subtype', 'full')
       ->removeComponent($this->field['field_name']);
 
-    // Set up a second instance on another bundle, with a formatter that uses
+    // Set up a second instance on another subtype, with a formatter that uses
     // hook_field_formatter_prepare_view().
-    field_test_create_bundle('test_bundle_2');
+    field_test_create_subtype('test_subtype_2');
     $formatter_setting = $this->randomName();
     $this->instance2 = $this->instance;
-    $this->instance2['bundle'] = 'test_bundle_2';
+    $this->instance2['subtype'] = 'test_subtype_2';
     field_create_instance($this->instance2);
 
-    $display_2 = entity_get_display('test_entity', 'test_bundle_2', 'full')
+    $display_2 = entity_get_display('test_entity', 'test_subtype_2', 'full')
       ->setComponent($this->field['field_name'], array(
         'type' => 'field_test_with_prepare_view',
         'settings' => array(
@@ -198,14 +198,14 @@ function testFieldAttachPrepareViewMultiple() {
         ),
       ));
 
-    $displays = array('test_bundle' => $display, 'test_bundle_2' => $display_2);
+    $displays = array('test_subtype' => $display, 'test_subtype_2' => $display_2);
 
-    // Create one entity in each bundle.
-    $entity1_init = field_test_create_entity(1, 1, 'test_bundle');
+    // Create one entity in each subtype.
+    $entity1_init = field_test_create_entity(1, 1, 'test_subtype');
     $values1 = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity1_init->{$this->field_name}[$langcode] = $values1;
 
-    $entity2_init = field_test_create_entity(2, 2, 'test_bundle_2');
+    $entity2_init = field_test_create_entity(2, 2, 'test_subtype_2');
     $values2 = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity2_init->{$this->field_name}[$langcode] = $values2;
 
@@ -231,7 +231,7 @@ function testFieldAttachPrepareViewMultiple() {
    */
   function testFieldAttachCache() {
     // Initialize random values and a test entity.
-    $entity_init = field_test_create_entity(1, 1, $this->instance['bundle']);
+    $entity_init = field_test_create_entity(1, 1, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
 
@@ -259,7 +259,7 @@ function testFieldAttachCache() {
     $entity_init = entity_create($entity_type, array(
       'ftid' => 1,
       'ftvid' => 1,
-      'fttype' => $this->instance['bundle'],
+      'fttype' => $this->instance['subtype'],
     ));
     $cid = "field:$entity_type:{$entity_init->ftid}";
     $instance = $this->instance;
@@ -304,7 +304,7 @@ function testFieldAttachCache() {
     $entity_init = entity_create($entity_type, array(
       'ftid' => 1,
       'ftvid' => 2,
-      'fttype' => $this->instance['bundle'],
+      'fttype' => $this->instance['subtype'],
     ));
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity = clone($entity_init);
@@ -334,7 +334,7 @@ function testFieldAttachValidate() {
     $this->createFieldWithInstance('_2');
 
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Set up all but one values of the first field to generate errors.
@@ -426,7 +426,7 @@ function testFieldAttachForm() {
     $this->createFieldWithInstance('_2');
 
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // When generating form for all fields.
@@ -466,7 +466,7 @@ function testFieldAttachExtractFormValues() {
     $this->createFieldWithInstance('_2');
 
     $entity_type = 'test_entity';
-    $entity_init = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity_init = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Build the form for all fields.
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php
index 5ae3610..8d5874e 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php
@@ -42,7 +42,7 @@ function testFieldAttachSaveLoad() {
 
     // Preparation: create three revisions and store them in $revision array.
     for ($revision_id = 0; $revision_id < 3; $revision_id++) {
-      $revision[$revision_id] = field_test_create_entity(0, $revision_id, $this->instance['bundle']);
+      $revision[$revision_id] = field_test_create_entity(0, $revision_id, $this->instance['subtype']);
       // Note: we try to insert one extra value.
       $values[$revision_id] = $this->_generateTestFieldValues($this->field['cardinality'] + 1);
       $current_revision = $revision_id;
@@ -59,7 +59,7 @@ function testFieldAttachSaveLoad() {
     }
 
     // Confirm current revision loads the correct data.
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     field_attach_load($entity_type, array(0 => $entity));
     // Number of values per field loaded equals the field cardinality.
     $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], 'Current revision: expected number of values');
@@ -72,7 +72,7 @@ function testFieldAttachSaveLoad() {
 
     // Confirm each revision loads the correct data.
     foreach (array_keys($revision) as $revision_id) {
-      $entity = field_test_create_entity(0, $revision_id, $this->instance['bundle']);
+      $entity = field_test_create_entity(0, $revision_id, $this->instance['subtype']);
       field_attach_load_revision($entity_type, array(0 => $entity));
       // Number of values per field loaded equals the field cardinality.
       $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], format_string('Revision %revision_id: expected number of values.', array('%revision_id' => $revision_id)));
@@ -92,18 +92,18 @@ function testFieldAttachLoadMultiple() {
     $entity_type = 'test_entity';
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
-    // Define 2 bundles.
-    $bundles = array(
-      1 => 'test_bundle_1',
-      2 => 'test_bundle_2',
+    // Define 2 subtypes.
+    $subtypes = array(
+      1 => 'test_subtype_1',
+      2 => 'test_subtype_2',
     );
-    field_test_create_bundle($bundles[1]);
-    field_test_create_bundle($bundles[2]);
+    field_test_create_subtype($subtypes[1]);
+    field_test_create_subtype($subtypes[2]);
     // Define 3 fields:
-    // - field_1 is in bundle_1 and bundle_2,
-    // - field_2 is in bundle_1,
-    // - field_3 is in bundle_2.
-    $field_bundles_map = array(
+    // - field_1 is in subtype_1 and subtype_2,
+    // - field_2 is in subtype_1,
+    // - field_3 is in subtype_2.
+    $field_subtypes_map = array(
       1 => array(1, 2),
       2 => array(1),
       3 => array(2),
@@ -113,11 +113,11 @@ function testFieldAttachLoadMultiple() {
       $field = array('field_name' => $field_names[$i], 'type' => 'test_field');
       $field = field_create_field($field);
       $field_ids[$i] = $field['id'];
-      foreach ($field_bundles_map[$i] as $bundle) {
+      foreach ($field_subtypes_map[$i] as $subtype) {
         $instance = array(
           'field_name' => $field_names[$i],
           'entity_type' => 'test_entity',
-          'bundle' => $bundles[$bundle],
+          'subtype' => $subtypes[$subtype],
           'settings' => array(
             // Configure the instance so that we test hook_field_load()
             // (see field_test_field_load() in field_test.module).
@@ -128,11 +128,11 @@ function testFieldAttachLoadMultiple() {
       }
     }
 
-    // Create one test entity per bundle, with random values.
-    foreach ($bundles as $index => $bundle) {
-      $entities[$index] = field_test_create_entity($index, $index, $bundle);
+    // Create one test entity per subtype, with random values.
+    foreach ($subtypes as $index => $subtype) {
+      $entities[$index] = field_test_create_entity($index, $index, $subtype);
       $entity = clone($entities[$index]);
-      $instances = field_info_instances('test_entity', $bundle);
+      $instances = field_info_instances('test_entity', $subtype);
       foreach ($instances as $field_name => $instance) {
         $values[$index][$field_name] = mt_rand(1, 127);
         $entity->$field_name = array($langcode => array(array('value' => $values[$index][$field_name])));
@@ -143,7 +143,7 @@ function testFieldAttachLoadMultiple() {
     // Check that a single load correctly loads field values for both entities.
     field_attach_load($entity_type, $entities);
     foreach ($entities as $index => $entity) {
-      $instances = field_info_instances($entity_type, $bundles[$index]);
+      $instances = field_info_instances($entity_type, $subtypes[$index]);
       foreach ($instances as $field_name => $instance) {
         // The field value loaded matches the one inserted.
         $this->assertEqual($entity->{$field_name}[$langcode][0]['value'], $values[$index][$field_name], format_string('Entity %index: expected value was found.', array('%index' => $index)));
@@ -153,7 +153,7 @@ function testFieldAttachLoadMultiple() {
     }
 
     // Check that the single-field load option works.
-    $entity = field_test_create_entity(1, 1, $bundles[1]);
+    $entity = field_test_create_entity(1, 1, $subtypes[1]);
     field_attach_load($entity_type, array(1 => $entity), FIELD_LOAD_CURRENT, array('field_id' => $field_ids[1]));
     $this->assertEqual($entity->{$field_names[1]}[$langcode][0]['value'], $values[1][$field_names[1]], format_string('Entity %index: expected value was found.', array('%index' => 1)));
     $this->assertEqual($entity->{$field_names[1]}[$langcode][0]['additional_key'], 'additional_value', format_string('Entity %index: extra information was found', array('%index' => 1)));
@@ -188,7 +188,7 @@ function testFieldAttachSaveLoadDifferentStorage() {
       $instance = array(
         'field_name' => $field['field_name'],
         'entity_type' => 'test_entity',
-        'bundle' => 'test_bundle',
+        'subtype' => 'test_subtype',
       );
       field_create_instance($instance);
     }
@@ -229,12 +229,12 @@ function testFieldStorageDetailsAlter() {
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
     field_create_instance($instance);
 
     $field = field_info_field($instance['field_name']);
-    $instance = field_info_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);
+    $instance = field_info_instance($instance['entity_type'], $instance['field_name'], $instance['subtype']);
 
     // The storage details are indexed by a storage engine type.
     $this->assertTrue(array_key_exists('drupal_variables', $field['storage']['details']), 'The storage type is Drupal variables.');
@@ -369,7 +369,7 @@ function testFieldAttachSaveMissingDataDefaultValue() {
 
     // Verify that prepopulated field values are not overwritten by defaults.
     $value = array(array('value' => $default[0]['value'] - mt_rand(1, 127)));
-    $entity = entity_create('test_entity', array('fttype' => $entity_init->bundle(), $this->field_name => array($langcode => $value)));
+    $entity = entity_create('test_entity', array('fttype' => $entity_init->subtype(), $this->field_name => array($langcode => $value)));
     $this->assertEqual($entity->{$this->field_name}[$langcode], $value, 'Prepopulated field value correctly maintained.');
   }
 
@@ -379,7 +379,7 @@ function testFieldAttachSaveMissingDataDefaultValue() {
   function testFieldAttachDelete() {
     $entity_type = 'test_entity';
     $langcode = LANGUAGE_NOT_SPECIFIED;
-    $rev[0] = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $rev[0] = field_test_create_entity(0, 0, $this->instance['subtype']);
 
     // Create revision 0
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
@@ -387,18 +387,18 @@ function testFieldAttachDelete() {
     field_attach_insert($rev[0]);
 
     // Create revision 1
-    $rev[1] = field_test_create_entity(0, 1, $this->instance['bundle']);
+    $rev[1] = field_test_create_entity(0, 1, $this->instance['subtype']);
     $rev[1]->{$this->field_name}[$langcode] = $values;
     field_attach_update($rev[1]);
 
     // Create revision 2
-    $rev[2] = field_test_create_entity(0, 2, $this->instance['bundle']);
+    $rev[2] = field_test_create_entity(0, 2, $this->instance['subtype']);
     $rev[2]->{$this->field_name}[$langcode] = $values;
     field_attach_update($rev[2]);
 
     // Confirm each revision loads
     foreach (array_keys($rev) as $vid) {
-      $read = field_test_create_entity(0, $vid, $this->instance['bundle']);
+      $read = field_test_create_entity(0, $vid, $this->instance['subtype']);
       field_attach_load_revision($entity_type, array(0 => $read));
       $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity revision $vid has {$this->field['cardinality']} values.");
     }
@@ -406,42 +406,42 @@ function testFieldAttachDelete() {
     // Delete revision 1, confirm the other two still load.
     field_attach_delete_revision($rev[1]);
     foreach (array(0, 2) as $vid) {
-      $read = field_test_create_entity(0, $vid, $this->instance['bundle']);
+      $read = field_test_create_entity(0, $vid, $this->instance['subtype']);
       field_attach_load_revision($entity_type, array(0 => $read));
       $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity revision $vid has {$this->field['cardinality']} values.");
     }
 
     // Confirm the current revision still loads
-    $read = field_test_create_entity(0, 2, $this->instance['bundle']);
+    $read = field_test_create_entity(0, 2, $this->instance['subtype']);
     field_attach_load($entity_type, array(0 => $read));
     $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity current revision has {$this->field['cardinality']} values.");
 
     // Delete all field data, confirm nothing loads
     field_attach_delete($rev[2]);
     foreach (array(0, 1, 2) as $vid) {
-      $read = field_test_create_entity(0, $vid, $this->instance['bundle']);
+      $read = field_test_create_entity(0, $vid, $this->instance['subtype']);
       field_attach_load_revision($entity_type, array(0 => $read));
       $this->assertIdentical($read->{$this->field_name}, array(), "The test entity revision $vid is deleted.");
     }
-    $read = field_test_create_entity(0, 2, $this->instance['bundle']);
+    $read = field_test_create_entity(0, 2, $this->instance['subtype']);
     field_attach_load($entity_type, array(0 => $read));
     $this->assertIdentical($read->{$this->field_name}, array(), 'The test entity current revision is deleted.');
   }
 
   /**
-   * Test field_attach_create_bundle() and field_attach_rename_bundle().
+   * Test field_attach_create_subtype() and field_attach_rename_subtype().
    */
-  function testFieldAttachCreateRenameBundle() {
-    // Create a new bundle.
-    $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
-    field_test_create_bundle($new_bundle);
+  function testFieldAttachCreateRenameSubtype() {
+    // Create a new subtype.
+    $new_subtype = 'test_subtype_' . drupal_strtolower($this->randomName());
+    field_test_create_subtype($new_subtype);
 
-    // Add an instance to that bundle.
-    $this->instance['bundle'] = $new_bundle;
+    // Add an instance to that subtype.
+    $this->instance['subtype'] = $new_subtype;
     field_create_instance($this->instance);
 
     // Save an entity with data in the field.
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity->{$this->field_name}[$langcode] = $values;
@@ -449,44 +449,44 @@ function testFieldAttachCreateRenameBundle() {
     field_attach_insert($entity);
 
     // Verify the field data is present on load.
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     field_attach_load($entity_type, array(0 => $entity));
-    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Data is retrieved for the new bundle");
+    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Data is retrieved for the new subtype");
 
-    // Rename the bundle.
-    $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
-    field_test_rename_bundle($this->instance['bundle'], $new_bundle);
+    // Rename the subtype.
+    $new_subtype = 'test_subtype_' . drupal_strtolower($this->randomName());
+    field_test_rename_subtype($this->instance['subtype'], $new_subtype);
 
     // Check that the instance definition has been updated.
-    $this->instance = field_info_instance($entity_type, $this->field_name, $new_bundle);
-    $this->assertIdentical($this->instance['bundle'], $new_bundle, "Bundle name has been updated in the instance.");
+    $this->instance = field_info_instance($entity_type, $this->field_name, $new_subtype);
+    $this->assertIdentical($this->instance['subtype'], $new_subtype, "Subtype name has been updated in the instance.");
 
     // Verify the field data is present on load.
-    $entity = field_test_create_entity(0, 0, $new_bundle);
+    $entity = field_test_create_entity(0, 0, $new_subtype);
     field_attach_load($entity_type, array(0 => $entity));
-    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Bundle name has been updated in the field storage");
+    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Subtype name has been updated in the field storage");
   }
 
   /**
-   * Test field_attach_delete_bundle().
+   * Test field_attach_delete_subtype().
    */
-  function testFieldAttachDeleteBundle() {
-    // Create a new bundle.
-    $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
-    field_test_create_bundle($new_bundle);
+  function testFieldAttachDeleteSubtype() {
+    // Create a new subtype.
+    $new_subtype = 'test_subtype_' . drupal_strtolower($this->randomName());
+    field_test_create_subtype($new_subtype);
 
-    // Add an instance to that bundle.
-    $this->instance['bundle'] = $new_bundle;
+    // Add an instance to that subtype.
+    $this->instance['subtype'] = $new_subtype;
     field_create_instance($this->instance);
 
-    // Create a second field for the test bundle
+    // Create a second field for the test subtype
     $field_name = drupal_strtolower($this->randomName() . '_field_name');
     $field = array('field_name' => $field_name, 'type' => 'test_field', 'cardinality' => 1);
     field_create_field($field);
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'test_entity',
-      'bundle' => $this->instance['bundle'],
+      'subtype' => $this->instance['subtype'],
       'label' => $this->randomName() . '_label',
       'description' => $this->randomName() . '_description',
       'weight' => mt_rand(0, 127),
@@ -498,7 +498,7 @@ function testFieldAttachDeleteBundle() {
     field_create_instance($instance);
 
     // Save an entity with data for both fields
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity->{$this->field_name}[$langcode] = $values;
@@ -506,22 +506,22 @@ function testFieldAttachDeleteBundle() {
     field_attach_insert($entity);
 
     // Verify the fields are present on load
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     field_attach_load('test_entity', array(0 => $entity));
     $this->assertEqual(count($entity->{$this->field_name}[$langcode]), 4, 'First field got loaded');
     $this->assertEqual(count($entity->{$field_name}[$langcode]), 1, 'Second field got loaded');
 
-    // Delete the bundle.
-    field_test_delete_bundle($this->instance['bundle']);
+    // Delete the subtype.
+    field_test_delete_subtype($this->instance['subtype']);
 
     // Verify no data gets loaded
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     field_attach_load('test_entity', array(0 => $entity));
     $this->assertFalse(isset($entity->{$this->field_name}[$langcode]), 'No data for first field');
     $this->assertFalse(isset($entity->{$field_name}[$langcode]), 'No data for second field');
 
     // Verify that the instances are gone
-    $this->assertFalse(field_read_instance('test_entity', $this->field_name, $this->instance['bundle']), "First field is deleted");
-    $this->assertFalse(field_read_instance('test_entity', $field_name, $instance['bundle']), "Second field is deleted");
+    $this->assertFalse(field_read_instance('test_entity', $this->field_name, $this->instance['subtype']), "First field is deleted");
+    $this->assertFalse(field_read_instance('test_entity', $field_name, $instance['subtype']), "Second field is deleted");
   }
 }
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachTestBase.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachTestBase.php
index 9d15ba2..38a2c64 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachTestBase.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachTestBase.php
@@ -42,7 +42,7 @@ function createFieldWithInstance($suffix = '') {
     $this->$instance = array(
       'field_name' => $this->$field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->randomName() . '_label',
       'description' => $this->randomName() . '_description',
       'weight' => mt_rand(0, 127),
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
index 3115851..38a0550 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
@@ -19,7 +19,7 @@ class FieldInfoTest extends FieldTestBase {
   public static function getInfo() {
     return array(
       'name' => 'Field info tests',
-      'description' => 'Get information about existing fields, instances and bundles.',
+      'description' => 'Get information about existing fields, instances and subtypes.',
       'group' => 'Field API',
     );
   }
@@ -56,8 +56,8 @@ function testFieldInfo() {
     $instances = field_info_instances('test_entity');
     $expected = array();
     $this->assertIdentical($instances, $expected, format_string("field_info_instances('test_entity') returns %expected.", array('%expected' => var_export($expected, TRUE))));
-    $instances = field_info_instances('test_entity', 'test_bundle');
-    $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'test_bundle') returns an empty array.");
+    $instances = field_info_instances('test_entity', 'test_subtype');
+    $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'test_subtype') returns an empty array.");
 
     // Create a field, verify it shows up.
     $core_fields = field_info_fields();
@@ -82,7 +82,7 @@ function testFieldInfo() {
     $instance = array(
       'field_name' => $field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->randomName(),
       'description' => $this->randomName(),
       'weight' => mt_rand(0, 127),
@@ -94,25 +94,25 @@ function testFieldInfo() {
     field_create_instance($instance);
 
     $info = entity_get_info('test_entity');
-    $instances = field_info_instances('test_entity', $instance['bundle']);
-    $this->assertEqual(count($instances), 1, format_string('One instance shows up in info when attached to a bundle on a @label.', array(
+    $instances = field_info_instances('test_entity', $instance['subtype']);
+    $this->assertEqual(count($instances), 1, format_string('One instance shows up in info when attached to a subtype on a @label.', array(
       '@label' => $info['label']
     )));
     $this->assertTrue($instance < $instances[$instance['field_name']], 'Instance appears in info correctly');
 
-    // Test a valid entity type but an invalid bundle.
-    $instances = field_info_instances('test_entity', 'invalid_bundle');
-    $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'invalid_bundle') returns an empty array.");
+    // Test a valid entity type but an invalid subtype.
+    $instances = field_info_instances('test_entity', 'invalid_subtype');
+    $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'invalid_subtype') returns an empty array.");
 
-    // Test invalid entity type and bundle.
-    $instances = field_info_instances('invalid_entity', $instance['bundle']);
-    $this->assertIdentical($instances, array(), "field_info_instances('invalid_entity', 'test_bundle') returns an empty array.");
+    // Test invalid entity type and subtype.
+    $instances = field_info_instances('invalid_entity', $instance['subtype']);
+    $this->assertIdentical($instances, array(), "field_info_instances('invalid_entity', 'test_subtype') returns an empty array.");
 
-    // Test invalid entity type, no bundle provided.
+    // Test invalid entity type, no subtype provided.
     $instances = field_info_instances('invalid_entity');
     $this->assertIdentical($instances, array(), "field_info_instances('invalid_entity') returns an empty array.");
 
-    // Test with an entity type that has no bundles.
+    // Test with an entity type that has no subtypes.
     $instances = field_info_instances('user');
     $expected = array();
     $this->assertIdentical($instances, $expected, format_string("field_info_instances('user') returns %expected.", array('%expected' => var_export($expected, TRUE))));
@@ -122,10 +122,10 @@ function testFieldInfo() {
     // Test that querying for invalid entity types does not add entries in the
     // list returned by field_info_instances().
     field_info_cache_clear();
-    field_info_instances('invalid_entity', 'invalid_bundle');
+    field_info_instances('invalid_entity', 'invalid_subtype');
     // Simulate new request by clearing static caches.
     drupal_static_reset();
-    field_info_instances('invalid_entity', 'invalid_bundle');
+    field_info_instances('invalid_entity', 'invalid_subtype');
     $instances = field_info_instances();
     $this->assertFalse(isset($instances['invalid_entity']), 'field_info_instances() does not contain entries for the invalid entity type that was queried before');
   }
@@ -173,14 +173,14 @@ function testInstancePrepare() {
     $instance_definition = array(
       'field_name' => $field_definition['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
     field_create_instance($instance_definition);
 
     // Simulate a stored instance definition missing various settings (e.g. a
     // third-party module adding instance or widget settings has been enabled,
     // but existing instances do not know the new settings).
-    $data = db_query('SELECT data FROM {field_config_instance} WHERE field_name = :field_name AND bundle = :bundle', array(':field_name' => $instance_definition['field_name'], ':bundle' => $instance_definition['bundle']))->fetchField();
+    $data = db_query('SELECT data FROM {field_config_instance} WHERE field_name = :field_name AND subtype = :subtype', array(':field_name' => $instance_definition['field_name'], ':subtype' => $instance_definition['subtype']))->fetchField();
     $data = unserialize($data);
     $data['settings'] = array();
     $data['widget']['settings'] = 'unavailable_widget';
@@ -188,13 +188,13 @@ function testInstancePrepare() {
     db_update('field_config_instance')
       ->fields(array('data' => serialize($data)))
       ->condition('field_name', $instance_definition['field_name'])
-      ->condition('bundle', $instance_definition['bundle'])
+      ->condition('subtype', $instance_definition['subtype'])
       ->execute();
 
     field_cache_clear();
 
     // Read the instance back.
-    $instance = field_info_instance($instance_definition['entity_type'], $instance_definition['field_name'], $instance_definition['bundle']);
+    $instance = field_info_instance($instance_definition['entity_type'], $instance_definition['field_name'], $instance_definition['subtype']);
 
     // Check that all expected instance settings are in place.
     $field_type = field_info_field_types($field_definition['type']);
@@ -221,7 +221,7 @@ function testInstanceDisabledEntityType() {
     $instance_definition = array(
       'field_name' => 'field',
       'entity_type' => 'comment',
-      'bundle' => 'comment_node_article',
+      'subtype' => 'comment_node_article',
     );
     field_create_instance($instance_definition);
 
@@ -237,8 +237,8 @@ function testFieldMap() {
     // We will overlook fields created by the 'standard' installation profile.
     $exclude = field_info_field_map();
 
-    // Create a new bundle for 'test_entity' entity type.
-    field_test_create_bundle('test_bundle_2');
+    // Create a new subtype for 'test_entity' entity type.
+    field_test_create_subtype('test_subtype_2');
 
     // Create a couple fields.
     $fields  = array(
@@ -260,22 +260,22 @@ function testFieldMap() {
       array(
         'field_name' => 'field_1',
         'entity_type' => 'test_entity',
-        'bundle' => 'test_bundle',
+        'subtype' => 'test_subtype',
       ),
       array(
         'field_name' => 'field_1',
         'entity_type' => 'test_entity',
-        'bundle' => 'test_bundle_2',
+        'subtype' => 'test_subtype_2',
       ),
       array(
         'field_name' => 'field_2',
         'entity_type' => 'test_entity',
-        'bundle' => 'test_bundle',
+        'subtype' => 'test_subtype',
       ),
       array(
         'field_name' => 'field_2',
         'entity_type' => 'test_cacheable_entity',
-        'bundle' => 'test_bundle',
+        'subtype' => 'test_subtype',
       ),
     );
     foreach ($instances as $instance) {
@@ -285,15 +285,15 @@ function testFieldMap() {
     $expected = array(
       'field_1' => array(
         'type' => 'test_field',
-        'bundles' => array(
-          'test_entity' => array('test_bundle', 'test_bundle_2'),
+        'subtypes' => array(
+          'test_entity' => array('test_subtype', 'test_subtype_2'),
         ),
       ),
       'field_2' => array(
         'type' => 'hidden_test_field',
-        'bundles' => array(
-          'test_entity' => array('test_bundle'),
-          'test_cacheable_entity' => array('test_bundle'),
+        'subtypes' => array(
+          'test_entity' => array('test_subtype'),
+          'test_cacheable_entity' => array('test_subtype'),
         ),
       ),
     );
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
index 90fcc05..bf0db38 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
@@ -39,7 +39,7 @@ function setUp() {
     $this->instance_definition = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
   }
 
@@ -56,7 +56,7 @@ function testCreateFieldInstance() {
     field_create_instance($this->instance_definition);
 
     // Read the raw record from the {field_config_instance} table.
-    $result = db_query('SELECT * FROM {field_config_instance} WHERE field_name = :field_name AND bundle = :bundle', array(':field_name' => $this->instance_definition['field_name'], ':bundle' => $this->instance_definition['bundle']));
+    $result = db_query('SELECT * FROM {field_config_instance} WHERE field_name = :field_name AND subtype = :subtype', array(':field_name' => $this->instance_definition['field_name'], ':subtype' => $this->instance_definition['subtype']));
     $record = $result->fetchAssoc();
     $record['data'] = unserialize($record['data']);
 
@@ -76,13 +76,13 @@ function testCreateFieldInstance() {
     $this->assertIdentical($record['data']['settings'], $field_type['instance_settings'] , 'Default instance settings have been written.');
     $this->assertIdentical($record['data']['widget']['settings'], $widget_type['settings'] , 'Default widget settings have been written.');
 
-    // Guarantee that the field/bundle combination is unique.
+    // Guarantee that the field/subtype combination is unique.
     try {
       field_create_instance($this->instance_definition);
-      $this->fail(t('Cannot create two instances with the same field / bundle combination.'));
+      $this->fail(t('Cannot create two instances with the same field / subtype combination.'));
     }
     catch (FieldException $e) {
-      $this->pass(t('Cannot create two instances with the same field / bundle combination.'));
+      $this->pass(t('Cannot create two instances with the same field / subtype combination.'));
     }
 
     // Check that the specified field exists.
@@ -138,7 +138,7 @@ function testReadFieldInstance() {
     field_create_instance($this->instance_definition);
 
     // Read the instance back.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $this->assertTrue($this->instance_definition == $instance, 'The field was properly read.');
   }
 
@@ -149,7 +149,7 @@ function testUpdateFieldInstance() {
     field_create_instance($this->instance_definition);
 
     // Check that basic changes are saved.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $instance['required'] = !$instance['required'];
     $instance['label'] = $this->randomName();
     $instance['description'] = $this->randomName();
@@ -158,7 +158,7 @@ function testUpdateFieldInstance() {
     $instance['widget']['weight']++;
     field_update_instance($instance);
 
-    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $this->assertEqual($instance['required'], $instance_new['required'], '"required" change is saved');
     $this->assertEqual($instance['label'], $instance_new['label'], '"label" change is saved');
     $this->assertEqual($instance['description'], $instance_new['description'], '"description" change is saved');
@@ -166,11 +166,11 @@ function testUpdateFieldInstance() {
     $this->assertEqual($instance['widget']['weight'], $instance_new['widget']['weight'], 'Widget weight change is saved');
 
     // Check that changing the widget type updates the default settings.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $instance['widget']['type'] = 'test_field_widget_multiple';
     field_update_instance($instance);
 
-    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $this->assertEqual($instance['widget']['type'], $instance_new['widget']['type'] , 'Widget type change is saved.');
     $settings = field_info_widget_settings($instance_new['widget']['type']);
     $this->assertIdentical($settings, array_intersect_key($instance_new['widget']['settings'], $settings) , 'Widget type change updates default settings.');
@@ -190,25 +190,25 @@ function testDeleteFieldInstance() {
     // is deleted.
     field_create_instance($this->instance_definition);
     $this->another_instance_definition = $this->instance_definition;
-    $this->another_instance_definition['bundle'] .= '_another_bundle';
+    $this->another_instance_definition['subtype'] .= '_another_subtype';
     $instance = field_create_instance($this->another_instance_definition);
 
     // Test that the first instance is not deleted, and then delete it.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype'], array('include_deleted' => TRUE));
     $this->assertTrue(!empty($instance) && empty($instance['deleted']), 'A new field instance is not marked for deletion.');
     field_delete_instance($instance);
 
     // Make sure the instance is marked as deleted when the instance is
     // specifically loaded.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype'], array('include_deleted' => TRUE));
     $this->assertTrue(!empty($instance['deleted']), 'A deleted field instance is marked for deletion.');
 
     // Try to load the instance normally and make sure it does not show up.
-    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['subtype']);
     $this->assertTrue(empty($instance), 'A deleted field instance is not loaded by default.');
 
     // Make sure the other field instance is not deleted.
-    $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
+    $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['subtype']);
     $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), 'A non-deleted field instance is not marked for deletion.');
 
     // Make sure the field is deleted when its last instance is deleted.
diff --git a/core/modules/field/lib/Drupal/field/Tests/FormTest.php b/core/modules/field/lib/Drupal/field/Tests/FormTest.php
index 2f5dbee..2042372 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FormTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FormTest.php
@@ -36,7 +36,7 @@ function setUp() {
 
     $this->instance = array(
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->randomName() . '_label',
       'description' => '[site:name]_description',
       'weight' => mt_rand(0, 127),
@@ -62,7 +62,7 @@ function testFieldFormSingle() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
 
     // Create token value expected for description.
     $token_description = check_plain(variable_get('site_name', 'Drupal')) . '_description';
@@ -128,7 +128,7 @@ function testFieldFormDefaultValue() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     // Test that the default value is displayed correctly.
     $this->assertFieldByXpath("//input[@name='{$this->field_name}[$langcode][0][value]' and @value='$default']");
 
@@ -153,7 +153,7 @@ function testFieldFormSingleRequired() {
 
     // Submit with missing required value.
     $edit = array();
-    $this->drupalPost('test-entity/add/test_bundle', $edit, t('Save'));
+    $this->drupalPost('test-entity/add/test_subtype', $edit, t('Save'));
     $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
 
     // Create an entity
@@ -190,7 +190,7 @@ function testFieldFormUnlimited() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form -> 1 widget.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget 1 is displayed');
     $this->assertNoField("{$this->field_name}[$langcode][1][value]", 'No extraneous widget is displayed');
 
@@ -280,7 +280,7 @@ function testFieldFormMultivalueWithRequiredRadio() {
     $instance = array(
       'field_name' => 'required_radio_test',
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'required' => TRUE,
       'widget' => array(
         'type' => 'options_buttons',
@@ -289,7 +289,7 @@ function testFieldFormMultivalueWithRequiredRadio() {
     field_create_instance($instance);
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
 
     // Press the 'Add more' button.
     $this->drupalPost(NULL, array(), t('Add another item'));
@@ -312,7 +312,7 @@ function testFieldFormJSAddMore() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form -> 1 widget.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
 
     // Press 'add more' button a couple times -> 3 widgets.
     // drupalPostAJAX() will not work iteratively, so we add those through
@@ -372,7 +372,7 @@ function testFieldFormMultipleWidget() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode]", '', 'Widget is displayed.');
 
     // Create entity with three values.
@@ -418,7 +418,7 @@ function testFieldFormAccess() {
     $instance_no_access = array(
       'field_name' => $field_name_no_access,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'default_value' => array(0 => array('value' => 99)),
     );
     field_create_field($field_no_access);
@@ -429,7 +429,7 @@ function testFieldFormAccess() {
     // Test that the form structure includes full information for each delta
     // apart from #access.
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
 
     $form = array();
     $form_state = form_state_defaults();
@@ -439,7 +439,7 @@ function testFieldFormAccess() {
     $this->assertFalse($form[$field_name_no_access]['#access'], 'Field #access is FALSE for the field without edit access.');
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertNoFieldByName("{$field_name_no_access}[$langcode][0][value]", '', 'Widget is not displayed if field access is denied.');
 
     // Create entity.
@@ -473,7 +473,7 @@ function testFieldFormAccess() {
    * Tests Field API form integration within a subform.
    */
   function testNestedFieldForm() {
-    // Add two instances on the 'test_bundle'
+    // Add two instances on the 'test_subtype'
     field_create_field($this->field_single);
     field_create_field($this->field_unlimited);
     $this->instance['field_name'] = 'field_single';
diff --git a/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php b/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php
index c5e52c1..d00d861 100644
--- a/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php
@@ -42,7 +42,7 @@ public function setUp() {
     $this->instance = array(
       'entity_type' => 'entity_test',
       'field_name' => 'field_shape',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'test_field_widget',
       ),
diff --git a/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php b/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php
index 4873eb7..cea3d55 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php
@@ -42,7 +42,7 @@ public function setUp() {
     $this->instance = array(
       'entity_type' => 'entity_test',
       'field_name' => 'field_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'test_field_widget',
       ),
diff --git a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
index f2ada97..0d8facd 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
@@ -51,10 +51,10 @@ function setUp() {
     $instance = array(
       'field_name' => $this->field_name,
       'entity_type' => $this->entity_type,
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
     field_create_instance($instance);
-    $this->instance = field_read_instance('test_entity', $this->field_name, 'test_bundle');
+    $this->instance = field_read_instance('test_entity', $this->field_name, 'test_subtype');
 
     for ($i = 0; $i < 3; ++$i) {
       $language = new Language(array(
@@ -104,7 +104,7 @@ function testFieldInvoke() {
     field_test_entity_info_translatable('test_entity', TRUE);
 
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
 
     // Populate some extra languages to check if _field_invoke() correctly uses
     // the result of field_available_languages().
@@ -149,7 +149,7 @@ function testFieldInvokeMultiple() {
     $available_langcodes = field_available_languages($this->entity_type, $this->field);
 
     for ($id = 1; $id <= $entity_count; ++$id) {
-      $entity = field_test_create_entity($id, $id, $this->instance['bundle']);
+      $entity = field_test_create_entity($id, $id, $this->instance['subtype']);
       $langcodes = $available_langcodes;
 
       // Populate some extra languages to check whether _field_invoke()
@@ -220,7 +220,7 @@ function testTranslatableFieldSaveLoad() {
     field_test_entity_info_translatable('test_entity', TRUE);
     $eid = $evid = 1;
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, $evid, $this->instance['subtype']);
     $field_translations = array();
     $available_langcodes = field_available_languages($entity_type, $this->field);
     $this->assertTrue(count($available_langcodes) > 1, 'Field is translatable.');
@@ -259,7 +259,7 @@ function testTranslatableFieldSaveLoad() {
 
     $eid++;
     $evid++;
-    $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance['bundle'], 'langcode' => $translation_langcodes[0]);
+    $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance['subtype'], 'langcode' => $translation_langcodes[0]);
     foreach ($translation_langcodes as $langcode) {
       $values[$this->field_name][$langcode] = $this->_generateTestFieldValues($this->field['cardinality']);
     }
@@ -277,7 +277,7 @@ function testTranslatableFieldSaveLoad() {
     foreach (array(NULL, array()) as $empty_items) {
       $eid++;
       $evid++;
-      $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance['bundle'], 'langcode' => $translation_langcodes[0]);
+      $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance['subtype'], 'langcode' => $translation_langcodes[0]);
       foreach ($translation_langcodes as $langcode) {
         $values[$this->field_name][$langcode] = $this->_generateTestFieldValues($this->field['cardinality']);
         $values[$field_name_default][$langcode] = $empty_items;
@@ -310,12 +310,12 @@ function testFieldDisplayLanguage() {
     $instance = array(
       'field_name' => $field['field_name'],
       'entity_type' => $entity_type,
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
     );
     field_create_instance($instance);
 
-    $entity = field_test_create_entity(1, 1, $this->instance['bundle']);
-    $instances = field_info_instances($entity_type, $this->instance['bundle']);
+    $entity = field_test_create_entity(1, 1, $this->instance['subtype']);
+    $instances = field_info_instances($entity_type, $this->instance['subtype']);
 
     $enabled_langcodes = field_content_languages();
     $langcodes = array();
@@ -393,7 +393,7 @@ function testFieldFormTranslationRevisions() {
     // Prepare the field translations.
     field_test_entity_info_translatable($this->entity_type, TRUE);
     $eid = 1;
-    $entity = field_test_create_entity($eid, $eid, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, $eid, $this->instance['subtype']);
     $available_langcodes = array_flip(field_available_languages($this->entity_type, $this->field));
     unset($available_langcodes[LANGUAGE_NOT_SPECIFIED]);
     $field_name = $this->field['field_name'];
diff --git a/core/modules/field/lib/Drupal/field/Tests/Views/ApiDataTest.php b/core/modules/field/lib/Drupal/field/Tests/Views/ApiDataTest.php
index 417b836..a61a3ca 100644
--- a/core/modules/field/lib/Drupal/field/Tests/Views/ApiDataTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/Views/ApiDataTest.php
@@ -36,7 +36,7 @@ function setUp() {
     $instance = array(
       'field_name' => $field_names[0],
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
     );
     field_create_instance($instance);
 
@@ -44,7 +44,7 @@ function setUp() {
     $instance = array(
       'field_name' => $field_names[1],
       'entity_type' => 'user',
-      'bundle' => 'user',
+      'subtype' => 'user',
     );
     field_create_instance($instance);
 
@@ -52,13 +52,13 @@ function setUp() {
     $instance = array(
       'field_name' => $field_names[2],
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
     );
     field_create_instance($instance);
     $instance = array(
       'field_name' => $field_names[2],
       'entity_type' => 'user',
-      'bundle' => 'user',
+      'subtype' => 'user',
     );
     field_create_instance($instance);
 
diff --git a/core/modules/field/lib/Drupal/field/Tests/Views/FieldTestBase.php b/core/modules/field/lib/Drupal/field/Tests/Views/FieldTestBase.php
index c0f500b..0457883 100644
--- a/core/modules/field/lib/Drupal/field/Tests/Views/FieldTestBase.php
+++ b/core/modules/field/lib/Drupal/field/Tests/Views/FieldTestBase.php
@@ -63,12 +63,12 @@ function setUpFields($amount = 3) {
     return $field_names;
   }
 
-  function setUpInstances($bundle = 'page') {
+  function setUpInstances($subtype = 'page') {
     foreach ($this->fields as $key => $field) {
       $instance = array(
         'field_name' => $field['field_name'],
         'entity_type' => 'node',
-        'bundle' => 'page',
+        'subtype' => 'page',
       );
       $this->instances[$key] = field_create_instance($instance);
     }
diff --git a/core/modules/field/lib/Drupal/field/Tests/Views/HandlerFieldFieldTest.php b/core/modules/field/lib/Drupal/field/Tests/Views/HandlerFieldFieldTest.php
index 1c8d3f5..aa06d14 100644
--- a/core/modules/field/lib/Drupal/field/Tests/Views/HandlerFieldFieldTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/Views/HandlerFieldFieldTest.php
@@ -12,8 +12,8 @@
 /**
  * Tests the field_field handler.
  * @TODO
- *   Check a entity-type with bundles
- *   Check a entity-type without bundles
+ *   Check a entity-type with subtypes
+ *   Check a entity-type without subtypes
  *   Check locale:disabled, locale:enabled and locale:enabled with another language
  *   Check revisions
  */
diff --git a/core/modules/field/tests/modules/field_test/field_test.entity.inc b/core/modules/field/tests/modules/field_test/field_test.entity.inc
index 81c116d..46633b2 100644
--- a/core/modules/field/tests/modules/field_test/field_test.entity.inc
+++ b/core/modules/field/tests/modules/field_test/field_test.entity.inc
@@ -44,18 +44,18 @@ function field_test_entity_view_mode_info_alter(&$view_modes) {
 }
 
 /**
- * Implements hook_entity_bundle_info_alter().
+ * Implements hook_entity_subtype_info_alter().
  */
-function field_test_entity_bundle_info_alter(&$bundles) {
+function field_test_entity_subtype_info_alter(&$subtypes) {
   $entity_info = entity_get_info();
-  foreach ($bundles as $entity_type => $info) {
+  foreach ($subtypes as $entity_type => $info) {
     if ($entity_info[$entity_type]['module'] == 'field_test') {
-      $bundles[$entity_type] = state()->get('field_test_bundles') ?: array('test_bundle' => array('label' => 'Test Bundle'));
-      if ($entity_type == 'test_entity_bundle') {
-        $bundles[$entity_type] += array('test_entity_2' => array('label' => 'Test entity 2'));
+      $subtypes[$entity_type] = state()->get('field_test_subtypes') ?: array('test_subtype' => array('label' => 'Test Bundle'));
+      if ($entity_type == 'test_entity_subtype') {
+        $subtypes[$entity_type] += array('test_entity_2' => array('label' => 'Test entity 2'));
       }
-      if ($entity_type == 'test_entity_bundle_key') {
-        $bundles[$entity_type] += array('bundle1' => array('label' => 'Bundle1'), 'bundle2' => array('label' => 'Bundle2'));
+      if ($entity_type == 'test_entity_subtype_key') {
+        $subtypes[$entity_type] += array('subtype1' => array('label' => 'Bundle1'), 'subtype2' => array('label' => 'Bundle2'));
       }
     }
   }
@@ -75,64 +75,64 @@ function field_test_entity_info_translatable($entity_type = NULL, $translatable
 }
 
 /**
- * Creates a new bundle for test_entity entities.
+ * Creates a new subtype for test_entity entities.
  *
- * @param $bundle
- *   The machine-readable name of the bundle.
+ * @param $subtype
+ *   The machine-readable name of the subtype.
  * @param $text
- *   The human-readable name of the bundle. If none is provided, the machine
+ *   The human-readable name of the subtype. If none is provided, the machine
  *   name will be used.
  */
-function field_test_create_bundle($bundle, $text = NULL) {
-  $bundles = state()->get('field_test.bundles') ?: array('test_bundle' => array('label' => 'Test Bundle'));
-  $bundles += array($bundle => array('label' => $text ? $text : $bundle));
-  state()->set('field_test.bundles', $bundles);
+function field_test_create_subtype($subtype, $text = NULL) {
+  $subtypes = state()->get('field_test.subtypes') ?: array('test_subtype' => array('label' => 'Test Bundle'));
+  $subtypes += array($subtype => array('label' => $text ? $text : $subtype));
+  state()->set('field_test.subtypes', $subtypes);
 
   $info = entity_get_info();
   foreach ($info as $type => $type_info) {
     if ($type_info['module'] == 'field_test') {
-      field_attach_create_bundle($type, $bundle);
+      field_attach_create_subtype($type, $subtype);
     }
   }
 }
 
 /**
- * Renames a bundle for test_entity entities.
+ * Renames a subtype for test_entity entities.
  *
- * @param $bundle_old
- *   The machine-readable name of the bundle to rename.
- * @param $bundle_new
- *   The new machine-readable name of the bundle.
+ * @param $subtype_old
+ *   The machine-readable name of the subtype to rename.
+ * @param $subtype_new
+ *   The new machine-readable name of the subtype.
  */
-function field_test_rename_bundle($bundle_old, $bundle_new) {
-  $bundles = state()->get('field_test.bundles') ?: array('test_bundle' => array('label' => 'Test Bundle'));
-  $bundles[$bundle_new] = $bundles[$bundle_old];
-  unset($bundles[$bundle_old]);
-  state()->set('field_test.bundles', $bundles);
+function field_test_rename_subtype($subtype_old, $subtype_new) {
+  $subtypes = state()->get('field_test.subtypes') ?: array('test_subtype' => array('label' => 'Test Bundle'));
+  $subtypes[$subtype_new] = $subtypes[$subtype_old];
+  unset($subtypes[$subtype_old]);
+  state()->set('field_test.subtypes', $subtypes);
 
   $info = entity_get_info();
   foreach ($info as $type => $type_info) {
     if ($type_info['module'] == 'field_test') {
-      field_attach_rename_bundle($type, $bundle_old, $bundle_new);
+      field_attach_rename_subtype($type, $subtype_old, $subtype_new);
     }
   }
 }
 
 /**
- * Deletes a bundle for test_entity objects.
+ * Deletes a subtype for test_entity objects.
  *
- * @param $bundle
- *   The machine-readable name of the bundle to delete.
+ * @param $subtype
+ *   The machine-readable name of the subtype to delete.
  */
-function field_test_delete_bundle($bundle) {
-  $bundles = state()->get('field_test.bundles') ?: array('test_bundle' => array('label' => 'Test Bundle'));
-  unset($bundles[$bundle]);
-  state()->set('field_test.bundles', $bundles);
+function field_test_delete_subtype($subtype) {
+  $subtypes = state()->get('field_test.subtypes') ?: array('test_subtype' => array('label' => 'Test Bundle'));
+  unset($subtypes[$subtype]);
+  state()->set('field_test.subtypes', $subtypes);
 
   $info = entity_get_info();
   foreach ($info as $type => $type_info) {
     if ($type_info['module'] == 'field_test') {
-      field_attach_delete_bundle($type, $bundle);
+      field_attach_delete_subtype($type, $subtype);
     }
   }
 }
@@ -140,8 +140,8 @@ function field_test_delete_bundle($bundle) {
 /**
  * Creates a basic test_entity entity.
  */
-function field_test_create_entity($id = 1, $vid = 1, $bundle = 'test_bundle', $label = '') {
-  $entity = entity_create('test_entity', array('fttype' => $bundle));
+function field_test_create_entity($id = 1, $vid = 1, $subtype = 'test_subtype', $label = '') {
+  $entity = entity_create('test_entity', array('fttype' => $subtype));
   // Only set id and vid properties if they don't come as NULL (creation form).
   if (isset($id)) {
     $entity->ftid = $id;
@@ -152,7 +152,7 @@ function field_test_create_entity($id = 1, $vid = 1, $bundle = 'test_bundle', $l
     $entity->use_provided_revision_id = $vid;
   }
 
-  $label = !empty($label) ? $label : $bundle . ' label';
+  $label = !empty($label) ? $label : $subtype . ' label';
   $entity->ftlabel = $label;
   // Make sure the entity will saved even if a primary key is provided.
   $entity->enforceIsNew();
@@ -198,7 +198,7 @@ function field_test_entity_save(EntityInterface $entity) {
 function field_test_entity_add($fttype) {
   $fttype = str_replace('-', '_', $fttype);
   $entity = field_test_create_entity(NULL, NULL, $fttype);
-  drupal_set_title(t('Create test_entity @bundle', array('@bundle' => $fttype)), PASS_THROUGH);
+  drupal_set_title(t('Create test_entity @subtype', array('@subtype' => $fttype)), PASS_THROUGH);
   return entity_get_form($entity);
 }
 
diff --git a/core/modules/field/tests/modules/field_test/field_test.install b/core/modules/field/tests/modules/field_test/field_test.install
index 5355e9b..01dacb9 100644
--- a/core/modules/field/tests/modules/field_test/field_test.install
+++ b/core/modules/field/tests/modules/field_test/field_test.install
@@ -53,11 +53,11 @@ function field_test_schema() {
     ),
     'primary key' => array('ftid'),
   );
-  $schema['test_entity_bundle_key'] = array(
-    'description' => 'The base table for test entities with a bundle key.',
+  $schema['test_entity_subtype_key'] = array(
+    'description' => 'The base table for test entities with a subtype key.',
     'fields' => array(
       'ftid' => array(
-        'description' => 'The primary indentifier for a test_entity_bundle_key.',
+        'description' => 'The primary indentifier for a test_entity_subtype_key.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
@@ -72,11 +72,11 @@ function field_test_schema() {
       ),
     ),
   );
-  $schema['test_entity_bundle'] = array(
-    'description' => 'The base table for test entities with a bundle.',
+  $schema['test_entity_subtype'] = array(
+    'description' => 'The base table for test entities with a subtype.',
     'fields' => array(
       'ftid' => array(
-        'description' => 'The primary indentifier for a test_entity_bundle.',
+        'description' => 'The primary indentifier for a test_entity_subtype.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module
index 4ecd1a9..cee16f7 100644
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ b/core/modules/field/tests/modules/field_test/field_test.module
@@ -46,9 +46,9 @@ function field_test_permission() {
 function field_test_menu() {
   $items = array();
 
-  foreach (entity_get_bundles('test_entity') as $bundle_name => $bundle_info) {
-    $items['test-entity/add/' . $bundle_name] = array(
-      'title' => t('Add %bundle test_entity', array('%bundle' => $bundle_info['label'])),
+  foreach (entity_get_subtypes('test_entity') as $subtype_name => $subtype_info) {
+    $items['test-entity/add/' . $subtype_name] = array(
+      'title' => t('Add %subtype test_entity', array('%subtype' => $subtype_info['label'])),
       'page callback' => 'field_test_entity_add',
       'page arguments' => array(2),
       'access arguments' => array('administer field_test content'),
@@ -286,12 +286,12 @@ function field_test_field_extra_fields_alter(&$info) {
 /**
  * Implements hook_module_implements_alter().
  *
- * field_test_entity_info_alter() adds the bundles for its entities, and thus
+ * field_test_entity_info_alter() adds the subtypes for its entities, and thus
  * needs to run before rdf_entity_info_alter().
  * @todo Remove when http://drupal.org/node/1822458 is fixed.
  */
 function field_test_module_implements_alter(&$implementations, $hook) {
-  if ($hook == 'entity_bundle_info_alter' && isset($implementations['field_test']) && isset($implementations['rdf'])) {
+  if ($hook == 'entity_subtype_info_alter' && isset($implementations['field_test']) && isset($implementations['rdf'])) {
     foreach (array('field_test', 'rdf') as $module) {
       $group = $implementations[$module];
       unset($implementations[$module]);
diff --git a/core/modules/field/tests/modules/field_test/field_test.storage.inc b/core/modules/field/tests/modules/field_test/field_test.storage.inc
index a53b941..1f21664 100644
--- a/core/modules/field/tests/modules/field_test/field_test.storage.inc
+++ b/core/modules/field/tests/modules/field_test/field_test.storage.inc
@@ -122,7 +122,7 @@ function field_test_field_storage_write(EntityInterface $entity, $op, $fields) {
 
   $id = $entity->id();
   $vid = $entity->getRevisionId();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
 
   foreach ($fields as $field_id) {
     $field = field_info_field_by_id($field_id);
@@ -162,7 +162,7 @@ function field_test_field_storage_write(EntityInterface $entity, $op, $fields) {
           'type' => $entity->entityType(),
           'entity_id' => $id,
           'revision_id' => $vid,
-          'bundle' => $bundle,
+          'subtype' => $subtype,
           'delta' => $delta,
           'deleted' => FALSE,
           'langcode' => $langcode,
@@ -192,7 +192,7 @@ function field_test_field_storage_write(EntityInterface $entity, $op, $fields) {
 function field_test_field_storage_delete(EntityInterface $entity, $fields) {
   // Note: reusing field_test_storage_purge(), like field_sql_storage.module
   // does, is highly inefficient in our case...
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     if (isset($fields[$instance['field_id']])) {
       $field = field_info_field_by_id($instance['field_id']);
       field_test_field_storage_purge($entity, $field, $instance);
@@ -323,7 +323,7 @@ function field_test_field_storage_query($field_id, $conditions, $count, &$cursor
           $id = ($load_current || empty($entity_type['entity_keys']['revision'])) ? $row->entity_id : $row->revision_id;
 
           if (!isset($return[$row->type][$id])) {
-            $return[$row->type][$id] = (object) array('entity_id' => $row->entity_id, 'revision_id' => $row->revision_id, 'bundle' => $row->bundle);
+            $return[$row->type][$id] = (object) array('entity_id' => $row->entity_id, 'revision_id' => $row->revision_id, 'subtype' => $row->subtype);
             $entity_count++;
           }
         }
@@ -406,7 +406,7 @@ function field_test_field_storage_delete_instance($instance) {
   $field_data = &$data[$field['id']];
   foreach (array('current', 'revisions') as $sub_table) {
     foreach ($field_data[$sub_table] as &$row) {
-      if ($row->bundle == $instance['bundle']) {
+      if ($row->subtype == $instance['subtype']) {
         $row->deleted = TRUE;
       }
     }
@@ -416,28 +416,28 @@ function field_test_field_storage_delete_instance($instance) {
 }
 
 /**
- * Implements hook_field_attach_create_bundle().
+ * Implements hook_field_attach_create_subtype().
  */
-function field_test_field_attach_create_bundle($bundle) {
+function field_test_field_attach_create_subtype($subtype) {
   // We don't need to do anything here.
 }
 
 /**
- * Implements hook_field_attach_rename_bundle().
+ * Implements hook_field_attach_rename_subtype().
  */
-function field_test_field_attach_rename_bundle($bundle_old, $bundle_new) {
+function field_test_field_attach_rename_subtype($subtype_old, $subtype_new) {
   $data = _field_test_storage_data();
 
   // We need to account for deleted or inactive fields and instances.
-  $instances = field_read_instances(array('bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+  $instances = field_read_instances(array('subtype' => $subtype_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
   foreach ($instances as $field_name => $instance) {
     $field = field_info_field_by_id($instance['field_id']);
     if ($field['storage']['type'] == 'field_test_storage') {
       $field_data = &$data[$field['id']];
       foreach (array('current', 'revisions') as $sub_table) {
         foreach ($field_data[$sub_table] as &$row) {
-          if ($row->bundle == $bundle_old) {
-            $row->bundle = $bundle_new;
+          if ($row->subtype == $subtype_old) {
+            $row->subtype = $subtype_new;
           }
         }
       }
@@ -448,9 +448,9 @@ function field_test_field_attach_rename_bundle($bundle_old, $bundle_new) {
 }
 
 /**
- * Implements hook_field_attach_delete_bundle().
+ * Implements hook_field_attach_delete_subtype().
  */
-function field_test_field_attach_delete_bundle($entity_type, $bundle, $instances) {
+function field_test_field_attach_delete_subtype($entity_type, $subtype, $instances) {
   $data = _field_test_storage_data();
 
   foreach ($instances as $field_name => $instance) {
@@ -459,7 +459,7 @@ function field_test_field_attach_delete_bundle($entity_type, $bundle, $instances
       $field_data = &$data[$field['id']];
       foreach (array('current', 'revisions') as $sub_table) {
         foreach ($field_data[$sub_table] as &$row) {
-          if ($row->bundle == $bundle_old) {
+          if ($row->subtype == $subtype_old) {
             $row->deleted = TRUE;
           }
         }
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleKeyTestEntity.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleKeyTestEntity.php
index 11723b8..b3f53e2 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleKeyTestEntity.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleKeyTestEntity.php
@@ -14,19 +14,19 @@
  * Test entity class.
  *
  * @Plugin(
- *   id = "test_entity_bundle_key",
- *   label = @Translation("Test Entity with a bundle key"),
+ *   id = "test_entity_subtype_key",
+ *   label = @Translation("Test Entity with a subtype key"),
  *   module = "field_test",
  *   controller_class = "Drupal\field_test\TestEntityController",
  *   form_controller_class = {
  *     "default" = "Drupal\field_test\TestEntityFormController"
  *   },
  *   field_cache = FALSE,
- *   base_table = "test_entity_bundle_key",
+ *   base_table = "test_entity_subtype_key",
  *   fieldable = TRUE,
  *   entity_keys = {
  *     "id" = "ftid",
- *     "bundle" = "fttype"
+ *     "subtype" = "fttype"
  *   }
  * )
  */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleTestEntity.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleTestEntity.php
index ee91584..4fa687d 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleTestEntity.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/BundleTestEntity.php
@@ -14,19 +14,19 @@
  * Test entity class.
  *
  * @Plugin(
- *   id = "test_entity_bundle",
- *   label = @Translation("Test Entity with a specified bundle"),
+ *   id = "test_entity_subtype",
+ *   label = @Translation("Test Entity with a specified subtype"),
  *   module = "field_test",
  *   controller_class = "Drupal\field_test\TestEntityController",
  *   form_controller_class = {
  *     "default" = "Drupal\field_test\TestEntityFormController"
  *   },
  *   field_cache = FALSE,
- *   base_table = "test_entity_bundle",
+ *   base_table = "test_entity_subtype",
  *   fieldable = TRUE,
  *   entity_keys = {
  *     "id" = "ftid",
- *     "bundle" = "fttype"
+ *     "subtype" = "fttype"
  *   }
  * )
  */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/CacheableTestEntity.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/CacheableTestEntity.php
index 6970fa0..9bcc0f7 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/CacheableTestEntity.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/CacheableTestEntity.php
@@ -25,7 +25,7 @@
  *   entity_keys = {
  *     "id" = "ftid",
  *     "revision" = "ftvid",
- *     "bundle" = "fttype"
+ *     "subtype" = "fttype"
  *   }
  * )
  */
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/TestEntity.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/TestEntity.php
index be75dc0..67d44b7 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/TestEntity.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Core/Entity/TestEntity.php
@@ -30,7 +30,7 @@
  *   entity_keys = {
  *     "id" = "ftid",
  *     "revision" = "ftvid",
- *     "bundle" = "fttype"
+ *     "subtype" = "fttype"
  *   }
  * )
  */
@@ -51,7 +51,7 @@ class TestEntity extends Entity {
   public $ftvid;
 
   /**
-   * Bundle
+   * Subtype
    *
    * @var string
    */
@@ -79,9 +79,9 @@ public function getRevisionId() {
   }
 
   /**
-   * Overrides Drupal\Core\Entity\Entity::bundle().
+   * Overrides Drupal\Core\Entity\Entity::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return !empty($this->fttype) ? $this->fttype : $this->entityType();
   }
 }
diff --git a/core/modules/field_sql_storage/field_sql_storage.install b/core/modules/field_sql_storage/field_sql_storage.install
index 9607a9c..af3ec23 100644
--- a/core/modules/field_sql_storage/field_sql_storage.install
+++ b/core/modules/field_sql_storage/field_sql_storage.install
@@ -29,7 +29,7 @@ function field_sql_storage_schema() {
  *
  * @ingroup update_api
  */
-function _update_8000_field_sql_storage_write($entity_type, $bundle, $entity_id, $revision_id, $field_name, $data) {
+function _update_8000_field_sql_storage_write($entity_type, $subtype, $entity_id, $revision_id, $field_name, $data) {
   $table_name = "field_data_{$field_name}";
   $revision_name = "field_revision_{$field_name}";
 
@@ -50,7 +50,7 @@ function _update_8000_field_sql_storage_write($entity_type, $bundle, $entity_id,
         'entity_type' => $entity_type,
         'entity_id' => $entity_id,
         'revision_id' => $revision_id,
-        'bundle' => $bundle,
+        'subtype' => $subtype,
         'delta' => $delta,
         'langcode' => $langcode,
       );
diff --git a/core/modules/field_sql_storage/field_sql_storage.module b/core/modules/field_sql_storage/field_sql_storage.module
index e604ac6..625342c 100644
--- a/core/modules/field_sql_storage/field_sql_storage.module
+++ b/core/modules/field_sql_storage/field_sql_storage.module
@@ -126,12 +126,12 @@ function _field_sql_storage_schema($field) {
         'default' => '',
         'description' => 'The entity type this data is attached to',
       ),
-      'bundle' => array(
+      'subtype' => array(
         'type' => 'varchar',
         'length' => 128,
         'not null' => TRUE,
         'default' => '',
-        'description' => 'The field instance bundle to which this row belongs, used when deleting a field instance',
+        'description' => 'The field instance subtype to which this row belongs, used when deleting a field instance',
       ),
       'deleted' => array(
         'type' => 'int',
@@ -170,7 +170,7 @@ function _field_sql_storage_schema($field) {
     'primary key' => array('entity_type', 'entity_id', 'deleted', 'delta', 'langcode'),
     'indexes' => array(
       'entity_type' => array('entity_type'),
-      'bundle' => array('bundle'),
+      'subtype' => array('subtype'),
       'deleted' => array('deleted'),
       'entity_id' => array('entity_id'),
       'revision_id' => array('revision_id'),
@@ -406,7 +406,7 @@ function field_sql_storage_field_storage_load($entity_type, $entities, $age, $fi
 function field_sql_storage_field_storage_write(EntityInterface $entity, $op, $fields) {
   $vid = $entity->getRevisionId();
   $id = $entity->id();
-  $bundle = $entity->bundle();
+  $subtype = $entity->subtype();
   $entity_type = $entity->entityType();
   if (!isset($vid)) {
     $vid = $id;
@@ -447,7 +447,7 @@ function field_sql_storage_field_storage_write(EntityInterface $entity, $op, $fi
 
     // Prepare the multi-insert query.
     $do_insert = FALSE;
-    $columns = array('entity_type', 'entity_id', 'revision_id', 'bundle', 'delta', 'langcode');
+    $columns = array('entity_type', 'entity_id', 'revision_id', 'subtype', 'delta', 'langcode');
     foreach ($field['columns'] as $column => $attributes) {
       $columns[] = _field_sql_storage_columnname($field_name, $column);
     }
@@ -464,7 +464,7 @@ function field_sql_storage_field_storage_write(EntityInterface $entity, $op, $fi
           'entity_type' => $entity_type,
           'entity_id' => $id,
           'revision_id' => $vid,
-          'bundle' => $bundle,
+          'subtype' => $subtype,
           'delta' => $delta,
           'langcode' => $langcode,
         );
@@ -500,7 +500,7 @@ function field_sql_storage_field_storage_write(EntityInterface $entity, $op, $fi
  * This function deletes data for all fields for an entity from the database.
  */
 function field_sql_storage_field_storage_delete(EntityInterface $entity, $fields) {
-  foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+  foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
     if (isset($fields[$instance['field_id']])) {
       $field = field_info_field_by_id($instance['field_id']);
       field_sql_storage_field_storage_purge($entity, $field, $instance);
@@ -559,35 +559,35 @@ function field_sql_storage_field_storage_delete_instance($instance) {
   db_update($table_name)
     ->fields(array('deleted' => 1))
     ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('subtype', $instance['subtype'])
     ->execute();
   db_update($revision_name)
     ->fields(array('deleted' => 1))
     ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('subtype', $instance['subtype'])
     ->execute();
 }
 
 /**
- * Implements hook_field_attach_rename_bundle().
+ * Implements hook_field_attach_rename_subtype().
  */
-function field_sql_storage_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+function field_sql_storage_field_attach_rename_subtype($entity_type, $subtype_old, $subtype_new) {
   // We need to account for deleted or inactive fields and instances.
-  $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'subtype' => $subtype_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
   foreach ($instances as $instance) {
     $field = field_info_field_by_id($instance['field_id']);
     if ($field['storage']['type'] == 'field_sql_storage') {
       $table_name = _field_sql_storage_tablename($field);
       $revision_name = _field_sql_storage_revision_tablename($field);
       db_update($table_name)
-        ->fields(array('bundle' => $bundle_new))
+        ->fields(array('subtype' => $subtype_new))
         ->condition('entity_type', $entity_type)
-        ->condition('bundle', $bundle_old)
+        ->condition('subtype', $subtype_old)
         ->execute();
       db_update($revision_name)
-        ->fields(array('bundle' => $bundle_new))
+        ->fields(array('subtype' => $subtype_new))
         ->condition('entity_type', $entity_type)
-        ->condition('bundle', $bundle_old)
+        ->condition('subtype', $subtype_old)
         ->execute();
     }
   }
diff --git a/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Entity/Tables.php b/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Entity/Tables.php
index 09c8fda..cb955cb 100644
--- a/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Entity/Tables.php
+++ b/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Entity/Tables.php
@@ -173,10 +173,10 @@ function addField($field, $type, $langcode) {
           // Create a relevant entity to find the definition for this
           // property.
           $values = array();
-          // If there are bundles, pick one. It does not matter which,
-          // properties exist on all bundles.
-          if (!empty($entity_info['entity keys']['bundle'])) {
-            $values[$entity_info['entity keys']['bundle']] = key(entity_get_bundles('node'));
+          // If there are subtypes, pick one. It does not matter which,
+          // properties exist on all subtypes.
+          if (!empty($entity_info['entity keys']['subtype'])) {
+            $values[$entity_info['entity keys']['subtype']] = key(entity_get_subtypes('node'));
           }
           $entity = entity_create($entity_type, $values);
           $propertyDefinitions = $entity->$specifier->getPropertyDefinitions();
diff --git a/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php b/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php
index e79757e..6145fd2 100644
--- a/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php
+++ b/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php
@@ -44,7 +44,7 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle'
+      'subtype' => 'test_subtype'
     );
     $this->instance = field_create_instance($this->instance);
     $this->table = _field_sql_storage_tablename($this->field);
@@ -84,7 +84,7 @@ function testFieldAttachLoad() {
     $query->execute();
 
     // Load the "most current revision"
-    $entity = field_test_create_entity($eid, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, 0, $this->instance['subtype']);
     field_attach_load($entity_type, array($eid => $entity));
     foreach ($values[0] as $delta => $value) {
       if ($delta < $this->field['cardinality']) {
@@ -97,7 +97,7 @@ function testFieldAttachLoad() {
 
     // Load every revision
     for ($evid = 0; $evid < 4; ++$evid) {
-      $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
+      $entity = field_test_create_entity($eid, $evid, $this->instance['subtype']);
       field_attach_load_revision($entity_type, array($eid => $entity));
       foreach ($values[$evid] as $delta => $value) {
         if ($delta < $this->field['cardinality']) {
@@ -113,7 +113,7 @@ function testFieldAttachLoad() {
     // loaded.
     $eid = $evid = 1;
     $unavailable_langcode = 'xx';
-    $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, $evid, $this->instance['subtype']);
     $values = array($entity_type, $eid, $evid, 0, $unavailable_langcode, mt_rand(1, 127));
     db_insert($this->table)->fields($columns)->values($values)->execute();
     db_insert($this->revision_table)->fields($columns)->values($values)->execute();
@@ -127,7 +127,7 @@ function testFieldAttachLoad() {
    */
   function testFieldAttachInsertAndUpdate() {
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Test insert.
@@ -151,7 +151,7 @@ function testFieldAttachInsertAndUpdate() {
     }
 
     // Test update.
-    $entity = field_test_create_entity(0, 1, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 1, $this->instance['subtype']);
     $values = array();
     // Note: we try to update one extra value ('<=' instead of '<').
     for ($delta = 0; $delta <= $this->field['cardinality']; $delta++) {
@@ -208,7 +208,7 @@ function testFieldAttachInsertAndUpdate() {
    */
   function testFieldAttachSaveMissingData() {
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance['subtype']);
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Insert: Field is missing
@@ -258,8 +258,8 @@ function testFieldAttachSaveMissingData() {
     // Add a translation in an unavailable language.
     $unavailable_langcode = 'xx';
     db_insert($this->table)
-      ->fields(array('entity_type', 'bundle', 'deleted', 'entity_id', 'revision_id', 'delta', 'langcode'))
-      ->values(array($entity_type, $this->instance['bundle'], 0, 0, 0, 0, $unavailable_langcode))
+      ->fields(array('entity_type', 'subtype', 'deleted', 'entity_id', 'revision_id', 'delta', 'langcode'))
+      ->values(array($entity_type, $this->instance['subtype'], 0, 0, 0, 0, $unavailable_langcode))
       ->execute();
     $count = db_select($this->table)
       ->countQuery()
@@ -305,9 +305,9 @@ function testUpdateFieldSchemaWithData() {
     // Create a decimal 5.2 field and add some data.
     $field = array('field_name' => 'decimal52', 'type' => 'number_decimal', 'settings' => array('precision' => 5, 'scale' => 2));
     $field = field_create_field($field);
-    $instance = array('field_name' => 'decimal52', 'entity_type' => 'test_entity', 'bundle' => 'test_bundle');
+    $instance = array('field_name' => 'decimal52', 'entity_type' => 'test_entity', 'subtype' => 'test_subtype');
     $instance = field_create_instance($instance);
-    $entity = field_test_create_entity(0, 0, $instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $instance['subtype']);
     $entity->decimal52[LANGUAGE_NOT_SPECIFIED][0]['value'] = '1.235';
     $entity->save();
 
@@ -356,7 +356,7 @@ function testFieldUpdateIndexesWithData() {
     $field_name = 'testfield';
     $field = array('field_name' => $field_name, 'type' => 'text');
     $field = field_create_field($field);
-    $instance = array('field_name' => $field_name, 'entity_type' => 'test_entity', 'bundle' => 'test_bundle');
+    $instance = array('field_name' => $field_name, 'entity_type' => 'test_entity', 'subtype' => 'test_subtype');
     $instance = field_create_instance($instance);
     $tables = array(_field_sql_storage_tablename($field), _field_sql_storage_revision_tablename($field));
 
@@ -367,7 +367,7 @@ function testFieldUpdateIndexesWithData() {
     }
 
     // Add data so the table cannot be dropped.
-    $entity = field_test_create_entity(1, 1, $instance['bundle']);
+    $entity = field_test_create_entity(1, 1, $instance['subtype']);
     $entity->{$field_name}[LANGUAGE_NOT_SPECIFIED][0]['value'] = 'field data';
     $entity->save();
 
@@ -387,7 +387,7 @@ function testFieldUpdateIndexesWithData() {
     }
 
     // Verify that the tables were not dropped.
-    $entity = field_test_create_entity(1, 1, $instance['bundle']);
+    $entity = field_test_create_entity(1, 1, $instance['subtype']);
     field_attach_load('test_entity', array(1 => $entity));
     $this->assertEqual($entity->{$field_name}[LANGUAGE_NOT_SPECIFIED][0]['value'], 'field data', t("Index changes performed without dropping the tables"));
   }
@@ -401,7 +401,7 @@ function testFieldStorageDetails() {
 
     // Retrieve the field and instance with field_info so the storage details are attached.
     $field = field_info_field($this->field['field_name']);
-    $instance = field_info_instance($this->instance['entity_type'], $this->instance['field_name'], $this->instance['bundle']);
+    $instance = field_info_instance($this->instance['entity_type'], $this->instance['field_name'], $this->instance['subtype']);
 
     // The storage details are indexed by a storage engine type.
     $this->assertTrue(array_key_exists('sql', $field['storage']['details']), 'The storage type is SQL.');
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index 566959b..7728b0f 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -17,7 +17,7 @@
 function field_ui_fields_list() {
   $instances = field_info_instances();
   $field_types = field_info_field_types();
-  $bundles = entity_get_bundles();
+  $subtypes = entity_get_subtypes();
 
   $modules = system_rebuild_module_data();
 
@@ -27,9 +27,9 @@ function field_ui_fields_list() {
     t('Used in'),
   );
   $rows = array();
-  foreach ($instances as $entity_type => $type_bundles) {
-    foreach ($type_bundles as $bundle => $bundle_instances) {
-      foreach ($bundle_instances as $field_name => $instance) {
+  foreach ($instances as $entity_type => $type_subtypes) {
+    foreach ($type_subtypes as $subtype => $subtype_instances) {
+      foreach ($subtype_instances as $field_name => $instance) {
         $field = field_info_field($field_name);
 
         // Initialize the row if we encounter the field for the first time.
@@ -41,8 +41,8 @@ function field_ui_fields_list() {
         }
 
         // Add the current instance.
-        $admin_path = field_ui_bundle_admin_path($entity_type, $bundle);
-        $rows[$field_name]['data'][2][] = $admin_path ? l($bundles[$entity_type][$bundle]['label'], $admin_path . '/fields') : $bundles[$entity_type][$bundle]['label'];
+        $admin_path = field_ui_subtype_admin_path($entity_type, $subtype);
+        $rows[$field_name]['data'][2][] = $admin_path ? l($subtypes[$entity_type][$subtype]['label'], $admin_path . '/fields') : $subtypes[$entity_type][$subtype]['label'];
       }
     }
   }
@@ -61,10 +61,10 @@ function field_ui_fields_list() {
 }
 
 /**
- * Displays a message listing the inactive fields of a given bundle.
+ * Displays a message listing the inactive fields of a given subtype.
  */
-function field_ui_inactive_message($entity_type, $bundle) {
-  $inactive_instances = field_ui_inactive_instances($entity_type, $bundle);
+function field_ui_inactive_message($entity_type, $subtype) {
+  $inactive_instances = field_ui_inactive_instances($entity_type, $subtype);
   if (!empty($inactive_instances)) {
     $field_types = field_info_field_types();
     $widget_types = field_info_widget_types();
@@ -292,28 +292,28 @@ function theme_field_ui_table($variables) {
 }
 
 /**
- * Returns the built and processed 'Manage fields' form of a bundle.
+ * Returns the built and processed 'Manage fields' form of a subtype.
  *
  * The resulting form allows fields and pseudo-fields to be re-ordered.
  *
  * @param string $entity_type
  *   The entity type for the fieldable entity.
- * @param string $bundle
- *   The bundle for the fieldable entity.
+ * @param string $subtype
+ *   The subtype for the fieldable entity.
  *
  * @return
- *   The processed form for the given entity type and bundle.
+ *   The processed form for the given entity type and subtype.
  *
  * @see field_ui_menu()
  * @see Drupal\field_ui\FieldOverview::validate()
  * @see Drupal\field_ui\FieldOverview::submit()
  * @ingroup forms
  */
-function field_ui_field_overview($entity_type, $bundle) {
-  $bundle = field_extract_bundle($entity_type, $bundle);
-  field_ui_inactive_message($entity_type, $bundle);
+function field_ui_field_overview($entity_type, $subtype) {
+  $subtype = field_extract_subtype($entity_type, $subtype);
+  field_ui_inactive_message($entity_type, $subtype);
 
-  return drupal_get_form(new FieldOverview($entity_type, $bundle));
+  return drupal_get_form(new FieldOverview($entity_type, $subtype));
 }
 
 /**
@@ -335,30 +335,30 @@ function _field_ui_field_name_exists($value) {
 }
 
 /**
- * Returns the built and processed 'Manage display' form of a bundle.
+ * Returns the built and processed 'Manage display' form of a subtype.
  *
  * The resulting form allows fields and pseudo-fields to be re-ordered.
  *
  * @param string $entity_type
  *   The entity type for the fieldable entity.
- * @param string $bundle
- *   The bundle for the fieldable entity.
+ * @param string $subtype
+ *   The subtype for the fieldable entity.
  * @param string $view_mode
  *   The view mode for the fieldable entity.
  *
  * @return
- *   The processed form for the given entity type and bundle.
+ *   The processed form for the given entity type and subtype.
  *
  * @see field_ui_menu()
  * @see field_ui_display_overview_multistep_submit()
  * @see Drupal\field_ui\DisplayOverview::submit()
  * @ingroup forms
  */
-function field_ui_display_overview($entity_type, $bundle, $view_mode) {
-  $bundle = field_extract_bundle($entity_type, $bundle);
-  field_ui_inactive_message($entity_type, $bundle);
+function field_ui_display_overview($entity_type, $subtype, $view_mode) {
+  $subtype = field_extract_subtype($entity_type, $subtype);
+  field_ui_inactive_message($entity_type, $subtype);
 
-  return drupal_get_form(new DisplayOverview($entity_type, $bundle, $view_mode));
+  return drupal_get_form(new DisplayOverview($entity_type, $subtype, $view_mode));
 }
 
 /**
@@ -450,26 +450,26 @@ function field_ui_formatter_options($field_type = NULL) {
 }
 
 /**
- * Returns an array of existing fields to be added to a bundle.
+ * Returns an array of existing fields to be added to a subtype.
  */
-function field_ui_existing_field_options($entity_type, $bundle) {
+function field_ui_existing_field_options($entity_type, $subtype) {
   $info = array();
   $field_types = field_info_field_types();
 
-  foreach (field_info_instances() as $existing_entity_type => $bundles) {
-    foreach ($bundles as $existing_bundle => $instances) {
-      // No need to look in the current bundle.
-      if (!($existing_bundle == $bundle && $existing_entity_type == $entity_type)) {
+  foreach (field_info_instances() as $existing_entity_type => $subtypes) {
+    foreach ($subtypes as $existing_subtype => $instances) {
+      // No need to look in the current subtype.
+      if (!($existing_subtype == $subtype && $existing_entity_type == $entity_type)) {
         foreach ($instances as $instance) {
           $field = field_info_field($instance['field_name']);
           // Don't show
           // - locked fields,
-          // - fields already in the current bundle,
+          // - fields already in the current subtype,
           // - fields that cannot be added to the entity type,
           // - fields that should not be added via user interface.
 
           if (empty($field['locked'])
-            && !field_info_instance($entity_type, $field['field_name'], $bundle)
+            && !field_info_instance($entity_type, $field['field_name'], $subtype)
             && (empty($field['entity_types']) || in_array($entity_type, $field['entity_types']))
             && empty($field_types[$field['type']]['no_ui'])) {
             $info[$instance['field_name']] = array(
@@ -495,12 +495,12 @@ function field_ui_existing_field_options($entity_type, $bundle) {
  * @ingroups forms
  */
 function field_ui_field_settings_form($form, &$form_state, $instance) {
-  $bundle = $instance['bundle'];
+  $subtype = $instance['subtype'];
   $entity_type = $instance['entity_type'];
   $field = field_info_field($instance['field_name']);
   $form['#field'] = $field;
   $form['#entity_type'] = $entity_type;
-  $form['#bundle'] = $bundle;
+  $form['#subtype'] = $subtype;
 
   drupal_set_title($instance['label']);
 
@@ -611,8 +611,8 @@ function field_ui_field_settings_form_submit($form, &$form_state) {
   $field = field_info_field($field_values['field_name']);
 
   $entity_type = $form['#entity_type'];
-  $bundle = $form['#bundle'];
-  $instance = field_info_instance($entity_type, $field['field_name'], $bundle);
+  $subtype = $form['#subtype'];
+  $instance = field_info_instance($entity_type, $field['field_name'], $subtype);
 
   // Update the field.
   $field = array_merge($field, $field_values);
@@ -620,7 +620,7 @@ function field_ui_field_settings_form_submit($form, &$form_state) {
   try {
     field_update_field($field);
     drupal_set_message(t('Updated field %label field settings.', array('%label' => $instance['label'])));
-    $form_state['redirect'] = field_ui_next_destination($entity_type, $bundle);
+    $form_state['redirect'] = field_ui_next_destination($entity_type, $subtype);
   }
   catch (Exception $e) {
     drupal_set_message(t('Attempt to update field %label failed: %message.', array('%label' => $instance['label'], '%message' => $e->getMessage())), 'error');
@@ -637,16 +637,16 @@ function field_ui_field_settings_form_submit($form, &$form_state) {
 function field_ui_widget_type_form($form, &$form_state, FieldInstance $instance) {
   drupal_set_title($instance['label']);
 
-  $bundle = $instance['bundle'];
+  $subtype = $instance['subtype'];
   $entity_type = $instance['entity_type'];
   $field_name = $instance['field_name'];
 
   $field = field_info_field($field_name);
-  $bundles = entity_get_bundles();
-  $bundle_label = $bundles[$entity_type][$bundle]['label'];
+  $subtypes = entity_get_subtypes();
+  $subtype_label = $subtypes[$entity_type][$subtype]['label'];
 
   $form = array(
-    '#bundle' => $bundle,
+    '#subtype' => $subtype,
     '#entity_type' => $entity_type,
     '#field_name' => $field_name,
   );
@@ -657,7 +657,7 @@ function field_ui_widget_type_form($form, &$form_state, FieldInstance $instance)
     '#required' => TRUE,
     '#options' => field_ui_widget_type_options($field['type']),
     '#default_value' => $instance->getWidget()->getPluginId(),
-    '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $bundle_label)),
+    '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $subtype_label)),
   );
 
   $form['actions'] = array('#type' => 'actions');
@@ -674,12 +674,12 @@ function field_ui_widget_type_form($form, &$form_state, FieldInstance $instance)
  */
 function field_ui_widget_type_form_submit($form, &$form_state) {
   $form_values = $form_state['values'];
-  $bundle = $form['#bundle'];
+  $subtype = $form['#subtype'];
   $entity_type = $form['#entity_type'];
   $field_name = $form['#field_name'];
 
   // Retrieve the stored instance settings to merge with the incoming values.
-  $instance = field_read_instance($entity_type, $field_name, $bundle);
+  $instance = field_read_instance($entity_type, $field_name, $subtype);
 
   // Set the right module information.
   $widget_type = field_info_widget_types($form_values['widget_type']);
@@ -696,25 +696,25 @@ function field_ui_widget_type_form_submit($form, &$form_state) {
     drupal_set_message(t('There was a problem changing the widget for field %label.', array('%label' => $instance['label'])), 'error');
   }
 
-  $form_state['redirect'] = field_ui_next_destination($entity_type, $bundle);
+  $form_state['redirect'] = field_ui_next_destination($entity_type, $subtype);
 }
 
 /**
- * Form constructor for removing a field instance from a bundle.
+ * Form constructor for removing a field instance from a subtype.
  *
  * @see field_ui_menu()
  * @see field_ui_field_delete_form_submit()
  * @ingroup forms
  */
 function field_ui_field_delete_form($form, &$form_state, $instance) {
-  $bundle = $instance['bundle'];
+  $subtype = $instance['subtype'];
   $entity_type = $instance['entity_type'];
   $field = field_info_field($instance['field_name']);
 
-  $admin_path = field_ui_bundle_admin_path($entity_type, $bundle);
+  $admin_path = field_ui_subtype_admin_path($entity_type, $subtype);
 
   $form['entity_type'] = array('#type' => 'value', '#value' => $entity_type);
-  $form['bundle'] = array('#type' => 'value', '#value' => $bundle);
+  $form['subtype'] = array('#type' => 'value', '#value' => $subtype);
   $form['field_name'] = array('#type' => 'value', '#value' => $field['field_name']);
 
   $output = confirm_form($form,
@@ -736,29 +736,29 @@ function field_ui_field_delete_form($form, &$form_state, $instance) {
 /**
  * Form submission handler for field_ui_field_delete_form().
  *
- * Removes a field instance from a bundle. If the field has no more instances,
+ * Removes a field instance from a subtype. If the field has no more instances,
  * it will be marked as deleted too.
  */
 function field_ui_field_delete_form_submit($form, &$form_state) {
   $form_values = $form_state['values'];
   $field_name = $form_values['field_name'];
-  $bundle = $form_values['bundle'];
+  $subtype = $form_values['subtype'];
   $entity_type = $form_values['entity_type'];
 
   $field = field_info_field($field_name);
-  $instance = field_info_instance($entity_type, $field_name, $bundle);
-  $bundles = entity_get_bundles();
-  $bundle_label = $bundles[$entity_type][$bundle]['label'];
+  $instance = field_info_instance($entity_type, $field_name, $subtype);
+  $subtypes = entity_get_subtypes();
+  $subtype_label = $subtypes[$entity_type][$subtype]['label'];
 
-  if (!empty($bundle) && $field && !$field['locked'] && $form_values['confirm']) {
+  if (!empty($subtype) && $field && !$field['locked'] && $form_values['confirm']) {
     field_delete_instance($instance);
-    drupal_set_message(t('The field %field has been deleted from the %type content type.', array('%field' => $instance['label'], '%type' => $bundle_label)));
+    drupal_set_message(t('The field %field has been deleted from the %type content type.', array('%field' => $instance['label'], '%type' => $subtype_label)));
   }
   else {
-    drupal_set_message(t('There was a problem removing the %field from the %type content type.', array('%field' => $instance['label'], '%type' => $bundle_label)), 'error');
+    drupal_set_message(t('There was a problem removing the %field from the %type content type.', array('%field' => $instance['label'], '%type' => $subtype_label)), 'error');
   }
 
-  $admin_path = field_ui_bundle_admin_path($entity_type, $bundle);
+  $admin_path = field_ui_subtype_admin_path($entity_type, $subtype);
   $form_state['redirect'] = field_ui_get_destinations(array($admin_path . '/fields'));
 
   // Fields are purged on cron. However field module prevents disabling modules
@@ -780,20 +780,20 @@ function field_ui_field_delete_form_submit($form, &$form_state) {
  * @ingroup forms
  */
 function field_ui_field_edit_form($form, &$form_state, $instance) {
-  $bundle = $instance['bundle'];
+  $subtype = $instance['subtype'];
   $entity_type = $instance['entity_type'];
   $field = field_info_field($instance['field_name']);
-  $bundles = entity_get_bundles();
+  $subtypes = entity_get_subtypes();
 
-  drupal_set_title(t('%instance settings for %bundle', array(
+  drupal_set_title(t('%instance settings for %subtype', array(
     '%instance' => $instance['label'],
-    '%bundle' => $bundles[$entity_type][$bundle]['label'],
+    '%subtype' => $subtypes[$entity_type][$subtype]['label'],
   )), PASS_THROUGH);
 
   $form['#field'] = $field;
   $form['#instance'] = $instance;
   // Create an arbitrary entity object (used by the 'default value' widget).
-  $ids = (object) array('entity_type' => $instance['entity_type'], 'bundle' => $instance['bundle'], 'entity_id' => NULL);
+  $ids = (object) array('entity_type' => $instance['entity_type'], 'subtype' => $instance['subtype'], 'entity_id' => NULL);
   $form['#entity'] = _field_create_entity_from_ids($ids);
   $form['#entity']->field_ui_default_value = TRUE;
 
@@ -820,9 +820,9 @@ function field_ui_field_edit_form($form, &$form_state, $instance) {
     '#type' => 'value',
     '#value' => $entity_type,
   );
-  $form['instance']['bundle'] = array(
+  $form['instance']['subtype'] = array(
     '#type' => 'value',
-    '#value' => $bundle,
+    '#value' => $subtype,
   );
   $form['instance']['widget']['weight'] = array(
     '#type' => 'value',
@@ -908,7 +908,7 @@ function field_ui_field_edit_form_delete_submit($form, &$form_state) {
     unset($_GET['destination']);
   }
   $instance = $form['#instance'];
-  $form_state['redirect'] = array('admin/structure/types/manage/' . $instance['bundle'] . '/fields/' . $instance['field_name'] . '/delete', array('query' => $destination));
+  $form_state['redirect'] = array('admin/structure/types/manage/' . $instance['subtype'] . '/fields/' . $instance['field_name'] . '/delete', array('query' => $destination));
 }
 
 /**
@@ -1013,7 +1013,7 @@ function field_ui_field_edit_form_submit($form, &$form_state) {
 
   drupal_set_message(t('Saved %label configuration.', array('%label' => $instance['label'])));
 
-  $form_state['redirect'] = field_ui_next_destination($instance['entity_type'], $instance['bundle']);
+  $form_state['redirect'] = field_ui_next_destination($instance['entity_type'], $instance['subtype']);
 }
 
 /**
@@ -1033,12 +1033,12 @@ function field_ui_get_destinations($destinations) {
 /**
  * Returns the next redirect path in a multipage sequence.
  */
-function field_ui_next_destination($entity_type, $bundle) {
+function field_ui_next_destination($entity_type, $subtype) {
   $destinations = !empty($_REQUEST['destinations']) ? $_REQUEST['destinations'] : array();
   if (!empty($destinations)) {
     unset($_REQUEST['destinations']);
     return field_ui_get_destinations($destinations);
   }
-  $admin_path = field_ui_bundle_admin_path($entity_type, $bundle);
+  $admin_path = field_ui_subtype_admin_path($entity_type, $subtype);
   return $admin_path . '/fields';
 }
diff --git a/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php
index eb72e04..de6e576 100644
--- a/core/modules/field_ui/field_ui.api.php
+++ b/core/modules/field_ui/field_ui.api.php
@@ -14,7 +14,7 @@
  * Add settings to a field settings form.
  *
  * Invoked from field_ui_field_settings_form() to allow the module defining the
- * field to add global settings (i.e. settings that do not depend on the bundle
+ * field to add global settings (i.e. settings that do not depend on the subtype
  * or instance) to the field settings form. If the field already has data, only
  * include settings that are safe to change.
  *
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index 9f64f5f..7491fca 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -47,9 +47,9 @@ function field_ui_help($path, $arg) {
 }
 
 /**
- * Implements hook_field_attach_rename_bundle().
+ * Implements hook_field_attach_rename_subtype().
  */
-function field_ui_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+function field_ui_field_attach_rename_subtype($entity_type, $subtype_old, $subtype_new) {
   // The Field UI relies on entity_get_info() to build menu items for entity
   // field administration pages. Ensure that the menu is rebuilt.
   menu_router_rebuild();
@@ -72,27 +72,27 @@ function field_ui_menu() {
     'type' => MENU_DEFAULT_LOCAL_TASK,
   );
 
-  // Create tabs for all possible bundles.
+  // Create tabs for all possible subtypes.
   foreach (entity_get_info() as $entity_type => $entity_info) {
     if ($entity_info['fieldable']) {
-      foreach (entity_get_bundles($entity_type) as $bundle_name => $bundle_info) {
-        if (isset($bundle_info['admin'])) {
-          // Extract path information from the bundle.
-          $path = $bundle_info['admin']['path'];
-          // Different bundles can appear on the same path (e.g. %node_type and
+      foreach (entity_get_subtypes($entity_type) as $subtype_name => $subtype_info) {
+        if (isset($subtype_info['admin'])) {
+          // Extract path information from the subtype.
+          $path = $subtype_info['admin']['path'];
+          // Different subtypes can appear on the same path (e.g. %node_type and
           // %comment_node_type). To allow field_ui_instance_load() to extract
-          // the actual bundle object from the translated menu router path
-          // arguments, we need to identify the argument position of the bundle
-          // name string ('bundle argument') and pass that position to the menu
+          // the actual subtype object from the translated menu router path
+          // arguments, we need to identify the argument position of the subtype
+          // name string ('subtype argument') and pass that position to the menu
           // loader. The position needs to be casted into a string; otherwise it
-          // would be replaced with the bundle name string.
-          if (isset($bundle_info['admin']['bundle argument'])) {
-            $bundle_arg = $bundle_info['admin']['bundle argument'];
-            $bundle_pos = (string) $bundle_arg;
+          // would be replaced with the subtype name string.
+          if (isset($subtype_info['admin']['subtype argument'])) {
+            $subtype_arg = $subtype_info['admin']['subtype argument'];
+            $subtype_pos = (string) $subtype_arg;
           }
           else {
-            $bundle_arg = $bundle_name;
-            $bundle_pos = '0';
+            $subtype_arg = $subtype_name;
+            $subtype_pos = '0';
           }
           // This is the position of the %field_ui_instance placeholder in the
           // items below.
@@ -112,13 +112,13 @@ function field_ui_menu() {
           $items["$path/fields"] = array(
             'title' => 'Manage fields',
             'page callback' => 'field_ui_field_overview',
-            'page arguments' => array($entity_type, $bundle_arg),
+            'page arguments' => array($entity_type, $subtype_arg),
             'type' => MENU_LOCAL_TASK,
             'weight' => 1,
             'file' => 'field_ui.admin.inc',
           ) + $access_fields;
           $items["$path/fields/%field_ui_instance"] = array(
-            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'load arguments' => array($entity_type, $subtype_arg, $subtype_pos, '%map'),
             'title callback' => 'field_ui_instance_title',
             'title arguments' => array($field_position),
             'page callback' => 'drupal_get_form',
@@ -126,7 +126,7 @@ function field_ui_menu() {
             'file' => 'field_ui.admin.inc',
           ) + $access_fields;
           $items["$path/fields/%field_ui_instance/edit"] = array(
-            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'load arguments' => array($entity_type, $subtype_arg, $subtype_pos, '%map'),
             'title' => 'Edit',
             'page callback' => 'drupal_get_form',
             'page arguments' => array('field_ui_field_edit_form', $field_position),
@@ -134,7 +134,7 @@ function field_ui_menu() {
             'file' => 'field_ui.admin.inc',
           ) + $access_fields;
           $items["$path/fields/%field_ui_instance/field-settings"] = array(
-            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'load arguments' => array($entity_type, $subtype_arg, $subtype_pos, '%map'),
             'title' => 'Field settings',
             'page callback' => 'drupal_get_form',
             'page arguments' => array('field_ui_field_settings_form', $field_position),
@@ -142,7 +142,7 @@ function field_ui_menu() {
             'file' => 'field_ui.admin.inc',
           ) + $access_fields;
           $items["$path/fields/%field_ui_instance/widget-type"] = array(
-            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'load arguments' => array($entity_type, $subtype_arg, $subtype_pos, '%map'),
             'title' => 'Widget type',
             'page callback' => 'drupal_get_form',
             'page arguments' => array('field_ui_widget_type_form', $field_position),
@@ -150,7 +150,7 @@ function field_ui_menu() {
             'file' => 'field_ui.admin.inc',
           ) + $access_fields;
           $items["$path/fields/%field_ui_instance/delete"] = array(
-            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'load arguments' => array($entity_type, $subtype_arg, $subtype_pos, '%map'),
             'title' => 'Delete',
             'page callback' => 'drupal_get_form',
             'page arguments' => array('field_ui_field_delete_form', $field_position),
@@ -163,7 +163,7 @@ function field_ui_menu() {
           $items["$path/display"] = array(
             'title' => 'Manage display',
             'page callback' => 'field_ui_display_overview',
-            'page arguments' => array($entity_type, $bundle_arg, 'default'),
+            'page arguments' => array($entity_type, $subtype_arg, 'default'),
             'type' => MENU_LOCAL_TASK,
             'weight' => 2,
             'file' => 'field_ui.admin.inc',
@@ -171,23 +171,23 @@ function field_ui_menu() {
 
           // View modes secondary tabs.
           // The same base $path for the menu item (with a placeholder) can be
-          // used for all bundles of a given entity type; but depending on
-          // administrator settings, each bundle has a different set of view
+          // used for all subtypes of a given entity type; but depending on
+          // administrator settings, each subtype has a different set of view
           // modes available for customisation. So we define menu items for all
           // view modes, and use an access callback to determine which ones are
-          // actually visible for a given bundle.
+          // actually visible for a given subtype.
           $weight = 0;
           $view_modes = array('default' => array('label' => t('Default'))) + entity_get_view_modes($entity_type);
           foreach ($view_modes as $view_mode => $view_mode_info) {
             $items["$path/display/$view_mode"] = array(
               'title' => $view_mode_info['label'],
               'page callback' => 'field_ui_display_overview',
-              'page arguments' => array($entity_type, $bundle_arg, $view_mode),
+              'page arguments' => array($entity_type, $subtype_arg, $view_mode),
               // The access callback needs to check both the current 'custom
               // display' setting for the view mode, and the overall access
-              // rules for the bundle admin pages.
+              // rules for the subtype admin pages.
               'access callback' => '_field_ui_view_mode_menu_access',
-              'access arguments' => array($entity_type, $bundle_arg, $view_mode, $access_display['access arguments'][0]),
+              'access arguments' => array($entity_type, $subtype_arg, $view_mode, $access_display['access arguments'][0]),
               'type' => ($view_mode == 'default' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK),
               'file' => 'field_ui.admin.inc',
             );
@@ -226,16 +226,16 @@ function field_ui_permission() {
 }
 
 /**
- * Menu loader callback: Loads a field instance based on field and bundle name.
+ * Menu loader callback: Loads a field instance based on field and subtype name.
  *
  * @param $field_name
  *   The name of the field, as contained in the path.
  * @param $entity_type
  *   The name of the entity.
- * @param $bundle_name
- *   The name of the bundle, as contained in the path.
- * @param $bundle_pos
- *   The position of $bundle_name in $map.
+ * @param $subtype_name
+ *   The name of the subtype, as contained in the path.
+ * @param $subtype_pos
+ *   The position of $subtype_name in $map.
  * @param $map
  *   The translated menu router path argument map.
  *
@@ -244,26 +244,26 @@ function field_ui_permission() {
  *
  * @ingroup field
  */
-function field_ui_instance_load($field_name, $entity_type, $bundle_name, $bundle_pos, $map) {
-  // Extract the actual bundle name from the translated argument map.
+function field_ui_instance_load($field_name, $entity_type, $subtype_name, $subtype_pos, $map) {
+  // Extract the actual subtype name from the translated argument map.
   // The menu router path to manage fields of an entity can be shared among
-  // multiple bundles. For example:
+  // multiple subtypes. For example:
   // - admin/structure/types/manage/%node_type/fields/%field_ui_instance
   // - admin/structure/types/manage/%comment_node_type/fields/%field_ui_instance
-  // The menu system will automatically load the correct bundle depending on the
+  // The menu system will automatically load the correct subtype depending on the
   // actual path arguments, but this menu loader function only receives the node
-  // type string as $bundle_name, which is not the bundle name for comments.
+  // type string as $subtype_name, which is not the subtype name for comments.
   // We therefore leverage the dynamically translated $map provided by the menu
-  // system to retrieve the actual bundle and bundle name for the current path.
-  if ($bundle_pos > 0) {
-    $bundle = $map[$bundle_pos];
-    $bundle_name = field_extract_bundle($entity_type, $bundle);
+  // system to retrieve the actual subtype and subtype name for the current path.
+  if ($subtype_pos > 0) {
+    $subtype = $map[$subtype_pos];
+    $subtype_name = field_extract_subtype($entity_type, $subtype);
   }
   // Check whether the field exists at all.
   if ($field = field_info_field($field_name)) {
     // Only return the field if a field instance exists for the given entity
-    // type and bundle.
-    if ($instance = field_info_instance($entity_type, $field_name, $bundle_name)) {
+    // type and subtype.
+    if ($instance = field_info_instance($entity_type, $field_name, $subtype_name)) {
       return $instance;
     }
   }
@@ -284,11 +284,11 @@ function field_ui_instance_title($instance) {
  *
  * @see field_ui_menu()
  */
-function _field_ui_view_mode_menu_access($entity_type, $bundle, $view_mode, $permission) {
+function _field_ui_view_mode_menu_access($entity_type, $subtype, $view_mode, $permission) {
   // First, determine visibility according to the 'use custom display'
   // setting for the view mode.
-  $bundle = field_extract_bundle($entity_type, $bundle);
-  $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+  $subtype = field_extract_subtype($entity_type, $subtype);
+  $view_mode_settings = field_view_mode_settings($entity_type, $subtype);
   $visibility = ($view_mode == 'default') || !empty($view_mode_settings[$view_mode]['custom_settings']);
 
   // Then, determine access according to the $permission parameter.
@@ -322,55 +322,55 @@ function field_ui_element_info() {
 }
 
 /**
- * Implements hook_field_attach_create_bundle().
+ * Implements hook_field_attach_create_subtype().
  */
-function field_ui_field_attach_create_bundle($entity_type, $bundle) {
-  // When a new bundle is created, the menu needs to be rebuilt to add our
+function field_ui_field_attach_create_subtype($entity_type, $subtype) {
+  // When a new subtype is created, the menu needs to be rebuilt to add our
   // menu item tabs.
   state()->set('menu_rebuild_needed', TRUE);
 }
 
 /**
- * Determines the adminstration path for a bundle.
+ * Determines the adminstration path for a subtype.
  */
-function field_ui_bundle_admin_path($entity_type, $bundle_name) {
-  $bundles = entity_get_bundles($entity_type);
-  $bundle_info = $bundles[$bundle_name];
-  if (isset($bundle_info['admin'])) {
-    return isset($bundle_info['admin']['real path']) ? $bundle_info['admin']['real path'] : $bundle_info['admin']['path'];
+function field_ui_subtype_admin_path($entity_type, $subtype_name) {
+  $subtypes = entity_get_subtypes($entity_type);
+  $subtype_info = $subtypes[$subtype_name];
+  if (isset($subtype_info['admin'])) {
+    return isset($subtype_info['admin']['real path']) ? $subtype_info['admin']['real path'] : $subtype_info['admin']['path'];
   }
 }
 
 /**
- * Identifies inactive fields within a bundle.
+ * Identifies inactive fields within a subtype.
  */
-function field_ui_inactive_instances($entity_type, $bundle_name = NULL) {
+function field_ui_inactive_instances($entity_type, $subtype_name = NULL) {
   $params = array('entity_type' => $entity_type);
 
-  if (empty($bundle_name)) {
+  if (empty($subtype_name)) {
     $active = field_info_instances($entity_type);
     $inactive = array();
   }
   else {
-    // Restrict to the specified bundle. For consistency with the case where
-    // $bundle_name is NULL, the $active and  $inactive arrays are keyed by
-    // bundle name first.
-    $params['bundle'] = $bundle_name;
-    $active = array($bundle_name => field_info_instances($entity_type, $bundle_name));
-    $inactive = array($bundle_name => array());
+    // Restrict to the specified subtype. For consistency with the case where
+    // $subtype_name is NULL, the $active and  $inactive arrays are keyed by
+    // subtype name first.
+    $params['subtype'] = $subtype_name;
+    $active = array($subtype_name => field_info_instances($entity_type, $subtype_name));
+    $inactive = array($subtype_name => array());
   }
 
   // Iterate on existing definitions, and spot those that do not appear in the
   // $active list collected earlier.
   $all_instances = field_read_instances($params, array('include_inactive' => TRUE));
   foreach ($all_instances as $instance) {
-    if (!isset($active[$instance['bundle']][$instance['field_name']])) {
-      $inactive[$instance['bundle']][$instance['field_name']] = $instance;
+    if (!isset($active[$instance['subtype']][$instance['field_name']])) {
+      $inactive[$instance['subtype']][$instance['field_name']] = $instance;
     }
   }
 
-  if (!empty($bundle_name)) {
-    return $inactive[$bundle_name];
+  if (!empty($subtype_name)) {
+    return $inactive[$subtype_name];
   }
   return $inactive;
 }
@@ -402,7 +402,7 @@ function field_ui_form_node_type_form_alter(&$form, $form_state) {
  */
 function field_ui_form_node_type_form_submit($form, &$form_state) {
   if ($form_state['triggering_element']['#parents'][0] === 'save_continue') {
-    $form_state['redirect'] = field_ui_bundle_admin_path('node', $form_state['values']['type']) .'/fields';
+    $form_state['redirect'] = field_ui_subtype_admin_path('node', $form_state['values']['type']) .'/fields';
   }
 }
 
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
index 7ee40f4..b6af8b8 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -43,10 +43,10 @@ public function getFormID() {
    */
   public function buildForm(array $form, array &$form_state) {
     // Gather type information.
-    $instances = field_info_instances($this->entity_type, $this->bundle);
+    $instances = field_info_instances($this->entity_type, $this->subtype);
     $field_types = field_info_field_types();
-    $extra_fields = field_info_extra_fields($this->entity_type, $this->bundle, 'display');
-    $entity_display = entity_get_display($this->entity_type, $this->bundle, $this->view_mode);
+    $extra_fields = field_info_extra_fields($this->entity_type, $this->subtype, 'display');
+    $entity_display = entity_get_display($this->entity_type, $this->subtype, $this->view_mode);
 
     $form_state += array(
       'formatter_settings_edit' => NULL,
@@ -54,7 +54,7 @@ public function buildForm(array $form, array &$form_state) {
 
     $form += array(
       '#entity_type' => $this->entity_type,
-      '#bundle' => $this->bundle,
+      '#subtype' => $this->subtype,
       '#view_mode' => $this->view_mode,
       '#fields' => array_keys($instances),
       '#extra' => array_keys($extra_fields),
@@ -355,7 +355,7 @@ public function buildForm(array $form, array &$form_state) {
         // checkboxes.
         $options = array();
         $default = array();
-        $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle);
+        $view_mode_settings = field_view_mode_settings($this->entity_type, $this->subtype);
         foreach ($view_modes as $view_mode_name => $view_mode_info) {
           $options[$view_mode_name] = $view_mode_info['label'];
           if (!empty($view_mode_settings[$view_mode_name]['custom_settings'])) {
@@ -411,7 +411,7 @@ public function buildForm(array $form, array &$form_state) {
    */
   public function submitForm(array &$form, array &$form_state) {
     $form_values = $form_state['values'];
-    $display = entity_get_display($this->entity_type, $this->bundle, $this->view_mode);
+    $display = entity_get_display($this->entity_type, $this->subtype, $this->view_mode);
 
     // Collect data for 'regular' fields.
     foreach ($form['#fields'] as $field_name) {
@@ -469,28 +469,28 @@ public function submitForm(array &$form, array &$form_state) {
     if ($this->view_mode == 'default' && !empty($form_values['view_modes_custom'])) {
       $entity_info = entity_get_info($this->entity_type);
       $view_modes = entity_get_view_modes($this->entity_type);
-      $bundle_settings = field_bundle_settings($this->entity_type, $this->bundle);
-      $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle);
+      $subtype_settings = field_subtype_settings($this->entity_type, $this->subtype);
+      $view_mode_settings = field_view_mode_settings($this->entity_type, $this->subtype);
 
       foreach ($form_values['view_modes_custom'] as $view_mode => $value) {
         if (!empty($value) && empty($view_mode_settings[$view_mode]['custom_settings'])) {
           // If no display exists for the newly enabled view mode, initialize
           // it with those from the 'default' view mode, which were used so
           // far.
-          if (!entity_load('entity_display', $this->entity_type . '.' . $this->bundle . '.' . $view_mode)) {
-            $display = entity_get_display($this->entity_type, $this->bundle, 'default')->createCopy($view_mode);
+          if (!entity_load('entity_display', $this->entity_type . '.' . $this->subtype . '.' . $view_mode)) {
+            $display = entity_get_display($this->entity_type, $this->subtype, 'default')->createCopy($view_mode);
             $display->save();
           }
 
           $view_mode_label = $view_modes[$view_mode]['label'];
-          $path = field_ui_bundle_admin_path($this->entity_type, $this->bundle) . "/display/$view_mode";
+          $path = field_ui_subtype_admin_path($this->entity_type, $this->subtype) . "/display/$view_mode";
           drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', array('%view_mode' => $view_mode_label, '@url' => url($path))));
         }
-        $bundle_settings['view_modes'][$view_mode]['custom_settings'] = !empty($value);
+        $subtype_settings['view_modes'][$view_mode]['custom_settings'] = !empty($value);
       }
 
-      // Save updated bundle settings.
-      field_bundle_settings($this->entity_type, $this->bundle, $bundle_settings);
+      // Save updated subtype settings.
+      field_subtype_settings($this->entity_type, $this->subtype, $subtype_settings);
     }
 
     drupal_set_message(t('Your settings have been saved.'));
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
index 925caef..048a7d3 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
@@ -17,11 +17,11 @@ class FieldOverview extends OverviewBase {
   /**
    * Overrides Drupal\field_ui\OverviewBase::__construct().
    */
-  public function __construct($entity_type, $bundle, $view_mode = NULL) {
+  public function __construct($entity_type, $subtype, $view_mode = NULL) {
     $this->entity_type = $entity_type;
-    $this->bundle = $bundle;
+    $this->subtype = $subtype;
     $this->view_mode = 'form';
-    $this->adminPath = field_ui_bundle_admin_path($this->entity_type, $this->bundle);
+    $this->adminPath = field_ui_subtype_admin_path($this->entity_type, $this->subtype);
   }
 
   /**
@@ -58,15 +58,15 @@ public function buildForm(array $form, array &$form_state) {
       field_info_cache_clear();
     }
 
-    // Gather bundle information.
-    $instances = field_info_instances($this->entity_type, $this->bundle);
+    // Gather subtype information.
+    $instances = field_info_instances($this->entity_type, $this->subtype);
     $field_types = field_info_field_types();
     $widget_types = field_info_widget_types();
-    $extra_fields = field_info_extra_fields($this->entity_type, $this->bundle, 'form');
+    $extra_fields = field_info_extra_fields($this->entity_type, $this->subtype, 'form');
 
     $form += array(
       '#entity_type' => $this->entity_type,
-      '#bundle' => $this->bundle,
+      '#subtype' => $this->subtype,
       '#fields' => array_keys($instances),
       '#extra' => array_keys($extra_fields),
     );
@@ -212,7 +212,7 @@ public function buildForm(array $form, array &$form_state) {
     }
 
     // Additional row: add new field.
-    $max_weight = field_info_max_weight($this->entity_type, $this->bundle, 'form');
+    $max_weight = field_info_max_weight($this->entity_type, $this->subtype, 'form');
     $field_type_options = field_ui_field_type_options();
     $widget_type_options = field_ui_widget_type_options(NULL, TRUE);
     if ($field_type_options && $widget_type_options) {
@@ -307,7 +307,7 @@ public function buildForm(array $form, array &$form_state) {
     }
 
     // Additional row: re-use existing field.
-    $existing_fields = field_ui_existing_field_options($this->entity_type, $this->bundle);
+    $existing_fields = field_ui_existing_field_options($this->entity_type, $this->subtype);
     if ($existing_fields && $widget_type_options) {
       // Build list of options.
       $existing_field_options = array();
@@ -491,7 +491,7 @@ protected function validateAddNew(array $form, array &$form_state) {
    */
   protected function validateAddExisting(array $form, array &$form_state) {
     // The form element might be absent if no existing fields can be added to
-    // this bundle.
+    // this subtype.
     if (isset($form_state['values']['fields']['_add_existing_field'])) {
       $field = $form_state['values']['fields']['_add_existing_field'];
 
@@ -529,21 +529,21 @@ protected function validateAddExisting(array $form, array &$form_state) {
   public function submitForm(array &$form, array &$form_state) {
     $form_values = $form_state['values']['fields'];
 
-    $bundle_settings = field_bundle_settings($this->entity_type, $this->bundle);
+    $subtype_settings = field_subtype_settings($this->entity_type, $this->subtype);
 
     // Update field weights.
     foreach ($form_values as $key => $values) {
       if (in_array($key, $form['#fields'])) {
-        $instance = field_read_instance($this->entity_type, $key, $this->bundle);
+        $instance = field_read_instance($this->entity_type, $key, $this->subtype);
         $instance['widget']['weight'] = $values['weight'];
         field_update_instance($instance);
       }
       elseif (in_array($key, $form['#extra'])) {
-        $bundle_settings['extra_fields']['form'][$key]['weight'] = $values['weight'];
+        $subtype_settings['extra_fields']['form'][$key]['weight'] = $values['weight'];
       }
     }
 
-    field_bundle_settings($this->entity_type, $this->bundle, $bundle_settings);
+    field_subtype_settings($this->entity_type, $this->subtype, $subtype_settings);
 
     $destinations = array();
 
@@ -560,7 +560,7 @@ public function submitForm(array &$form, array &$form_state) {
       $instance = array(
         'field_name' => $field['field_name'],
         'entity_type' => $this->entity_type,
-        'bundle' => $this->bundle,
+        'subtype' => $this->subtype,
         'label' => $values['label'],
         'widget' => array(
           'type' => $values['widget_type'],
@@ -576,7 +576,7 @@ public function submitForm(array &$form, array &$form_state) {
         // Make sure the field is displayed in the 'default' view mode (using
         // default formatter and settings). It stays hidden for other view
         // modes until it is explicitly configured.
-        entity_get_display($this->entity_type, $this->bundle, 'default')
+        entity_get_display($this->entity_type, $this->subtype, 'default')
           ->setComponent($field['field_name'])
           ->save();
 
@@ -604,7 +604,7 @@ public function submitForm(array &$form, array &$form_state) {
         $instance = array(
           'field_name' => $field['field_name'],
           'entity_type' => $this->entity_type,
-          'bundle' => $this->bundle,
+          'subtype' => $this->subtype,
           'label' => $values['label'],
           'widget' => array(
             'type' => $values['widget_type'],
@@ -618,7 +618,7 @@ public function submitForm(array &$form, array &$form_state) {
           // Make sure the field is displayed in the 'default' view mode (using
           // default formatter and settings). It stays hidden for other view
           // modes until it is explicitly configured.
-          entity_get_display($this->entity_type, $this->bundle, 'default')
+          entity_get_display($this->entity_type, $this->subtype, 'default')
             ->setComponent($field['field_name'])
             ->save();
 
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
index 5a76dc1..1241a8a 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
@@ -22,11 +22,11 @@
   protected $entity_type = '';
 
   /**
-   * The entity bundle.
+   * The entity subtype.
    *
    * @var string
    */
-  protected $bundle = '';
+  protected $subtype = '';
 
   /**
    * The entity view mode.
@@ -43,21 +43,21 @@
   protected $adminPath = NULL;
 
   /**
-   * Constructs the overview object for a entity type, bundle and view mode.
+   * Constructs the overview object for a entity type, subtype and view mode.
    *
    * @param string $entity_type
    *   The entity type.
-   * @param string $bundle
-   *   The bundle for the entity of entity_type.
+   * @param string $subtype
+   *   The subtype for the entity of entity_type.
    * @param string $view_mode
    *   (optional) The view mode for the entity which takes a string or
    *   "default".
    */
-  public function __construct($entity_type, $bundle, $view_mode = NULL) {
+  public function __construct($entity_type, $subtype, $view_mode = NULL) {
     $this->entity_type = $entity_type;
-    $this->bundle = $bundle;
+    $this->subtype = $subtype;
     $this->view_mode = (isset($view_mode) ? $view_mode : 'default');
-    $this->adminPath = field_ui_bundle_admin_path($this->entity_type, $this->bundle);
+    $this->adminPath = field_ui_subtype_admin_path($this->entity_type, $this->subtype);
   }
 
   /**
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php
index 016b9d0..b3ab1f4 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php
@@ -57,7 +57,7 @@ function testDefaultWidgetPropertiesAlter() {
     $instance = array(
       'field_name' => 'alter_test_text',
       'entity_type' => 'node',
-      'bundle' => 'article',
+      'subtype' => 'article',
       'widget' => array(
         'type' => 'text_textfield',
         'size' => 60,
@@ -83,7 +83,7 @@ function testDefaultWidgetPropertiesAlter() {
     $instance = array(
       'field_name' => 'alter_test_options',
       'entity_type' => 'user',
-      'bundle' => 'user',
+      'subtype' => 'user',
       'widget' => array(
         'type' => 'options_select',
       )
@@ -92,7 +92,7 @@ function testDefaultWidgetPropertiesAlter() {
     $instance = array(
       'field_name' => 'alter_test_options',
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'widget' => array(
         'type' => 'options_select',
       )
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
index 2d3fb98..e852dc4 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
@@ -50,8 +50,8 @@ function setUp() {
   /**
    * Creates a new field through the Field UI.
    *
-   * @param $bundle_path
-   *   Admin path of the bundle that the new field is to be attached to.
+   * @param $subtype_path
+   *   Admin path of the subtype that the new field is to be attached to.
    * @param $initial_edit
    *   $edit parameter for drupalPost() on the first step ('Manage fields'
    *   screen).
@@ -62,7 +62,7 @@ function setUp() {
    *   $edit parameter for drupalPost() on the third step ('Instance settings'
    *   form).
    */
-  function fieldUIAddNewField($bundle_path, $initial_edit, $field_edit = array(), $instance_edit = array()) {
+  function fieldUIAddNewField($subtype_path, $initial_edit, $field_edit = array(), $instance_edit = array()) {
     // Use 'test_field' field type by default.
     $initial_edit += array(
       'fields[_add_new_field][type]' => 'test_field',
@@ -72,7 +72,7 @@ function fieldUIAddNewField($bundle_path, $initial_edit, $field_edit = array(),
     $field_name = $initial_edit['fields[_add_new_field][field_name]'];
 
     // First step : 'Add new field' on the 'Manage fields' page.
-    $this->drupalPost("$bundle_path/fields",  $initial_edit, t('Save'));
+    $this->drupalPost("$subtype_path/fields",  $initial_edit, t('Save'));
     $this->assertRaw(t('These settings apply to the %label field everywhere it is used.', array('%label' => $label)), 'Field settings page was displayed.');
 
     // Second step : 'Field settings' form.
@@ -90,8 +90,8 @@ function fieldUIAddNewField($bundle_path, $initial_edit, $field_edit = array(),
   /**
    * Adds an existing field through the Field UI.
    *
-   * @param $bundle_path
-   *   Admin path of the bundle that the field is to be attached to.
+   * @param $subtype_path
+   *   Admin path of the subtype that the field is to be attached to.
    * @param $initial_edit
    *   $edit parameter for drupalPost() on the first step ('Manage fields'
    *   screen).
@@ -99,7 +99,7 @@ function fieldUIAddNewField($bundle_path, $initial_edit, $field_edit = array(),
    *   $edit parameter for drupalPost() on the second step ('Instance settings'
    *   form).
    */
-  function fieldUIAddExistingField($bundle_path, $initial_edit, $instance_edit = array()) {
+  function fieldUIAddExistingField($subtype_path, $initial_edit, $instance_edit = array()) {
     // Use 'test_field_widget' by default.
     $initial_edit += array(
       'fields[_add_existing_field][widget_type]' => 'test_field_widget',
@@ -108,7 +108,7 @@ function fieldUIAddExistingField($bundle_path, $initial_edit, $instance_edit = a
     $field_name = $initial_edit['fields[_add_existing_field][field_name]'];
 
     // First step : 'Re-use existing field' on the 'Manage fields' page.
-    $this->drupalPost("$bundle_path/fields", $initial_edit, t('Save'));
+    $this->drupalPost("$subtype_path/fields", $initial_edit, t('Save'));
 
     // Second step : 'Instance settings' form.
     $this->drupalPost(NULL, $instance_edit, t('Save settings'));
@@ -121,23 +121,23 @@ function fieldUIAddExistingField($bundle_path, $initial_edit, $instance_edit = a
   /**
    * Deletes a field instance through the Field UI.
    *
-   * @param $bundle_path
-   *   Admin path of the bundle that the field instance is to be deleted from.
+   * @param $subtype_path
+   *   Admin path of the subtype that the field instance is to be deleted from.
    * @param $field_name
    *   The name of the field.
    * @param $label
    *   The label of the field.
-   * @param $bundle_label
-   *   The label of the bundle.
+   * @param $subtype_label
+   *   The label of the subtype.
    */
-  function fieldUIDeleteField($bundle_path, $field_name, $label, $bundle_label) {
+  function fieldUIDeleteField($subtype_path, $field_name, $label, $subtype_label) {
     // Display confirmation form.
-    $this->drupalGet("$bundle_path/fields/$field_name/delete");
+    $this->drupalGet("$subtype_path/fields/$field_name/delete");
     $this->assertRaw(t('Are you sure you want to delete the field %label', array('%label' => $label)), 'Delete confirmation was found.');
 
     // Submit confirmation form.
     $this->drupalPost(NULL, array(), t('Delete'));
-    $this->assertRaw(t('The field %label has been deleted from the %type content type.', array('%label' => $label, '%type' => $bundle_label)), 'Delete message was found.');
+    $this->assertRaw(t('The field %label has been deleted from the %type content type.', array('%label' => $label, '%type' => $subtype_label)), 'Delete message was found.');
 
     // Check that the field does not appear in the overview form.
     $this->assertNoFieldByXPath('//table[@id="field-overview"]//span[@class="label-field"]', $label, 'Field does not appear in the overview page.');
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
index cbc132f..178a901 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
@@ -49,7 +49,7 @@ function setUp() {
       'field_name' => 'field_' . $vocabulary->id(),
       'entity_type' => 'node',
       'label' => 'Tags',
-      'bundle' => 'article',
+      'subtype' => 'article',
     );
     field_create_instance($instance);
   }
@@ -215,8 +215,8 @@ function cardinalitySettings() {
   /**
    * Asserts field settings are as expected.
    *
-   * @param $bundle
-   *   The bundle name for the instance.
+   * @param $subtype
+   *   The subtype name for the instance.
    * @param $field_name
    *   The field name for the instance.
    * @param $string
@@ -224,7 +224,7 @@ function cardinalitySettings() {
    * @param $entity_type
    *   The entity type for the instance.
    */
-  function assertFieldSettings($bundle, $field_name, $string = 'dummy test string', $entity_type = 'node') {
+  function assertFieldSettings($subtype, $field_name, $string = 'dummy test string', $entity_type = 'node') {
     // Reset the fields info.
     field_info_cache_clear();
     // Assert field settings.
@@ -232,7 +232,7 @@ function assertFieldSettings($bundle, $field_name, $string = 'dummy test string'
     $this->assertTrue($field['settings']['test_field_setting'] == $string, 'Field settings were found.');
 
     // Assert instance and widget settings.
-    $instance = field_info_instance($entity_type, $field_name, $bundle);
+    $instance = field_info_instance($entity_type, $field_name, $subtype);
     $this->assertTrue($instance['settings']['test_instance_setting'] == $string, 'Field instance settings were found.');
     $this->assertTrue($instance['widget']['settings']['test_widget_setting'] == $string, 'Field widget settings were found.');
   }
@@ -251,7 +251,7 @@ function testDefaultValue() {
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'node',
-      'bundle' => $this->type,
+      'subtype' => $this->type,
     );
     field_create_instance($instance);
 
@@ -299,12 +299,12 @@ function testDefaultValue() {
    */
   function testDeleteField() {
     // Create a new field.
-    $bundle_path1 = 'admin/structure/types/manage/' . $this->type;
+    $subtype_path1 = 'admin/structure/types/manage/' . $this->type;
     $edit1 = array(
       'fields[_add_new_field][label]' => $this->field_label,
       'fields[_add_new_field][field_name]' => $this->field_name_input,
     );
-    $this->fieldUIAddNewField($bundle_path1, $edit1);
+    $this->fieldUIAddNewField($subtype_path1, $edit1);
 
     // Create an additional node type.
     $type_name2 = strtolower($this->randomName(8)) . '_test';
@@ -312,15 +312,15 @@ function testDeleteField() {
     $type_name2 = $type2->type;
 
     // Add an instance to the second node type.
-    $bundle_path2 = 'admin/structure/types/manage/' . $type_name2;
+    $subtype_path2 = 'admin/structure/types/manage/' . $type_name2;
     $edit2 = array(
       'fields[_add_existing_field][label]' => $this->field_label,
       'fields[_add_existing_field][field_name]' => $this->field_name,
     );
-    $this->fieldUIAddExistingField($bundle_path2, $edit2);
+    $this->fieldUIAddExistingField($subtype_path2, $edit2);
 
     // Delete the first instance.
-    $this->fieldUIDeleteField($bundle_path1, $this->field_name, $this->field_label, $this->type);
+    $this->fieldUIDeleteField($subtype_path1, $this->field_name, $this->field_label, $this->type);
 
     // Reset the fields info.
     field_info_cache_clear();
@@ -330,7 +330,7 @@ function testDeleteField() {
     $this->assertNotNull(field_info_field($this->field_name), 'Field was not deleted.');
 
     // Delete the second instance.
-    $this->fieldUIDeleteField($bundle_path2, $this->field_name, $this->field_label, $type_name2);
+    $this->fieldUIDeleteField($subtype_path2, $this->field_name, $this->field_label, $type_name2);
 
     // Reset the fields info.
     field_info_cache_clear();
@@ -344,10 +344,10 @@ function testDeleteField() {
    * Tests that Field UI respects the 'no_ui' option in hook_field_info().
    */
   function testHiddenFields() {
-    $bundle_path = 'admin/structure/types/manage/' . $this->type . '/fields/';
+    $subtype_path = 'admin/structure/types/manage/' . $this->type . '/fields/';
 
     // Check that the field type is not available in the 'add new field' row.
-    $this->drupalGet($bundle_path);
+    $this->drupalGet($subtype_path);
     $this->assertFalse($this->xpath('//select[@id="edit-add-new-field-type"]//option[@value="hidden_test_field"]'), "The 'add new field' select respects field types 'no_ui' property.");
 
     // Create a field and an instance programmatically.
@@ -355,7 +355,7 @@ function testHiddenFields() {
     field_create_field(array('field_name' => $field_name, 'type' => $field_name));
     $instance = array(
       'field_name' => $field_name,
-      'bundle' => $this->type,
+      'subtype' => $this->type,
       'entity_type' => 'node',
       'label' => t('Hidden field'),
       'widget' => array('type' => 'test_field_widget'),
@@ -365,20 +365,20 @@ function testHiddenFields() {
 
     // Check that the newly added instance appears on the 'Manage Fields'
     // screen.
-    $this->drupalGet($bundle_path);
+    $this->drupalGet($subtype_path);
     $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $instance['label'], 'Field was created and appears in the overview page.');
 
     // Check that the instance does not appear in the 're-use existing field' row
-    // on other bundles.
-    $bundle_path = 'admin/structure/types/manage/article/fields/';
-    $this->drupalGet($bundle_path);
+    // on other subtypes.
+    $subtype_path = 'admin/structure/types/manage/article/fields/';
+    $this->drupalGet($subtype_path);
     $this->assertFalse($this->xpath('//select[@id="edit-add-existing-field-field-name"]//option[@value=:field_name]', array(':field_name' => $field_name)), "The 're-use existing field' select respects field types 'no_ui' property.");
   }
 
   /**
-   * Tests renaming a bundle.
+   * Tests renaming a subtype.
    */
-  function testRenameBundle() {
+  function testRenameSubtype() {
     $type2 = strtolower($this->randomName(8)) . '_test';
 
     $options = array(
@@ -455,15 +455,15 @@ function testWidgetChange() {
    */
   function testDeleteTaxonomyField() {
     // Create a new field.
-    $bundle_path = 'admin/structure/taxonomy/tags';
+    $subtype_path = 'admin/structure/taxonomy/tags';
     $edit1 = array(
       'fields[_add_new_field][label]' => $this->field_label,
       'fields[_add_new_field][field_name]' => $this->field_name_input,
     );
-    $this->fieldUIAddNewField($bundle_path, $edit1);
+    $this->fieldUIAddNewField($subtype_path, $edit1);
 
     // Delete the field.
-    $this->fieldUIDeleteField($bundle_path, $this->field_name, $this->field_label, 'Tags');
+    $this->fieldUIDeleteField($subtype_path, $this->field_name, $this->field_label, 'Tags');
 
     // Reset the fields info.
     field_info_cache_clear();
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index 69fcbf3..9895b2c 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -1534,12 +1534,12 @@ function file_get_file_references(File $file, $field = NULL, $age = FIELD_LOAD_R
       $match_entity_type = $age == FIELD_LOAD_REVISION || !isset($entity_info['entity_keys']['revision']);
       $entities = entity_load_multiple($entity_type, $entity_ids);
       foreach ($entities as $entity) {
-        $bundle = $entity->bundle();
-        // We need to find file fields for this entity type and bundle.
-        if (!isset($file_fields[$entity_type][$bundle])) {
-          $file_fields[$entity_type][$bundle] = array();
+        $subtype = $entity->subtype();
+        // We need to find file fields for this entity type and subtype.
+        if (!isset($file_fields[$entity_type][$subtype])) {
+          $file_fields[$entity_type][$subtype] = array();
           // This contains the possible field names.
-          $instances = field_info_instances($entity_type, $bundle);
+          $instances = field_info_instances($entity_type, $subtype);
           foreach ($instances as $field_name => $instance) {
             $current_field = field_info_field($field_name);
             // If this is the first time this field type is seen, check
@@ -1549,11 +1549,11 @@ function file_get_file_references(File $file, $field = NULL, $age = FIELD_LOAD_R
             }
             // If the field type does reference files then record it.
             if ($field_columns[$current_field['type']]) {
-              $file_fields[$entity_type][$bundle][$field_name] = $field_columns[$current_field['type']];
+              $file_fields[$entity_type][$subtype][$field_name] = $field_columns[$current_field['type']];
             }
           }
         }
-        foreach ($file_fields[$entity_type][$bundle] as $field_name => $field_column) {
+        foreach ($file_fields[$entity_type][$subtype] as $field_name => $field_column) {
           $match = $match_entity_type;
           // If we didn't match yet then iterate over the field items to find
           // the referenced file. This will fail if the usage checked is in a
diff --git a/core/modules/file/file.views.inc b/core/modules/file/file.views.inc
index 6b0fb59..f7f80a8 100644
--- a/core/modules/file/file.views.inc
+++ b/core/modules/file/file.views.inc
@@ -473,7 +473,7 @@ function file_field_views_data($field) {
  * Views integration to provide reverse relationships on file fields.
  */
 function file_field_views_data_views_data_alter(&$data, $field) {
-  foreach ($field['bundles'] as $entity_type => $bundles) {
+  foreach ($field['subtypes'] as $entity_type => $subtypes) {
     $entity_info = entity_get_info($entity_type);
     $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type;
 
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
index 52df6f2..0e652d5 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
@@ -84,8 +84,8 @@ function createFileField($name, $type_name, $field_settings = array(), $instance
    *   The name of the new field (all lowercase), exclude the "field_" prefix.
    * @param $entity_type
    *   The entity type this field will be added to.
-   * @param $bundle
-   *   The bundle this field will be added to.
+   * @param $subtype
+   *   The subtype this field will be added to.
    * @param $field_settings
    *   A list of field settings that will be added to the defaults.
    * @param $instance_settings
@@ -93,12 +93,12 @@ function createFileField($name, $type_name, $field_settings = array(), $instance
    * @param $widget_settings
    *   A list of widget settings that will be added to the widget defaults.
    */
-  function attachFileField($name, $entity_type, $bundle, $instance_settings = array(), $widget_settings = array()) {
+  function attachFileField($name, $entity_type, $subtype, $instance_settings = array(), $widget_settings = array()) {
     $instance = array(
       'field_name' => $name,
       'label' => $name,
       'entity_type' => $entity_type,
-      'bundle' => $bundle,
+      'subtype' => $subtype,
       'required' => !empty($instance_settings['required']),
       'settings' => array(),
       'widget' => array(
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php b/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php
index be275f1..98518ff 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php
@@ -53,7 +53,7 @@ public function setUp() {
     $instance = array(
       'entity_type' => 'entity_test',
       'field_name' => 'file_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'options_select',
       ),
diff --git a/core/modules/file/tests/file_module_test.module b/core/modules/file/tests/file_module_test.module
index b962e2a..0d593e5 100644
--- a/core/modules/file/tests/file_module_test.module
+++ b/core/modules/file/tests/file_module_test.module
@@ -76,7 +76,7 @@ function file_module_test_form_submit($form, &$form_state) {
  * Implements hook_file_download_access().
  */
 function file_module_test_file_download_access($field, EntityInterface $entity, File $file) {
-  $instance = field_info_instance($entity->entityType(), $field['field_name'], $entity->bundle());
+  $instance = field_info_instance($entity->entityType(), $field['field_name'], $entity->subtype());
   // Allow the file to be downloaded only if the given arguments are correct.
   // If any are wrong, $instance will be NULL.
   if (empty($instance)) {
diff --git a/core/modules/forum/forum.install b/core/modules/forum/forum.install
index b1e63de..fbe799c 100644
--- a/core/modules/forum/forum.install
+++ b/core/modules/forum/forum.install
@@ -80,12 +80,12 @@ function forum_enable() {
     ));
     taxonomy_term_save($term);
 
-    // Create the instance on the bundle.
+    // Create the instance on the subtype.
     $instance = array(
       'field_name' => 'taxonomy_forums',
       'entity_type' => 'node',
       'label' => $vocabulary->name,
-      'bundle' => 'forum',
+      'subtype' => 'forum',
       'required' => TRUE,
       'widget' => array(
         'type' => 'options_select',
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 8b35c3e..17b0b8e 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -176,9 +176,9 @@ function forum_menu_local_tasks(&$data, $router_item, $root_path) {
     $forum_term = forum_forum_load($tid);
     if ($forum_term) {
       $links = array();
-      // Loop through all bundles for forum taxonomy vocabulary field.
+      // Loop through all subtypes for forum taxonomy vocabulary field.
       $field = field_info_field('taxonomy_forums');
-      foreach ($field['bundles']['node'] as $type) {
+      foreach ($field['subtypes']['node'] as $type) {
         if (node_access('create', $type)) {
           $links[$type] = array(
             '#theme' => 'menu_local_action',
@@ -218,13 +218,13 @@ function forum_menu_local_tasks(&$data, $router_item, $root_path) {
 }
 
 /**
- * Implements hook_entity_bundle_info_alter().
+ * Implements hook_entity_subtype_info_alter().
  */
-function forum_entity_bundle_info_alter(&$bundles) {
+function forum_entity_subtype_info_alter(&$subtypes) {
   // Take over URI construction for taxonomy terms that are forums.
   if ($vid = config('forum.settings')->get('vocabulary')) {
-    if (isset($bundles['taxonomy_term'][$vid])) {
-      $bundles['taxonomy_term'][$vid]['uri_callback'] = 'forum_uri';
+    if (isset($subtypes['taxonomy_term'][$vid])) {
+      $subtypes['taxonomy_term'][$vid]['uri_callback'] = 'forum_uri';
     }
   }
 }
@@ -303,7 +303,7 @@ function forum_node_validate(Node $node, $form) {
         }
         $used = db_query_range('SELECT 1 FROM {taxonomy_term_data} WHERE tid = :tid AND vid = :vid', 0, 1, array(
           ':tid' => $term->tid,
-          ':vid' => $term->bundle(),
+          ':vid' => $term->subtype(),
         ))->fetchField();
         if ($used && in_array($term->tid, $containers)) {
           form_set_error('taxonomy_forums', t('The item %forum is a forum container, not a forum. Select one of the forums below instead.', array('%forum' => $term->label())));
@@ -707,7 +707,7 @@ function forum_forum_load($tid = NULL) {
   // Load and validate the parent term.
   if ($tid) {
     $forum_term = taxonomy_term_load($tid);
-    if (!$forum_term || ($forum_term->bundle() != $vid)) {
+    if (!$forum_term || ($forum_term->subtype() != $vid)) {
       return $cache[$tid] = FALSE;
     }
   }
@@ -1300,7 +1300,7 @@ function forum_rdf_mapping() {
   return array(
     array(
       'type' => 'node',
-      'bundle' => 'forum',
+      'subtype' => 'forum',
       'mapping' => array(
         'rdftype' => array('sioc:Post', 'sioct:BoardPost'),
         'taxonomy_forums' => array(
@@ -1311,7 +1311,7 @@ function forum_rdf_mapping() {
     ),
     array(
       'type' => 'taxonomy_term',
-      'bundle' => 'forums',
+      'subtype' => 'forums',
       'mapping' => array(
         'rdftype' => array('sioc:Container', 'sioc:Forum'),
       ),
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php
index 02314e8..0224b88 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php
@@ -105,7 +105,7 @@ public function testActiveForumTopicsBlock() {
       $date->modify('+1 minute');
       $comment = entity_create('comment', array(
         'nid' => $node->nid,
-        'node_type' => 'node_type_' . $node->bundle(),
+        'node_type' => 'node_type_' . $node->subtype(),
         'subject' => $this->randomString(20),
         'comment_body' => $this->randomString(256),
         'created' => $date->getTimestamp(),
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index b2816de..934288f 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -360,7 +360,7 @@ function image_image_style_update(ImageStyle $style) {
         $view_modes = entity_get_view_modes($instance['entity_type']);
         $view_modes = array('default') + array_keys($view_modes);
         foreach ($view_modes as $view_mode) {
-          $display = entity_get_display($instance['entity_type'], $instance['bundle'], $view_mode);
+          $display = entity_get_display($instance['entity_type'], $instance['subtype'], $view_mode);
           $display_options = $display->getComponent($instance['field_name']);
 
           // Check if the formatter involves an image style.
diff --git a/core/modules/image/image.views.inc b/core/modules/image/image.views.inc
index 77c4ea3..6567f77 100644
--- a/core/modules/image/image.views.inc
+++ b/core/modules/image/image.views.inc
@@ -36,7 +36,7 @@ function image_field_views_data($field) {
  * Views integration to provide reverse relationships on image fields.
  */
 function image_field_views_data_views_data_alter(&$data, $field) {
-  foreach ($field['bundles'] as $entity_type => $bundles) {
+  foreach ($field['subtypes'] as $entity_type => $subtypes) {
     $entity_info = entity_get_info($entity_type);
     $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type;
 
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
index 01fa5f4..692c158 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
@@ -59,7 +59,7 @@ function testDefaultImages() {
     $instance2 = array(
       'field_name' => $field['field_name'],
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'label' => $instance['label'],
       'required' => $instance['required'],
       'settings' => array(
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
index 5a4e20e..d59d5ee 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
@@ -81,7 +81,7 @@ function createImageField($name, $type_name, $field_settings = array(), $instanc
       'field_name' => $field['field_name'],
       'entity_type' => 'node',
       'label' => $name,
-      'bundle' => $type_name,
+      'subtype' => $type_name,
       'required' => !empty($instance_settings['required']),
       'description' => !empty($instance_settings['description']) ? $instance_settings['description'] : '',
       'settings' => array(),
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
index 14e7e00..fba4489 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
@@ -48,7 +48,7 @@ public function denormalize($data, $class, $format = null, array $context = arra
       throw new UnexpectedValueException('JSON-LD @type parameter must be included.');
     }
 
-    // Every bundle has a type, identified by URI. The incoming data should
+    // Every subtype has a type, identified by URI. The incoming data should
     // either include a type URI from this site's schema, or one of the type
     // URIs in the incoming data must map to a site schema URI when passed
     // through the RDF mapping manager.
@@ -65,7 +65,7 @@ public function denormalize($data, $class, $format = null, array $context = arra
     }
 
     $values = array(
-      'type' => $typed_data_ids['bundle'],
+      'type' => $typed_data_ids['subtype'],
     );
     // If the data specifies a default language, use it to create the entity.
     if (isset($data['langcode'])) {
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityWrapper.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityWrapper.php
index a2e49e3..9cd021f 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityWrapper.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityWrapper.php
@@ -90,7 +90,7 @@ public function getId() {
    */
   public function getTypeUri() {
     $entity_type = $this->entity->entityType();
-    $bundle = $this->entity->bundle();
+    $subtype = $this->entity->subtype();
     switch ($this->format) {
       case 'drupal_jsonld':
         $schema_path = SiteSchema::CONTENT_DEPLOYMENT;
@@ -99,7 +99,7 @@ public function getTypeUri() {
         $schema_path = SiteSchema::SYNDICATION;
     }
     $schema = $this->siteSchemaManager->getSchema($schema_path);
-    return $schema->bundle($entity_type, $bundle)->getUri();
+    return $schema->subtype($entity_type, $subtype)->getUri();
   }
 
   /**
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
index a9e057d..0e65cef 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
@@ -142,9 +142,9 @@ public function testNormalize() {
 
   function testDenormalize() {
     $schema = new SiteSchema(SiteSchema::CONTENT_DEPLOYMENT);
-    $bundle_uri = $schema->bundle('entity_test', 'entity_test')->getUri();
+    $subtype_uri = $schema->subtype('entity_test', 'entity_test')->getUri();
     $incoming_data = array(
-      '@type' => $bundle_uri,
+      '@type' => $subtype_uri,
       'name' => array(
         'en' => array(
           array(
@@ -169,7 +169,7 @@ function testDenormalize() {
 
     // Test valid request.
     $entity = $this->normalizers['entity']->denormalize($incoming_data, 'Drupal\Core\Entity\EntityNG', static::$format);
-    $this->assertEqual('entity_test', $entity->bundle(), "Denormalize creates entity with correct bundle.");
+    $this->assertEqual('entity_test', $entity->subtype(), "Denormalize creates entity with correct subtype.");
     $this->assertEqual($incoming_data['name']['en'], $entity->get('name')->getValue(), "Translatable field denormalized correctly in default language.");
     $this->assertEqual($incoming_data['name']['de'], $entity->getTranslation('de')->get('name')->getValue(), "Translatable field denormalized correctly in translation language.");
     $this->assertEqual($incoming_data['field_test_text']['und'], $entity->get('field_test_text')->getValue(), "Untranslatable field denormalized correctly.");
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/RdfSchemaSerializationTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/RdfSchemaSerializationTest.php
index eacf9df..113ed47 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/RdfSchemaSerializationTest.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/RdfSchemaSerializationTest.php
@@ -32,21 +32,21 @@ function testSchemaSerialization() {
     // url() requires the {url_alias} table.
     $this->installSchema('system', 'url_alias');
 
-    $entity_type = $bundle = 'entity_test';
+    $entity_type = $subtype = 'entity_test';
 
-    // Set up the bundle schema for the entity_test bundle.
+    // Set up the subtype schema for the entity_test subtype.
     $schema = new SiteSchema(SiteSchema::CONTENT_DEPLOYMENT);
-    $bundle_schema = $schema->bundle($entity_type, $bundle);
+    $subtype_schema = $schema->subtype($entity_type, $subtype);
     // Set up the serializer.
     $setup_helper = new JsonldTestSetupHelper();
     $normalizer = new JsonldRdfSchemaNormalizer($setup_helper->getSiteSchemaManager(), $setup_helper->getRdfMappingManager());
     $serializer = new Serializer(array($normalizer), array(new JsonldEncoder()));
 
-    $serialized = $serializer->serialize($bundle_schema, 'jsonld');
+    $serialized = $serializer->serialize($subtype_schema, 'jsonld');
     $decoded = json_decode($serialized);
     $parsed_term = $decoded[0];
 
-    $this->assertEqual($parsed_term->{'@id'}, $bundle_schema->getUri(), 'JSON-LD for schema term uses correct @id.');
+    $this->assertEqual($parsed_term->{'@id'}, $subtype_schema->getUri(), 'JSON-LD for schema term uses correct @id.');
     $this->assertEqual($parsed_term->{'@type'}, 'http://www.w3.org/2000/01/rdf-schema#class', 'JSON-LD for schema term uses correct @type.');
     // The @id and @type should be placed in the beginning of the array.
     $array_keys = array_keys((array) $parsed_term);
diff --git a/core/modules/language/language.admin.css b/core/modules/language/language.admin.css
index 2af92d7..eb10cd1 100644
--- a/core/modules/language/language.admin.css
+++ b/core/modules/language/language.admin.css
@@ -3,11 +3,11 @@
  * Styles for the content language administration page.
  */
 
-#language-content-settings-form table .bundle {
+#language-content-settings-form table .subtype {
   width: 25%;
 }
 
-#language-content-settings-form table td.bundle {
+#language-content-settings-form table td.subtype {
   font-weight: bold;
 }
 
diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index a3500fd..b827a34 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -989,12 +989,12 @@ function language_content_settings_form(array $form, array $form_state, array $s
     $default[$entity_type] = FALSE;
 
     // Check whether we have any custom setting.
-    foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) {
-      $conf = language_get_default_configuration($entity_type, $bundle);
+    foreach (entity_get_subtypes($entity_type) as $subtype => $subtype_info) {
+      $conf = language_get_default_configuration($entity_type, $subtype);
       if (!empty($conf['language_show']) || $conf['langcode'] != 'site_default') {
         $default[$entity_type] = $entity_type;
       }
-      $language_configuration[$entity_type][$bundle] = $conf;
+      $language_configuration[$entity_type][$subtype] = $conf;
     }
   }
 
@@ -1023,7 +1023,7 @@ function language_content_settings_form(array $form, array $form_state, array $s
       '#type' => 'container',
       '#entity_type' => $entity_type,
       '#theme' => 'language_content_settings_table',
-      '#bundle_label' => isset($info['bundle_label']) ? $info['bundle_label'] : $labels[$entity_type],
+      '#subtype_label' => isset($info['subtype_label']) ? $info['subtype_label'] : $labels[$entity_type],
       '#states' => array(
         'visible' => array(
           ':input[name="entity_types[' . $entity_type . ']"]' => array('checked' => TRUE),
@@ -1031,17 +1031,17 @@ function language_content_settings_form(array $form, array $form_state, array $s
       ),
     );
 
-    foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) {
-      $form['settings'][$entity_type][$bundle]['settings'] = array(
+    foreach (entity_get_subtypes($entity_type) as $subtype => $subtype_info) {
+      $form['settings'][$entity_type][$subtype]['settings'] = array(
         '#type' => 'item',
-        '#label' => $bundle_info['label'],
+        '#label' => $subtype_info['label'],
         'language' => array(
           '#type' => 'language_configuration',
           '#entity_information' => array(
             'entity_type' => $entity_type,
-            'bundle' => $bundle,
+            'subtype' => $subtype,
           ),
-          '#default_value' => $language_configuration[$entity_type][$bundle],
+          '#default_value' => $language_configuration[$entity_type][$subtype],
         ),
       );
     }
@@ -1060,13 +1060,13 @@ function language_content_settings_form(array $form, array $form_state, array $s
  * Implements hook_preprocess_HOOK() for theme_language_content_settings_table().
  */
 function template_preprocess_language_content_settings_table(&$variables) {
-  // Add a render element representing the bundle language settings table.
+  // Add a render element representing the subtype language settings table.
   $element = $variables['element'];
 
   $header = array(
     array(
-      'data' => $element['#bundle_label'],
-      'class' => array('bundle'),
+      'data' => $element['#subtype_label'],
+      'class' => array('subtype'),
     ),
     array(
       'data' => t('Configuration'),
@@ -1075,23 +1075,23 @@ function template_preprocess_language_content_settings_table(&$variables) {
   );
 
   $rows = array();
-  foreach (element_children($element) as $bundle) {
-    $rows[$bundle] = array(
+  foreach (element_children($element) as $subtype) {
+    $rows[$subtype] = array(
       'data' => array(
         array(
           'data' => array(
             '#prefix' => '<label>',
             '#suffix' => '</label>',
-            '#markup' => check_plain($element[$bundle]['settings']['#label']),
+            '#markup' => check_plain($element[$subtype]['settings']['#label']),
           ),
-          'class' => array('bundle'),
+          'class' => array('subtype'),
         ),
         array(
-          'data' => $element[$bundle]['settings'],
+          'data' => $element[$subtype]['settings'],
           'class' => array('operations'),
         ),
       ),
-      'class' => array('bundle-settings'),
+      'class' => array('subtype-settings'),
     );
   }
 
@@ -1108,7 +1108,7 @@ function template_preprocess_language_content_settings_table(&$variables) {
  *
  * @param array $variables
  *   An associative array containing:
- *   - build: A render element representing a table of bundle content language
+ *   - build: A render element representing a table of subtype content language
  *     settings for a particular entity type.
  *
  * @ingroup themable
@@ -1124,8 +1124,8 @@ function language_content_settings_form_submit(array $form, array &$form_state)
   $entity_types = $form_state['values']['entity_types'];
   $settings = &$form_state['values']['settings'];
   foreach ($settings as $entity_type => $entity_settings) {
-    foreach ($entity_settings as $bundle => $bundle_settings) {
-      language_save_default_configuration($entity_type, $bundle, $bundle_settings['settings']['language']);
+    foreach ($entity_settings as $subtype => $subtype_settings) {
+      language_save_default_configuration($entity_type, $subtype, $subtype_settings['settings']['language']);
     }
   }
   drupal_set_message(t('Settings successfully updated.'));
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 81b9715..c280f6e 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -319,7 +319,7 @@ function language_configuration_element_process($element, &$form_state, &$form)
     '#default_value' => isset($element['#default_value']['language_show']) ? $element['#default_value']['language_show'] : NULL,
   );
 
-  // Add the entity type and bundle information to the form if they are set.
+  // Add the entity type and subtype information to the form if they are set.
   // They will be used, in the submit handler, to generate the names of the
   // variables that will store the settings and are a way to uniquely identify
   // the entity.
@@ -329,7 +329,7 @@ function language_configuration_element_process($element, &$form_state, &$form)
   $form_state['language'] += array(
     $element['#name'] => array(
       'entity_type' => $element['#entity_information']['entity_type'],
-      'bundle' => $element['#entity_information']['bundle'],
+      'subtype' => $element['#entity_information']['subtype'],
     ),
   );
 
@@ -344,42 +344,42 @@ function language_configuration_element_submit(&$form, &$form_state) {
   // values.
   if (isset($form_state['language'])) {
     foreach ($form_state['language'] as $element_name => $values) {
-      language_save_default_configuration($values['entity_type'], $values['bundle'],  $form_state['values'][$element_name]);
+      language_save_default_configuration($values['entity_type'], $values['subtype'],  $form_state['values'][$element_name]);
     }
   }
 }
 
 /**
- * Saves a language configuration that is attached to an entity type and bundle.
+ * Saves a language configuration that is attached to an entity type and subtype.
  *
  * @param string $entity_type
  *   A string representing the entity type.
- * @param string $bundle
- *   A string representing the bundle.
+ * @param string $subtype
+ *   A string representing the subtype.
  * @param array $values
  *   An array holding the values to be saved having the following keys:
  *   - langcode: the language code.
  *   - language_show: if the language element should be hidden or not.
  */
-function language_save_default_configuration($entity_type, $bundle, $values = array()) {
-  config('language.settings')->set(language_get_default_configuration_settings_key($entity_type, $bundle), array('langcode' => $values['langcode'], 'language_show' => $values['language_show']))->save();
+function language_save_default_configuration($entity_type, $subtype, $values = array()) {
+  config('language.settings')->set(language_get_default_configuration_settings_key($entity_type, $subtype), array('langcode' => $values['langcode'], 'language_show' => $values['language_show']))->save();
 }
 
 /**
- * Returns the language configuration stored for an entity type and bundle.
+ * Returns the language configuration stored for an entity type and subtype.
  *
  * @param string $entity_type
  *   A string representing the entity type.
- * @param string $bundle
- *   A string representing the bundle.
+ * @param string $subtype
+ *   A string representing the subtype.
  *
  * @return array
  *   An array with the following keys:
  *   - langcode: the language code.
  *   - language_show: if the language element is hidden or not.
  */
-function language_get_default_configuration($entity_type, $bundle) {
-  $configuration = config('language.settings')->get(language_get_default_configuration_settings_key($entity_type, $bundle));
+function language_get_default_configuration($entity_type, $subtype) {
+  $configuration = config('language.settings')->get(language_get_default_configuration_settings_key($entity_type, $subtype));
   if (is_null($configuration)) {
     $configuration = array();
   }
@@ -388,36 +388,36 @@ function language_get_default_configuration($entity_type, $bundle) {
 }
 
 /**
- * Clears the default language configuration for an entity type and bundle.
+ * Clears the default language configuration for an entity type and subtype.
  *
  * @param string $entity_type
  *   A string representing the entity type.
- * @param string $bundle
- *   A string representing the bundle.
+ * @param string $subtype
+ *   A string representing the subtype.
  */
-function language_clear_default_configuration($entity_type, $bundle) {
-  config('language.settings')->clear(language_get_default_configuration_settings_key($entity_type, $bundle))->save();
+function language_clear_default_configuration($entity_type, $subtype) {
+  config('language.settings')->clear(language_get_default_configuration_settings_key($entity_type, $subtype))->save();
 }
 
 /**
  * Returns the root name of the variables used to store the configuration.
  *
- * Based on the entity type and bundle, the variables used to store the
+ * Based on the entity type and subtype, the variables used to store the
  * configuration will have a common root name.
  *
  * @param string $entity_type
  *   A string representing the entity type.
- * @param string $bundle
- *   A string representing the bundle.
+ * @param string $subtype
+ *   A string representing the subtype.
  *
  * @return string
  *   The root name of the variables.
  */
-function language_get_default_configuration_settings_key($entity_type, $bundle) {
+function language_get_default_configuration_settings_key($entity_type, $subtype) {
   // Replace all the characters that are not letters, numbers or "_" with "_".
   $entity_type = preg_replace('/[^0-9a-zA-Z_]/', "_", $entity_type);
-  $bundle = preg_replace('/[^0-9a-zA-Z_]/', "_", $bundle);
-  return $entity_type . '.' . $bundle . '.language.default_configuration';
+  $subtype = preg_replace('/[^0-9a-zA-Z_]/', "_", $subtype);
+  return $entity_type . '.' . $subtype . '.language.default_configuration';
 }
 
 /**
@@ -431,18 +431,18 @@ function language_node_type_update($info) {
 }
 
 /**
- * Returns the default language code assigned to an entity type and a bundle.
+ * Returns the default language code assigned to an entity type and a subtype.
  *
  * @param string $entity_type
  *   The entity type.
- * @param string $bundle
- *   The bundle name.
+ * @param string $subtype
+ *   The subtype name.
  *
  * @return string
  *   The language code.
  */
-function language_get_default_langcode($entity_type, $bundle) {
-  $configuration = language_get_default_configuration($entity_type, $bundle);
+function language_get_default_langcode($entity_type, $subtype) {
+  $configuration = language_get_default_configuration($entity_type, $subtype);
 
   if (!isset($configuration['langcode'])) {
     $configuration['langcode'] = 'site_default';
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
index 55d6e8a..61b69cd 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
@@ -38,7 +38,7 @@ public function testLanguageConfigurationElement() {
     $edit['lang_configuration[langcode]'] = 'current_interface';
     $edit['lang_configuration[language_show]'] = FALSE;
     $this->drupalPost(NULL, $edit, 'Save');
-    $lang_conf = language_get_default_configuration('some_custom_type', 'some_bundle');
+    $lang_conf = language_get_default_configuration('some_custom_type', 'some_subtype');
 
     // Check that the settings have been saved.
     $this->assertEqual($lang_conf['langcode'], 'current_interface');
@@ -52,7 +52,7 @@ public function testLanguageConfigurationElement() {
     $edit['lang_configuration[langcode]'] = 'authors_default';
     $edit['lang_configuration[language_show]'] = TRUE;
     $this->drupalPost(NULL, $edit, 'Save');
-    $lang_conf = language_get_default_configuration('some_custom_type', 'some_bundle');
+    $lang_conf = language_get_default_configuration('some_custom_type', 'some_subtype');
 
     // Check that the settings have been saved.
     $this->assertEqual($lang_conf['langcode'], 'authors_default');
@@ -76,13 +76,13 @@ public function testDefaultLangcode() {
     }
 
     // Fixed language.
-    language_save_default_configuration('custom_type', 'custom_bundle', array('langcode' => 'bb', 'language_show' => TRUE));
-    $langcode = language_get_default_langcode('custom_type', 'custom_bundle');
+    language_save_default_configuration('custom_type', 'custom_subtype', array('langcode' => 'bb', 'language_show' => TRUE));
+    $langcode = language_get_default_langcode('custom_type', 'custom_subtype');
     $this->assertEqual($langcode, 'bb');
 
     // Current interface.
-    language_save_default_configuration('custom_type', 'custom_bundle', array('langcode' => 'current_interface', 'language_show' => TRUE));
-    $langcode = language_get_default_langcode('custom_type', 'custom_bundle');
+    language_save_default_configuration('custom_type', 'custom_subtype', array('langcode' => 'current_interface', 'language_show' => TRUE));
+    $langcode = language_get_default_langcode('custom_type', 'custom_subtype');
     $language_interface = language(LANGUAGE_TYPE_INTERFACE);
     $this->assertEqual($langcode, $language_interface->langcode);
 
@@ -93,8 +93,8 @@ public function testDefaultLangcode() {
     $new_default = language_load('cc');
     $new_default->default = TRUE;
     language_save($new_default);
-    language_save_default_configuration('custom_type', 'custom_bundle', array('langcode' => 'site_default', 'language_show' => TRUE));
-    $langcode = language_get_default_langcode('custom_type', 'custom_bundle');
+    language_save_default_configuration('custom_type', 'custom_subtype', array('langcode' => 'site_default', 'language_show' => TRUE));
+    $langcode = language_get_default_langcode('custom_type', 'custom_subtype');
     $this->assertEqual($langcode, 'cc');
 
     // Check the default value of a language field when authors preferred option
@@ -104,7 +104,7 @@ public function testDefaultLangcode() {
     $some_user->preferred_langcode = 'bb';
     $some_user->save();
     $this->drupalLogin($some_user);
-    language_save_default_configuration('custom_type', 'some_bundle', array('langcode' => 'authors_default', 'language_show' => TRUE));
+    language_save_default_configuration('custom_type', 'some_subtype', array('langcode' => 'authors_default', 'language_show' => TRUE));
     $this->drupalGet('language-tests/language_configuration_element_test');
     $this->assertOptionSelected('edit-langcode', 'bb');
   }
diff --git a/core/modules/language/tests/language_elements_test/language_elements_test.module b/core/modules/language/tests/language_elements_test/language_elements_test.module
index 6030e4c..fdc69e0 100644
--- a/core/modules/language/tests/language_elements_test/language_elements_test.module
+++ b/core/modules/language/tests/language_elements_test/language_elements_test.module
@@ -30,13 +30,13 @@ function language_elements_test_menu() {
  * A form containing a language configuration element.
  */
 function language_elements_configuration_element() {
-  $conf = language_get_default_configuration('some_custom_type', 'some_bundle');
+  $conf = language_get_default_configuration('some_custom_type', 'some_subtype');
 
   $form['lang_configuration'] = array(
     '#type' => 'language_configuration',
     '#entity_information' => array(
       'entity_type' => 'some_custom_type',
-      'bundle' => 'some_bundle',
+      'subtype' => 'some_subtype',
     ),
     '#default_value' => $conf,
   );
@@ -55,7 +55,7 @@ function language_elements_configuration_element() {
 function language_elements_configuration_element_test() {
   $form['langcode'] = array(
     '#type' => 'language_select',
-    '#default_value' => language_get_default_langcode('custom_type', 'some_bundle'),
+    '#default_value' => language_get_default_langcode('custom_type', 'some_subtype'),
   );
   return $form;
 }
diff --git a/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestBundle.php b/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestBundle.php
index b711507..f8b102f 100644
--- a/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestBundle.php
+++ b/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestBundle.php
@@ -11,7 +11,7 @@
 use Symfony\Component\HttpKernel\Bundle\Bundle;
 
 /**
- * Defines the LanguageTest bundle.
+ * Defines the LanguageTest subtype.
  */
 class LanguageTestBundle extends Bundle {
 
diff --git a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
index a608873..e7b1b06 100644
--- a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
+++ b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
@@ -52,7 +52,7 @@ function testURLValidation() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'settings' => array(
         'title' => DRUPAL_DISABLED,
       ),
@@ -64,7 +64,7 @@ function testURLValidation() {
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field['field_name'], array(
         'type' => 'link',
       ))
@@ -73,7 +73,7 @@ function testURLValidation() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][url]", '', 'Link URL field is displayed');
     $this->assertRaw('placeholder="http://example.com"');
 
@@ -97,7 +97,7 @@ function testURLValidation() {
       // Missing host name
       'http://',
     );
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     foreach ($wrong_entries as $invalid_value) {
       $edit = array(
         "{$this->field['field_name']}[$langcode][0][url]" => $invalid_value,
@@ -120,7 +120,7 @@ function testLinkTitle() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'settings' => array(
         'title' => DRUPAL_OPTIONAL,
       ),
@@ -133,7 +133,7 @@ function testLinkTitle() {
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field['field_name'], array(
         'type' => 'link',
         'label' => 'hidden',
@@ -149,7 +149,7 @@ function testLinkTitle() {
       field_update_instance($this->instance);
 
       // Display creation form.
-      $this->drupalGet('test-entity/add/test_bundle');
+      $this->drupalGet('test-entity/add/test_subtype');
       $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][url]", '', 'URL field found.');
       $this->assertRaw('placeholder="http://example.com"');
 
@@ -177,7 +177,7 @@ function testLinkTitle() {
           $this->assertNoText(t('!name field is required.', array('!name' => t('Title'))));
 
           // Verify that a URL and title meets requirements.
-          $this->drupalGet('test-entity/add/test_bundle');
+          $this->drupalGet('test-entity/add/test_subtype');
           $edit = array(
             "{$this->field['field_name']}[$langcode][0][url]" => 'http://www.example.com',
             "{$this->field['field_name']}[$langcode][0][title]" => 'Example',
@@ -230,7 +230,7 @@ function testLinkFormatter() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'settings' => array(
         'title' => DRUPAL_OPTIONAL,
       ),
@@ -243,7 +243,7 @@ function testLinkFormatter() {
       'label' => 'hidden',
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field['field_name'], $display_options)
       ->save();
 
@@ -254,7 +254,7 @@ function testLinkFormatter() {
     // - The second field item uses a URL and title.
     // For consistency in assertion code below, the URL is assigned to the title
     // variable for the first field.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $url1 = 'http://www.example.com/content/articles/archive?author=John&year=2012#com';
     $url2 = 'http://www.example.org/content/articles/archive?author=John&year=2012#org';
     $title1 = $url1;
@@ -297,7 +297,7 @@ function testLinkFormatter() {
         else {
           $display_options['settings'] = $new_value;
         }
-        entity_get_display('test_entity', 'test_bundle', 'full')
+        entity_get_display('test_entity', 'test_subtype', 'full')
           ->setComponent($this->field['field_name'], $display_options)
           ->save();
 
@@ -366,7 +366,7 @@ function testLinkSeparateFormatter() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'settings' => array(
         'title' => DRUPAL_OPTIONAL,
       ),
@@ -379,7 +379,7 @@ function testLinkSeparateFormatter() {
       'label' => 'hidden',
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field['field_name'], $display_options)
       ->save();
 
@@ -390,7 +390,7 @@ function testLinkSeparateFormatter() {
     // - The second field item uses a URL and title.
     // For consistency in assertion code below, the URL is assigned to the title
     // variable for the first field.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $url1 = 'http://www.example.com/content/articles/archive?author=John&year=2012#com';
     $url2 = 'http://www.example.org/content/articles/archive?author=John&year=2012#org';
     // Intentionally contains an ampersand that needs sanitization on output.
@@ -415,7 +415,7 @@ function testLinkSeparateFormatter() {
       foreach ($values as $new_value) {
         // Update the field formatter settings.
         $display_options['settings'] = array($setting => $new_value);
-        entity_get_display('test_entity', 'test_bundle', 'full')
+        entity_get_display('test_entity', 'test_subtype', 'full')
           ->setComponent($this->field['field_name'], $display_options)
           ->save();
 
@@ -471,8 +471,8 @@ protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) {
       $this->container->get('plugin.manager.entity')->getStorageController('test_entity')->resetCache(array($id));
     }
     $entity = field_test_entity_test_load($id);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), $view_mode);
-    field_attach_prepare_view('test_entity', array($entity->id() => $entity), array($entity->bundle() => $display));
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), $view_mode);
+    field_attach_prepare_view('test_entity', array($entity->id() => $entity), array($entity->subtype() => $display));
     $entity->content = field_attach_view($entity, $display);
 
     $output = drupal_render($entity->content);
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
index 110a1e3..3b1b08e 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
@@ -32,7 +32,7 @@
  *     "label" = "link_title",
  *     "uuid" = "uuid"
  *   },
- *   bundles = {
+ *   subtypes = {
  *     "menu_link" = {
  *       "label" = "Menu link",
  *     }
diff --git a/core/modules/node/content_types.inc b/core/modules/node/content_types.inc
index e838460..a287c39 100644
--- a/core/modules/node/content_types.inc
+++ b/core/modules/node/content_types.inc
@@ -219,7 +219,7 @@ function node_type_form($form, &$form_state, $type = NULL) {
       '#type' => 'language_configuration',
       '#entity_information' => array(
         'entity_type' => 'node',
-        'bundle' => $type->type,
+        'subtype' => $type->type,
       ),
       '#default_value' => $language_configuration,
     );
diff --git a/core/modules/node/lib/Drupal/node/NodeRenderController.php b/core/modules/node/lib/Drupal/node/NodeRenderController.php
index 6a6608a..e9a5422 100644
--- a/core/modules/node/lib/Drupal/node/NodeRenderController.php
+++ b/core/modules/node/lib/Drupal/node/NodeRenderController.php
@@ -31,12 +31,12 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang
     parent::buildContent($entities, $displays, $view_mode, $langcode);
 
     foreach ($entities as $key => $entity) {
-      $bundle = $entity->bundle();
-      $display = $displays[$bundle];
+      $subtype = $entity->subtype();
+      $display = $displays[$subtype];
 
       // The 'view' hook can be implemented to overwrite the default function
       // to display nodes.
-      if (node_hook($bundle, 'view')) {
+      if (node_hook($subtype, 'view')) {
         $entity = node_invoke($entity, 'view', $display, $view_mode, $langcode);
       }
 
diff --git a/core/modules/node/lib/Drupal/node/Plugin/Core/Condition/NodeType.php b/core/modules/node/lib/Drupal/node/Plugin/Core/Condition/NodeType.php
index 0712745..dee08dd 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/Core/Condition/NodeType.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/Core/Condition/NodeType.php
@@ -16,7 +16,7 @@
  *
  * @Plugin(
  *   id = "node_type",
- *   label = @Translation("Node Bundle"),
+ *   label = @Translation("Node Subtype"),
  *   module = "node",
  *   context = {
  *     "node" = {
@@ -39,11 +39,11 @@ public function buildForm(array $form, array &$form_state) {
     foreach (node_type_get_types() as $type) {
       $options[$type->type] = $type->name;
     }
-    $form['bundles'] = array(
+    $form['subtypes'] = array(
       '#type' => 'checkboxes',
       '#options' => $options,
       '#required' => TRUE,
-      '#default_value' => isset($this->configuration['bundles']) ? $this->configuration['bundles'] : array(),
+      '#default_value' => isset($this->configuration['subtypes']) ? $this->configuration['subtypes'] : array(),
     );
     return $form;
   }
@@ -52,9 +52,9 @@ public function buildForm(array $form, array &$form_state) {
    * Implements \Drupal\Core\Form\FormInterface::validateForm().
    */
   public function validateForm(array &$form, array &$form_state) {
-    foreach ($form_state['values']['bundles'] as $bundle) {
-      if (!in_array($bundle, array_keys(node_type_get_types()))) {
-        form_set_error('bundles', t('You have chosen an invalid node bundle, please check your selection and try again.'));
+    foreach ($form_state['values']['subtypes'] as $subtype) {
+      if (!in_array($subtype, array_keys(node_type_get_types()))) {
+        form_set_error('subtypes', t('You have chosen an invalid node subtype, please check your selection and try again.'));
       }
     }
   }
@@ -63,7 +63,7 @@ public function validateForm(array &$form, array &$form_state) {
    * Implements \Drupal\Core\Form\FormInterface::submitForm().
    */
   public function submitForm(array &$form, array &$form_state) {
-    $this->configuration['bundles'] = $form_state['values']['bundles'];
+    $this->configuration['subtypes'] = $form_state['values']['subtypes'];
     parent::submitForm($form, $form_state);
   }
 
@@ -71,14 +71,14 @@ public function submitForm(array &$form, array &$form_state) {
    * Implements \Drupal\Core\Executable\ExecutableInterface::summary().
    */
   public function summary() {
-    if (count($this->configuration['bundles']) > 1) {
-      $bundles = $this->configuration['bundles'];
-      $last = array_pop($bundles);
-      $bundles = implode(', ', $bundles);
-      return t('The node bundle is @bundles or @last', array('@bundles' => $bundles, '@last' => $last));
+    if (count($this->configuration['subtypes']) > 1) {
+      $subtypes = $this->configuration['subtypes'];
+      $last = array_pop($subtypes);
+      $subtypes = implode(', ', $subtypes);
+      return t('The node subtype is @subtypes or @last', array('@subtypes' => $subtypes, '@last' => $last));
     }
-    $bundle = $this->configuration['bundles'][0];
-    return t('The node bundle is @bundle', array('@bundle' => $bundle));
+    $subtype = $this->configuration['subtypes'][0];
+    return t('The node subtype is @subtype', array('@subtype' => $subtype));
   }
 
   /**
@@ -86,7 +86,7 @@ public function summary() {
    */
   public function evaluate() {
     $node = $this->getContextValue('node');
-    return in_array($node->type, $this->configuration['bundles']);
+    return in_array($node->type, $this->configuration['subtypes']);
   }
 
 }
diff --git a/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php b/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php
index 61882b9..b7d8409 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php
@@ -18,7 +18,7 @@
  * @Plugin(
  *   id = "node",
  *   label = @Translation("Content"),
- *   bundle_label = @Translation("Content type"),
+ *   subtype_label = @Translation("Content type"),
  *   module = "node",
  *   controller_class = "Drupal\node\NodeStorageController",
  *   render_controller_class = "Drupal\node\NodeRenderController",
@@ -33,14 +33,14 @@
  *   entity_keys = {
  *     "id" = "nid",
  *     "revision" = "vid",
- *     "bundle" = "type",
+ *     "subtype" = "type",
  *     "label" = "title",
  *     "uuid" = "uuid"
  *   },
- *   bundle_keys = {
- *     "bundle" = "type"
+ *   subtype_keys = {
+ *     "subtype" = "type"
  *   },
- *   permission_granularity = "bundle"
+ *   permission_granularity = "subtype"
  * )
  */
 class Node extends Entity implements ContentEntityInterface {
@@ -77,7 +77,7 @@ class Node extends Entity implements ContentEntityInterface {
   public $uuid;
 
   /**
-   * The node content type (bundle).
+   * The node content type (subtype).
    *
    * @var string
    */
@@ -200,9 +200,9 @@ public function id() {
   }
 
   /**
-   * Implements Drupal\Core\Entity\EntityInterface::bundle().
+   * Implements Drupal\Core\Entity\EntityInterface::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return $this->type;
   }
 
diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
index 4f868f7..244661a 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
@@ -249,7 +249,7 @@ protected  function display_options_row(&$display_options, $row_plugin, $row_opt
   protected function build_filters(&$form, &$form_state) {
     parent::build_filters($form, $form_state);
 
-    $selected_bundle = static::getSelected($form_state, array('show', 'type'), 'all', $form['displays']['show']['type']);
+    $selected_subtype = static::getSelected($form_state, array('show', 'type'), 'all', $form['displays']['show']['type']);
 
     // Add the "tagged with" filter to the view.
 
@@ -266,18 +266,18 @@ protected function build_filters(&$form, &$form_state) {
     // uses to choose).
 
     // Find all "tag-like" taxonomy fields associated with the view's
-    // entities. If a particular entity type (i.e., bundle) has been
+    // entities. If a particular entity type (i.e., subtype) has been
     // selected above, then we only search for taxonomy fields associated
-    // with that bundle. Otherwise, we use all bundles.
-    $bundles = array_keys(entity_get_bundles($this->entity_type));
-    // Double check that this is a real bundle before using it (since above
-    // we added a dummy option 'all' to the bundle list on the form).
-    if (isset($selected_bundle) && in_array($selected_bundle, $bundles)) {
-      $bundles = array($selected_bundle);
+    // with that subtype. Otherwise, we use all subtypes.
+    $subtypes = array_keys(entity_get_subtypes($this->entity_type));
+    // Double check that this is a real subtype before using it (since above
+    // we added a dummy option 'all' to the subtype list on the form).
+    if (isset($selected_subtype) && in_array($selected_subtype, $subtypes)) {
+      $subtypes = array($selected_subtype);
     }
     $tag_fields = array();
-    foreach ($bundles as $bundle) {
-      foreach (field_info_instances($this->entity_type, $bundle) as $instance) {
+    foreach ($subtypes as $subtype) {
+      foreach (field_info_instances($this->entity_type, $subtype) as $instance) {
         // We define "tag-like" taxonomy fields as ones that use the
         // "Autocomplete term widget (tagging)" widget.
         if ($instance['widget']['type'] == 'taxonomy_autocomplete') {
diff --git a/core/modules/node/lib/Drupal/node/Tests/Condition/NodeConditionTest.php b/core/modules/node/lib/Drupal/node/Tests/Condition/NodeConditionTest.php
index a8058f7..b2df490 100644
--- a/core/modules/node/lib/Drupal/node/Tests/Condition/NodeConditionTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/Condition/NodeConditionTest.php
@@ -51,23 +51,23 @@ function testConditions() {
     // Grab the node type condition and configure it to check against node type
     // of 'article' and set the context to the page type node.
     $condition = $manager->createInstance('node_type')
-      ->setConfig('bundles', array('article'))
+      ->setConfig('subtypes', array('article'))
       ->setContextValue('node', $page);
     $this->assertFalse($condition->execute(), 'Page type nodes fail node type checks for articles.');
     // Check for the proper summary.
-    $this->assertEqual('The node bundle is article', $condition->summary());
+    $this->assertEqual('The node subtype is article', $condition->summary());
 
     // Set the node type check to page.
-    $condition->setConfig('bundles', array('page'));
+    $condition->setConfig('subtypes', array('page'));
     $this->assertTrue($condition->execute(), 'Page type nodes pass node type checks for pages');
     // Check for the proper summary.
-    $this->assertEqual('The node bundle is page', $condition->summary());
+    $this->assertEqual('The node subtype is page', $condition->summary());
 
     // Set the node type check to page or article.
-    $condition->setConfig('bundles', array('page', 'article'));
+    $condition->setConfig('subtypes', array('page', 'article'));
     $this->assertTrue($condition->execute(), 'Page type nodes pass node type checks for pages or articles');
     // Check for the proper summary.
-    $this->assertEqual('The node bundle is page or article', $condition->summary());
+    $this->assertEqual('The node subtype is page or article', $condition->summary());
 
     // Set the context to the article node.
     $condition->setContextValue('node', $article);
@@ -77,12 +77,12 @@ function testConditions() {
     $condition->setContextValue('node', $test);
     $this->assertFalse($condition->execute(), 'Test type nodes pass node type checks for pages or articles');
 
-    // Check a greater than 2 bundles summary scenario.
-    $condition->setConfig('bundles', array('page', 'article', 'test'));
-    $this->assertEqual('The node bundle is page, article or test', $condition->summary());
+    // Check a greater than 2 subtypes summary scenario.
+    $condition->setConfig('subtypes', array('page', 'article', 'test'));
+    $this->assertEqual('The node subtype is page, article or test', $condition->summary());
 
     // Test Constructor injection.
-    $condition = $manager->createInstance('node_type', array('bundles' => array('article'), 'context' => array('node' => $article)));
+    $condition = $manager->createInstance('node_type', array('subtypes' => array('article'), 'context' => array('node' => $article)));
     $this->assertTrue($condition->execute(), 'Constructor injection of context and configuration working as anticipated.');
   }
 }
diff --git a/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php b/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php
index 7ee1e85..b353c67 100644
--- a/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php
@@ -49,7 +49,7 @@ function testMultiStepNodeFormBasicOptions() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'label' => $this->randomName() . '_label',
       'settings' => array(
         'text_processing' => TRUE,
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php
index 433c6bb..2bcd89c 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php
@@ -42,7 +42,7 @@ public function setUp() {
     $instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
     );
     $this->instance = field_create_instance($instance);
     entity_get_display('node', 'page', 'default')
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php
index de24f45..1388f55 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php
@@ -47,7 +47,7 @@ public function testCommentPager() {
     for ($i = 0; $i < 60; $i++) {
       $comment = entity_create('comment', array(
         'nid' => $node->nid,
-        'node_type' => 'node_type_' . $node->bundle(),
+        'node_type' => 'node_type_' . $node->subtype(),
         'subject' => $this->randomName(),
         'comment_body' => array(
           array('value' => $this->randomName()),
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
index 8a744ec..d359c89 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
@@ -36,24 +36,24 @@ public static function getInfo() {
 
   function setUp() {
     $this->entityType = 'node';
-    $this->bundle = 'article';
+    $this->subtype = 'article';
     $this->title = $this->randomName();
     parent::setUp();
   }
 
   /**
-   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::setupBundle().
+   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::setupSubtype().
    */
-  protected function setupBundle() {
-    parent::setupBundle();
-    $this->drupalCreateContentType(array('type' => $this->bundle, 'name' => $this->bundle));
+  protected function setupSubtype() {
+    parent::setupSubtype();
+    $this->drupalCreateContentType(array('type' => $this->subtype, 'name' => $this->subtype));
   }
 
   /**
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   protected function getTranslatorPermissions() {
-    return array_merge(parent::getTranslatorPermissions(), array('administer nodes', "edit any $this->bundle content"));
+    return array_merge(parent::getTranslatorPermissions(), array('administer nodes', "edit any $this->subtype content"));
   }
 
   /**
@@ -173,16 +173,16 @@ function testFieldTranslationForm() {
   }
 
   /**
-   * Test that no metadata is stored for a disabled bundle.
+   * Test that no metadata is stored for a disabled subtype.
    */
-  public function testDisabledBundle() {
-    // Create a bundle that does not have translation enabled.
-    $disabledBundle = $this->randomName();
-    $this->drupalCreateContentType(array('type' => $disabledBundle, 'name' => $disabledBundle));
-
-    // Create a node for each bundle.
-    $enabledNode = $this->drupalCreateNode(array('type' => $this->bundle));
-    $disabledNode = $this->drupalCreateNode(array('type' => $disabledBundle));
+  public function testDisabledSubtype() {
+    // Create a subtype that does not have translation enabled.
+    $disabledSubtype = $this->randomName();
+    $this->drupalCreateContentType(array('type' => $disabledSubtype, 'name' => $disabledSubtype));
+
+    // Create a node for each subtype.
+    $enabledNode = $this->drupalCreateNode(array('type' => $this->subtype));
+    $disabledNode = $this->drupalCreateNode(array('type' => $disabledSubtype));
 
     // Make sure that only a single row was inserted into the
     // {translation_entity} table.
diff --git a/core/modules/node/lib/Drupal/node/Tests/Views/FieldTypeTest.php b/core/modules/node/lib/Drupal/node/Tests/Views/FieldTypeTest.php
index 3b92fb9..4e1c395 100644
--- a/core/modules/node/lib/Drupal/node/Tests/Views/FieldTypeTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/Views/FieldTypeTest.php
@@ -31,7 +31,7 @@ public function testFieldType() {
     $node = $this->drupalCreateNode();
     $expected_result[] = array(
       'nid' => $node->id(),
-      'node_type' => $node->bundle(),
+      'node_type' => $node->subtype(),
     );
     $column_map = array(
       'nid' => 'nid',
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 139b2d2..b96748e 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -568,7 +568,7 @@ function node_admin_nodes() {
         'query' => $destination,
       );
     }
-    if (module_invoke('translation_entity', 'enabled', 'node', $node->bundle())) {
+    if (module_invoke('translation_entity', 'enabled', 'node', $node->subtype())) {
       $operations['translate'] = array(
         'title' => t('Translate'),
         'href' => 'node/' . $node->nid . '/translations',
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 8019ff3..f0cb0fb 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -217,24 +217,24 @@ function node_entity_view_mode_info() {
 }
 
 /**
- * Implements hook_entity_bundle_info().
+ * Implements hook_entity_subtype_info().
  */
-function node_entity_bundle_info() {
-  $bundles = array();
-  // Bundles must provide a human readable name so we can create help and error
+function node_entity_subtype_info() {
+  $subtypes = array();
+  // Subtypes must provide a human readable name so we can create help and error
   // messages, and the path to attach Field admin pages to.
   node_type_cache_reset();
   foreach (node_type_get_names() as $type => $name) {
-    $bundles['node'][$type] = array(
+    $subtypes['node'][$type] = array(
       'label' => $name,
       'admin' => array(
         'path' => 'admin/structure/types/manage/%node_type',
         'real path' => 'admin/structure/types/manage/' . $type,
-        'bundle argument' => 4,
+        'subtype argument' => 4,
       ),
     );
   }
-  return $bundles;
+  return $subtypes;
 }
 
 /**
@@ -536,7 +536,7 @@ function node_type_save($info) {
       ->execute();
 
     if (!empty($type->old_type) && $type->old_type != $type->type) {
-      field_attach_rename_bundle('node', $type->old_type, $type->type);
+      field_attach_rename_subtype('node', $type->old_type, $type->type);
     }
     module_invoke_all('node_type_update', $type);
     $status = SAVED_UPDATED;
@@ -547,7 +547,7 @@ function node_type_save($info) {
       ->fields($fields)
       ->execute();
 
-    field_attach_create_bundle('node', $type->type);
+    field_attach_create_subtype('node', $type->type);
 
     module_invoke_all('node_type_insert', $type);
     $status = SAVED_NEW;
@@ -586,7 +586,7 @@ function node_add_body_field($type, $label = 'Body') {
     $instance = array(
       'field_name' => 'body',
       'entity_type' => 'node',
-      'bundle' => $type->type,
+      'subtype' => $type->type,
       'label' => $label,
       'widget' => array('type' => 'text_textarea_with_summary'),
       'settings' => array('display_summary' => TRUE),
@@ -619,30 +619,30 @@ function node_field_extra_fields() {
   $module_language_enabled = module_exists('language');
   $description = t('Node module element');
 
-  foreach (node_type_get_types() as $bundle) {
-    if ($bundle->has_title) {
-      $extra['node'][$bundle->type]['form']['title'] = array(
-        'label' => $bundle->title_label,
+  foreach (node_type_get_types() as $subtype) {
+    if ($subtype->has_title) {
+      $extra['node'][$subtype->type]['form']['title'] = array(
+        'label' => $subtype->title_label,
         'description' => $description,
         'weight' => -5,
       );
     }
 
     // Add also the 'language' select if Language module is enabled and the
-    // bundle has multilingual support.
+    // subtype has multilingual support.
     // Visibility of the ordering of the language selector is the same as on the
     // node/add form.
     if ($module_language_enabled) {
-      $configuration = language_get_default_configuration('node', $bundle->type);
+      $configuration = language_get_default_configuration('node', $subtype->type);
       if ($configuration['language_show']) {
-        $extra['node'][$bundle->type]['form']['language'] = array(
+        $extra['node'][$subtype->type]['form']['language'] = array(
           'label' => t('Language'),
           'description' => $description,
           'weight' => 0,
         );
       }
     }
-    $extra['node'][$bundle->type]['display']['language'] = array(
+    $extra['node'][$subtype->type]['display']['language'] = array(
       'label' => t('Language'),
       'description' => $description,
       'weight' => 0,
@@ -664,7 +664,7 @@ function node_type_delete($name) {
   db_delete('node_type')
     ->condition('type', $name)
     ->execute();
-  field_attach_delete_bundle('node', $name);
+  field_attach_delete_subtype('node', $name);
   module_invoke_all('node_type_delete', $type);
 
   // Clear the node type cache.
@@ -852,7 +852,7 @@ function node_rdf_mapping() {
   return array(
     array(
       'type' => 'node',
-      'bundle' => RDF_DEFAULT_BUNDLE,
+      'subtype' => RDF_DEFAULT_BUNDLE,
       'mapping' => array(
         'rdftype' => array('sioc:Item', 'foaf:Document'),
         'title' => array(
diff --git a/core/modules/node/node.views.inc b/core/modules/node/node.views.inc
index 7794c98..16b40ca 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -113,7 +113,7 @@ function node_views_data() {
       'id' => 'standard',
     ),
     'filter' => array(
-      'id' => 'bundle',
+      'id' => 'subtype',
     ),
     'argument' => array(
       'id' => 'node_type',
diff --git a/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php b/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php
index 925828c..9229cb2 100644
--- a/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php
+++ b/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php
@@ -56,7 +56,7 @@ function testNumberDecimalField() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'number',
         'settings' => array(
@@ -70,12 +70,12 @@ function testNumberDecimalField() {
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'default')
+    entity_get_display('test_entity', 'test_subtype', 'default')
       ->setComponent($this->field['field_name'])
       ->save();
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value]", '', 'Widget is displayed');
     $this->assertRaw('placeholder="0.00"');
@@ -101,7 +101,7 @@ function testNumberDecimalField() {
     );
 
     foreach ($wrong_entries as $wrong_entry) {
-      $this->drupalGet('test-entity/add/test_bundle');
+      $this->drupalGet('test-entity/add/test_subtype');
       $edit = array(
         "{$this->field['field_name']}[$langcode][0][value]" => $wrong_entry,
       );
@@ -119,7 +119,7 @@ function testNumberDecimalField() {
     );
 
     foreach ($wrong_entries as $wrong_entry) {
-      $this->drupalGet('test-entity/add/test_bundle');
+      $this->drupalGet('test-entity/add/test_subtype');
       $edit = array(
         "{$this->field['field_name']}[$langcode][0][value]" => $wrong_entry,
       );
diff --git a/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php b/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php
index 0de9593..300923a 100644
--- a/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php
+++ b/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php
@@ -44,7 +44,7 @@ public function setUp() {
       $this->instance[$type] = array(
         'entity_type' => 'entity_test',
         'field_name' => 'field_' . $type,
-        'bundle' => 'entity_test',
+        'subtype' => 'entity_test',
         'widget' => array(
           'type' => 'number',
         ),
diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php
index 4065b7d..c808bea 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php
@@ -38,7 +38,7 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'required' => TRUE,
       'widget' => array(
         'type' => 'options_select',
@@ -50,7 +50,7 @@ function setUp() {
       // Make sure this does not equal the ID so that
       // options_test_dynamic_values_callback() always returns 4 values.
       'vid' => mt_rand(20, 30),
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->randomName(),
     );
     $this->entity = call_user_func_array('field_test_create_entity', $this->test);
diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
index e715f55..1d236e5 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php
@@ -51,7 +51,7 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'options_buttons',
       ),
@@ -116,7 +116,7 @@ function testUpdateAllowedValues() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'options_buttons',
       ),
diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php
index 3409185..74093ee 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php
@@ -254,7 +254,7 @@ protected function createOptionsField($type) {
     $instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'node',
-      'bundle' => $this->type,
+      'subtype' => $this->type,
     );
     field_create_instance($instance);
 
diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php
index 023f012..cf5fce9 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php
@@ -81,7 +81,7 @@ function testRadioButtons() {
     $instance = array(
       'field_name' => $this->card_1['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'options_buttons',
       ),
@@ -135,7 +135,7 @@ function testCheckBoxes() {
     $instance = array(
       'field_name' => $this->card_2['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'options_buttons',
       ),
@@ -222,7 +222,7 @@ function testSelectListSingle() {
     $instance = array(
       'field_name' => $this->card_1['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'required' => TRUE,
       'widget' => array(
         'type' => 'options_select',
@@ -319,7 +319,7 @@ function testSelectListMultiple() {
     $instance = array(
       'field_name' => $this->card_2['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'options_select',
       ),
@@ -436,7 +436,7 @@ function testOnOffCheckbox() {
     $instance = array(
       'field_name' => $this->bool['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'options_onoff',
       ),
@@ -487,7 +487,7 @@ function testOnOffCheckbox() {
     $instance = array(
       'field_name' => $this->bool['field_name'],
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'widget' => array(
         'type' => 'options_onoff',
         'module' => 'options',
diff --git a/core/modules/options/options.module b/core/modules/options/options.module
index 793b07e..14277cf 100644
--- a/core/modules/options/options.module
+++ b/core/modules/options/options.module
@@ -390,7 +390,7 @@ function _options_values_in_use($field, $values) {
   if ($values) {
     $field = field_info_field_by_id($field['id']);
     $factory = drupal_container()->get('entity.query');
-    foreach ($field['bundles'] as $entity_type => $bundle) {
+    foreach ($field['subtypes'] as $entity_type => $subtype) {
       $result = $factory->get($entity_type)
         ->condition($field['field_name'] . '.value', $values)
         ->count()
diff --git a/core/modules/options/tests/options_test.module b/core/modules/options/tests/options_test.module
index 90f6bf1..cc401e1 100644
--- a/core/modules/options/tests/options_test.module
+++ b/core/modules/options/tests/options_test.module
@@ -34,6 +34,6 @@ function options_test_dynamic_values_callback($field, $instance, EntityInterface
     $entity->ftlabel,
     $entity->id(),
     $entity->getRevisionId(),
-    $entity->bundle(),
+    $entity->subtype(),
   ));
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/MapTypesFromInputEvent.php b/core/modules/rdf/lib/Drupal/rdf/MapTypesFromInputEvent.php
index c54fe0d..6bee462 100644
--- a/core/modules/rdf/lib/Drupal/rdf/MapTypesFromInputEvent.php
+++ b/core/modules/rdf/lib/Drupal/rdf/MapTypesFromInputEvent.php
@@ -22,7 +22,7 @@ class MapTypesFromInputEvent extends Event {
   protected $inputUris;
 
   /**
-   * An array of entity_type/bundles, keyed by site schema type URI
+   * An array of entity_type/subtypes, keyed by site schema type URI
    *
    * @var array
    */
@@ -41,7 +41,7 @@ class MapTypesFromInputEvent extends Event {
    * @param $input_uris
    *   An array of incoming RDF type URIs.
    * @param $site_schema_types
-   *   An array of entity_type/bundles, keyed by site schema type URI.
+   *   An array of entity_type/subtypes, keyed by site schema type URI.
    */
   public function __construct($input_uris, $site_schema_types) {
     $this->inputUris = $input_uris;
diff --git a/core/modules/rdf/lib/Drupal/rdf/RdfMappingManager.php b/core/modules/rdf/lib/Drupal/rdf/RdfMappingManager.php
index 90588e9..b7cfe0b 100644
--- a/core/modules/rdf/lib/Drupal/rdf/RdfMappingManager.php
+++ b/core/modules/rdf/lib/Drupal/rdf/RdfMappingManager.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\rdf\MapTypesFromInputEvent;
 use Drupal\rdf\RdfMappingEvents;
-use Drupal\rdf\SiteSchema\BundleSchema;
+use Drupal\rdf\SiteSchema\SubtypeSchema;
 use Drupal\rdf\SiteSchema\SiteSchema;
 use Drupal\rdf\SiteSchema\SiteSchemaManager;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -55,7 +55,7 @@ public function __construct(EventDispatcherInterface $dispatcher, SiteSchemaMana
    *   An array of URIs for the type.
    *
    * @return array
-   *   An array containing entity_type and bundle.
+   *   An array containing entity_type and subtype.
    *
    * @throws \Drupal\rdf\RdfMappingException
    */
@@ -71,7 +71,7 @@ public function getTypedDataIdsFromTypeUris($input_rdf_types) {
       throw new RdfMappingException(sprintf('No mapping to a site schema type URI found for incoming types (%s).', implode(',', $input_rdf_types)));
     }
     // Use the mapped RDF type URI to get the TypedData API ids the rest of the
-    // system uses (entity type and bundle).
+    // system uses (entity type and subtype).
     return $site_schema_types[$type_uri];
   }
 
diff --git a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/BundleSchema.php b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/BundleSchema.php
deleted file mode 100644
index 2c92696..0000000
--- a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/BundleSchema.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains BundleSchema.
- */
-
-namespace Drupal\rdf\SiteSchema;
-
-use Drupal\rdf\RdfConstants;
-use Drupal\rdf\SiteSchema\EntitySchema;
-
-/**
- * Defines RDF terms corresponding to Drupal bundles.
- */
-class BundleSchema extends EntitySchema {
-
-  /**
-   * The URI pattern for bundle site schema terms.
-   *
-   * @var string
-   */
-  public static $uriPattern = '{entity_type}/{bundle}';
-
-  /**
-   * The bundle that this term identifies.
-   *
-   * @var string
-   */
-  protected $bundle;
-
-  /**
-   * Constructor.
-   *
-   * @param \Drupal\rdf\SiteSchema\SiteSchema $site_schema
-   *   The schema the term is defined in.
-   * @param string $entity_type
-   *   The entity type.
-   * @param string $bundle
-   *   The bundle.
-   */
-  public function __construct($site_schema, $entity_type, $bundle) {
-    parent::__construct($site_schema, $entity_type);
-    $this->bundle = $bundle;
-  }
-
-  /**
-   * Implements \Drupal\rdf\SiteSchema\SchemaTermInterface::getUri().
-   */
-  public function getUri() {
-    $path = str_replace(array('{entity_type}', '{bundle}'), array($this->entityType, $this->bundle), static::$uriPattern);
-    return $this->siteSchema->getUri() . $path;
-  }
-
-  /**
-   * Overrides \Drupal\rdf\SiteSchema\SchemaTermBase::getProperties().
-   */
-  public function getProperties() {
-    $properties = parent::getProperties();
-    $properties[RdfConstants::RDFS_SUB_CLASS_OF] = $this->siteSchema->entity($this->entityType)->getUri();
-    return $properties;
-  }
-
-}
diff --git a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaController.php b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaController.php
index acd3f8e..181a6a7 100644
--- a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaController.php
+++ b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaController.php
@@ -36,12 +36,12 @@ public function setContainer(ContainerInterface $container = NULL) {
   }
 
   /**
-   * Responds to a schema request for a bundle of a given entity type.
+   * Responds to a schema request for a subtype of a given entity type.
    *
    * @param string $entity_type
    *   The entity type.
-   * @param string $bundle
-   *   The entity bundle.
+   * @param string $subtype
+   *   The entity subtype.
    * @param string $schema_path
    *   The relative base path for the schema.
    *
@@ -50,19 +50,19 @@ public function setContainer(ContainerInterface $container = NULL) {
    *
    * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
    */
-  public function bundle($entity_type, $bundle, $schema_path) {
+  public function subtype($entity_type, $subtype, $schema_path) {
     if (!$entity_info = entity_get_info($entity_type)) {
       throw new NotFoundHttpException(t('Entity type @entity_type not found', array('@entity_type' => $entity_type)));
     }
-    if (!array_key_exists($bundle, entity_get_bundles($entity_type))) {
-      throw new NotFoundHttpException(t('Bundle @bundle not found', array('@bundle' => $bundle)));
+    if (!array_key_exists($subtype, entity_get_subtypes($entity_type))) {
+      throw new NotFoundHttpException(t('Subtype @subtype not found', array('@subtype' => $subtype)));
     }
 
     $serializer = $this->container->get('serializer');
     $site_schema_manager = $this->container->get('rdf.site_schema_manager');
     $schema = $site_schema_manager->getSchema($schema_path);
     // @todo Remove hard-coded mimetype once we have proper conneg.
-    $content = $serializer->serialize($schema->bundle($entity_type, $bundle), 'jsonld');
+    $content = $serializer->serialize($schema->subtype($entity_type, $subtype), 'jsonld');
     return new Response($content, 200, array('Content-type' => 'application/json'));
   }
 
diff --git a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaTermInterface.php b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaTermInterface.php
index 342b51e..444267f 100644
--- a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaTermInterface.php
+++ b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SchemaTermInterface.php
@@ -15,7 +15,7 @@
    * When an RDF term URI is dereferenced, it usually contains a description of
    * the term in RDF. To make it easier to use this description, include
    * information about all related terms. For example, when viewing the RDF
-   * description for the RDF class which corresponds to a Drupal bundle, data
+   * description for the RDF class which corresponds to a Drupal subtype, data
    * about its fields would also be included.
    *
    * @return array
diff --git a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchema.php b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchema.php
index e3153d1..19e627b 100644
--- a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchema.php
+++ b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchema.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\rdf\SiteSchema;
 
-use Drupal\rdf\SiteSchema\BundleSchema;
+use Drupal\rdf\SiteSchema\SubtypeSchema;
 use Drupal\rdf\SiteSchema\EntitySchema;
 
 /**
@@ -53,10 +53,10 @@ public function entity($entity_type) {
   }
 
   /**
-   * Get a bundle's term definition in this vocabulary.
+   * Get a subtype's term definition in this vocabulary.
    */
-  public function bundle($entity_type, $bundle) {
-    return new BundleSchema($this, $entity_type, $bundle);
+  public function subtype($entity_type, $subtype) {
+    return new SubtypeSchema($this, $entity_type, $subtype);
   }
 
   /**
@@ -84,7 +84,7 @@ public function getPath() {
    */
   public function getRoutes() {
     return array(
-      'bundle' => $this->schemaPath . BundleSchema::$uriPattern,
+      'subtype' => $this->schemaPath . SubtypeSchema::$uriPattern,
     );
   }
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchemaManager.php b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchemaManager.php
index e42b868..8e1626b 100644
--- a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchemaManager.php
+++ b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SiteSchemaManager.php
@@ -10,7 +10,7 @@
 use ReflectionClass;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\rdf\SiteSchema\SiteSchema;
-use Drupal\rdf\SiteSchema\BundleSchema;
+use Drupal\rdf\SiteSchema\SubtypeSchema;
 
 class SiteSchemaManager {
 
@@ -36,10 +36,10 @@ public function __construct(CacheBackendInterface $cache) {
   public function writeCache() {
     $data = array();
 
-    // Type URIs correspond to bundles. Iterate through the bundles to get the
+    // Type URIs correspond to subtypes. Iterate through the subtypes to get the
     // URI and data for them.
     $entity_info = entity_get_info();
-    foreach (entity_get_bundles() as $entity_type => $bundles) {
+    foreach (entity_get_subtypes() as $entity_type => $subtypes) {
       // Only content entities are supported currently.
       // @todo Consider supporting config entities.
       $entity_type_info = $entity_info[$entity_type];
@@ -47,13 +47,13 @@ public function writeCache() {
       if ($reflection->implementsInterface('\Drupal\Core\Config\Entity\ConfigEntityInterface')) {
         continue;
       }
-      foreach ($bundles as $bundle => $bundle_info) {
-        // Get a type URI for the bundle in each of the defined schemas.
+      foreach ($subtypes as $subtype => $subtype_info) {
+        // Get a type URI for the subtype in each of the defined schemas.
         foreach ($this->siteSchemas as $schema) {
-          $bundle_uri = $schema->bundle($entity_type, $bundle)->getUri();
-          $data[$bundle_uri] = array(
+          $subtype_uri = $schema->subtype($entity_type, $subtype)->getUri();
+          $data[$subtype_uri] = array(
             'entity_type' => $entity_type,
-            'bundle' => $bundle,
+            'subtype' => $subtype,
           );
         }
       }
@@ -75,7 +75,7 @@ public function getSchema($schema_path) {
    * Get the array of site schema types.
    *
    * @return array
-   *   An array of typed data ids (entity_type and bundle) keyed by
+   *   An array of typed data ids (entity_type and subtype) keyed by
    *   corresponding site schema URI.
    */
   public function getTypes() {
diff --git a/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SubtypeSchema.php b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SubtypeSchema.php
new file mode 100644
index 0000000..d040c11
--- /dev/null
+++ b/core/modules/rdf/lib/Drupal/rdf/SiteSchema/SubtypeSchema.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Contains SubtypeSchema.
+ */
+
+namespace Drupal\rdf\SiteSchema;
+
+use Drupal\rdf\RdfConstants;
+use Drupal\rdf\SiteSchema\EntitySchema;
+
+/**
+ * Defines RDF terms corresponding to Drupal subtypes.
+ */
+class SubtypeSchema extends EntitySchema {
+
+  /**
+   * The URI pattern for subtype site schema terms.
+   *
+   * @var string
+   */
+  public static $uriPattern = '{entity_type}/{subtype}';
+
+  /**
+   * The subtype that this term identifies.
+   *
+   * @var string
+   */
+  protected $subtype;
+
+  /**
+   * Constructor.
+   *
+   * @param \Drupal\rdf\SiteSchema\SiteSchema $site_schema
+   *   The schema the term is defined in.
+   * @param string $entity_type
+   *   The entity type.
+   * @param string $subtype
+   *   The subtype.
+   */
+  public function __construct($site_schema, $entity_type, $subtype) {
+    parent::__construct($site_schema, $entity_type);
+    $this->subtype = $subtype;
+  }
+
+  /**
+   * Implements \Drupal\rdf\SiteSchema\SchemaTermInterface::getUri().
+   */
+  public function getUri() {
+    $path = str_replace(array('{entity_type}', '{subtype}'), array($this->entityType, $this->subtype), static::$uriPattern);
+    return $this->siteSchema->getUri() . $path;
+  }
+
+  /**
+   * Overrides \Drupal\rdf\SiteSchema\SchemaTermBase::getProperties().
+   */
+  public function getProperties() {
+    $properties = parent::getProperties();
+    $properties[RdfConstants::RDFS_SUB_CLASS_OF] = $this->siteSchema->entity($this->entityType)->getUri();
+    return $properties;
+  }
+
+}
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php
index 3383f94..5f4f503 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php
@@ -34,13 +34,13 @@ public static function getInfo() {
    */
   function testCRUD() {
     // Verify loading of a default mapping.
-    $mapping = _rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = _rdf_mapping_load('test_entity', 'test_subtype');
     $this->assertTrue(count($mapping), 'Default mapping was found.');
 
     // Verify saving a mapping.
     $mapping = array(
       'type' => 'crud_test_entity',
-      'bundle' => 'crud_test_bundle',
+      'subtype' => 'crud_test_subtype',
       'mapping' => array(
         'rdftype' => array('sioc:Post'),
         'title' => array(
@@ -55,13 +55,13 @@ function testCRUD() {
     $this->assertTrue(rdf_mapping_save($mapping) === SAVED_NEW, 'Mapping was saved.');
 
     // Read the raw record from the {rdf_mapping} table.
-    $result = db_query('SELECT * FROM {rdf_mapping} WHERE type = :type AND bundle = :bundle', array(':type' => $mapping['type'], ':bundle' => $mapping['bundle']));
+    $result = db_query('SELECT * FROM {rdf_mapping} WHERE type = :type AND subtype = :subtype', array(':type' => $mapping['type'], ':subtype' => $mapping['subtype']));
     $stored_mapping = $result->fetchAssoc();
     $stored_mapping['mapping'] = unserialize($stored_mapping['mapping']);
     $this->assertEqual($mapping, $stored_mapping, 'Mapping was stored properly in the {rdf_mapping} table.');
 
     // Verify loading of saved mapping.
-    $this->assertEqual($mapping['mapping'], _rdf_mapping_load($mapping['type'], $mapping['bundle']), 'Saved mapping loaded successfully.');
+    $this->assertEqual($mapping['mapping'], _rdf_mapping_load($mapping['type'], $mapping['subtype']), 'Saved mapping loaded successfully.');
 
     // Verify updating of mapping.
     $mapping['mapping']['title'] = array(
@@ -70,16 +70,16 @@ function testCRUD() {
     $this->assertTrue(rdf_mapping_save($mapping) === SAVED_UPDATED, 'Mapping was updated.');
 
     // Read the raw record from the {rdf_mapping} table.
-    $result = db_query('SELECT * FROM {rdf_mapping} WHERE type = :type AND bundle = :bundle', array(':type' => $mapping['type'], ':bundle' => $mapping['bundle']));
+    $result = db_query('SELECT * FROM {rdf_mapping} WHERE type = :type AND subtype = :subtype', array(':type' => $mapping['type'], ':subtype' => $mapping['subtype']));
     $stored_mapping = $result->fetchAssoc();
     $stored_mapping['mapping'] = unserialize($stored_mapping['mapping']);
     $this->assertEqual($mapping, $stored_mapping, 'Updated mapping was stored properly in the {rdf_mapping} table.');
 
     // Verify loading of saved mapping.
-    $this->assertEqual($mapping['mapping'], _rdf_mapping_load($mapping['type'], $mapping['bundle']), 'Saved mapping loaded successfully.');
+    $this->assertEqual($mapping['mapping'], _rdf_mapping_load($mapping['type'], $mapping['subtype']), 'Saved mapping loaded successfully.');
 
     // Verify deleting of mapping.
-    $this->assertTrue(rdf_mapping_delete($mapping['type'], $mapping['bundle']), 'Mapping was deleted.');
-    $this->assertFalse(_rdf_mapping_load($mapping['type'], $mapping['bundle']), 'Deleted mapping is no longer found in the database.');
+    $this->assertTrue(rdf_mapping_delete($mapping['type'], $mapping['subtype']), 'Mapping was deleted.');
+    $this->assertFalse(_rdf_mapping_load($mapping['type'], $mapping['subtype']), 'Deleted mapping is no longer found in the database.');
   }
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/MappingDefinitionTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/MappingDefinitionTest.php
index ef33e6f..55c7e86 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/MappingDefinitionTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/MappingDefinitionTest.php
@@ -35,7 +35,7 @@ function setUp() {
     // Defines RDF mapping for page content type.
     $page_rdf_mapping = array(
       'type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'mapping' => array(
         'rdftype' => array('foaf:DocumentBar'),
         'body' => array(
@@ -79,12 +79,12 @@ function testMappingDefinitionPage() {
   }
 
   /**
-   * Creates a content type and a node of type test_bundle_hook_install and
+   * Creates a content type and a node of type test_subtype_hook_install and
    * tests whether the RDF mapping defined in rdf_test.install is used.
    */
-  function testMappingDefinitionTestBundleInstall() {
-    $this->drupalCreateContentType(array('type' => 'test_bundle_hook_install'));
-    $node = $this->drupalCreateNode(array('type' => 'test_bundle_hook_install'));
+  function testMappingDefinitionTestSubtypeInstall() {
+    $this->drupalCreateContentType(array('type' => 'test_subtype_hook_install'));
+    $node = $this->drupalCreateNode(array('type' => 'test_subtype_hook_install'));
 
     $expected_mapping = array(
       'rdftype' => array('foo:mapping_install1', 'bar:mapping_install2'),
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/MappingHookTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/MappingHookTest.php
index eb1340e..40fc13b 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/MappingHookTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/MappingHookTest.php
@@ -34,7 +34,7 @@ public static function getInfo() {
    */
   function testMapping() {
     // Test that the mapping is returned correctly by the hook.
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype');
     $this->assertIdentical($mapping['rdftype'], array('sioc:Post'), 'Mapping for rdftype is sioc:Post.');
     $this->assertIdentical($mapping['title'], array('predicates' => array('dc:title')), 'Mapping for title is dc:title.');
     $this->assertIdentical($mapping['created'], array(
@@ -44,7 +44,7 @@ function testMapping() {
     ), 'Mapping for created is dc:created with datatype xsd:dateTime and callback date_iso8601.');
     $this->assertIdentical($mapping['uid'], array('predicates' => array('sioc:has_creator', 'dc:creator'), 'type' => 'rel'), 'Mapping for uid is sioc:has_creator and dc:creator, and type is rel.');
 
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle_no_mapping');
-    $this->assertEqual($mapping, array(), 'Empty array returned when an entity type, bundle pair has no mapping.');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype_no_mapping');
+    $this->assertEqual($mapping, array(), 'Empty array returned when an entity type, subtype pair has no mapping.');
   }
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingEventTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingEventTest.php
index 7a7a7b5..19efa69 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingEventTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingEventTest.php
@@ -10,7 +10,7 @@
 use Drupal\rdf\RdfMappingManager;
 use Drupal\rdf\EventSubscriber\MappingSubscriber;
 use Drupal\rdf_test_mapping\EventSubscriber\TestMappingSubscriber;
-use Drupal\rdf\SiteSchema\BundleSchema;
+use Drupal\rdf\SiteSchema\SubtypeSchema;
 use Drupal\rdf\SiteSchema\SiteSchema;
 use Drupal\rdf\SiteSchema\SiteSchemaManager;
 use Drupal\simpletest\WebTestBase;
@@ -51,14 +51,14 @@ public function testMapInputType() {
     // Test that a site schema URI is mapped to itself. This is the default
     // behavior.
     $schema = new SiteSchema(SiteSchema::CONTENT_DEPLOYMENT);
-    $bundle_schema = $schema->bundle('entity_test', 'entity_test');
-    $site_schema_type = $bundle_schema->getUri();
+    $subtype_schema = $schema->subtype('entity_test', 'entity_test');
+    $site_schema_type = $subtype_schema->getUri();
     $typed_data_ids = $mapping_manager->getTypedDataIdsFromTypeUris(array($site_schema_type));
-    $this->assertTrue($typed_data_ids['bundle'] == 'entity_test', 'An internal site schema type URI is properly handled.');
+    $this->assertTrue($typed_data_ids['subtype'] == 'entity_test', 'An internal site schema type URI is properly handled.');
 
     // Test that a module can map an external URI to a site schema URI.
     $typed_data_ids = $mapping_manager->getTypedDataIdsFromTypeUris(array(TestMappingSubscriber::STAGING_SITE_TYPE_URI));
-    $this->assertTrue($typed_data_ids['bundle'] == 'entity_test', 'Modules can map external type URIs to a site schema type.');
+    $this->assertTrue($typed_data_ids['subtype'] == 'entity_test', 'Modules can map external type URIs to a site schema type.');
   }
 
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
index 6f99dae..5030d4a 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
@@ -39,7 +39,7 @@ function testDrupalRdfaAttributes() {
     $expected_attributes = array(
       'property' => array('dc:title'),
     );
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype');
     $attributes = rdf_rdfa_attributes($mapping['title']);
     ksort($expected_attributes);
     ksort($attributes);
@@ -53,7 +53,7 @@ function testDrupalRdfaAttributes() {
       'property' => array('dc:created'),
       'content' => $isoDate,
     );
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype');
     $attributes = rdf_rdfa_attributes($mapping['created'], $date);
     ksort($expected_attributes);
     ksort($attributes);
@@ -64,7 +64,7 @@ function testDrupalRdfaAttributes() {
       'datatype' => 'foo:bar1type',
       'property' => array('foo:bar1'),
     );
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype');
     $attributes = rdf_rdfa_attributes($mapping['foobar1']);
     ksort($expected_attributes);
     ksort($attributes);
@@ -74,7 +74,7 @@ function testDrupalRdfaAttributes() {
     $expected_attributes = array(
       'rel' => array('sioc:has_creator', 'dc:creator'),
     );
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype');
     $attributes = rdf_rdfa_attributes($mapping['foobar_objproperty1']);
     ksort($expected_attributes);
     ksort($attributes);
@@ -84,7 +84,7 @@ function testDrupalRdfaAttributes() {
     $expected_attributes = array(
       'rev' => array('sioc:reply_of'),
     );
-    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $mapping = rdf_mapping_load('test_entity', 'test_subtype');
     $attributes = rdf_rdfa_attributes($mapping['foobar_objproperty2']);
     ksort($expected_attributes);
     ksort($attributes);
@@ -103,7 +103,7 @@ function testAttributesInMarkupFile() {
     $this->drupalLogin($admin_user);
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
-    $bundle_name = "article";
+    $subtype_name = "article";
 
     $field_name = 'file_test';
     $field = array(
@@ -114,19 +114,19 @@ function testAttributesInMarkupFile() {
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'node',
-      'bundle' => $bundle_name,
+      'subtype' => $subtype_name,
     );
     field_create_instance($instance);
-    entity_get_display('node', $bundle_name, 'teaser')
+    entity_get_display('node', $subtype_name, 'teaser')
       ->setComponent($field_name, array(
         'type' => 'file_default',
       ))
       ->save();
 
     // Set the RDF mapping for the new field.
-    $rdf_mapping = rdf_mapping_load('node', $bundle_name);
+    $rdf_mapping = rdf_mapping_load('node', $subtype_name);
     $rdf_mapping += array($field_name => array('predicates' => array('rdfs:seeAlso'), 'type' => 'rel'));
-    $rdf_mapping_save = array('mapping' => $rdf_mapping, 'type' => 'node', 'bundle' => $bundle_name);
+    $rdf_mapping_save = array('mapping' => $rdf_mapping, 'type' => 'node', 'subtype' => $subtype_name);
     rdf_mapping_save($rdf_mapping_save);
 
     // Get the test file that simpletest provides.
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/SiteSchemaTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/SiteSchemaTest.php
index 0cfe07f..2224afd 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/SiteSchemaTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/SiteSchemaTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\rdf\Tests;
 
-use Drupal\rdf\SiteSchema\BundleSchema;
+use Drupal\rdf\SiteSchema\SubtypeSchema;
 use Drupal\rdf\SiteSchema\SiteSchema;
 use Drupal\simpletest\WebTestBase;
 
@@ -26,7 +26,7 @@ class SiteSchemaTest extends WebTestBase {
   public static function getInfo() {
     return array(
       'name' => 'RDF site schema test',
-      'description' => 'Confirm that site-generated schemas are created for entity, bundle, field, and field property.',
+      'description' => 'Confirm that site-generated schemas are created for entity, subtype, field, and field property.',
       'group' => 'RDF',
     );
   }
@@ -35,21 +35,21 @@ public static function getInfo() {
    * Tests site-generated schema.
    */
   function testSiteSchema() {
-    $entity_type = $bundle = 'entity_test';
+    $entity_type = $subtype = 'entity_test';
     $schema = new SiteSchema(SiteSchema::SYNDICATION);
     $schema_path = 'site-schema/syndication/';
 
-    // Bundle.
-    $bundle_schema = $schema->bundle($entity_type, $bundle);
-    $bundle_uri = url("$schema_path$entity_type/$bundle", array('absolute' => TRUE));
-    $bundle_properties = array(
+    // Subtype.
+    $subtype_schema = $schema->subtype($entity_type, $subtype);
+    $subtype_uri = url("$schema_path$entity_type/$subtype", array('absolute' => TRUE));
+    $subtype_properties = array(
       'http://www.w3.org/2000/01/rdf-schema#isDefinedBy' => url($schema_path, array('absolute' => TRUE)),
       'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' => 'http://www.w3.org/2000/01/rdf-schema#class',
       'http://www.w3.org/2000/01/rdf-schema#subClassOf' => url("$schema_path$entity_type", array('absolute' => TRUE)),
     );
 
-    $this->assertEqual($bundle_schema->getUri(), $bundle_uri, 'Bundle term URI is generated correctly.');
-    $this->assertEqual($bundle_schema->getProperties(), $bundle_properties, 'Bundle term properties are generated correctly.');
+    $this->assertEqual($subtype_schema->getUri(), $subtype_uri, 'Subtype term URI is generated correctly.');
+    $this->assertEqual($subtype_schema->getProperties(), $subtype_properties, 'Subtype term properties are generated correctly.');
   }
 
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/UserAttributesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/UserAttributesTest.php
index 29c69cb..9e8a815 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/UserAttributesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/UserAttributesTest.php
@@ -45,7 +45,7 @@ function testUserAttributesInMarkup() {
     $account_uri = url('user/' . $user2->uid, array('absolute' => TRUE));
     $person_uri = url('user/' . $user2->uid, array('fragment' => 'me', 'absolute' => TRUE));
 
-    // Parses the user profile page where the default bundle mapping for user
+    // Parses the user profile page where the default subtype mapping for user
     // should be used.
     $parser = new \EasyRdf_Parser_Rdfa();
     $graph = new \EasyRdf_Graph();
@@ -84,14 +84,14 @@ function testUserAttributesInMarkup() {
     $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
     $this->drupalLogin($user1);
 
-    // Parses the user profile page where the default bundle mapping for user
+    // Parses the user profile page where the default subtype mapping for user
     // should be used.
     $parser = new \EasyRdf_Parser_Rdfa();
     $graph = new \EasyRdf_Graph();
     $base_uri = url('<front>', array('absolute' => TRUE));
     $parser->parse($graph, $this->drupalGet('node/' . $node->nid), 'rdfa', $base_uri);
 
-    // Ensures the default bundle mapping for user is used on the Authored By
+    // Ensures the default subtype mapping for user is used on the Authored By
     // information on the node.
     // User type.
     $expected_value = array(
diff --git a/core/modules/rdf/rdf.api.php b/core/modules/rdf/rdf.api.php
index b3f95ba..0e6afec 100644
--- a/core/modules/rdf/rdf.api.php
+++ b/core/modules/rdf/rdf.api.php
@@ -11,24 +11,24 @@
  */
 
 /**
- * Allow modules to define RDF mappings for field bundles.
+ * Allow modules to define RDF mappings for field subtypes.
  *
- * Modules defining their own field bundles can specify which RDF semantics
- * should be used to annotate these bundles. These mappings are then used for
+ * Modules defining their own field subtypes can specify which RDF semantics
+ * should be used to annotate these subtypes. These mappings are then used for
  * automatic RDFa output in the HTML code.
  *
  * @return
  *   A list of mapping structures, where each mapping is an associative array:
  *   - type: The name of an entity type (e.g., 'node', 'comment', and so on.)
- *   - bundle: The name of the bundle (e.g., 'page', 'article', or
+ *   - subtype: The name of the subtype (e.g., 'page', 'article', or
  *     RDF_DEFAULT_BUNDLE for default mappings.)
  *   - mapping: The mapping structure which applies to the entity type and
- *     bundle. A mapping structure is an array with keys corresponding to
- *     existing field instances in the bundle. Each field is then described in
+ *     subtype. A mapping structure is an array with keys corresponding to
+ *     existing field instances in the subtype. Each field is then described in
  *     terms of the RDF mapping:
  *     - predicates: An array of RDF predicates which describe the relation
- *       between the bundle (RDF subject) and the value of the field (RDF
- *       object). This value is either some text, another bundle, or a URI in
+ *       between the subtype (RDF subject) and the value of the field (RDF
+ *       object). This value is either some text, another subtype, or a URI in
  *       general.
  *     - datatype: Is used along with 'callback' to format data so that it is
  *       readable by machines. A typical example is a date which can be written
@@ -47,7 +47,7 @@ function hook_rdf_mapping() {
   return array(
     array(
       'type' => 'comment',
-      'bundle' => RDF_DEFAULT_BUNDLE,
+      'subtype' => RDF_DEFAULT_BUNDLE,
       'mapping' => array(
         'rdftype' => array('sioc:Post', 'sioct:Comment'),
         'title' => array(
diff --git a/core/modules/rdf/rdf.install b/core/modules/rdf/rdf.install
index 10d3f8d..9336bb9 100644
--- a/core/modules/rdf/rdf.install
+++ b/core/modules/rdf/rdf.install
@@ -18,21 +18,21 @@ function rdf_schema() {
         'not null' => TRUE,
         'description' => 'The name of the entity type a mapping applies to (node, user, comment, etc.).',
       ),
-      'bundle' => array(
+      'subtype' => array(
         'type' => 'varchar',
         'length' => 128,
         'not null' => TRUE,
-        'description' => 'The name of the bundle a mapping applies to.',
+        'description' => 'The name of the subtype a mapping applies to.',
       ),
       'mapping' => array(
-        'description' => 'The serialized mapping of the bundle type and fields to RDF terms.',
+        'description' => 'The serialized mapping of the subtype type and fields to RDF terms.',
         'type' => 'blob',
         'not null' => FALSE,
         'size' => 'big',
         'serialize' => TRUE,
       ),
     ),
-    'primary key' => array('type', 'bundle'),
+    'primary key' => array('type', 'subtype'),
   );
 
   return $schema;
diff --git a/core/modules/rdf/rdf.module b/core/modules/rdf/rdf.module
index 89494eb..0e92308 100644
--- a/core/modules/rdf/rdf.module
+++ b/core/modules/rdf/rdf.module
@@ -24,7 +24,7 @@ function rdf_help($path, $arg) {
 /**
  * @defgroup rdf RDF Mapping API
  * @{
- * Functions to describe entities and bundles in RDF.
+ * Functions to describe entities and subtypes in RDF.
  *
  * The RDF module introduces RDF and RDFa to Drupal. RDF is a W3C standard to
  * describe structured data. RDF can be serialized as RDFa in XHTML attributes
@@ -32,7 +32,7 @@ function rdf_help($path, $arg) {
  * @see http://www.w3.org/RDF/
  * @see http://www.w3.org/TR/xhtml-rdfa-primer/
  *
- * Modules can provide mappings of their bundles' data and metadata to RDF
+ * Modules can provide mappings of their subtypes' data and metadata to RDF
  * classes and properties. This module takes care of injecting these mappings
  * into variables available to theme functions and templates. All Drupal core
  * themes are coded to be RDFa compatible.
@@ -41,7 +41,7 @@ function rdf_help($path, $arg) {
  * @code
  *   array(
  *     'type' => 'node',
- *     'bundle' => RDF_DEFAULT_BUNDLE,
+ *     'subtype' => RDF_DEFAULT_BUNDLE,
  *     'mapping' => array(
  *       'rdftype' => array('sioc:Item', 'foaf:Document'),
  *       'title' => array(
@@ -67,12 +67,12 @@ function rdf_help($path, $arg) {
  */
 
 /**
- * RDF bundle flag: Default bundle.
+ * RDF subtype flag: Default subtype.
  *
  * Implementations of hook_rdf_mapping() should use this constant for the
- * 'bundle' key when defining a default set of RDF mappings for an entity type.
- * Each bundle will inherit the default mappings defined for the entity type
- * unless the bundle defines its own specific mappings.
+ * 'subtype' key when defining a default set of RDF mappings for an entity type.
+ * Each subtype will inherit the default mappings defined for the entity type
+ * unless the subtype defines its own specific mappings.
  */
 const RDF_DEFAULT_BUNDLE = '';
 
@@ -113,24 +113,24 @@ function rdf_get_namespaces() {
 }
 
 /**
- * Returns the mapping for attributes of a given entity type/bundle pair.
+ * Returns the mapping for attributes of a given entity type/subtype pair.
  *
  * @param $type
  *   An entity type.
- * @param $bundle
- *   (optional) A bundle name.
+ * @param $subtype
+ *   (optional) A subtype name.
  *
  * @return
- *   The mapping corresponding to the requested entity type/bundle pair or an
+ *   The mapping corresponding to the requested entity type/subtype pair or an
  *   empty array.
  */
-function rdf_mapping_load($type, $bundle = RDF_DEFAULT_BUNDLE) {
-  // Retrieves the bundle-specific mapping from the entity info.
-  $bundles = entity_get_bundles($type);
-  if (!empty($bundles[$bundle]['rdf_mapping'])) {
-    return $bundles[$bundle]['rdf_mapping'];
+function rdf_mapping_load($type, $subtype = RDF_DEFAULT_BUNDLE) {
+  // Retrieves the subtype-specific mapping from the entity info.
+  $subtypes = entity_get_subtypes($type);
+  if (!empty($subtypes[$subtype]['rdf_mapping'])) {
+    return $subtypes[$subtype]['rdf_mapping'];
   }
-  // If there is no mapping defined for this bundle, we return the default
+  // If there is no mapping defined for this subtype, we return the default
   // mapping that is defined for this entity type.
   else {
     return _rdf_get_default_mapping($type);
@@ -162,7 +162,7 @@ function _rdf_get_default_mapping($type) {
     foreach ($modules as $module) {
       $mappings = module_invoke($module, 'rdf_mapping');
       foreach ($mappings as $mapping) {
-        if ($mapping['bundle'] === RDF_DEFAULT_BUNDLE) {
+        if ($mapping['subtype'] === RDF_DEFAULT_BUNDLE) {
           $default_mappings[$mapping['type']] = $mapping['mapping'];
         }
       }
@@ -177,14 +177,14 @@ function _rdf_get_default_mapping($type) {
  *
  * @param $type
  *   The entity type the mapping refers to.
- * @param $bundle
- *   The bundle the mapping refers to.
+ * @param $subtype
+ *   The subtype the mapping refers to.
  *
  * @return
  *   An RDF mapping structure or, FALSE if the mapping does not exist.
  */
-function _rdf_mapping_load($type, $bundle) {
-  $mappings = _rdf_mapping_load_multiple($type, array($bundle));
+function _rdf_mapping_load($type, $subtype) {
+  $mappings = _rdf_mapping_load_multiple($type, array($subtype));
   return $mappings ? reset($mappings) : FALSE;
 }
 
@@ -193,22 +193,22 @@ function _rdf_mapping_load($type, $bundle) {
  *
  * @param $type
  *   The entity type of the mappings.
- * @param $bundles
- *   The bundles the mappings refer to.
+ * @param $subtypes
+ *   The subtypes the mappings refer to.
  *
  * @return
  *   An array of RDF mapping structures, or an empty array.
  */
-function _rdf_mapping_load_multiple($type, array $bundles) {
+function _rdf_mapping_load_multiple($type, array $subtypes) {
   $mappings = db_select('rdf_mapping')
-    ->fields(NULL, array('bundle', 'mapping'))
+    ->fields(NULL, array('subtype', 'mapping'))
     ->condition('type', $type)
-    ->condition('bundle', $bundles)
+    ->condition('subtype', $subtypes)
     ->execute()
     ->fetchAllKeyed();
 
-  foreach ($mappings as $bundle => $mapping) {
-    $mappings[$bundle] = unserialize($mapping);
+  foreach ($mappings as $subtype => $mapping) {
+    $mappings[$subtype] = unserialize($mapping);
   }
   return $mappings;
 }
@@ -223,7 +223,7 @@ function _rdf_mapping_load_multiple($type, array $bundles) {
  *
  * Takes a mapping structure returned by hook_rdf_mapping() implementations
  * and creates or updates a record mapping for each encountered entity
- * type/bundle pair. If available, adds default values for non-existent mapping
+ * type/subtype pair. If available, adds default values for non-existent mapping
  * keys.
  *
  * @param $mapping
@@ -234,14 +234,14 @@ function _rdf_mapping_load_multiple($type, array $bundles) {
  */
 function rdf_mapping_save($mapping) {
   // In the case where a field has a mapping defined in the default entity
-  // mapping, but a mapping is not specified in the bundle-specific mapping,
+  // mapping, but a mapping is not specified in the subtype-specific mapping,
   // then use the default mapping for that field.
   $mapping['mapping'] += _rdf_get_default_mapping($mapping['type']);
 
   $status = db_merge('rdf_mapping')
     ->key(array(
       'type' => $mapping['type'],
-      'bundle' => $mapping['bundle'],
+      'subtype' => $mapping['subtype'],
     ))
     ->fields(array(
       'mapping' => serialize($mapping['mapping']),
@@ -254,20 +254,20 @@ function rdf_mapping_save($mapping) {
 }
 
 /**
- * Deletes the mapping for the given bundle from the database.
+ * Deletes the mapping for the given subtype from the database.
  *
  * @param $type
  *   The entity type the mapping refers to.
- * @param $bundle
- *   The bundle the mapping refers to.
+ * @param $subtype
+ *   The subtype the mapping refers to.
  *
  * @return
  *   TRUE if the mapping is deleted, FALSE if not.
  */
-function rdf_mapping_delete($type, $bundle) {
+function rdf_mapping_delete($type, $subtype) {
   $num_rows = db_delete('rdf_mapping')
     ->condition('type', $type)
-    ->condition('bundle', $bundle)
+    ->condition('subtype', $subtype)
     ->execute();
 
   return (bool) ($num_rows > 0);
@@ -340,10 +340,10 @@ function rdf_rdfa_attributes($mapping, $data = NULL) {
  * Checks if the installed modules have any RDF mapping definitions to declare
  * and stores them in the rdf_mapping table.
  *
- * While both default entity mappings and specific bundle mappings can be
+ * While both default entity mappings and specific subtype mappings can be
  * defined in hook_rdf_mapping(), default entity mappings are not stored in the
  * database. Only overridden mappings are stored in the database. The default
- * entity mappings can be overriden by specific bundle mappings which are
+ * entity mappings can be overriden by specific subtype mappings which are
  * stored in the database and can be altered via the RDF CRUD mapping API.
  */
 function rdf_modules_installed($modules) {
@@ -351,8 +351,8 @@ function rdf_modules_installed($modules) {
     $function = $module . '_rdf_mapping';
     if (function_exists($function)) {
       foreach ($function() as $mapping) {
-        // Only the bundle mappings are saved in the database.
-        if ($mapping['bundle'] !== RDF_DEFAULT_BUNDLE) {
+        // Only the subtype mappings are saved in the database.
+        if ($mapping['subtype'] !== RDF_DEFAULT_BUNDLE) {
           rdf_mapping_save($mapping);
         }
       }
@@ -368,31 +368,31 @@ function rdf_modules_uninstalled($modules) {
 }
 
 /**
- * Implements hook_entity_bundle_info_alter().
+ * Implements hook_entity_subtype_info_alter().
  *
- * Adds the proper RDF mapping to each entity type/bundle pair.
+ * Adds the proper RDF mapping to each entity type/subtype pair.
  *
  * @todo May need to move the comment below to another place.
- * This hook should not be used by modules to alter the bundle mappings. The UI
+ * This hook should not be used by modules to alter the subtype mappings. The UI
  * should always be authoritative. UI mappings are stored in the database and
  * if hook_entity_info_alter() was used to override module defined mappings, it
  * would override the user defined mapping as well.
  *
  */
-function rdf_entity_bundle_info_alter(&$bundles) {
-  // Loop through each entity type and its bundles.
-  foreach ($bundles as $entity_type => $bundle_info) {
-    $bundle_names = array_keys($bundle_info);
-    $mappings = _rdf_mapping_load_multiple($entity_type, $bundle_names);
+function rdf_entity_subtype_info_alter(&$subtypes) {
+  // Loop through each entity type and its subtypes.
+  foreach ($subtypes as $entity_type => $subtype_info) {
+    $subtype_names = array_keys($subtype_info);
+    $mappings = _rdf_mapping_load_multiple($entity_type, $subtype_names);
 
-    foreach ($bundle_names as $bundle) {
-      if (isset($mappings[$bundle])) {
-        $bundles[$entity_type][$bundle]['rdf_mapping'] = $mappings[$bundle];
+    foreach ($subtype_names as $subtype) {
+      if (isset($mappings[$subtype])) {
+        $subtypes[$entity_type][$subtype]['rdf_mapping'] = $mappings[$subtype];
       }
       else {
         // If no mapping was found in the database, assign the default RDF
         // mapping for this entity type.
-        $bundles[$entity_type][$bundle]['rdf_mapping'] = _rdf_get_default_mapping($entity_type);
+        $subtypes[$entity_type][$subtype]['rdf_mapping'] = _rdf_get_default_mapping($entity_type);
       }
     }
   }
@@ -403,8 +403,8 @@ function rdf_entity_bundle_info_alter(&$bundles) {
  */
 function rdf_entity_load($entities, $type) {
   foreach ($entities as $entity) {
-    // Extracts the bundle of the entity being loaded.
-    $entity->rdf_mapping = rdf_mapping_load($type, $entity->bundle());
+    // Extracts the subtype of the entity being loaded.
+    $entity->rdf_mapping = rdf_mapping_load($type, $entity->subtype());
   }
 }
 
@@ -579,7 +579,7 @@ function rdf_preprocess_node(&$variables) {
  */
 function rdf_preprocess_field(&$variables) {
   $element = $variables['element'];
-  $mapping = rdf_mapping_load($element['#entity_type'], $element['#bundle']);
+  $mapping = rdf_mapping_load($element['#entity_type'], $element['#subtype']);
   $field_name = $element['#field_name'];
 
   if (!empty($mapping) && !empty($mapping[$field_name])) {
@@ -660,7 +660,7 @@ function rdf_preprocess_username(&$variables) {
   // contain the RDF mappings for the user. In the case of nodes and comments,
   // it contains the mappings for the node or comment object instead. However,
   // while the RDF mappings are available from a full user_load(), this should
-  // be avoided for performance reasons. Since the type and bundle for users is
+  // be avoided for performance reasons. Since the type and subtype for users is
   // already known, call rdf_mapping_load() directly.
   $rdf_mapping = rdf_mapping_load('user', 'user');
 
@@ -811,7 +811,7 @@ function rdf_field_attach_view_alter(&$output, $context) {
 function rdf_preprocess_image(&$variables) {
   // Adds the RDF type for image.  We cannot use the usual entity-based mapping
   // to get 'foaf:Image' because image does not have its own entity type or
-  // bundle.
+  // subtype.
   $variables['attributes']['typeof'] = array('foaf:Image');
 }
 
diff --git a/core/modules/rdf/tests/rdf_test.install b/core/modules/rdf/tests/rdf_test.install
index 91a3392..32136f7 100644
--- a/core/modules/rdf/tests/rdf_test.install
+++ b/core/modules/rdf/tests/rdf_test.install
@@ -12,7 +12,7 @@ function rdf_test_install() {
   $rdf_mappings = array(
     array(
       'type' => 'node',
-      'bundle' => 'test_bundle_hook_install',
+      'subtype' => 'test_subtype_hook_install',
       'mapping' => array(
         'rdftype' => array('foo:mapping_install1', 'bar:mapping_install2'),
       ),
diff --git a/core/modules/rdf/tests/rdf_test.module b/core/modules/rdf/tests/rdf_test.module
index 4d90472..8183b4b 100644
--- a/core/modules/rdf/tests/rdf_test.module
+++ b/core/modules/rdf/tests/rdf_test.module
@@ -12,7 +12,7 @@ function rdf_test_rdf_mapping() {
   return array(
     array(
       'type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'mapping' => array(
         'rdftype' => array('sioc:Post'),
         'title' => array(
diff --git a/core/modules/rdf/tests/rdf_test_mapping/lib/Drupal/rdf_test_mapping/EventSubscriber/TestMappingSubscriber.php b/core/modules/rdf/tests/rdf_test_mapping/lib/Drupal/rdf_test_mapping/EventSubscriber/TestMappingSubscriber.php
index 44e9460..6937700 100644
--- a/core/modules/rdf/tests/rdf_test_mapping/lib/Drupal/rdf_test_mapping/EventSubscriber/TestMappingSubscriber.php
+++ b/core/modules/rdf/tests/rdf_test_mapping/lib/Drupal/rdf_test_mapping/EventSubscriber/TestMappingSubscriber.php
@@ -8,13 +8,13 @@
 namespace Drupal\rdf_test_mapping\EventSubscriber;
 
 use Drupal\rdf\RdfMappingEvents;
-use Drupal\rdf\SiteSchema\BundleSchema;
+use Drupal\rdf\SiteSchema\SubtypeSchema;
 use Drupal\rdf\SiteSchema\SiteSchema;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 class TestMappingSubscriber implements EventSubscriberInterface {
 
-  const STAGING_SITE_TYPE_URI = 'http://staging.com/entity_test_bundle';
+  const STAGING_SITE_TYPE_URI = 'http://staging.com/entity_test_subtype';
 
   /**
    * Demonstrate mapping between external type and site schema type.
@@ -31,8 +31,8 @@ public function mapTypesFromInput($event) {
     // table. For the test, manually map a fake external URI to the site schema
     // URI for the test entity.
     $schema = new SiteSchema(SiteSchema::CONTENT_DEPLOYMENT);
-    $bundle_schema = $schema->bundle('entity_test', 'entity_test');
-    $site_schema_type = $bundle_schema->getUri();
+    $subtype_schema = $schema->subtype('entity_test', 'entity_test');
+    $site_schema_type = $subtype_schema->getUri();
     $mapping = array(
       self::STAGING_SITE_TYPE_URI => $site_schema_type,
     );
diff --git a/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
index fb7019e..b678aed 100644
--- a/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
@@ -70,7 +70,7 @@ protected function setUp() {
     $instance = array(
       'entity_type' => 'entity_test_mulrev',
       'field_name' => 'field_test_text',
-      'bundle' => 'entity_test_mulrev',
+      'subtype' => 'entity_test_mulrev',
       'label' => 'Test text-field',
       'widget' => array(
         'type' => 'text_textfield',
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php b/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php
index 3aeab60..af8bde1 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php
@@ -231,7 +231,7 @@ function testEnableModulesFixedList() {
     // Create a field and an instance.
     $display = entity_create('entity_display', array(
       'targetEntityType' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'viewMode' => 'default',
     ));
     $field = array(
@@ -242,7 +242,7 @@ function testEnableModulesFixedList() {
     $instance = array(
       'field_name' => $field['field_name'],
       'entity_type' => 'entity_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
     );
     field_create_instance($instance);
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php
index c9e7b6d..15b90b5 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php
@@ -43,7 +43,7 @@ function setUp() {
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
     );
     field_create_instance($instance);
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Condition/ConditionFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Condition/ConditionFormTest.php
index e191efe..bdfb860 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Condition/ConditionFormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Condition/ConditionFormTest.php
@@ -35,10 +35,10 @@ function testConfigForm() {
     $article = entity_create('node', array('type' => 'article', 'title' => $this->randomName()));
     $article->save();
     $this->drupalGet('condition_test');
-    $this->assertField('bundles[article]', 'There is an article bundle selector.');
-    $this->assertField('bundles[page]', 'There is a page bundle selector.');
-    $this->drupalPost(NULL, array('bundles[page]' => 'page', 'bundles[article]' => 'article'), t('Submit'));
-    $this->assertText('The bundles are article and page', 'The form component appropriately saved the bundles.');
+    $this->assertField('subtypes[article]', 'There is an article subtype selector.');
+    $this->assertField('subtypes[page]', 'There is a page subtype selector.');
+    $this->drupalPost(NULL, array('subtypes[page]' => 'page', 'subtypes[article]' => 'article'), t('Submit'));
+    $this->assertText('The subtypes are article and page', 'The form component appropriately saved the subtypes.');
     $this->assertText('Executed successfully.', 'The form configured condition executed properly.');
   }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
index 67f190e..074beec 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
@@ -149,7 +149,7 @@ public function testCommentHooks() {
     $_SESSION['entity_crud_hook_test'] = array();
 
     $comment = entity_create('comment', array(
-      'node_type' => 'node_type_' . $node->bundle(),
+      'node_type' => 'node_type_' . $node->subtype(),
       'cid' => NULL,
       'pid' => 0,
       'nid' => $nid,
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
index 3c5679b..42dabc4 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
@@ -364,7 +364,7 @@ protected function assertIntrospection($entity_type) {
     $this->assertEqual($definitions['field_test_text']['type'], 'text_field', $entity_type .': Test-text-field field found.');
 
     // Test introspecting an entity object.
-    // @todo: Add bundles and test bundles as well.
+    // @todo: Add subtypes and test subtypes as well.
     $entity = entity_create($entity_type, array());
 
     $definitions = $entity->getPropertyDefinitions();
@@ -555,12 +555,12 @@ public function testEntityConstraintValidation() {
     $violations = $wrapped_entity->validate();
     $this->assertEqual($violations->count(), 1);
 
-    // Test bundle validation.
+    // Test subtype validation.
     $entity_definition = array(
       'type' => 'entity',
       'constraints' => array(
         'EntityType' => 'node',
-        'Bundle' => 'article',
+        'Subtype' => 'article',
       ),
       'label' => 'Test node',
     );
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryAggregateTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryAggregateTest.php
index 54c6934..49273df 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryAggregateTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryAggregateTest.php
@@ -69,7 +69,7 @@ public function setUp() {
       $instance = array(
         'field_name' => $field['field_name'],
         'entity_type' => 'entity_test',
-        'bundle' => 'entity_test',
+        'subtype' => 'entity_test',
       );
       field_create_instance($instance);
     }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryRelationshipTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryRelationshipTest.php
index 434311c..742c290 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryRelationshipTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryRelationshipTest.php
@@ -90,7 +90,7 @@ public function setUp() {
     $instance = array(
       'entity_type' => 'entity_test',
       'field_name' => $this->fieldName,
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
     );
     field_create_instance($instance);
     // Create two terms and also two accounts.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryTest.php
index ae51625..53ca2bd 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityQueryTest.php
@@ -53,7 +53,7 @@ public static function getInfo() {
 
   function setUp() {
     parent::setUp();
-    $this->installSchema('field_test', array('test_entity', 'test_entity_revision', 'test_entity_bundle'));
+    $this->installSchema('field_test', array('test_entity', 'test_entity_revision', 'test_entity_subtype'));
     $figures = drupal_strtolower($this->randomName());
     $greetings = drupal_strtolower($this->randomName());
     foreach (array($figures => 'shape', $greetings => 'text') as $field_name => $field_type) {
@@ -64,23 +64,23 @@ function setUp() {
       );
       $fields[] = field_create_field($field);
     }
-    $bundles = array();
+    $subtypes = array();
     for ($i = 0; $i < 2; $i++) {
-      // For the sake of tablesort, make sure the second bundle is higher than
+      // For the sake of tablesort, make sure the second subtype is higher than
       // the first one. Beware: MySQL is not case sensitive.
       do {
-        $bundle = $this->randomName();
-      } while ($bundles && strtolower($bundles[0]) >= strtolower($bundle));
-      field_test_create_bundle($bundle);
+        $subtype = $this->randomName();
+      } while ($subtypes && strtolower($subtypes[0]) >= strtolower($subtype));
+      field_test_create_subtype($subtype);
       foreach ($fields as $field) {
         $instance = array(
           'field_name' => $field['field_name'],
           'entity_type' => 'test_entity',
-          'bundle' => $bundle,
+          'subtype' => $subtype,
         );
         field_create_instance($instance);
       }
-      $bundles[] = $bundle;
+      $subtypes[] = $subtype;
     }
     // Each unit is a list of field name, langcode and a column-value array.
     $units[] = array($figures, LANGUAGE_NOT_SPECIFIED, array(
@@ -112,7 +112,7 @@ function setUp() {
       $entity = entity_create('test_entity', array(
         'ftid' => $i,
         'ftvid' => $i,
-        'fttype' => $bundles[$i & 1],
+        'fttype' => $subtypes[$i & 1],
       ));
       $entity->enforceIsNew();
       $entity->setNewRevision();
@@ -349,8 +349,8 @@ function testSort() {
    * Test tablesort().
    */
   protected function testTableSort() {
-    // While ordering on bundles do not give us a definite order, we can still
-    // assert that all entities from one bundle are after the other as the
+    // While ordering on subtypes do not give us a definite order, we can still
+    // assert that all entities from one subtype are after the other as the
     // order dictates.
     $_GET['sort'] = 'asc';
     $_GET['order'] = 'Type';
@@ -362,7 +362,7 @@ protected function testTableSort() {
     $this->queryResults = array_values($this->factory->get('test_entity')
       ->tableSort($header)
       ->execute());
-    $this->assertBundleOrder('asc');
+    $this->assertSubtypeOrder('asc');
     $_GET['sort'] = 'desc';
     $header = array(
       'id' => array('data' => 'Id', 'specifier' => 'ftid'),
@@ -371,7 +371,7 @@ protected function testTableSort() {
     $this->queryResults = array_values($this->factory->get('test_entity')
       ->tableSort($header)
       ->execute());
-    $this->assertBundleOrder('desc');
+    $this->assertSubtypeOrder('desc');
     // Ordering on ID is definite, however.
     $_GET['order'] = 'Id';
     $this->queryResults = $this->factory->get('test_entity')
@@ -387,24 +387,24 @@ protected function testCount() {
     // Attach the existing 'figures' field to a second entity type so that we
     // can test whether cross entity type fields produce the correct query.
     $field_name = $this->figures;
-    $bundle = $this->randomName();
+    $subtype = $this->randomName();
     $instance = array(
       'field_name' => $field_name,
-      'entity_type' => 'test_entity_bundle',
-      'bundle' => $bundle,
+      'entity_type' => 'test_entity_subtype',
+      'subtype' => $subtype,
     );
     field_create_instance($instance);
 
-    $entity = entity_create('test_entity_bundle', array(
+    $entity = entity_create('test_entity_subtype', array(
       'ftid' => 1,
-      'fttype' => $bundle,
+      'fttype' => $subtype,
     ));
     $entity->enforceIsNew();
     $entity->setNewRevision();
     $entity->save();
     // As the single entity of this type we just saved does not have a value
     // in the color field, the result should be 0.
-    $count = $this->factory->get('test_entity_bundle')
+    $count = $this->factory->get('test_entity_subtype')
       ->exists("$field_name.color")
       ->count()
       ->execute();
@@ -432,13 +432,13 @@ protected function assertRevisionResult($keys, $expected) {
     return $assert;
   }
 
-  protected function assertBundleOrder($order) {
-    // This loop is for bundle1 entities.
+  protected function assertSubtypeOrder($order) {
+    // This loop is for subtype1 entities.
     for ($i = 1; $i <= 15; $i +=2) {
       $ok = TRUE;
       $index1 = array_search($i, $this->queryResults);
       $this->assertNotIdentical($index1, FALSE, "$i found at $index1.");
-      // This loop is for bundle2 entities.
+      // This loop is for subtype2 entities.
       for ($j = 2; $j <= 15; $j += 2) {
         if ($ok) {
           if ($order == 'asc') {
@@ -449,7 +449,7 @@ protected function assertBundleOrder($order) {
           }
         }
       }
-      $this->assertTrue($ok, format_string("$i is after all entities in bundle2"));
+      $this->assertTrue($ok, format_string("$i is after all entities in subtype2"));
     }
   }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
index cccdc5f..788b9e4 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
@@ -64,7 +64,7 @@ function setUp() {
       $instance = array(
         'field_name' => $this->field_name,
         'entity_type' => $entity_type,
-        'bundle' => $entity_type,
+        'subtype' => $entity_type,
       );
       field_create_instance($instance);
       $this->instance[$entity_type] = field_read_instance($entity_type, $this->field_name, $entity_type);
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php
index 1604063..11fe543 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php
@@ -44,7 +44,7 @@ function setUp() {
     $instance = array(
       'entity_type' => 'node',
       'field_name' => 'test_multiple',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'label' => 'Test a multiple valued field',
       'widget' => array(
         'type' => 'text_textfield',
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php
index 3c0c0c5..8cfc36a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php
@@ -80,7 +80,7 @@ function testPreserveFormActionAfterAJAX() {
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
     );
     field_create_instance($instance);
 
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index a8e132e..d556201 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -3736,13 +3736,13 @@ function hook_filetransfer_info_alter(&$filetransfer_info) {
  * And bar.install could contain:
  * @code
  * function bar_update_8000() {
- *   // Type and bundle are confusing, so we renamed the table.
- *   db_rename_table('bar_types', 'bar_bundles');
+ *   // Type and subtype are confusing, so we renamed the table.
+ *   db_rename_table('bar_types', 'bar_subtypes');
  * }
  *
  * function bar_update_8001() {
  *   // Database table names should be singular when possible.
- *   db_rename_table('bar_bundles', 'bar_bundle');
+ *   db_rename_table('bar_subtypes', 'bar_subtype');
  * }
  *
  * function _update_7000_bar_get_types() {
@@ -3750,11 +3750,11 @@ function hook_filetransfer_info_alter(&$filetransfer_info) {
  * }
  *
  * function _update_8000_bar_get_types() {
- *   db_query('SELECT * FROM {bar_bundles'})->fetchAll();
+ *   db_query('SELECT * FROM {bar_subtypes'})->fetchAll();
  * }
  *
  * function _update_8001_bar_get_types() {
- *   db_query('SELECT * FROM {bar_bundle}')->fetchAll();
+ *   db_query('SELECT * FROM {bar_subtype}')->fetchAll();
  * }
  * @endcode
  *
diff --git a/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php b/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php
index 03b918e..4a96212 100644
--- a/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php
+++ b/core/modules/system/tests/modules/condition_test/lib/Drupal/condition_test/FormController.php
@@ -63,8 +63,8 @@ public function validateForm(array &$form, array &$form_state) {
   public function submitForm(array &$form, array &$form_state) {
     $this->condition->submitForm($form, $form_state);
     $config = $this->condition->getConfig();
-    $bundles = implode(' and ', $config['bundles']);
-    drupal_set_message(t('The bundles are @bundles', array('@bundles' => $bundles)));
+    $subtypes = implode(' and ', $config['subtypes']);
+    drupal_set_message(t('The subtypes are @subtypes', array('@subtypes' => $subtypes)));
     $article = node_load(1);
     $this->condition->setContextValue('node', $article);
     if ($this->condition->execute()) {
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.install b/core/modules/system/tests/modules/entity_test/entity_test.install
index dacd1f5..3f84309 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.install
+++ b/core/modules/system/tests/modules/entity_test/entity_test.install
@@ -28,7 +28,7 @@ function entity_test_install() {
     $instance = array(
       'entity_type' => $entity_type,
       'field_name' => 'field_test_text',
-      'bundle' => $entity_type,
+      'subtype' => $entity_type,
       'label' => 'Test text-field',
       'widget' => array(
         'type' => 'text_textfield',
diff --git a/core/modules/system/tests/upgrade/drupal-7.field.database.php b/core/modules/system/tests/upgrade/drupal-7.field.database.php
index 0862650..10fb21d 100644
--- a/core/modules/system/tests/upgrade/drupal-7.field.database.php
+++ b/core/modules/system/tests/upgrade/drupal-7.field.database.php
@@ -8,7 +8,7 @@
  * two form the database structure expected in tests altogether.
  */
 
-// Add a 'bundle settings' variable for article nodes.
+// Add a 'subtype settings' variable for article nodes.
 $value = array(
   'view_modes' => array(
     'teaser' => array(
@@ -45,7 +45,7 @@
 );
 db_insert('variable')
   ->fields(array(
-    'name' => 'field_bundle_settings_node__article',
+    'name' => 'field_subtype_settings_node__article',
     'value' => serialize($value),
   ))
   ->execute();
diff --git a/core/modules/system/tests/upgrade/drupal-7.language.database.php b/core/modules/system/tests/upgrade/drupal-7.language.database.php
index 5687361..5513583 100644
--- a/core/modules/system/tests/upgrade/drupal-7.language.database.php
+++ b/core/modules/system/tests/upgrade/drupal-7.language.database.php
@@ -593,7 +593,7 @@
 // Add the body field value.
 db_insert('field_data_body')->fields(array(
   'entity_type',
-  'bundle',
+  'subtype',
   'deleted',
   'entity_id',
   'revision_id',
@@ -605,7 +605,7 @@
 ))
 ->values(array(
   'entity_type' => 'node',
-  'bundle' => 'article',
+  'subtype' => 'article',
   'deleted' => '0',
   'entity_id' => '50',
   'revision_id' => '70',
@@ -620,7 +620,7 @@
 // Add revision information for the body field value.
 db_insert('field_revision_body')->fields(array(
   'entity_type',
-  'bundle',
+  'subtype',
   'deleted',
   'entity_id',
   'revision_id',
@@ -632,7 +632,7 @@
 ))
 ->values(array(
   'entity_type' => 'node',
-  'bundle' => 'article',
+  'subtype' => 'article',
   'deleted' => '0',
   'entity_id' => '50',
   'revision_id' => '70',
@@ -698,7 +698,7 @@
 // Add both comment bodies.
 db_insert('field_data_comment_body')->fields(array(
   'entity_type',
-  'bundle',
+  'subtype',
   'deleted',
   'entity_id',
   'revision_id',
@@ -709,7 +709,7 @@
 ))
 ->values(array(
   'entity_type' => 'comment',
-  'bundle' => 'comment_node_article',
+  'subtype' => 'comment_node_article',
   'deleted' => '0',
   'entity_id' => '1',
   'revision_id' => '1',
@@ -720,7 +720,7 @@
 ))
 ->values(array(
   'entity_type' => 'comment',
-  'bundle' => 'comment_node_article',
+  'subtype' => 'comment_node_article',
   'deleted' => '0',
   'entity_id' => '2',
   'revision_id' => '2',
@@ -734,7 +734,7 @@
 // Add revisions for comment bodies.
 db_insert('field_revision_comment_body')->fields(array(
   'entity_type',
-  'bundle',
+  'subtype',
   'deleted',
   'entity_id',
   'revision_id',
@@ -745,7 +745,7 @@
 ))
 ->values(array(
   'entity_type' => 'comment',
-  'bundle' => 'comment_node_article',
+  'subtype' => 'comment_node_article',
   'deleted' => '0',
   'entity_id' => '1',
   'revision_id' => '1',
@@ -756,7 +756,7 @@
 ))
 ->values(array(
   'entity_type' => 'comment',
-  'bundle' => 'comment_node_article',
+  'subtype' => 'comment_node_article',
   'deleted' => '0',
   'entity_id' => '2',
   'revision_id' => '2',
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
index bbb4638..220c191 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
@@ -18,7 +18,7 @@
  * @Plugin(
  *   id = "taxonomy_term",
  *   label = @Translation("Taxonomy term"),
- *   bundle_label = @Translation("Vocabulary"),
+ *   subtype_label = @Translation("Vocabulary"),
  *   module = "taxonomy",
  *   controller_class = "Drupal\taxonomy\TermStorageController",
  *   render_controller_class = "Drupal\taxonomy\TermRenderController",
@@ -32,15 +32,15 @@
  *   fieldable = TRUE,
  *   entity_keys = {
  *     "id" = "tid",
- *     "bundle" = "vid",
+ *     "subtype" = "vid",
  *     "label" = "name",
  *     "uuid" = "uuid"
  *   },
- *   bundle_keys = {
- *     "bundle" = "vid"
+ *   subtype_keys = {
+ *     "subtype" = "vid"
  *   },
  *   menu_base_path = "taxonomy/term/%taxonomy_term",
- *   permission_granularity = "bundle"
+ *   permission_granularity = "subtype"
  * )
  */
 class Term extends Entity implements ContentEntityInterface {
@@ -119,9 +119,9 @@ public function id() {
   }
 
   /**
-   * Implements Drupal\Core\Entity\EntityInterface::bundle().
+   * Implements Drupal\Core\Entity\EntityInterface::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return $this->vid;
   }
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php
index ab3d946..f2d26de 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php
@@ -60,11 +60,11 @@ public function getReferencableEntities($match = NULL, $match_operator = 'CONTAI
 
     $options = array();
 
-    $bundles = entity_get_bundles('taxonomy_term');
-    $bundle_names = !empty($this->instance['settings']['handler_settings']['target_bundles']) ? $this->instance['settings']['handler_settings']['target_bundles'] : array_keys($bundles);
+    $subtypes = entity_get_subtypes('taxonomy_term');
+    $subtype_names = !empty($this->instance['settings']['handler_settings']['target_subtypes']) ? $this->instance['settings']['handler_settings']['target_subtypes'] : array_keys($subtypes);
 
-    foreach ($bundle_names as $bundle) {
-      if ($vocabulary = entity_load('taxonomy_vocabulary', $bundle)) {
+    foreach ($subtype_names as $subtype) {
+      if ($vocabulary = entity_load('taxonomy_vocabulary', $subtype)) {
         if ($terms = taxonomy_get_tree($vocabulary->id(), 0)) {
           foreach ($terms as $term) {
             $options[$vocabulary->id()][$term->tid] = str_repeat('-', $term->depth) . check_plain($term->name);
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/argument_validator/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/argument_validator/Term.php
index 0dbcd4c..59415dc 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/argument_validator/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/argument_validator/Term.php
@@ -110,7 +110,7 @@ function validate_argument($argument) {
           return FALSE;
         }
         $this->argument->validated_title = check_plain($term->name);
-        return empty($vocabularies) || !empty($vocabularies[$term->bundle()]);
+        return empty($vocabularies) || !empty($vocabularies[$term->subtype()]);
 
       case 'tids':
         // An empty argument is not a term so doesn't pass.
@@ -146,7 +146,7 @@ function validate_argument($argument) {
         if (count($test)) {
           $result = entity_load_multiple('taxonomy_term', $test);
           foreach ($result as $term) {
-            if ($vocabularies && empty($vocabularies[$term->bundle()])) {
+            if ($vocabularies && empty($vocabularies[$term->subtype()])) {
               $validated_cache[$term->id()] = FALSE;
               return FALSE;
             }
@@ -171,7 +171,7 @@ function validate_argument($argument) {
           $term->name = str_replace(' ', '-', $term->name);
         }
 
-        if ($term && (empty($vocabularies) || !empty($vocabularies[$term->bundle()]))) {
+        if ($term && (empty($vocabularies) || !empty($vocabularies[$term->subtype()]))) {
           if ($type == 'convert') {
             $this->argument->argument = $term->id();
           }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/field/TaxonomyIndexTid.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/field/TaxonomyIndexTid.php
index 9aefbec..33d7550 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/field/TaxonomyIndexTid.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/field/TaxonomyIndexTid.php
@@ -122,8 +122,8 @@ function pre_render(&$values) {
       foreach ($result as $term) {
         $this->items[$term->node_nid][$term->tid]['name'] = check_plain($term->name);
         $this->items[$term->node_nid][$term->tid]['tid'] = $term->tid;
-        $this->items[$term->node_nid][$term->tid]['vocabulary_vid'] = $term->bundle();
-        $this->items[$term->node_nid][$term->tid]['vocabulary'] = check_plain($vocabularies[$term->bundle()]->label());
+        $this->items[$term->node_nid][$term->tid]['vocabulary_vid'] = $term->subtype();
+        $this->items[$term->node_nid][$term->tid]['vocabulary'] = check_plain($vocabularies[$term->subtype()]->label());
 
         if (!empty($this->options['link_to_taxonomy'])) {
           $this->items[$term->node_nid][$term->tid]['make_link'] = TRUE;
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermAccessController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermAccessController.php
index c45aa02..9228dd8 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermAccessController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermAccessController.php
@@ -36,14 +36,14 @@ public function createAccess(EntityInterface $entity, $langcode = LANGUAGE_DEFAU
    * Implements \Drupal\Core\Entity\EntityAccessControllerInterface::updateAccess().
    */
   public function updateAccess(EntityInterface $entity, $langcode = LANGUAGE_DEFAULT, User $account = NULL) {
-    return user_access("update terms in {$entity->bundle()}", $account) || user_access('administer taxonomy', $account);
+    return user_access("update terms in {$entity->subtype()}", $account) || user_access('administer taxonomy', $account);
   }
 
   /**
    * Implements \Drupal\Core\Entity\EntityAccessControllerInterface::deleteAccess().
    */
   public function deleteAccess(EntityInterface $entity, $langcode = LANGUAGE_DEFAULT, User $account = NULL) {
-    return user_access("delete terms in {$entity->bundle()}", $account) || user_access('administer taxonomy', $account);
+    return user_access("delete terms in {$entity->subtype()}", $account) || user_access('administer taxonomy', $account);
   }
 
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
index 3735ad6..dfed9ef 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
@@ -19,7 +19,7 @@ class TermFormController extends EntityFormController {
    * Overrides Drupal\Core\Entity\EntityFormController::form().
    */
   public function form(array $form, array &$form_state, EntityInterface $term) {
-    $vocabulary = taxonomy_vocabulary_load($term->bundle());
+    $vocabulary = taxonomy_vocabulary_load($term->subtype());
 
     $parent = array_keys(taxonomy_term_load_parents($term->tid));
     $form_state['taxonomy']['parent'] = $parent;
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php
index ce8cb03..8877beb 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php
@@ -24,7 +24,7 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang
 
     foreach ($entities as $entity) {
       // Add the description if enabled.
-      $display = $displays[$entity->bundle()];
+      $display = $displays[$entity->subtype()];
       if (!empty($entity->description) && $display->getComponent('description')) {
         $entity->content['description'] = array(
           '#markup' => check_markup($entity->description, $entity->format, '', TRUE),
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/EfqTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/EfqTest.php
index 8ca1afd..67f6b34 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/EfqTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/EfqTest.php
@@ -44,7 +44,7 @@ function testTaxonomyEfq() {
     $ids = (object) array(
       'entity_type' => 'taxonomy_term',
       'entity_id' => $tid,
-      'bundle' => $this->vocabulary->id(),
+      'subtype' => $this->vocabulary->id(),
     );
     $term = _field_create_entity_from_ids($ids);
     $this->assertEqual($term->tid, $tid, 'Taxonomy term can be created based on the IDs');
@@ -66,7 +66,7 @@ function testTaxonomyEfq() {
     $ids = (object) array(
       'entity_type' => 'taxonomy_term',
       'entity_id' => $tid,
-      'bundle' => $vocabulary2->id(),
+      'subtype' => $vocabulary2->id(),
     );
     $term = _field_create_entity_from_ids($ids);
     $this->assertEqual($term->tid, $tid, 'Taxonomy term can be created based on the IDs');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
index 3d28ec0..fd4257c 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
@@ -51,7 +51,7 @@ function setUp() {
 
     $this->instance = array(
       'field_name' => 'taxonomy_' . $this->vocabulary->id(),
-      'bundle' => 'article',
+      'subtype' => 'article',
       'entity_type' => 'node',
       'widget' => array(
         'type' => 'options_select',
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php
index f4b0ec8..9ba9c27 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php
@@ -59,7 +59,7 @@ public function setUp() {
     $instance = array(
       'entity_type' => 'entity_test',
       'field_name' => 'field_test_taxonomy',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'options_select',
       ),
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php
index 8c5571c..be0b793 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php
@@ -62,13 +62,13 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'options_select',
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field_name, array(
         'type' => 'taxonomy_term_reference_link',
       ))
@@ -85,7 +85,7 @@ function testTaxonomyTermFieldMultipleVocabularies() {
 
     // Submit an entity with both terms.
     $langcode = LANGUAGE_NOT_SPECIFIED;
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode][]", '', 'Widget is displayed');
     $edit = array(
       "{$this->field_name}[$langcode][]" => array($term1->tid, $term2->tid),
@@ -98,8 +98,8 @@ function testTaxonomyTermFieldMultipleVocabularies() {
     // Render the entity.
     $entity = field_test_entity_test_load($id);
     $entities = array($id => $entity);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
-    field_attach_prepare_view('test_entity', $entities, array($entity->bundle() => $display));
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
+    field_attach_prepare_view('test_entity', $entities, array($entity->subtype() => $display));
     $entity->content = field_attach_view($entity, $display);
     $this->content = drupal_render($entity->content);
     $this->assertText($term1->name, 'Term 1 name is displayed.');
@@ -111,8 +111,8 @@ function testTaxonomyTermFieldMultipleVocabularies() {
     // Re-render the content.
     $entity = field_test_entity_test_load($id);
     $entities = array($id => $entity);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
-    field_attach_prepare_view('test_entity', $entities, array($entity->bundle() => $display));
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
+    field_attach_prepare_view('test_entity', $entities, array($entity->subtype() => $display));
     $entity->content = field_attach_view($entity, $display);
     $this->plainTextContent = FALSE;
     $this->content = drupal_render($entity->content);
@@ -126,7 +126,7 @@ function testTaxonomyTermFieldMultipleVocabularies() {
     $this->assertEqual(count($field_info['settings']['allowed_values']), 1, 'Only one vocabulary is allowed for the field.');
 
     // The widget should still be displayed.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode][]", '', 'Widget is still displayed');
 
     // Term 1 should still pass validation.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php
index d5de5fa..e2a6737 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php
@@ -57,13 +57,13 @@ function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'options_select',
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field_name, array(
         'type' => 'taxonomy_term_reference_link',
       ))
@@ -108,7 +108,7 @@ function testTaxonomyTermFieldWidgets() {
 
     // Display creation form.
     $langcode = LANGUAGE_NOT_SPECIFIED;
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode]", '', 'Widget is displayed.');
 
     // Submit with some value.
@@ -123,15 +123,15 @@ function testTaxonomyTermFieldWidgets() {
     // Display the object.
     $entity = field_test_entity_test_load($id);
     $entities = array($id => $entity);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
-    field_attach_prepare_view('test_entity', $entities, array($entity->bundle() => $display));
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
+    field_attach_prepare_view('test_entity', $entities, array($entity->subtype() => $display));
     $entity->content = field_attach_view($entity, $display);
     $this->content = drupal_render($entity->content);
     $this->assertText($term->label(), 'Term label is displayed.');
 
     // Delete the vocabulary and verify that the widget is gone.
     taxonomy_vocabulary_delete($this->vocabulary->id());
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertNoFieldByName("{$this->field_name}[$langcode]", '', 'Widget is not displayed');
   }
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
index f9cba0d..1587e4f 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
@@ -47,7 +47,7 @@ function setUp() {
     field_create_field($this->field_1);
     $this->instance_1 = array(
       'field_name' => $this->field_name_1,
-      'bundle' => 'article',
+      'subtype' => 'article',
       'entity_type' => 'node',
       'widget' => array(
         'type' => 'options_select',
@@ -77,7 +77,7 @@ function setUp() {
     field_create_field($this->field_2);
     $this->instance_2 = array(
       'field_name' => $this->field_name_2,
-      'bundle' => 'article',
+      'subtype' => 'article',
       'entity_type' => 'node',
       'widget' => array(
         'type' => 'options_select',
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
index 93cc8d4..038b4d0 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
@@ -43,7 +43,7 @@ function setUp() {
 
     $this->instance = array(
       'field_name' => 'taxonomy_' . $this->vocabulary->id(),
-      'bundle' => 'article',
+      'subtype' => 'article',
       'entity_type' => 'node',
       'widget' => array(
         'type' => 'options_select',
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php
index 4084e2a..230b809 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php
@@ -43,22 +43,22 @@ public static function getInfo() {
 
   function setUp() {
     $this->entityType = 'taxonomy_term';
-    $this->bundle = 'tags';
+    $this->subtype = 'tags';
     $this->name = $this->randomName();
     parent::setUp();
   }
 
   /**
-   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::setupBundle().
+   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::setupSubtype().
    */
-  protected function setupBundle() {
-    parent::setupBundle();
+  protected function setupSubtype() {
+    parent::setupSubtype();
 
     // Create a vocabulary.
     $this->vocabulary = entity_create('taxonomy_vocabulary', array(
-      'name' => $this->bundle,
+      'name' => $this->subtype,
       'description' => $this->randomName(),
-      'vid' => $this->bundle,
+      'vid' => $this->subtype,
       'langcode' => LANGUAGE_NOT_SPECIFIED,
       'help' => '',
       'weight' => mt_rand(0, 10),
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
index ea73152..0cc9067 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
@@ -44,7 +44,7 @@ function setUp() {
 
     $this->instance = array(
       'field_name' => 'taxonomy_' . $this->vocabulary->id(),
-      'bundle' => 'article',
+      'subtype' => 'article',
       'entity_type' => 'node',
       'widget' => array(
         'type' => 'options_select',
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
index ec91070..3c49340 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
@@ -99,7 +99,7 @@ protected function mockStandardInstall() {
       'field_name' => 'field_' . $this->vocabulary->id(),
       'entity_type' => 'node',
       'label' => 'Tags',
-      'bundle' => 'article',
+      'subtype' => 'article',
       'widget' => array(
         'type' => 'taxonomy_autocomplete',
         'weight' => -4,
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyUnitTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyUnitTest.php
index d73302b..5b60e91 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyUnitTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyUnitTest.php
@@ -149,7 +149,7 @@ function testTaxonomyVocabularyChangeMachineName() {
     $instance = array(
       'field_name' => 'field_test',
       'entity_type' => 'taxonomy_term',
-      'bundle' => $this->vocabulary->id(),
+      'subtype' => $this->vocabulary->id(),
     );
     field_create_instance($instance);
 
@@ -159,20 +159,20 @@ function testTaxonomyVocabularyChangeMachineName() {
     $this->vocabulary->vid = $new_name;
     taxonomy_vocabulary_save($this->vocabulary);
 
-    // Check that entity bundles are properly updated.
-    $info = entity_get_bundles('taxonomy_term');
-    $this->assertFalse(isset($info[$old_name]), 'The old bundle name does not appear in entity_get_bundles().');
-    $this->assertTrue(isset($info[$new_name]), 'The new bundle name appears in entity_get_bundles().');
+    // Check that entity subtypes are properly updated.
+    $info = entity_get_subtypes('taxonomy_term');
+    $this->assertFalse(isset($info[$old_name]), 'The old subtype name does not appear in entity_get_subtypes().');
+    $this->assertTrue(isset($info[$new_name]), 'The new subtype name appears in entity_get_subtypes().');
 
     // Check that the field instance is still attached to the vocabulary.
-    $this->assertTrue(field_info_instance('taxonomy_term', 'field_test', $new_name), 'The bundle name was updated correctly.');
+    $this->assertTrue(field_info_instance('taxonomy_term', 'field_test', $new_name), 'The subtype name was updated correctly.');
   }
 
   /**
    * Test uninstall and reinstall of the taxonomy module.
    */
   function testUninstallReinstall() {
-    // Fields and field instances attached to taxonomy term bundles should be
+    // Fields and field instances attached to taxonomy term subtypes should be
     // removed when the module is uninstalled.
     $this->field_name = drupal_strtolower($this->randomName() . '_field_name');
     $this->field = array('field_name' => $this->field_name, 'type' => 'text', 'cardinality' => 4);
@@ -180,7 +180,7 @@ function testUninstallReinstall() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'taxonomy_term',
-      'bundle' => $this->vocabulary->id(),
+      'subtype' => $this->vocabulary->id(),
       'label' => $this->randomName() . '_label',
     );
     field_create_instance($this->instance);
@@ -193,7 +193,7 @@ function testUninstallReinstall() {
     // Now create a vocabulary with the same name. All field instances
     // connected to this vocabulary name should have been removed when the
     // module was uninstalled. Creating a new field with the same name and
-    // an instance of this field on the same bundle name should be successful.
+    // an instance of this field on the same subtype name should be successful.
     $this->vocabulary->enforceIsNew();
     taxonomy_vocabulary_save($this->vocabulary);
     unset($this->field['id']);
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
index 6785335..7eb1fd3 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
@@ -65,7 +65,7 @@ public function form(array $form, array &$form_state, EntityInterface $vocabular
         '#type' => 'language_configuration',
         '#entity_information' => array(
           'entity_type' => 'taxonomy_term',
-          'bundle' => $vocabulary->id(),
+          'subtype' => $vocabulary->id(),
         ),
         '#default_value' => language_get_default_configuration('taxonomy_term', $vocabulary->id()),
       );
@@ -128,7 +128,7 @@ public function validate(array $form, array &$form_state) {
   }
 
   /**
-   * Submit handler to update the bundle for the default language configuration.
+   * Submit handler to update the subtype for the default language configuration.
    */
   public function languageConfigurationSubmit(array &$form, array &$form_state) {
     $vocabulary = $this->getEntity($form_state);
@@ -138,9 +138,9 @@ public function languageConfigurationSubmit(array &$form, array &$form_state) {
       language_clear_default_configuration('taxonomy_term', $vocabulary->id());
     }
     // Since the machine name is not known yet, and it can be changed anytime,
-    // we have to also update the bundle property for the default language
-    // configuration in order to have the correct bundle value.
-    $form_state['language']['default_language']['bundle'] = $form_state['values']['vid'];
+    // we have to also update the subtype property for the default language
+    // configuration in order to have the correct subtype value.
+    $form_state['language']['default_language']['subtype'] = $form_state['values']['vid'];
   }
 
   /**
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php
index b14fc2f..e67fdff 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php
@@ -20,7 +20,7 @@ class VocabularyStorageController extends ConfigStorageController {
    */
   protected function postSave(EntityInterface $entity, $update) {
     if (!$update) {
-      field_attach_create_bundle('taxonomy_term', $entity->id());
+      field_attach_create_subtype('taxonomy_term', $entity->id());
     }
     elseif ($entity->getOriginalID() != $entity->id()) {
       // Reflect machine name changes in the definitions of existing 'taxonomy'
@@ -40,8 +40,8 @@ protected function postSave(EntityInterface $entity, $update) {
           }
         }
       }
-      // Update bundles.
-      field_attach_rename_bundle('taxonomy_term', $entity->getOriginalID(), $entity->id());
+      // Update subtypes.
+      field_attach_rename_subtype('taxonomy_term', $entity->getOriginalID(), $entity->id());
     }
     parent::postSave($entity, $update);
     $this->resetCache($update ? array($entity->getOriginalID()) : array());
diff --git a/core/modules/taxonomy/taxonomy.admin.inc b/core/modules/taxonomy/taxonomy.admin.inc
index 6305e48..c865c72 100644
--- a/core/modules/taxonomy/taxonomy.admin.inc
+++ b/core/modules/taxonomy/taxonomy.admin.inc
@@ -557,10 +557,10 @@ function taxonomy_term_confirm_delete($form, &$form_state, Term $term) {
   // Always provide entity id in the same form key as in the entity edit form.
   $form['tid'] = array('#type' => 'value', '#value' => $term->tid);
 
-  $form_state['taxonomy']['vocabulary'] = taxonomy_vocabulary_load($term->bundle());;
+  $form_state['taxonomy']['vocabulary'] = taxonomy_vocabulary_load($term->subtype());;
   $form['type'] = array('#type' => 'value', '#value' => 'term');
   $form['name'] = array('#type' => 'value', '#value' => $term->name);
-  $form['vid'] = array('#type' => 'value', '#value' => $term->bundle());
+  $form['vid'] = array('#type' => 'value', '#value' => $term->subtype());
   $form['delete'] = array('#type' => 'value', '#value' => TRUE);
   return confirm_form($form,
     t('Are you sure you want to delete the term %title?',
diff --git a/core/modules/taxonomy/taxonomy.api.php b/core/modules/taxonomy/taxonomy.api.php
index d2f41f6..ed417ef 100644
--- a/core/modules/taxonomy/taxonomy.api.php
+++ b/core/modules/taxonomy/taxonomy.api.php
@@ -90,7 +90,7 @@ function hook_taxonomy_vocabulary_update(Drupal\taxonomy\Plugin\Core\Entity\Voca
  * Act before taxonomy vocabulary deletion.
  *
  * This hook is invoked from taxonomy_vocabulary_delete() before
- * field_attach_delete_bundle() is called and before the vocabulary is actually
+ * field_attach_delete_subtype() is called and before the vocabulary is actually
  * removed from the database.
  *
  * @param Drupal\taxonomy\Plugin\Core\Entity\Vocabulary $vocabulary
@@ -109,7 +109,7 @@ function hook_taxonomy_vocabulary_predelete(Drupal\taxonomy\Plugin\Core\Entity\V
  * Respond to taxonomy vocabulary deletion.
  *
  * This hook is invoked from taxonomy_vocabulary_delete() after
- * field_attach_delete_bundle() has been called and after the vocabulary has
+ * field_attach_delete_subtype() has been called and after the vocabulary has
  * been removed from the database.
  *
  * @param Drupal\taxonomy\Plugin\Core\Entity\Vocabulary $vocabulary
diff --git a/core/modules/taxonomy/taxonomy.install b/core/modules/taxonomy/taxonomy.install
index fef48fb..df3d72c 100644
--- a/core/modules/taxonomy/taxonomy.install
+++ b/core/modules/taxonomy/taxonomy.install
@@ -11,11 +11,11 @@
  * Implements hook_uninstall().
  */
 function taxonomy_uninstall() {
-  // Remove taxonomy_term bundles.
+  // Remove taxonomy_term subtypes.
   $config_names = config_get_storage_names_with_prefix('taxonomy.vocabulary.');
   foreach ($config_names as $config_name) {
     $vid = substr($config_name, strlen('taxonomy.vocabulary.'));
-    field_attach_delete_bundle('taxonomy_term', $vid);
+    field_attach_delete_subtype('taxonomy_term', $vid);
   }
 }
 
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index f894d6c..bf26377 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -119,22 +119,22 @@ function taxonomy_entity_view_mode_info() {
 }
 
 /**
- * Implements hook_entity_bundle_info().
+ * Implements hook_entity_subtype_info().
  */
-function taxonomy_entity_bundle_info() {
-  $bundles = array();
+function taxonomy_entity_subtype_info() {
+  $subtypes = array();
   foreach (taxonomy_vocabulary_get_names() as $id) {
     $config = config('taxonomy.vocabulary.' . $id);
-    $bundles['taxonomy_term'][$id] = array(
+    $subtypes['taxonomy_term'][$id] = array(
       'label' => $config->get('name'),
       'admin' => array(
         'path' => 'admin/structure/taxonomy/%taxonomy_vocabulary',
         'real path' => 'admin/structure/taxonomy/' . $id,
-        'bundle argument' => 3,
+        'subtype argument' => 3,
       ),
     );
   }
-  return $bundles;
+  return $subtypes;
 }
 
 /**
@@ -151,8 +151,8 @@ function taxonomy_term_uri($term) {
  */
 function taxonomy_field_extra_fields() {
   $return = array();
-  foreach (entity_get_bundles('taxonomy_term') as $bundle => $bundle_info) {
-    $return['taxonomy_term'][$bundle] = array(
+  foreach (entity_get_subtypes('taxonomy_term') as $subtype => $subtype_info) {
+    $return['taxonomy_term'][$subtype] = array(
       'form' => array(
         'name' => array(
           'label' => t('Name'),
@@ -554,10 +554,10 @@ function template_preprocess_taxonomy_term(&$variables) {
   field_attach_preprocess($term, $variables['content'], $variables);
 
   // Gather classes, and clean up name so there are no underscores.
-  $vocabulary_name_css = str_replace('_', '-', $term->bundle());
+  $vocabulary_name_css = str_replace('_', '-', $term->subtype());
   $variables['attributes']['class'][] = 'vocabulary-' . $vocabulary_name_css;
 
-  $variables['theme_hook_suggestions'][] = 'taxonomy_term__' . $term->bundle();
+  $variables['theme_hook_suggestions'][] = 'taxonomy_term__' . $term->subtype();
   $variables['theme_hook_suggestions'][] = 'taxonomy_term__' . $term->tid;
 }
 
@@ -941,7 +941,7 @@ function taxonomy_implode_tags($tags, $vid = NULL) {
   $typed_tags = array();
   foreach ($tags as $tag) {
     // Extract terms belonging to the vocabulary in question.
-    if (!isset($vid) || $tag->bundle() == $vid) {
+    if (!isset($vid) || $tag->subtype() == $vid) {
       // Make sure we have a completed loaded taxonomy term.
       if ($tag instanceof EntityInterface && $label = $tag->label()) {
         // Commas and quotes in tag names are special cases, so encode 'em.
@@ -1035,7 +1035,7 @@ function taxonomy_field_validate(EntityInterface $entity = NULL, $field, $instan
         foreach ($field['settings']['allowed_values'] as $settings) {
           // If no parent is specified, check if the term is in the vocabulary.
           if (isset($settings['vocabulary']) && empty($settings['parent'])) {
-            if ($settings['vocabulary'] == $terms[$item['tid']]->bundle()) {
+            if ($settings['vocabulary'] == $terms[$item['tid']]->subtype()) {
               $validate = TRUE;
               break;
             }
@@ -1298,7 +1298,7 @@ function taxonomy_rdf_mapping() {
   return array(
     array(
       'type' => 'taxonomy_term',
-      'bundle' => RDF_DEFAULT_BUNDLE,
+      'subtype' => RDF_DEFAULT_BUNDLE,
       'mapping' => array(
         'rdftype' => array('skos:Concept'),
         'name'   => array(
@@ -1319,7 +1319,7 @@ function taxonomy_rdf_mapping() {
     ),
     array(
       'type' => 'taxonomy_vocabulary',
-      'bundle' => RDF_DEFAULT_BUNDLE,
+      'subtype' => RDF_DEFAULT_BUNDLE,
       'mapping' => array(
         'rdftype' => array('skos:ConceptScheme'),
         'name'   => array(
diff --git a/core/modules/taxonomy/taxonomy.tokens.inc b/core/modules/taxonomy/taxonomy.tokens.inc
index 34099ce..c382f8b 100644
--- a/core/modules/taxonomy/taxonomy.tokens.inc
+++ b/core/modules/taxonomy/taxonomy.tokens.inc
@@ -123,7 +123,7 @@ function taxonomy_tokens($type, $tokens, array $data = array(), array $options =
           break;
 
         case 'vocabulary':
-          $vocabulary = taxonomy_vocabulary_load($term->bundle());
+          $vocabulary = taxonomy_vocabulary_load($term->subtype());
           $replacements[$original] = check_plain($vocabulary->name);
           break;
 
@@ -137,7 +137,7 @@ function taxonomy_tokens($type, $tokens, array $data = array(), array $options =
     }
 
     if ($vocabulary_tokens = token_find_with_prefix($tokens, 'vocabulary')) {
-      $vocabulary = taxonomy_vocabulary_load($term->bundle());
+      $vocabulary = taxonomy_vocabulary_load($term->subtype());
       $replacements += token_generate('vocabulary', $vocabulary_tokens, array('vocabulary' => $vocabulary), $options);
     }
 
diff --git a/core/modules/taxonomy/taxonomy.views.inc b/core/modules/taxonomy/taxonomy.views.inc
index 0644f82..c52d97c 100644
--- a/core/modules/taxonomy/taxonomy.views.inc
+++ b/core/modules/taxonomy/taxonomy.views.inc
@@ -145,7 +145,7 @@ function taxonomy_views_data() {
     'title' => t('Vocabulary'),
     'help' => t('Filter the results of "Taxonomy: Term" to a particular vocabulary.'),
     'filter' => array(
-      'id' => 'bundle',
+      'id' => 'subtype',
     ),
   );
 
@@ -364,7 +364,7 @@ function taxonomy_field_views_data($field) {
  * Views integration to provide reverse relationships on term references.
  */
 function taxonomy_field_views_data_views_data_alter(&$data, $field) {
-  foreach ($field['bundles'] as $entity_type => $bundles) {
+  foreach ($field['subtypes'] as $entity_type => $subtypes) {
     $entity_info = entity_get_info($entity_type);
     $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type;
 
diff --git a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php
index 4d09f45..1fff2f7 100644
--- a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php
+++ b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php
@@ -63,7 +63,7 @@ function testTelephoneField() {
       'field_name' => 'field_telephone',
       'label' => 'Telephone Number',
       'entity_type' => 'node',
-      'bundle' => 'article',
+      'subtype' => 'article',
     );
     field_create_instance($instance);
 
diff --git a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php
index 36dc8a9..a2417d3 100644
--- a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php
+++ b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php
@@ -43,7 +43,7 @@ public function setUp() {
     $this->instance = array(
       'entity_type' => 'entity_test',
       'field_name' => 'field_test',
-      'bundle' => 'entity_test',
+      'subtype' => 'entity_test',
       'widget' => array(
         'type' => 'telephone_default',
       ),
diff --git a/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php b/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php
index f8c585b..a56c5fd 100644
--- a/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php
+++ b/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php
@@ -61,13 +61,13 @@ function testTextFieldValidation() {
     $this->instance = array(
       'field_name' => $this->field['field_name'],
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'widget' => array(
         'type' => 'text_textfield',
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'default')
+    entity_get_display('test_entity', 'test_subtype', 'default')
       ->setComponent($this->field['field_name'])
       ->save();
 
@@ -106,7 +106,7 @@ function _testTextfieldWidgets($field_type, $widget_type) {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->randomName() . '_label',
       'settings' => array(
         'text_processing' => TRUE,
@@ -119,14 +119,14 @@ function _testTextfieldWidgets($field_type, $widget_type) {
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field_name)
       ->save();
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
     // Display creation form.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');
     $this->assertNoFieldByName("{$this->field_name}[$langcode][0][format]", '1', 'Format selector is not displayed');
     $this->assertRaw(format_string('placeholder="A placeholder on !widget_type"', array('!widget_type' => $widget_type)));
@@ -143,7 +143,7 @@ function _testTextfieldWidgets($field_type, $widget_type) {
 
     // Display the entity.
     $entity = field_test_entity_test_load($id);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
     $entity->content = field_attach_view($entity, $display);
     $this->content = drupal_render($entity->content);
     $this->assertText($value, 'Filtered tags are not displayed');
@@ -169,7 +169,7 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'test_entity',
-      'bundle' => 'test_bundle',
+      'subtype' => 'test_subtype',
       'label' => $this->randomName() . '_label',
       'settings' => array(
         'text_processing' => TRUE,
@@ -179,7 +179,7 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
       ),
     );
     field_create_instance($this->instance);
-    entity_get_display('test_entity', 'test_bundle', 'full')
+    entity_get_display('test_entity', 'test_subtype', 'full')
       ->setComponent($this->field_name)
       ->save();
 
@@ -196,7 +196,7 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
 
     // Display the creation form. Since the user only has access to one format,
     // no format selector will be displayed.
-    $this->drupalGet('test-entity/add/test_bundle');
+    $this->drupalGet('test-entity/add/test_subtype');
     $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');
     $this->assertNoFieldByName("{$this->field_name}[$langcode][0][format]", '', 'Format selector is not displayed');
 
@@ -212,7 +212,7 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
 
     // Display the entity.
     $entity = field_test_entity_test_load($id);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
     $entity->content = field_attach_view($entity, $display);
     $this->content = drupal_render($entity->content);
     $this->assertNoRaw($value, 'HTML tags are not displayed.');
@@ -253,7 +253,7 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
     // Display the entity.
     $this->container->get('plugin.manager.entity')->getStorageController('test_entity')->resetCache(array($id));
     $entity = field_test_entity_test_load($id);
-    $display = entity_get_display($entity->entityType(), $entity->bundle(), 'full');
+    $display = entity_get_display($entity->entityType(), $entity->subtype(), 'full');
     $entity->content = field_attach_view($entity, $display);
     $this->content = drupal_render($entity->content);
     $this->assertRaw($value, 'Value is displayed unfiltered');
diff --git a/core/modules/text/lib/Drupal/text/TextProcessed.php b/core/modules/text/lib/Drupal/text/TextProcessed.php
index c73af6f..019c235 100644
--- a/core/modules/text/lib/Drupal/text/TextProcessed.php
+++ b/core/modules/text/lib/Drupal/text/TextProcessed.php
@@ -67,7 +67,7 @@ public function getValue($langcode = NULL) {
 
     $field = $this->parent->getParent();
     $entity = $field->getParent();
-    $instance = field_info_instance($entity->entityType(), $field->getName(), $entity->bundle());
+    $instance = field_info_instance($entity->entityType(), $field->getName(), $entity->subtype());
 
     if (!empty($instance['settings']['text_processing']) && $this->format->getValue()) {
       return check_markup($this->text->getValue(), $this->format->getValue(), $entity->language()->langcode);
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
index ce9d3a0..b44f709 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -48,7 +48,7 @@ public function removeTranslation(EntityInterface $entity, $langcode) {
     $translations = $entity->getTranslationLanguages();
     // @todo Handle properties.
     // Remove field translations.
-    foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+    foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
       $field_name = $instance['field_name'];
       $field = field_info_field($field_name);
       if ($field['translatable']) {
@@ -107,7 +107,7 @@ public function getTranslationAccess(EntityInterface $entity, $op) {
     // If no permission granularity is defined this entity type does not need an
     // explicit translate permission.
     if (!user_access('translate any entity') && !empty($info['permission_granularity'])) {
-      $translate_permission = user_access($info['permission_granularity'] == 'bundle' ? "translate {$entity->bundle()} {$entity->entityType()}" : "translate {$entity->entityType()}");
+      $translate_permission = user_access($info['permission_granularity'] == 'subtype' ? "translate {$entity->subtype()} {$entity->entityType()}" : "translate {$entity->entityType()}");
     }
     return $translate_permission && user_access("$op entity translations");
   }
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php
index a42a019..a07d87d 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php
@@ -45,7 +45,7 @@
  * If the entity paths match the default patterns above and there is no need for
  * an entity-specific translation controller class, Entity Translation will
  * provide built-in support for the entity. It will still be required to enable
- * translation for each translatable bundle.
+ * translation for each translatable subtype.
  *
  * Additionally some more entity info keys can be defined to further customize
  * the translation UI. The entity translation info is an associative array that
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
index 281b82f..72b30ca 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
@@ -40,7 +40,7 @@ public function synchronizeFields(EntityInterface $entity, $sync_langcode, $orig
     $entity_unchanged = $entity_unchanged->getBCEntity();
 
     // @todo Use Entity Field API to retrieve field definitions.
-    $instances = field_info_instances($entity_type, $entity->bundle());
+    $instances = field_info_instances($entity_type, $entity->subtype());
     foreach ($instances as $field_name => $instance) {
       $field = field_info_field($field_name);
 
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSettingsTest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSettingsTest.php
index 41600ac..8a04b99 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSettingsTest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSettingsTest.php
@@ -33,7 +33,7 @@ function setUp() {
     parent::setUp();
 
     // Set up two content types to test field instances shared between different
-    // bundles.
+    // subtypes.
     $this->drupalCreateContentType(array('type' => 'article'));
     $this->drupalCreateContentType(array('type' => 'page'));
 
@@ -45,25 +45,25 @@ function setUp() {
    * Tests that the settings UI works as expected.
    */
   function testSettingsUI() {
-    // Test that the translation settings are ignored if the bundle is marked
+    // Test that the translation settings are ignored if the subtype is marked
     // translatable but the entity type is not.
     $edit = array('settings[comment][comment_node_article][translatable]' => TRUE);
     $this->assertSettings('comment', NULL, FALSE, $edit);
 
     // Test that the translation settings are ignored if only a field is marked
-    // as translatable and not the related entity type and bundle.
+    // as translatable and not the related entity type and subtype.
     $edit = array('settings[comment][comment_node_article][fields][comment_body]' => TRUE);
     $this->assertSettings('comment', NULL, FALSE, $edit);
 
     // Test that the translation settings are not stored if an entity type and
-    // bundle are marked as translatable but no field is.
+    // subtype are marked as translatable but no field is.
     $edit = array(
       'entity_types[comment]' => TRUE,
       'settings[comment][comment_node_article][translatable]' => TRUE,
     );
     $this->assertSettings('comment', 'comment_node_article', FALSE, $edit);
     $xpath_err = '//div[@id="messages"]//div[contains(@class, "error")]';
-    $this->assertTrue($this->xpath($xpath_err), 'Enabling translation only for entity bundles generates a form error.');
+    $this->assertTrue($this->xpath($xpath_err), 'Enabling translation only for entity subtypes generates a form error.');
 
     // Test that the translation settings are not stored if a non-configurable
     // language is set as default and the language selector is hidden.
@@ -77,8 +77,8 @@ function testSettingsUI() {
     $this->assertSettings('comment', 'comment_node_article', FALSE, $edit);
     $this->assertTrue($this->xpath($xpath_err), 'Enabling translation with a fixed non-configurable language generates a form error.');
 
-    // Test that a field shared among different bundles can be enabled without
-    // needing to make all the related bundles translatable.
+    // Test that a field shared among different subtypes can be enabled without
+    // needing to make all the related subtypes translatable.
     $edit = array(
       'entity_types[comment]' => TRUE,
       'settings[comment][comment_node_article][settings][language][langcode]' => 'current_interface',
@@ -97,12 +97,12 @@ function testSettingsUI() {
   }
 
   /**
-   * Asserts that translatability has the expected value for the given bundle.
+   * Asserts that translatability has the expected value for the given subtype.
    *
    * @param string $entity_type
    *   The entity type for which to check translatibility.
-   * @param string $bundle
-   *   The bundle for which to check translatibility.
+   * @param string $subtype
+   *   The subtype for which to check translatibility.
    * @param boolean $enabled
    *   TRUE if translatibility should be enabled, FALSE otherwise.
    * @param array $edit
@@ -111,12 +111,12 @@ function testSettingsUI() {
    * @return boolean
    *   TRUE if the assertion succeeded, FALSE otherwise.
    */
-  protected function assertSettings($entity_type, $bundle, $enabled, $edit) {
+  protected function assertSettings($entity_type, $subtype, $enabled, $edit) {
     $this->drupalPost('admin/config/regional/content-language', $edit, t('Save'));
-    $args = array('@entity_type' => $entity_type, '@bundle' => $bundle, '@enabled' => $enabled ? 'enabled' : 'disabled');
-    $message = format_string('Translation for entity @entity_type (@bundle) is @enabled.', $args);
+    $args = array('@entity_type' => $entity_type, '@subtype' => $subtype, '@enabled' => $enabled ? 'enabled' : 'disabled');
+    $message = format_string('Translation for entity @entity_type (@subtype) is @enabled.', $args);
     entity_info_cache_clear();
-    return $this->assertEqual(translation_entity_enabled($entity_type, $bundle), $enabled, $message);
+    return $this->assertEqual(translation_entity_enabled($entity_type, $subtype), $enabled, $message);
   }
 
 }
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php
index 61f93cf..f4d9908 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php
@@ -67,7 +67,7 @@ protected function setupTestFields() {
     $instance = array(
       'entity_type' => $this->entityType,
       'field_name' => $this->fieldName,
-      'bundle' => $this->entityType,
+      'subtype' => $this->entityType,
       'label' => 'Test translatable image field',
       'widget' => array(
         'type' => 'image_image',
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php
index 13e1f59..8f2aa51 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php
@@ -24,11 +24,11 @@
   protected $entityType = 'entity_test_mul';
 
   /**
-   * The bundle being tested.
+   * The subtype being tested.
    *
    * @var string
    */
-  protected $bundle;
+  protected $subtype;
 
   /**
    * The enabled languages.
@@ -76,7 +76,7 @@ function setUp() {
     parent::setUp();
 
     $this->setupLanguages();
-    $this->setupBundle();
+    $this->setupSubtype();
     $this->enableTranslation();
     $this->setupUsers();
     $this->setupTestFields();
@@ -103,12 +103,12 @@ protected function getTranslatorPermissions() {
   }
 
   /**
-   * Returns the translate permissions for the current entity and bundle.
+   * Returns the translate permissions for the current entity and subtype.
    */
   protected function getTranslatePermission() {
     $info = entity_get_info($this->entityType);
     if (!empty($info['permission_granularity'])) {
-      return $info['permission_granularity'] == 'bundle' ? "translate {$this->bundle} {$this->entityType}" : "translate {$this->entityType}";
+      return $info['permission_granularity'] == 'subtype' ? "translate {$this->subtype} {$this->entityType}" : "translate {$this->entityType}";
     }
   }
 
@@ -131,21 +131,21 @@ protected function setupUsers() {
   }
 
   /**
-   * Creates or initializes the bundle date if needed.
+   * Creates or initializes the subtype date if needed.
    */
-  protected function setupBundle() {
-    if (empty($this->bundle)) {
-      $this->bundle = $this->entityType;
+  protected function setupSubtype() {
+    if (empty($this->subtype)) {
+      $this->subtype = $this->entityType;
     }
   }
 
   /**
-   * Enables translation for the current entity type and bundle.
+   * Enables translation for the current entity type and subtype.
    */
   protected function enableTranslation() {
     // Enable translation for the current entity type and ensure the change is
     // picked up.
-    translation_entity_set_config($this->entityType, $this->bundle, 'enabled', TRUE);
+    translation_entity_set_config($this->entityType, $this->subtype, 'enabled', TRUE);
     drupal_static_reset();
     entity_info_cache_clear();
     menu_router_rebuild();
@@ -168,7 +168,7 @@ protected function setupTestFields() {
     $instance = array(
       'entity_type' => $this->entityType,
       'field_name' => $this->fieldName,
-      'bundle' => $this->bundle,
+      'subtype' => $this->subtype,
       'label' => 'Test translatable text-field',
       'widget' => array(
         'type' => 'text_textfield',
@@ -185,19 +185,19 @@ protected function setupTestFields() {
    *   An array of initial values for the entity.
    * @param string $langcode
    *   The initial language code of the entity.
-   * @param string $bundle_name
-   *   (optional) The entity bundle, if the entity uses bundles. Defaults to
-   *   NULL. If left NULL, $this->bundle will be used.
+   * @param string $subtype_name
+   *   (optional) The entity subtype, if the entity uses subtypes. Defaults to
+   *   NULL. If left NULL, $this->subtype will be used.
    *
    * @return
    *   The entity id.
    */
-  protected function createEntity($values, $langcode, $bundle_name = NULL) {
+  protected function createEntity($values, $langcode, $subtype_name = NULL) {
     $entity_values = $values;
     $entity_values['langcode'] = $langcode;
     $info = entity_get_info($this->entityType);
-    if (!empty($info['entity_keys']['bundle'])) {
-      $entity_values[$info['entity_keys']['bundle']] = $bundle_name ?: $this->bundle;
+    if (!empty($info['entity_keys']['subtype'])) {
+      $entity_values[$info['entity_keys']['subtype']] = $subtype_name ?: $this->subtype;
     }
     $controller = $this->container->get('plugin.manager.entity')->getStorageController($this->entityType);
     if (!($controller instanceof DatabaseStorageControllerNG)) {
diff --git a/core/modules/translation_entity/translation_entity.admin.css b/core/modules/translation_entity/translation_entity.admin.css
index cab64f8..13ca2a6 100644
--- a/core/modules/translation_entity/translation_entity.admin.css
+++ b/core/modules/translation_entity/translation_entity.admin.css
@@ -3,11 +3,11 @@
  * Styles for the content language administration page.
  */
 
-#language-content-settings-form table .bundle {
+#language-content-settings-form table .subtype {
   width: 24%;
 }
 
-#language-content-settings-form table td.bundle {
+#language-content-settings-form table td.subtype {
   font-weight: bold;
 }
 
diff --git a/core/modules/translation_entity/translation_entity.admin.inc b/core/modules/translation_entity/translation_entity.admin.inc
index 0e2316b..d80dff3 100644
--- a/core/modules/translation_entity/translation_entity.admin.inc
+++ b/core/modules/translation_entity/translation_entity.admin.inc
@@ -61,29 +61,29 @@ function _translation_entity_form_language_content_settings_form_alter(array &$f
   $form['#attached']['library'][] = array('translation_entity', 'drupal.translation_entity.admin');
 
   foreach ($form['#labels'] as $entity_type => $label) {
-    foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) {
-      $form['settings'][$entity_type][$bundle]['translatable'] = array(
+    foreach (entity_get_subtypes($entity_type) as $subtype => $subtype_info) {
+      $form['settings'][$entity_type][$subtype]['translatable'] = array(
         '#type' => 'checkbox',
-        '#default_value' => translation_entity_enabled($entity_type, $bundle),
+        '#default_value' => translation_entity_enabled($entity_type, $subtype),
       );
 
       // Here we do not want the widget to be altered and hold also the "Enable
       // translation" checkbox, which would be redundant. Hence we add this key
       // to be able to skip alterations.
-      $form['settings'][$entity_type][$bundle]['settings']['language']['#translation_entity_skip_alter'] = TRUE;
+      $form['settings'][$entity_type][$subtype]['settings']['language']['#translation_entity_skip_alter'] = TRUE;
 
       // @todo Exploit field definitions once all core entities and field types
       //   are migrated to the Entity Field API.
-      foreach (field_info_instances($entity_type, $bundle) as $field_name => $instance) {
+      foreach (field_info_instances($entity_type, $subtype) as $field_name => $instance) {
         $field = field_info_field($field_name);
-        $form['settings'][$entity_type][$bundle]['fields'][$field_name] = array(
+        $form['settings'][$entity_type][$subtype]['fields'][$field_name] = array(
           '#label' => $instance['label'],
           '#type' => 'checkbox',
           '#default_value' => $field['translatable'],
         );
         $column_element = translation_entity_field_sync_widget($field, $instance);
         if ($column_element) {
-          $form['settings'][$entity_type][$bundle]['columns'][$field_name] = $column_element;
+          $form['settings'][$entity_type][$subtype]['columns'][$field_name] = $column_element;
         }
       }
     }
@@ -109,21 +109,21 @@ function _translation_entity_preprocess_language_content_settings_table(&$variab
   array_unshift($build['#header'], array('data' => t('Translatable'), 'class' => array('translatable')));
   $rows = array();
 
-  foreach (element_children($element) as $bundle) {
-    $field_names = !empty($element[$bundle]['fields']) ? element_children($element[$bundle]['fields']) : array();
-    $checkbox_id = $element[$bundle]['translatable']['#id'];
-    $rows[$bundle] = $build['#rows'][$bundle];
+  foreach (element_children($element) as $subtype) {
+    $field_names = !empty($element[$subtype]['fields']) ? element_children($element[$subtype]['fields']) : array();
+    $checkbox_id = $element[$subtype]['translatable']['#id'];
+    $rows[$subtype] = $build['#rows'][$subtype];
 
     $translatable = array(
-      'data' => $element[$bundle]['translatable'],
+      'data' => $element[$subtype]['translatable'],
       'class' => array('translatable'),
     );
-    array_unshift($rows[$bundle]['data'], $translatable);
+    array_unshift($rows[$subtype]['data'], $translatable);
 
-    $rows[$bundle]['data'][1]['data']['#prefix'] = '<label for="' . $checkbox_id . '">';
+    $rows[$subtype]['data'][1]['data']['#prefix'] = '<label for="' . $checkbox_id . '">';
 
     foreach ($field_names as $field_name) {
-      $field_element = &$element[$bundle]['fields'][$field_name];
+      $field_element = &$element[$subtype]['fields'][$field_name];
       $rows[] = array(
         'data' => array(
           array(
@@ -134,10 +134,10 @@ function _translation_entity_preprocess_language_content_settings_table(&$variab
             'data' => array(
               '#prefix' => '<label for="' . $field_element['#id'] . '">',
               '#suffix' => '</label>',
-              'bundle' => array(
+              'subtype' => array(
                 '#prefix' => '<span class="element-invisible">',
                 '#suffix' => '</span> ',
-                '#markup' => check_plain($element[$bundle]['settings']['#label']),
+                '#markup' => check_plain($element[$subtype]['settings']['#label']),
               ),
               'field' => array(
                 '#markup' => check_plain($field_element['#label']),
@@ -153,8 +153,8 @@ function _translation_entity_preprocess_language_content_settings_table(&$variab
         'class' => array('field-settings'),
       );
 
-      if (!empty($element[$bundle]['columns'][$field_name])) {
-        $column_element = &$element[$bundle]['columns'][$field_name];
+      if (!empty($element[$subtype]['columns'][$field_name])) {
+        $column_element = &$element[$subtype]['columns'][$field_name];
         foreach (element_children($column_element) as $key) {
           $column_label = $column_element[$key]['#title'];
           unset($column_element[$key]['#title']);
@@ -168,10 +168,10 @@ function _translation_entity_preprocess_language_content_settings_table(&$variab
                 'data' => array(
                   '#prefix' => '<label for="' . $column_element[$key]['#id'] . '">',
                   '#suffix' => '</label>',
-                  'bundle' => array(
+                  'subtype' => array(
                     '#prefix' => '<span class="element-invisible">',
                     '#suffix' => '</span> ',
-                    '#markup' => check_plain($element[$bundle]['settings']['#label']),
+                    '#markup' => check_plain($element[$subtype]['settings']['#label']),
                   ),
                   'field' => array(
                     '#prefix' => '<span class="element-invisible">',
@@ -207,17 +207,17 @@ function _translation_entity_preprocess_language_content_settings_table(&$variab
 function translation_entity_form_language_content_settings_validate(array $form, array &$form_state) {
   $settings = &$form_state['values']['settings'];
   foreach ($settings as $entity_type => $entity_settings) {
-    foreach ($entity_settings as $bundle => $bundle_settings) {
-      if (!empty($bundle_settings['translatable'])) {
-        $name = "settings][$entity_type][$bundle][translatable";
+    foreach ($entity_settings as $subtype => $subtype_settings) {
+      if (!empty($subtype_settings['translatable'])) {
+        $name = "settings][$entity_type][$subtype][translatable";
 
-        $translatable_fields = isset($settings[$entity_type][$bundle]['fields']) ? array_filter($settings[$entity_type][$bundle]['fields']) : FALSE;
+        $translatable_fields = isset($settings[$entity_type][$subtype]['fields']) ? array_filter($settings[$entity_type][$subtype]['fields']) : FALSE;
         if (empty($translatable_fields)) {
-          $t_args = array('%bundle' => $form['settings'][$entity_type][$bundle]['settings']['#label']);
-          form_set_error($name, t('At least one field needs to be translatable to enable %bundle for translation.', $t_args));
+          $t_args = array('%subtype' => $form['settings'][$entity_type][$subtype]['settings']['#label']);
+          form_set_error($name, t('At least one field needs to be translatable to enable %subtype for translation.', $t_args));
         }
 
-        $values = $bundle_settings['settings']['language'];
+        $values = $subtype_settings['settings']['language'];
         if (language_is_locked($values['langcode']) && empty($values['language_show'])) {
           foreach (language_list(LANGUAGE_LOCKED) as $language) {
             $locked_languages[] = $language->name;
@@ -238,19 +238,19 @@ function translation_entity_form_language_content_settings_submit(array $form, a
   $entity_types = $form_state['values']['entity_types'];
   $settings = &$form_state['values']['settings'];
 
-  // If an entity type is not translatable all its bundles and fields must be
-  // marked as non-translatable. Similarly, if a bundle is made non-translatable
+  // If an entity type is not translatable all its subtypes and fields must be
+  // marked as non-translatable. Similarly, if a subtype is made non-translatable
   // all of its fields will be not translatable.
   foreach ($settings as $entity_type => &$entity_settings) {
-    foreach ($entity_settings as $bundle => &$bundle_settings) {
-      $bundle_settings['translatable'] = $bundle_settings['translatable'] && $entity_types[$entity_type];
-      if (!empty($bundle_settings['fields'])) {
-        foreach ($bundle_settings['fields'] as $field_name => $translatable) {
-          $bundle_settings['fields'][$field_name] = $translatable && $bundle_settings['translatable'];
+    foreach ($entity_settings as $subtype => &$subtype_settings) {
+      $subtype_settings['translatable'] = $subtype_settings['translatable'] && $entity_types[$entity_type];
+      if (!empty($subtype_settings['fields'])) {
+        foreach ($subtype_settings['fields'] as $field_name => $translatable) {
+          $subtype_settings['fields'][$field_name] = $translatable && $subtype_settings['translatable'];
           // If we have column settings and no column is translatable, no point
           // in making the field translatable.
-          if (isset($bundle_settings['columns'][$field_name]) && !array_filter($bundle_settings['columns'][$field_name])) {
-            $bundle_settings['fields'][$field_name] = FALSE;
+          if (isset($subtype_settings['columns'][$field_name]) && !array_filter($subtype_settings['columns'][$field_name])) {
+            $subtype_settings['fields'][$field_name] = FALSE;
           }
         }
       }
@@ -265,9 +265,9 @@ function translation_entity_form_language_content_settings_submit(array $form, a
  * Stores entity translation settings.
  *
  * @param array $settings
- *   An associative array of settings keyed by entity type and bundle. At bundle
+ *   An associative array of settings keyed by entity type and subtype. At subtype
  *   level the following keys are available:
- *   - translatable: The bundle translatability status, which is a bool.
+ *   - translatable: The subtype translatability status, which is a bool.
  *   - settings: An array of language configuration settings as defined by
  *     language_save_default_configuration().
  *   - fields: An associative array with field names as keys and a boolean as
@@ -279,12 +279,12 @@ function translation_entity_form_language_content_settings_submit(array $form, a
 function _translation_entity_update_field_translatability($settings) {
   $fields = array();
   foreach ($settings as $entity_type => $entity_settings) {
-    foreach ($entity_settings as $bundle => $bundle_settings) {
+    foreach ($entity_settings as $subtype => $subtype_settings) {
       // Collapse field settings since here we have per instance settings, but
       // translatability has per-field scope. We assume that all the field
       // instances have the same value.
-      if (!empty($bundle_settings['fields'])) {
-        foreach ($bundle_settings['fields'] as $field_name => $translatable) {
+      if (!empty($subtype_settings['fields'])) {
+        foreach ($subtype_settings['fields'] as $field_name => $translatable) {
           // If a field is enabled for translation for at least one instance we
           // need to mark it as translatable.
           $fields[$field_name] = $translatable || !empty($fields[$field_name]);
@@ -444,7 +444,7 @@ function translation_entity_translatable_batch($translatable, $field_name, &$con
   // Determine the entity types to act on.
   $entity_types = array();
   foreach (field_info_instances() as $entity_type => $info) {
-    foreach ($info as $bundle => $instances) {
+    foreach ($info as $subtype => $instances) {
       foreach ($instances as $instance_field_name => $instance) {
         if ($instance_field_name == $field_name) {
           $entity_types[] = $entity_type;
diff --git a/core/modules/translation_entity/translation_entity.admin.js b/core/modules/translation_entity/translation_entity.admin.js
index bf253a1..40904f6 100644
--- a/core/modules/translation_entity/translation_entity.admin.js
+++ b/core/modules/translation_entity/translation_entity.admin.js
@@ -3,33 +3,33 @@
 "use strict";
 
 /**
- * Makes field translatability inherit bundle translatability.
+ * Makes field translatability inherit subtype translatability.
  */
 Drupal.behaviors.translationEntity = {
   attach: function (context) {
-    // Initially hide all field rows for non translatable bundles and all column
+    // Initially hide all field rows for non translatable subtypes and all column
     // rows for non translatable fields.
-    $(context).find('table .bundle-settings .translatable :input').once('translation-entity-admin-hide', function () {
+    $(context).find('table .subtype-settings .translatable :input').once('translation-entity-admin-hide', function () {
       var $input = $(this);
-      var $bundleSettings = $input.closest('.bundle-settings');
+      var $subtypeSettings = $input.closest('.subtype-settings');
       if (!$input.is(':checked')) {
-        $bundleSettings.nextUntil('.bundle-settings').hide();
+        $subtypeSettings.nextUntil('.subtype-settings').hide();
       }
       else {
-        $bundleSettings.nextUntil('.bundle-settings', '.field-settings').find('.translatable :input:not(:checked)').closest('.field-settings').nextUntil(':not(.column-settings)').hide();
+        $subtypeSettings.nextUntil('.subtype-settings', '.field-settings').find('.translatable :input:not(:checked)').closest('.field-settings').nextUntil(':not(.column-settings)').hide();
       }
     });
 
-    // When a bundle is made translatable all of its field instances should
+    // When a subtype is made translatable all of its field instances should
     // inherit this setting. Instead when it is made non translatable its field
     // instances are hidden, since their translatability no longer matters.
-    $('body').once('translation-entity-admin-bind').on('click', 'table .bundle-settings .translatable :input', function (e) {
+    $('body').once('translation-entity-admin-bind').on('click', 'table .subtype-settings .translatable :input', function (e) {
       var $target = $(e.target);
-      var $bundleSettings = $target.closest('.bundle-settings');
-      var $settings = $bundleSettings.nextUntil('.bundle-settings');
+      var $subtypeSettings = $target.closest('.subtype-settings');
+      var $settings = $subtypeSettings.nextUntil('.subtype-settings');
       var $fieldSettings = $settings.filter('.field-settings');
       if ($target.is(':checked')) {
-        $bundleSettings.find('.operations :input[name$="[language_show]"]').attr('checked', true);
+        $subtypeSettings.find('.operations :input[name$="[language_show]"]').attr('checked', true);
         $fieldSettings.find('.translatable :input').attr('checked', true);
         $settings.show();
       }
@@ -39,7 +39,7 @@ Drupal.behaviors.translationEntity = {
     }).on('click', 'table .field-settings .translatable :input', function (e) {
       var $target = $(e.target);
       var $fieldSettings = $target.closest('.field-settings');
-      var $columnSettings = $fieldSettings.nextUntil('.field-settings, .bundle-settings');
+      var $columnSettings = $fieldSettings.nextUntil('.field-settings, .subtype-settings');
       if ($target.is(':checked')) {
         $columnSettings.show();
       }
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index ac00322..f8481da 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -74,7 +74,7 @@ function translation_entity_language_types_info_alter(array &$language_types) {
 function translation_entity_entity_info_alter(array &$entity_info) {
   $edit_form_info = array();
 
-  $bundles_info = entity_get_bundles();
+  $subtypes_info = entity_get_subtypes();
   // Provide defaults for translation info.
   foreach ($entity_info as $entity_type => &$info) {
     if (!isset($info['translation']['translation_entity'])) {
@@ -87,13 +87,13 @@ function translation_entity_entity_info_alter(array &$entity_info) {
     // shared accross different entities.
     $info += array('translation_controller_class' => 'Drupal\translation_entity\EntityTranslationController');
 
-    // Check whether translation is enabled at least for one bundle. We cannot
+    // Check whether translation is enabled at least for one subtype. We cannot
     // use translation_entity_enabled() here since it would cause infinite
     // recursion, as it relies on entity info.
     $enabled = FALSE;
-    $bundles = isset($bundles_info[$entity_type]) ? array_keys($bundles_info[$entity_type]) : array($entity_type);
-    foreach ($bundles as $bundle) {
-      if (translation_entity_get_config($entity_type, $bundle, 'enabled')) {
+    $subtypes = isset($subtypes_info[$entity_type]) ? array_keys($subtypes_info[$entity_type]) : array($entity_type);
+    foreach ($subtypes as $subtype) {
+      if (translation_entity_get_config($entity_type, $subtype, 'enabled')) {
         $enabled = TRUE;
         break;
       }
@@ -281,7 +281,7 @@ function translation_entity_translate_access(EntityInterface $entity) {
   $entity_type = $entity->entityType();
   return empty($entity->language()->locked) &&
     language_multilingual() &&
-    translation_entity_enabled($entity_type, $entity->bundle()) &&
+    translation_entity_enabled($entity_type, $entity->subtype()) &&
     (user_access('create entity translations') || user_access('update entity translations') || user_access('delete entity translations'));
 }
 
@@ -380,13 +380,13 @@ function translation_entity_library_info() {
 /**
  * Returns the key name used to store the configuration setting.
  *
- * Based on the entity type and bundle, the keys used to store configuration
+ * Based on the entity type and subtype, the keys used to store configuration
  * will have a common root name.
  *
  * @param string $entity_type
  *   The type of the entity the setting refers to.
- * @param string $bundle
- *   The bundle of the entity the setting refers to.
+ * @param string $subtype
+ *   The subtype of the entity the setting refers to.
  * @param string $setting
  *   The name of the setting.
  *
@@ -394,12 +394,12 @@ function translation_entity_library_info() {
  *   The key name of the configuration setting.
  *
  * @todo Generalize this logic so that it is available to any module needing
- *   per-bundle configuration.
+ *   per-subtype configuration.
  */
-function translation_entity_get_config_key($entity_type, $bundle, $setting) {
+function translation_entity_get_config_key($entity_type, $subtype, $setting) {
   $entity_type = preg_replace('/[^0-9a-zA-Z_]/', "_", $entity_type);
-  $bundle = preg_replace('/[^0-9a-zA-Z_]/', "_", $bundle);
-  return $entity_type . '.' . $bundle . '.translation_entity.' . $setting;
+  $subtype = preg_replace('/[^0-9a-zA-Z_]/', "_", $subtype);
+  return $entity_type . '.' . $subtype . '.translation_entity.' . $setting;
 }
 
 /**
@@ -407,16 +407,16 @@ function translation_entity_get_config_key($entity_type, $bundle, $setting) {
  *
  * @param string $entity_type
  *   The type of the entity the setting refer to.
- * @param string $bundle
- *   The bundle of the entity the setting refer to.
+ * @param string $subtype
+ *   The subtype of the entity the setting refer to.
  * @param string $setting
  *   The name of the setting.
  *
  * @returns mixed
  *   The stored value for the given setting.
  */
-function translation_entity_get_config($entity_type, $bundle, $setting) {
-  $key = translation_entity_get_config_key($entity_type, $bundle, $setting);
+function translation_entity_get_config($entity_type, $subtype, $setting) {
+  $key = translation_entity_get_config_key($entity_type, $subtype, $setting);
   return config('translation_entity.settings')->get($key);
 }
 
@@ -425,15 +425,15 @@ function translation_entity_get_config($entity_type, $bundle, $setting) {
  *
  * @param string $entity_type
  *   The type of the entity the setting refer to.
- * @param string $bundle
- *   The bundle of the entity the setting refer to.
+ * @param string $subtype
+ *   The subtype of the entity the setting refer to.
  * @param string $setting
  *   The name of the setting.
  * @param $value
  *   The value to be stored for the given setting.
  */
-function translation_entity_set_config($entity_type, $bundle, $setting, $value) {
-  $key = translation_entity_get_config_key($entity_type, $bundle, $setting);
+function translation_entity_set_config($entity_type, $subtype, $setting, $value) {
+  $key = translation_entity_get_config_key($entity_type, $subtype, $setting);
   return config('translation_entity.settings')->set($key, $value)->save();
 }
 
@@ -442,23 +442,23 @@ function translation_entity_set_config($entity_type, $bundle, $setting, $value)
  *
  * @param string $entity_type
  *   The type of the entity.
- * @param string $bundle
- *   (optional) The bundle of the entity. If no bundle is provided, all the
- *   available bundles are checked.
+ * @param string $subtype
+ *   (optional) The subtype of the entity. If no subtype is provided, all the
+ *   available subtypes are checked.
  * @param boolean $skip_handler
  *   (optional) Specifies whether the availablity of a field translation handler
  *   should affect the returned value. By default the check is performed.
  *
  * @returns
- *   TRUE if the specified bundle is translatable. If no bundle is provided
- *   returns TRUE if at least one of the entity bundles is translatable.
+ *   TRUE if the specified subtype is translatable. If no subtype is provided
+ *   returns TRUE if at least one of the entity subtypes is translatable.
  */
-function translation_entity_enabled($entity_type, $bundle = NULL, $skip_handler = FALSE) {
+function translation_entity_enabled($entity_type, $subtype = NULL, $skip_handler = FALSE) {
   $enabled = FALSE;
-  $bundles = !empty($bundle) ? array($bundle) : array_keys(entity_get_bundles($entity_type));
+  $subtypes = !empty($subtype) ? array($subtype) : array_keys(entity_get_subtypes($entity_type));
 
-  foreach ($bundles as $bundle) {
-    if (translation_entity_get_config($entity_type, $bundle, 'enabled')) {
+  foreach ($subtypes as $subtype) {
+    if (translation_entity_get_config($entity_type, $subtype, 'enabled')) {
       $enabled = TRUE;
       break;
     }
@@ -567,18 +567,18 @@ function translation_entity_permission() {
   );
 
   // Create a translate permission for each enabled entity type and (optionally)
-  // bundle.
+  // subtype.
   foreach (entity_get_info() as $entity_type => $info) {
     if (!empty($info['permission_granularity'])) {
       $t_args = array('@entity_label' => drupal_strtolower(t($info['label'])));
 
       switch ($info['permission_granularity']) {
-        case 'bundle':
-          foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) {
-            if (translation_entity_enabled($entity_type, $bundle)) {
-              $t_args['%bundle_label'] = isset($bundle_info['label']) ? $bundle_info['label'] : $bundle;
-              $permission["translate $bundle $entity_type"] = array(
-                'title' => t('Translate %bundle_label @entity_label', $t_args),
+        case 'subtype':
+          foreach (entity_get_subtypes($entity_type) as $subtype => $subtype_info) {
+            if (translation_entity_enabled($entity_type, $subtype)) {
+              $t_args['%subtype_label'] = isset($subtype_info['label']) ? $subtype_info['label'] : $subtype;
+              $permission["translate $subtype $entity_type"] = array(
+                'title' => t('Translate %subtype_label @entity_label', $t_args),
               );
             }
           }
@@ -602,7 +602,7 @@ function translation_entity_permission() {
  * Implements hook_form_alter().
  */
 function translation_entity_form_alter(array &$form, array &$form_state) {
-  if (($form_controller = translation_entity_form_controller($form_state)) && ($entity = $form_controller->getEntity($form_state)) && !$entity->isNew() && translation_entity_enabled($entity->entityType(), $entity->bundle())) {
+  if (($form_controller = translation_entity_form_controller($form_state)) && ($entity = $form_controller->getEntity($form_state)) && !$entity->isNew() && translation_entity_enabled($entity->entityType(), $entity->subtype())) {
     $controller = translation_entity_controller($entity->entityType());
     $controller->entityFormAlter($form, $form_state, $entity);
 
@@ -622,7 +622,7 @@ function translation_entity_form_alter(array &$form, array &$form_state) {
         }
       }
       else {
-        foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+        foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
           $field_name = $instance['field_name'];
           $field = field_info_field($field_name);
           $form[$field_name]['#multilingual'] = !empty($field['translatable']);
@@ -642,8 +642,8 @@ function translation_entity_field_language_alter(&$display_language, $context) {
   $entity = $context['entity'];
   $entity_type = $entity->entityType();
 
-  if (isset($entity->translation[$context['langcode']]) && translation_entity_enabled($entity_type, $entity->bundle()) && !translation_entity_view_access($entity, $context['langcode'])) {
-    $instances = field_info_instances($entity_type, $entity->bundle());
+  if (isset($entity->translation[$context['langcode']]) && translation_entity_enabled($entity_type, $entity->subtype()) && !translation_entity_view_access($entity, $context['langcode'])) {
+    $instances = field_info_instances($entity_type, $entity->subtype());
     // Avoid altering the real entity.
     $entity = clone($entity);
     $entity_langcode = $entity->language()->langcode;
@@ -678,7 +678,7 @@ function translation_entity_entity_load(array $entities, $entity_type) {
 
   if (translation_entity_enabled($entity_type)) {
     foreach ($entities as $entity) {
-      if (translation_entity_enabled($entity_type, $entity->bundle())) {
+      if (translation_entity_enabled($entity_type, $entity->subtype())) {
         $enabled_entities[$entity->id()] = $entity;
       }
     }
@@ -717,7 +717,7 @@ function translation_entity_load_translation_metadata(array $entities, $entity_t
  */
 function translation_entity_entity_insert(EntityInterface $entity) {
   // Only do something if translation support for the given entity is enabled.
-  if (!translation_entity_enabled($entity->entityType(), $entity->bundle())) {
+  if (!translation_entity_enabled($entity->entityType(), $entity->subtype())) {
     return;
   }
 
@@ -757,7 +757,7 @@ function translation_entity_entity_insert(EntityInterface $entity) {
  */
 function translation_entity_entity_delete(EntityInterface $entity) {
   // Only do something if translation support for the given entity is enabled.
-  if (!translation_entity_enabled($entity->entityType(), $entity->bundle())) {
+  if (!translation_entity_enabled($entity->entityType(), $entity->subtype())) {
     return;
   }
 
@@ -772,7 +772,7 @@ function translation_entity_entity_delete(EntityInterface $entity) {
  */
 function translation_entity_entity_update(EntityInterface $entity) {
   // Only do something if translation support for the given entity is enabled.
-  if (!translation_entity_enabled($entity->entityType(), $entity->bundle())) {
+  if (!translation_entity_enabled($entity->entityType(), $entity->subtype())) {
     return;
   }
 
@@ -788,9 +788,9 @@ function translation_entity_field_extra_fields() {
   $extra = array();
 
   foreach (entity_get_info() as $entity_type => $info) {
-    foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) {
-      if (translation_entity_enabled($entity_type, $bundle)) {
-        $extra[$entity_type][$bundle]['form']['translation'] = array(
+    foreach (entity_get_subtypes($entity_type) as $subtype => $subtype_info) {
+      if (translation_entity_enabled($entity_type, $subtype)) {
+        $extra[$entity_type][$subtype]['form']['translation'] = array(
           'label' => t('Translation'),
           'description' => t('Translation settings'),
           'weight' => 10,
@@ -866,7 +866,7 @@ function translation_entity_field_info_alter(&$info) {
  * Implements hook_field_attach_presave().
  */
 function translation_entity_field_attach_presave(EntityInterface $entity) {
-  if (translation_entity_enabled($entity->entityType(), $entity->bundle())) {
+  if (translation_entity_enabled($entity->entityType(), $entity->subtype())) {
     $attributes = drupal_container()->get('request')->attributes;
     drupal_container()->get('translation_entity.synchronizer')->synchronizeFields($entity, $attributes->get('working_langcode'), $attributes->get('source_langcode'));
   }
@@ -882,7 +882,7 @@ function translation_entity_element_info_alter(&$type) {
 }
 
 /**
- * Returns a widget to enable entity translation per entity bundle.
+ * Returns a widget to enable entity translation per entity subtype.
  *
  * Backward compatibility layer to support entities not using the language
  * configuration form element.
@@ -891,19 +891,19 @@ function translation_entity_element_info_alter(&$type) {
  *
  * @param string $entity_type
  *   The type of the entity being configured for translation.
- * @param string $bundle
- *   The bundle of the entity being configured for translation.
+ * @param string $subtype
+ *   The subtype of the entity being configured for translation.
  * @param array $form
  *   The configuration form array.
  * @param array $form_state
  *   The configuration form state array.
  */
-function translation_entity_enable_widget($entity_type, $bundle, array &$form, array &$form_state) {
+function translation_entity_enable_widget($entity_type, $subtype, array &$form, array &$form_state) {
   $key = $form_state['translation_entity']['key'];
   if (!isset($form_state['language'][$key])) {
     $form_state['language'][$key] = array();
   }
-  $form_state['language'][$key] += array('entity_type' => $entity_type, 'bundle' => $bundle);
+  $form_state['language'][$key] += array('entity_type' => $entity_type, 'subtype' => $subtype);
   $element = translation_entity_language_configuration_element_process(array('#name' => $key), $form_state, $form);
   unset($element['translation_entity']['#element_validate']);
   return $element;
@@ -926,7 +926,7 @@ function translation_entity_language_configuration_element_process(array $elemen
     $element['translation_entity'] = array(
       '#type' => 'checkbox',
       '#title' => t('Enable translation'),
-      '#default_value' => translation_entity_enabled($context['entity_type'], $context['bundle']),
+      '#default_value' => translation_entity_enabled($context['entity_type'], $context['subtype']),
       '#element_validate' => array('translation_entity_language_configuration_element_validate'),
       '#prefix' => '<label>' . t('Translation') . '</label>',
     );
@@ -971,8 +971,8 @@ function translation_entity_language_configuration_element_submit(array $form, a
   $context = $form_state['language'][$key];
   $enabled = $form_state['values'][$key]['translation_entity'];
 
-  if (translation_entity_enabled($context['entity_type'], $context['bundle']) != $enabled) {
-    translation_entity_set_config($context['entity_type'], $context['bundle'], 'enabled', $enabled);
+  if (translation_entity_enabled($context['entity_type'], $context['subtype']) != $enabled) {
+    translation_entity_set_config($context['entity_type'], $context['subtype'], 'enabled', $enabled);
     entity_info_cache_clear();
     menu_router_rebuild();
   }
@@ -998,9 +998,9 @@ function translation_entity_preprocess_language_content_settings_table(&$variabl
  * Stores entity translation settings.
  *
  * @param array $settings
- *   An associative array of settings keyed by entity type and bundle. At bundle
+ *   An associative array of settings keyed by entity type and subtype. At subtype
  *   level the following keys are available:
- *   - translatable: The bundle translatability status, which is a bool.
+ *   - translatable: The subtype translatability status, which is a bool.
  *   - settings: An array of language configuration settings as defined by
  *     language_save_default_configuration().
  *   - fields: An associative array with field names as keys and a boolean as
@@ -1010,15 +1010,15 @@ function translation_entity_preprocess_language_content_settings_table(&$variabl
  */
 function translation_entity_save_settings($settings) {
   foreach ($settings as $entity_type => $entity_settings) {
-    foreach ($entity_settings as $bundle => $bundle_settings) {
-      // Store bundle translatability.
-      translation_entity_set_config($entity_type, $bundle, 'enabled', $bundle_settings['translatable']);
+    foreach ($entity_settings as $subtype => $subtype_settings) {
+      // Store subtype translatability.
+      translation_entity_set_config($entity_type, $subtype, 'enabled', $subtype_settings['translatable']);
 
       // Store column translatability.
-      if (!empty($bundle_settings['columns'])) {
-        foreach ($bundle_settings['columns'] as $field_name => $column_settings) {
+      if (!empty($subtype_settings['columns'])) {
+        foreach ($subtype_settings['columns'] as $field_name => $column_settings) {
           $field = field_info_field($field_name);
-          $instance = field_info_instance($entity_type, $field_name, $bundle);
+          $instance = field_info_instance($entity_type, $field_name, $subtype);
           if ($field['translatable']) {
             $instance['settings']['translation_sync'] = $column_settings;
           }
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index f0c3027..cc6c1fa 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -38,7 +38,7 @@ function translation_entity_overview(EntityInterface $entity) {
 
     // Determine whether the current entity is translatable.
     $translatable = FALSE;
-    foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
+    foreach (field_info_instances($entity->entityType(), $entity->subtype()) as $instance) {
       $field_name = $instance['field_name'];
       $field = field_info_field($field_name);
       if ($field['translatable']) {
@@ -124,7 +124,7 @@ function translation_entity_overview(EntityInterface $entity) {
             $links['add']['title'] = t('Add');
           }
           elseif ($field_ui) {
-            $entity_path = field_ui_bundle_admin_path($entity->entityType(), $entity->bundle());
+            $entity_path = field_ui_subtype_admin_path($entity->entityType(), $entity->subtype());
             // Link directly to the fields tab to make it easier to find the
             // setting to enable translation on fields.
             $path = $entity_path . '/fields';
@@ -237,7 +237,7 @@ function translation_entity_edit_page(EntityInterface $entity, Language $languag
  */
 function translation_entity_prepare_translation(EntityInterface $entity, Language $source, Language $target) {
   // @todo Unify field and property handling.
-  $instances = field_info_instances($entity->entityType(), $entity->bundle());
+  $instances = field_info_instances($entity->entityType(), $entity->subtype());
   if ($entity instanceof EntityNG) {
     $source_translation = $entity->getTranslation($source->langcode);
     $target_translation = $entity->getTranslation($target->langcode);
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
index 38ca376..4a2cd30 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
@@ -204,7 +204,7 @@ function testRegistrationWithUserFields() {
       'field_name' => 'test_user_field',
       'entity_type' => 'user',
       'label' => 'Some user field',
-      'bundle' => 'user',
+      'subtype' => 'user',
       'required' => TRUE,
       'settings' => array('user_register_form' => FALSE),
     );
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index c7fd16b..c9c7f1c 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -326,7 +326,7 @@ function user_install_picture_field() {
     'field_name' => 'user_picture',
     'entity_type' => 'user',
     'label' => 'Picture',
-    'bundle' => 'user',
+    'subtype' => 'user',
     'description' => $t('Your virtual face or picture.'),
     'required' => FALSE,
     'settings' => array(
@@ -385,11 +385,11 @@ function user_install_picture_field() {
  * The 'Member for' extra field has moved one level up in the array.
  */
 function user_update_8000() {
-  $settings = field_bundle_settings('user', 'user');
+  $settings = field_subtype_settings('user', 'user');
   if (isset($settings['extra_fields']['display']['summary'])) {
     $settings['extra_fields']['display']['member_for'] = $settings['extra_fields']['display']['summary'];
     unset($settings['extra_fields']['display']['summary']);
-    field_bundle_settings('user', 'user', $settings);
+    field_subtype_settings('user', 'user', $settings);
   }
 }
 
@@ -722,7 +722,7 @@ function user_update_8011() {
     'field_name' => 'user_picture',
     'entity_type' => 'user',
     'label' => 'Picture',
-    'bundle' => 'user',
+    'subtype' => 'user',
     'description' => update_variable_get('user_picture_guidelines', ''),
     'required' => FALSE,
     'settings' => array(
@@ -797,13 +797,13 @@ function user_update_8011() {
       ->execute();
   }
 
-  // Update the user bundle settings and hide the member_for extra field.
-  $settings = update_variable_get('field_bundle_settings_user__user');
+  // Update the user subtype settings and hide the member_for extra field.
+  $settings = update_variable_get('field_subtype_settings_user__user');
   $settings['extra_fields']['display']['member_for']['compact'] = array(
     'weight' => 0,
     'visible' => FALSE,
   );
-  update_variable_set('field_bundle_settings_user__user', $settings);
+  update_variable_set('field_subtype_settings_user__user', $settings);
 
   // Delete old variables.
   update_variable_del('user_pictures');
@@ -833,7 +833,7 @@ function user_update_8012(&$sandbox) {
       db_insert('field_data_user_picture')
         ->fields(array(
           'entity_type' => 'user',
-          'bundle' => 'user',
+          'subtype' => 'user',
           'entity_id' => $uid,
           'revision_id' => $uid,
           'langcode' => LANGUAGE_NOT_SPECIFIED,
@@ -844,7 +844,7 @@ function user_update_8012(&$sandbox) {
       db_insert('field_revision_user_picture')
         ->fields(array(
           'entity_type' => 'user',
-          'bundle' => 'user',
+          'subtype' => 'user',
           'entity_id' => $uid,
           'revision_id' => $uid,
           'langcode' => LANGUAGE_NOT_SPECIFIED,
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index fa6a291..9cba431 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -139,16 +139,16 @@ function user_entity_view_mode_info() {
 }
 
 /**
- * Implements hook_entity_bundle_info().
+ * Implements hook_entity_subtype_info().
  */
-function user_entity_bundle_info() {
-  $bundles['user']['user'] = array(
+function user_entity_subtype_info() {
+  $subtypes['user']['user'] = array(
     'label' => t('User'),
     'admin' => array(
       'path' => 'admin/config/people/accounts',
     ),
   );
-  return $bundles;
+  return $subtypes;
 }
 
 /**
@@ -2672,7 +2672,7 @@ function user_rdf_mapping() {
   return array(
     array(
       'type' => 'user',
-      'bundle' => RDF_DEFAULT_BUNDLE,
+      'subtype' => RDF_DEFAULT_BUNDLE,
       'mapping' => array(
         'rdftype' => array('sioc:UserAccount'),
         'name' => array(
diff --git a/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php b/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
index c3cf1ac..4e44bc9 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
@@ -155,7 +155,7 @@ public function getReferencableEntities($match = NULL, $match_operator = 'CONTAI
     if ($result) {
       foreach($this->view->result as $row) {
         $entity = $row->_entity;
-        $return[$entity->bundle()][$entity->id()] = $entity->label();
+        $return[$entity->subtype()][$entity->id()] = $entity->label();
       }
     }
     return $return;
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/filter/Bundle.php b/core/modules/views/lib/Drupal/views/Plugin/views/filter/Bundle.php
index 0fbe8d2..a4e4445 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/filter/Bundle.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/filter/Bundle.php
@@ -12,12 +12,12 @@
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 
 /**
- * Filter class which allows filtering by entity bundles.
+ * Filter class which allows filtering by entity subtypes.
  *
  * @ingroup views_filter_handlers
  *
  * @Plugin(
- *   id = "bundle"
+ *   id = "subtype"
  * )
  */
 class Bundle extends InOperator {
@@ -44,7 +44,7 @@ public function init(ViewExecutable $view, DisplayPluginBase $display, array &$o
 
     $this->entityType = $this->getEntityType();
     $this->entityInfo = entity_get_info($this->entityType);
-    $this->real_field = $this->entityInfo['entity_keys']['bundle'];
+    $this->real_field = $this->entityInfo['entity_keys']['subtype'];
   }
 
   /**
@@ -52,7 +52,7 @@ public function init(ViewExecutable $view, DisplayPluginBase $display, array &$o
    */
   public function get_value_options() {
     if (!isset($this->value_options)) {
-      $types = entity_get_bundles($this->entityType);
+      $types = entity_get_subtypes($this->entityType);
       $this->value_title = t('@entity types', array('@entity' => $this->entityInfo['label']));
 
       $options = array();
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
index 50013dc..a3174e8 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
@@ -558,23 +558,23 @@ protected function build_filters(&$form, &$form_state) {
     // Find all the fields we are allowed to filter by.
     $fields = views_fetch_fields($this->base_table, 'filter');
 
-    $bundles = entity_get_bundles($this->entity_type);
-    // If the current base table support bundles and has more than one (like user).
-    if (isset($this->entity_info['bundle_keys']) && !empty($bundles)) {
-      // Get all bundles and their human readable names.
+    $subtypes = entity_get_subtypes($this->entity_type);
+    // If the current base table support subtypes and has more than one (like user).
+    if (isset($this->entity_info['subtype_keys']) && !empty($subtypes)) {
+      // Get all subtypes and their human readable names.
       $options = array('all' => t('All'));
-      foreach ($bundles as $type => $bundle) {
-        $options[$type] = $bundle['label'];
+      foreach ($subtypes as $type => $subtype) {
+        $options[$type] = $subtype['label'];
       }
       $form['displays']['show']['type'] = array(
         '#type' => 'select',
         '#title' => t('of type'),
         '#options' => $options,
       );
-      $selected_bundle = static::getSelected($form_state, array('show', 'type'), 'all', $form['displays']['show']['type']);
-      $form['displays']['show']['type']['#default_value'] = $selected_bundle;
+      $selected_subtype = static::getSelected($form_state, array('show', 'type'), 'all', $form['displays']['show']['type']);
+      $form['displays']['show']['type']['#default_value'] = $selected_subtype;
       // Changing this dropdown updates the entire content of $form['displays']
-      // via AJAX, since each bundle might have entirely different fields
+      // via AJAX, since each subtype might have entirely different fields
       // attached to it, etc.
       views_ui_add_ajax_trigger($form['displays']['show'], 'type', array('displays'));
     }
@@ -817,17 +817,17 @@ protected function default_display_filters_user(array $form, array &$form_state)
     $filters = array();
 
     if (!empty($form_state['values']['show']['type']) && $form_state['values']['show']['type'] != 'all') {
-      $bundle_key = $this->entity_info['bundle_keys']['bundle'];
-      // Figure out the table where $bundle_key lives. It may not be the same as
+      $subtype_key = $this->entity_info['subtype_keys']['subtype'];
+      // Figure out the table where $subtype_key lives. It may not be the same as
       // the base table for the view; the taxonomy vocabulary machine_name, for
       // example, is stored in taxonomy_vocabulary, not taxonomy_term_data.
       $fields = views_fetch_fields($this->base_table, 'filter');
-      if (isset($fields[$this->base_table . '.' . $bundle_key])) {
+      if (isset($fields[$this->base_table . '.' . $subtype_key])) {
         $table = $this->base_table;
       }
       else {
         foreach ($fields as $field_name => $value) {
-          if ($pos = strpos($field_name, '.' . $bundle_key)) {
+          if ($pos = strpos($field_name, '.' . $subtype_key)) {
             $table = substr($field_name, 0, $pos);
             break;
           }
@@ -835,7 +835,7 @@ protected function default_display_filters_user(array $form, array &$form_state)
       }
       $table_data = drupal_container()->get('views.views_data')->get($table);
       // If the 'in' operator is being used, map the values to an array.
-      $handler = $table_data[$bundle_key]['filter']['id'];
+      $handler = $table_data[$subtype_key]['filter']['id'];
       $handler_definition = drupal_container()->get('plugin.manager.views.filter')->getDefinition($handler);
       if ($handler == 'in_operator' || is_subclass_of($handler_definition['class'], 'Drupal\\views\\Plugin\\views\\filter\\InOperator')) {
         $value = drupal_map_assoc(array($form_state['values']['show']['type']));
@@ -845,10 +845,10 @@ protected function default_display_filters_user(array $form, array &$form_state)
         $value = $form_state['values']['show']['type'];
       }
 
-      $filters[$bundle_key] = array(
-        'id' => $bundle_key,
+      $filters[$subtype_key] = array(
+        'id' => $subtype_key,
         'table' => $table,
-        'field' => $bundle_key,
+        'field' => $subtype_key,
         'value' => $value,
       );
     }
diff --git a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
index 7e8fc93..48d1090 100644
--- a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
@@ -73,7 +73,7 @@ protected function setUp() {
     $this->instance = array(
       'field_name' => $this->field_name,
       'entity_type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'widget' => array(
         'type' => 'options_select',
       ),
@@ -108,7 +108,7 @@ protected function setUp() {
       $comment = array(
         'uid' => $user->uid,
         'nid' => $node->nid,
-        'node_type' => 'node_type_' . $node->bundle(),
+        'node_type' => 'node_type_' . $node->subtype(),
       );
       entity_create('comment', $comment)->save();
     }
diff --git a/core/modules/views/lib/Drupal/views/Tests/Entity/FieldEntityTest.php b/core/modules/views/lib/Drupal/views/Tests/Entity/FieldEntityTest.php
index 87b4fbd..0396d52 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Entity/FieldEntityTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Entity/FieldEntityTest.php
@@ -43,7 +43,7 @@ public function testGetEntity() {
     // The view is a view of comments, their nodes and their authors, so there
     // are three layers of entities.
 
-    $account = entity_create('user', array('name' => $this->randomName(), 'bundle' => 'user'));
+    $account = entity_create('user', array('name' => $this->randomName(), 'subtype' => 'user'));
     $account->save();
     $node = entity_create('node', array('uid' => $account->id(), 'type' => 'page'));
     $node->save();
diff --git a/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntityBundleTest.php b/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntityBundleTest.php
deleted file mode 100644
index 29d55dd..0000000
--- a/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntityBundleTest.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views\Tests\Entity\FilterEntityBundleTest.
- */
-
-namespace Drupal\views\Tests\Entity;
-
-use Drupal\views\Tests\ViewTestBase;
-
-/**
- * Tests the EntityType generic filter handler.
- */
-class FilterEntityBundleTest extends ViewTestBase {
-
-  /**
-   * Views used by this test.
-   *
-   * @var array
-   */
-  public static $testViews = array('test_entity_type_filter');
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('node');
-
-  /**
-   * Entity info data.
-   *
-   * @var array
-   */
-  protected $entityInfo;
-
-  /**
-   * Entity bundle data.
-   *
-   * @var array
-   */
-  protected $entityBundles;
-
-  /**
-   * An array of entities.
-   *
-   * @var array
-   */
-  protected $entities = array();
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Filter: Entity bundle',
-      'description' => 'Tests the generic entity bundle filter.',
-      'group' => 'Views Handlers',
-    );
-  }
-
-  public function setUp() {
-    parent::setUp();
-
-    $this->drupalCreateContentType(array('type' => 'test_bundle'));
-    $this->drupalCreateContentType(array('type' => 'test_bundle_2'));
-
-    $this->entityBundles = entity_get_bundles('node');
-
-    $this->entities['count'] = 0;
-
-    foreach ($this->entityBundles as $key => $info) {
-      for ($i = 0; $i < 5; $i++) {
-        $entity = entity_create('node', array('label' => $this->randomName(), 'uid' => 1, 'type' => $key));
-        $entity->save();
-        $this->entities[$key][$entity->id()] = $entity;
-        $this->entities['count']++;
-      }
-    }
-  }
-
-  /**
-   * Tests the generic bundle filter.
-   */
-  public function testFilterEntity() {
-    $view = views_get_view('test_entity_type_filter');
-    $this->executeView($view);
-
-    // Test we have all the results, with all types selected.
-    $this->assertEqual(count($view->result), $this->entities['count']);
-
-    // Test the value_options of the filter handler.
-    $expected = array();
-
-    foreach ($this->entityBundles as $key => $info) {
-      $expected[$key] = $info['label'];
-    }
-    $this->assertIdentical($view->filter['type']->get_value_options(), $expected);
-
-    $view->destroy();
-
-    // Test each bundle type.
-    foreach ($this->entityBundles as $key => $info) {
-      // Test each bundle type.
-      $view->initDisplay();
-      $filters = $view->display_handler->getOption('filters');
-      $filters['type']['value'] = drupal_map_assoc(array($key));
-      $view->display_handler->setOption('filters', $filters);
-      $this->executeView($view);
-
-      $this->assertEqual(count($view->result), count($this->entities[$key]));
-
-      $view->destroy();
-    }
-
-    // Test an invalid bundle type to make sure we have no results.
-    $view->initDisplay();
-    $filters = $view->display_handler->getOption('filters');
-    $filters['type']['value'] = drupal_map_assoc(array('type_3'));
-    $view->display_handler->setOption('filters', $filters);
-    $this->executeView($view);
-
-    $this->assertEqual(count($view->result), 0);
-  }
-
-}
diff --git a/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntitySubtypeTest.php b/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntitySubtypeTest.php
new file mode 100644
index 0000000..626f321
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntitySubtypeTest.php
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Entity\FilterEntitySubtypeTest.
+ */
+
+namespace Drupal\views\Tests\Entity;
+
+use Drupal\views\Tests\ViewTestBase;
+
+/**
+ * Tests the EntityType generic filter handler.
+ */
+class FilterEntitySubtypeTest extends ViewTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_entity_type_filter');
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node');
+
+  /**
+   * Entity info data.
+   *
+   * @var array
+   */
+  protected $entityInfo;
+
+  /**
+   * Entity subtype data.
+   *
+   * @var array
+   */
+  protected $entitySubtypes;
+
+  /**
+   * An array of entities.
+   *
+   * @var array
+   */
+  protected $entities = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter: Entity subtype',
+      'description' => 'Tests the generic entity subtype filter.',
+      'group' => 'Views Handlers',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->drupalCreateContentType(array('type' => 'test_subtype'));
+    $this->drupalCreateContentType(array('type' => 'test_subtype_2'));
+
+    $this->entitySubtypes = entity_get_subtypes('node');
+
+    $this->entities['count'] = 0;
+
+    foreach ($this->entitySubtypes as $key => $info) {
+      for ($i = 0; $i < 5; $i++) {
+        $entity = entity_create('node', array('label' => $this->randomName(), 'uid' => 1, 'type' => $key));
+        $entity->save();
+        $this->entities[$key][$entity->id()] = $entity;
+        $this->entities['count']++;
+      }
+    }
+  }
+
+  /**
+   * Tests the generic subtype filter.
+   */
+  public function testFilterEntity() {
+    $view = views_get_view('test_entity_type_filter');
+    $this->executeView($view);
+
+    // Test we have all the results, with all types selected.
+    $this->assertEqual(count($view->result), $this->entities['count']);
+
+    // Test the value_options of the filter handler.
+    $expected = array();
+
+    foreach ($this->entitySubtypes as $key => $info) {
+      $expected[$key] = $info['label'];
+    }
+    $this->assertIdentical($view->filter['type']->get_value_options(), $expected);
+
+    $view->destroy();
+
+    // Test each subtype type.
+    foreach ($this->entitySubtypes as $key => $info) {
+      // Test each subtype type.
+      $view->initDisplay();
+      $filters = $view->display_handler->getOption('filters');
+      $filters['type']['value'] = drupal_map_assoc(array($key));
+      $view->display_handler->setOption('filters', $filters);
+      $this->executeView($view);
+
+      $this->assertEqual(count($view->result), count($this->entities[$key]));
+
+      $view->destroy();
+    }
+
+    // Test an invalid subtype type to make sure we have no results.
+    $view->initDisplay();
+    $filters = $view->display_handler->getOption('filters');
+    $filters['type']['value'] = drupal_map_assoc(array('type_3'));
+    $view->display_handler->setOption('filters', $filters);
+    $this->executeView($view);
+
+    $this->assertEqual(count($view->result), 0);
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
index 6416193..a1bc7a8 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
@@ -73,7 +73,7 @@ function setUp() {
     $this->tag_instance = array(
       'field_name' => 'field_views_testing_tags',
       'entity_type' => 'node',
-      'bundle' => $this->node_type_with_tags->type,
+      'subtype' => $this->node_type_with_tags->type,
       'widget' => array(
         'type' => 'taxonomy_autocomplete',
       ),
@@ -183,7 +183,7 @@ function testTaggedWithByNodeType() {
     // If we add an instance of the tagging field to the second node type, the
     // "tagged with" form element should not appear for it too.
     $instance = $this->tag_instance;
-    $instance['bundle'] = $this->node_type_without_tags->type;
+    $instance['subtype'] = $this->node_type_without_tags->type;
     field_create_instance($instance);
     $view['show[type]'] = $this->node_type_with_tags->type;
     $this->drupalPost('admin/structure/views/add', $view, t('Update "of type" choice'));
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml
index 086afb9..d2be845 100644
--- a/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml
@@ -74,8 +74,8 @@ display:
           relationship: none
           value:
             all: all
-            test_bundle: test_bundle
-            test_bundle_2: test_bundle_2
+            test_subtype: test_subtype
+            test_subtype_2: test_subtype_2
 human_name: ''
 id: test_entity_type_filter
 tag: ''
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php
index 73d96e7..a265699 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -772,9 +772,9 @@ public function entityType() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::bundle().
+   * Implements \Drupal\Core\Entity\EntityInterface::subtype().
    */
-  public function bundle() {
+  public function subtype() {
     return $this->__call(__FUNCTION__, func_get_args());
   }
 
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index 13463b9..438ea58 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -58,14 +58,14 @@ function standard_install() {
   $rdf_mappings = array(
     array(
       'type' => 'node',
-      'bundle' => 'page',
+      'subtype' => 'page',
       'mapping' => array(
         'rdftype' => array('foaf:Document'),
       ),
     ),
     array(
       'type' => 'node',
-      'bundle' => 'article',
+      'subtype' => 'article',
       'mapping' => array(
         'field_image' => array(
           'predicates' => array('og:image', 'rdfs:seeAlso'),
@@ -125,7 +125,7 @@ function standard_install() {
     'field_name' => 'field_' . $vocabulary->id(),
     'entity_type' => 'node',
     'label' => 'Tags',
-    'bundle' => 'article',
+    'subtype' => 'article',
     'description' => $vocabulary->help,
     'widget' => array(
       'type' => 'taxonomy_autocomplete',
@@ -176,7 +176,7 @@ function standard_install() {
     'field_name' => 'field_image',
     'entity_type' => 'node',
     'label' => 'Image',
-    'bundle' => 'article',
+    'subtype' => 'article',
     'description' => st('Upload an image to go with this article.'),
     'required' => FALSE,
 
diff --git a/core/scripts/generate-d7-content.sh b/core/scripts/generate-d7-content.sh
index a19d329..70a03fb 100644
--- a/core/scripts/generate-d7-content.sh
+++ b/core/scripts/generate-d7-content.sh
@@ -95,11 +95,11 @@
   );
   field_create_field($field);
   $node_types = $i > 11 ? array('page') : array_keys(node_type_get_types());
-  foreach ($node_types as $bundle) {
+  foreach ($node_types as $subtype) {
     $instance = array(
       'label' => $vocabulary->name,
       'field_name' => $field['field_name'],
-      'bundle' => $bundle,
+      'subtype' => $subtype,
       'entity_type' => 'node',
       'settings' => array(),
       'description' => $vocabulary->help,
@@ -298,21 +298,21 @@
   ->execute();
 db_update('field_data_body')
   ->fields(array(
-    'bundle' => $node_type,
+    'subtype' => $node_type,
   ))
   ->condition('entity_id', $node->nid)
   ->condition('entity_type', 'node')
   ->execute();
 db_update('field_revision_body')
   ->fields(array(
-    'bundle' => $node_type,
+    'subtype' => $node_type,
   ))
   ->condition('entity_id', $node->nid)
   ->condition('entity_type', 'node')
   ->execute();
 db_update('field_config_instance')
   ->fields(array(
-    'bundle' => $node_type,
+    'subtype' => $node_type,
   ))
-  ->condition('bundle', 'article')
+  ->condition('subtype', 'article')
   ->execute();
