diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index cee3a43..d8a9393 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -293,11 +293,9 @@ function hook_entity_view_mode_alter(&$view_mode, Drupal\Core\Entity\EntityInter
 function hook_entity_display_alter(\Drupal\entity\Plugin\Core\Entity\EntityDisplay $display, array $context) {
   // Leave field labels out of the search index.
   if ($context['entity_type'] == 'node' && $context['view_mode'] == 'search_index') {
-    foreach ($display->getComponents() as $name => $options) {
-      if (isset($options['label'])) {
-        $options['label'] = 'hidden';
-        $display->setComponent($name, $options);
-      }
+    foreach ($display->getComponents('field') as $name => $options) {
+      $options['label'] = 'hidden';
+      $display->setComponent($name, $options);
     }
   }
 }
diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index ea17846..53924c5 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -582,12 +582,12 @@ function entity_view_multiple(array $entities, $view_mode, $langcode = NULL) {
  *   hidden on article nodes in the 'default' display.
  * @code
  * entity_get_display('node', 'article', 'default')
- *   ->setComponent('body', array(
- *     'type' => 'text_summary_or_trimmed',
+ *   ->setComponent('field', 'body', array(
+ *     'formatter' => 'text_summary_or_trimmed',
  *     'settings' => array('trim_length' => '200')
  *     'weight' => 1,
  *   ))
- *   ->removeComponent('field_image')
+ *   ->removeComponent('field', 'field_image')
  *   ->save();
  * @endcode
  *
@@ -673,7 +673,7 @@ function _entity_view_pre_render($elements) {
   $extra_fields = field_info_extra_fields($display->targetEntityType, $display->bundle, 'display');
   foreach (array_keys($extra_fields) as $name) {
     if (isset($elements[$name]) && (!isset($elements[$name]['#access']) || $elements[$name]['#access'])) {
-      if ($options = $display->getComponent($name)) {
+      if ($options = $display->getComponent('extra_field', $name)) {
         $elements[$name]['#weight'] = $options['weight'];
       }
       else {
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index b73857c..84a894b 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -379,9 +379,9 @@ function _comment_body_field_create($info) {
     );
     field_create_instance($instance);
     entity_get_display('comment', 'comment_node_' . $info->type, 'default')
-      ->setComponent('comment_body', array(
+      ->setComponent('field', 'comment_body', array(
         'label' => 'hidden',
-        'type' => 'text_default',
+        'formatter' => 'text_default',
         'weight' => 0,
       ))
       ->save();
diff --git a/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php b/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php
index 5a7da04..66850aa 100644
--- a/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php
+++ b/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php
@@ -57,7 +57,7 @@ public function generate(EntityInterface $entity, FieldInstance $instance, $lang
     }
 
     $label = $instance['label'];
-    $formatter_id = entity_get_render_display($entity, $view_mode)->getFormatter($instance['field_name'])->getPluginId();
+    $formatter_id = entity_get_render_display($entity, $view_mode)->getRenderer('field', $instance['field_name'])->getPluginId();
     $items = $entity->get($field_name);
     $items = $items[$langcode];
     $editor = $this->editorSelector->getEditor($formatter_id, $instance, $items);
diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php b/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php
index 573ce93..d5b1074 100644
--- a/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php
+++ b/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php
@@ -83,9 +83,9 @@ function createFieldWithInstance($field_name, $type, $cardinality, $label, $inst
     field_create_instance($this->$instance);
 
     entity_get_display('test_entity', 'test_bundle', 'default')
-      ->setComponent($field_name, array(
+      ->setComponent('field', $field_name, array(
         'label' => 'above',
-        'type' => $formatter_type,
+        'formatter' => $formatter_type,
         'settings' => $formatter_settings
       ))
       ->save();
diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php b/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
index 5217b92..55477b9 100644
--- a/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
+++ b/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
@@ -46,7 +46,7 @@ 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);
+    $options = entity_get_display('test_entity', 'test_bundle', $view_mode)->getComponent('field', $field_name);
     $field_instance = field_info_instance('test_entity', $field_name, 'test_bundle');
     return $this->editorSelector->getEditor($options['type'], $field_instance, $items);
   }
diff --git a/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php b/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php
index 37d4ee5..6127c12 100644
--- a/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php
+++ b/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php
@@ -64,8 +64,8 @@ function testEmailField() {
     field_create_instance($this->instance);
     // Create a display for the full view mode.
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field['field_name'], array(
-        'type' => 'email_mailto',
+      ->setComponent('field', $this->field['field_name'], array(
+        'formatter' => 'email_mailto',
       ))
       ->save();
 
diff --git a/core/modules/entity/lib/Drupal/entity/DisplayComponentHandlerBase.php b/core/modules/entity/lib/Drupal/entity/DisplayComponentHandlerBase.php
new file mode 100644
index 0000000..4cd136f
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/DisplayComponentHandlerBase.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\DisplayComponentHandlerBase.
+ */
+
+namespace Drupal\entity;
+
+use Drupal\entity\Plugin\Core\Entity\EntityDisplay;
+
+// @todo interface
+abstract class DisplayComponentHandlerBase  {
+
+  public function __construct(EntityDisplay $display) {
+    $this->display = $display;
+  }
+
+  public function massageOut($name, $options) {
+    return $options;
+  }
+
+  public function massageIn($name, array $options) {
+    return $options;
+  }
+
+  public function massageRemove($name) { }
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/EntityBundle.php b/core/modules/entity/lib/Drupal/entity/EntityBundle.php
new file mode 100644
index 0000000..c352ec3
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/EntityBundle.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\entity\EntityBundle.
+ */
+
+namespace Drupal\entity;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Entity dependency injection container.
+ */
+class EntityBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the plugin managers for our plugin types with the dependency injection container.
+    $container->register('plugin.manager.entity.display_component_handler', 'Drupal\entity\Plugin\Type\DisplayComponentHandlerPluginManager');
+  }
+
+}
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 9048788..d0a4084 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
@@ -80,11 +80,18 @@ class EntityDisplay extends ConfigEntityBase {
   public $originalViewMode;
 
   /**
-   * The formatter objects used for this display, keyed by field name.
+   * The renderer objects used for this display, keyed by component name.
    *
    * @var array
    */
-  protected $formatters = array();
+  protected $renderers = array();
+
+  /**
+   * The component handler plugin manager.
+   *
+   * @var \Drupal\entity\Plugin\Type\DisplayComponentHandlerPluginManager
+   */
+  protected $handlersManager;
 
   /**
    * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::__construct().
@@ -100,6 +107,15 @@ public function __construct(array $values, $entity_type) {
     parent::__construct($values, $entity_type);
 
     $this->originalViewMode = $this->viewMode;
+
+    // Get the 'component handler' plugin manager.
+    $this->handlersManager = drupal_container()->get('plugin.manager.entity.display_component_handler');
+
+    // Let the component handlers add missing components.
+    $handlers = $this->handlersManager->getDefinitions();
+    foreach (array_keys($handlers) as $type) {
+      $this->getComponentHandler($type)->prepareDisplayComponents($this->content);
+    }
   }
 
   /**
@@ -158,17 +174,42 @@ public function createCopy($view_mode) {
   }
 
   /**
+   * Returns the component handler plugin for a given component type.
+   *
+   * @param string $type
+   *   The component type.
+   *
+   * @return \Drupal\entity\Plugin\Type\DisplayComponentHandlerBase
+   *   @todo interface instead
+   *   The component handler plugin if it exists, NULL otherwise.
+   */
+  public function getComponentHandler($type) {
+    $handler = $this->handlersManager->getInstance(array('type' => $type));
+    if ($handler) {
+      $handler->setContext(array(
+        'entity_type' => $this->targetEntityType,
+        'bundle' => $this->bundle,
+        'view_mode' => $this->originalViewMode,
+      ));
+    }
+    return $handler;
+  }
+
+  /**
    * Gets the display options for all components.
    *
+   * @param string $type
+   *   (Optional) A component type.
+   *
    * @return array
-   *   The array of display options, keyed by component name.
+   *   The array of display options for all components of type $type, keyed by
+   *   component name.
    */
-  public function getComponents() {
+  public function getComponents($type = NULL) {
     $result = array();
     foreach ($this->content as $name => $options) {
-      if (!isset($options['visible']) || $options['visible'] === TRUE) {
-        unset($options['visible']);
-        $result[$name] = $options;
+      if (empty($type) || $options['handler_type'] == $type) {
+        $result[$name] = $this->getComponent($options['handler_type'], $name);
       }
     }
     return $result;
@@ -177,6 +218,9 @@ public function getComponents() {
   /**
    * Gets the display options set for a component.
    *
+   * @param string $type
+   *   The type of the component (i.e. the plugin id of its
+   *   display_component_handler).
    * @param string $name
    *   The name of the component.
    *
@@ -184,44 +228,29 @@ public function getComponents() {
    *   The display options for the component, or NULL if the component is not
    *   displayed.
    */
-  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');
-    if (isset($extra_fields[$name])) {
-      // If we have explicit settings, return an array or NULL depending on
-      // visibility.
-      if (isset($this->content[$name])) {
-        if ($this->content[$name]['visible']) {
-          return array(
-            'weight' => $this->content[$name]['weight'],
-          );
-        }
-        else {
-          return NULL;
-        }
-      }
-
-      // If no explicit settings for the extra field, look at the default
-      // visibility in its definition.
-      $definition = $extra_fields[$name];
-      if (!isset($definition['visible']) || $definition['visible'] == TRUE) {
-        return array(
-          'weight' => $definition['weight']
-        );
-      }
-      else {
-        return NULL;
-      }
+  public function getComponent($type, $name) {
+    if (!isset($this->content[$name]) || $this->content[$name]['handler_type'] !== $type) {
+      return NULL;
     }
 
-    if (isset($this->content[$name])) {
-      return $this->content[$name];
+    $options = $this->content[$name];
+
+    if ($handler = $this->getComponentHandler($type)) {
+      $options = $handler->massageOut($name, $options);
     }
+
+    // The 'handler_type' entry is strictly internal.
+    unset($options['handler_type']);
+
+    return $options;
   }
 
   /**
    * Sets the display options for a component.
    *
+   * @param string $type
+   *   The type of the component (i.e. the plugin id of its
+   *   display_component_handler).
    * @param string $name
    *   The name of the component.
    * @param array $options
@@ -230,28 +259,21 @@ public function getComponent($name) {
    * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay
    *   The EntityDisplay object.
    */
-  public function setComponent($name, array $options = array()) {
+  public function setComponent($type, $name, array $options = array()) {
     // If no weight specified, make sure the field sinks at the bottom.
     if (!isset($options['weight'])) {
       $max = $this->getHighestWeight();
       $options['weight'] = isset($max) ? $max + 1 : 0;
     }
 
-    if ($instance = field_info_instance($this->targetEntityType, $name, $this->bundle)) {
-      $field = field_info_field($instance['field_name']);
-      $options = drupal_container()->get('plugin.manager.field.formatter')->prepareConfiguration($field['type'], $options);
-
-      // Clear the persisted formatter, if any.
-      unset($this->formatters[$name]);
+    if ($handler = $this->getComponentHandler($type)) {
+      $options = $handler->massageIn($name, $options);
     }
 
-    // We always store 'extra fields', whether they are visible or hidden.
-    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display');
-    if (isset($extra_fields[$name])) {
-      $options['visible'] = TRUE;
-    }
+    $this->content[$name] = array('handler_type' => $type) + $options;
 
-    $this->content[$name] = $options;
+    // Clear the associated renderer object.
+    unset($this->renderers[$name]);
 
     return $this;
   }
@@ -259,32 +281,58 @@ public function setComponent($name, array $options = array()) {
   /**
    * Sets a component to be hidden.
    *
+   * @param string $type
+   *   The type of the component (i.e. the plugin id of its
+   *   display_component_handler).
    * @param string $name
    *   The name of the component.
    *
    * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay
    *   The EntityDisplay object.
    */
-  public function removeComponent($name) {
-    $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, '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
-      // that we can differenciate with those that are simply not configured
-      // yet.
-      $this->content[$name] = array(
-        'visible' => FALSE,
-      );
+  public function removeComponent($type, $name) {
+    if ($handler = $this->getComponentHandler($type)) {
+      $options = $handler->massageIn($name);
+    }
+    if (isset($options)) {
+      $this->content[$name] = array('handler_type' => $type) + $options;
     }
     else {
       unset($this->content[$name]);
-      unset($this->formatters[$name]);
     }
 
+    // Clear the associated renderer object.
+    unset($this->renderers[$name]);
+
     return $this;
   }
 
   /**
+   * Returns the object responsible for rendering the component.
+   *
+   * @param string $type
+   *   The type of the component (i.e. the plugin id of its
+   *   display_component_handler).
+   * @param string $name
+   *   The component name.
+   *
+   * @return
+   *   If the component is not hidden, the object to use for rendering it.
+   */
+  public function getRenderer($type, $name) {
+    if (!isset($this->renderers[$name]) && !array_key_exists($name, $this->renderers)) {
+      $options = $this->getComponent($type, $name);
+      if ($handler = $this->getComponentHandler($type)) {
+        $this->renderers[$name] = $handler->getRenderer($name, $options);
+      }
+      else {
+        $this->renderers[$name] = NULL;
+      }
+    }
+    return $this->renderers[$name];
+  }
+
+  /**
    * Returns the highest weight of the components in the display.
    *
    * @return int|null
@@ -292,54 +340,13 @@ public function removeComponent($name) {
    *   display is empty.
    */
   public function getHighestWeight() {
-    $weights = array();
-
     // Collect weights for the components in the display.
+    $weights = array();
     foreach ($this->content as $options) {
       if (isset($options['weight'])) {
         $weights[] = $options['weight'];
       }
     }
-
-    // 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));
-
-    return $weights ? max($weights) : NULL;
-  }
-
-  /**
-   * Returns the Formatter plugin for a field.
-   *
-   * @param string $field_name
-   *   The field name.
-   *
-   * @return \Drupal\field\Plugin\Type\Formatter\FormatterInterface
-   *   If the field is not hidden, the Formatter plugin to use for rendering
-   *   it.
-   */
-  public function getFormatter($field_name) {
-    if (isset($this->formatters[$field_name])) {
-      return $this->formatters[$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);
-      $formatter = drupal_container()->get('plugin.manager.field.formatter')->getInstance(array(
-        'instance' => $instance,
-        'view_mode' => $this->originalViewMode,
-        // No need to prepare, defaults have been merged in setComponent().
-        'prepare' => FALSE,
-        'configuration' => $configuration
-      ));
-    }
-    else {
-      $formatter = NULL;
-    }
-
-    // Persist the formatter object.
-    $this->formatters[$field_name] = $formatter;
-    return $formatter;
   }
 
 }
diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/Type/DisplayComponentHandlerBase.php b/core/modules/entity/lib/Drupal/entity/Plugin/Type/DisplayComponentHandlerBase.php
new file mode 100644
index 0000000..7431086
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/Plugin/Type/DisplayComponentHandlerBase.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\Plugin\Type\DisplayComponentHandlerBase.
+ */
+
+namespace Drupal\entity\Plugin\Type;
+
+use Drupal\Component\Plugin\PluginBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+
+
+// @todo interface
+abstract class DisplayComponentHandlerBase extends PluginBase {
+
+  /**
+   * The context in which the handler is being used.
+   *
+   * @var array
+   */
+  protected $context;
+
+  public function setContext(array $context) {
+    $this->context = $context;
+  }
+
+  public function prepareDisplayComponents(array &$components) { }
+
+  public function massageOut($name, array $options = NULL) {
+    return $options;
+  }
+
+  public function massageIn($name, array $options = NULL) {
+    return $options;
+  }
+
+  public function getRenderer($name, array $options = NULL) { }
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/Type/DisplayComponentHandlerPluginManager.php b/core/modules/entity/lib/Drupal/entity/Plugin/Type/DisplayComponentHandlerPluginManager.php
new file mode 100644
index 0000000..33cc287
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/Plugin/Type/DisplayComponentHandlerPluginManager.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\entity\Plugin\Type\DisplayComponentHandlerPluginManager.
+ */
+
+namespace Drupal\entity\Plugin\Type;
+
+use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Core\Plugin\Discovery\AlterDecorator;
+use Drupal\Core\Plugin\Discovery\CacheDecorator;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+
+/**
+ * Plugin type manager for entity display component handlers.
+ *
+ * The handlers are typically shared for the whole request. getInstance() holds
+ * the instanciated plugins and only instanciates one of each type.
+ */
+class DisplayComponentHandlerPluginManager extends PluginManagerBase {
+
+  /**
+   * The handlers that have already been instanciated by getInstance().
+   *
+   * @var array
+   */
+  protected $plugins = array();
+
+  /**
+   * Constructs a DisplayComponentHandlerPluginManager object.
+   */
+  public function __construct() {
+    // @todo document the aletr hook.
+    // @todo cache key / bin ?
+    $this->discovery = new AnnotatedClassDiscovery('entity', 'display_component_handler');
+    $this->discovery = new AlterDecorator($this->discovery, 'display_component_handler_info');
+    $this->discovery = new CacheDecorator($this->discovery, 'plugin_display_component_handler');
+
+    $this->factory = new DefaultFactory($this->discovery);
+  }
+
+  /**
+   * Overrides PluginManagerBase::getInstance().
+   *
+   * The display component handlers are shared for the whole request.
+   */
+  public function getInstance(array $options) {
+    $plugin_id = $options['type'];
+
+    if (!isset($this->plugins[$plugin_id]) && !array_key_exists($plugin_id, $this->plugins)) {
+      $this->plugins[$plugin_id] = $this->discovery->getDefinition($plugin_id) ? $this->createInstance($plugin_id) : NULL;
+    }
+
+    return $this->plugins[$plugin_id];
+  }
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/entity/display_component_handler/ExtraFieldDisplayComponentHandler.php b/core/modules/entity/lib/Drupal/entity/Plugin/entity/display_component_handler/ExtraFieldDisplayComponentHandler.php
new file mode 100644
index 0000000..01ebb01
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/Plugin/entity/display_component_handler/ExtraFieldDisplayComponentHandler.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\Plugin\entity\display_component_handler\ExtraFieldDisplayComponentHandler.
+ */
+
+namespace Drupal\entity\Plugin\entity\display_component_handler;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\entity\Plugin\Type\DisplayComponentHandlerBase;
+
+/**
+ * @todo
+ *
+ * @Plugin(
+ *   id = "extra_field",
+ *   module = "entity"
+ * )
+ */
+class ExtraFieldDisplayComponentHandler extends DisplayComponentHandlerBase {
+
+  public function prepareDisplayComponents(array &$components) {
+    // Add extra fields that are not explicitely configured in the display.
+    $extra_fields = field_info_extra_fields($this->context['entity_type'], $this->context['bundle'], 'display');
+    foreach ($extra_fields as $name => $definition) {
+      if (!isset($components[$name])) {
+        if (!isset($definition['visible']) || $definition['visible'] == TRUE) {
+          $components[$name] = array(
+            'visible' => TRUE,
+            'weight' => $definition['weight'],
+          );
+        }
+        else {
+          $components[$name] = array(
+            'visible' => FALSE,
+          );
+        }
+        $components[$name]['handler_type'] = $this->plugin_id;
+      }
+    }
+    // @todo : we could add a custom $display->hiddenExtraFields property on the display, and merge them back on save.
+  }
+
+  public function massageOut($name, array $options = NULL) {
+    // We always store 'extra fields', whether they are visible or hidden. Only
+    // return an options array for visible components.
+    if (!empty($options['visible'])) {
+      unset($options['visible']);
+      return $options;
+    }
+  }
+
+  public function massageIn($name, array $options = NULL) {
+    // 'Extra fields' are exposed in hooks and can appear at any given time.
+    // Therefore we store extra fields that are explicitly being hidden, so
+    // that we can differenciate with those that are simply not configured
+    // yet.
+    if (is_null($options)) {
+      $options['visible'] = FALSE;
+    }
+    else {
+      $options['visible'] = TRUE;
+    }
+    return $options;
+  }
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php
index 8b0ce69..a9fcbb6 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php
@@ -46,34 +46,34 @@ public function testEntityDisplayCRUD() {
     // being assigned.
     $expected['component_1'] = array('weight' => 0);
     $expected['component_2'] = array('weight' => 1);
-    $display->setComponent('component_1');
-    $display->setComponent('component_2');
-    $this->assertEqual($display->getComponent('component_1'), $expected['component_1']);
-    $this->assertEqual($display->getComponent('component_2'), $expected['component_2']);
+    $display->setComponent('default', 'component_1');
+    $display->setComponent('default', 'component_2');
+    $this->assertEqual($display->getComponent('default', 'component_1'), $expected['component_1']);
+    $this->assertEqual($display->getComponent('default', 'component_2'), $expected['component_2']);
 
     // Check that arbitrary options are correctly stored.
     $expected['component_3'] = array('weight' => 10, 'foo' => 'bar');
-    $display->setComponent('component_3', $expected['component_3']);
-    $this->assertEqual($display->getComponent('component_3'), $expected['component_3']);
+    $display->setComponent('default', 'component_3', $expected['component_3']);
+    $this->assertEqual($display->getComponent('default', 'component_3'), $expected['component_3']);
 
     // Check that the display can be properly saved and read back.
     $display->save();
     $display = entity_load('entity_display', $display->id());
     foreach (array('component_1', 'component_2', 'component_3') as $name) {
-      $this->assertEqual($display->getComponent($name), $expected[$name]);
+      $this->assertEqual($display->getComponent('default', $name), $expected[$name]);
     }
 
     // Check that getComponents() returns options for all components.
-    $this->assertEqual($display->getComponents(), $expected);
+    $this->assertEqual($display->getComponents('default'), $expected);
 
     // Check that a component can be removed.
-    $display->removeComponent('component_3');
-    $this->assertNULL($display->getComponent('component_3'));
+    $display->removeComponent('default', 'component_3');
+    $this->assertNULL($display->getComponent('default', 'component_3'));
 
     // Check that the removal is correctly persisted.
     $display->save();
     $display = entity_load('entity_display', $display->id());
-    $this->assertNULL($display->getComponent('component_3'));
+    $this->assertNULL($display->getComponent('default', 'component_3'));
 
     // Check that CreateCopy() creates a new component that can be correclty
     // saved.
@@ -96,14 +96,14 @@ public function testEntityGetDisplay() {
     $this->assertTrue($display->isNew());
 
     // Add some components and save the display.
-    $display->setComponent('component_1', array('weight' => 10))
+    $display->setComponent('default', 'component_1', array('weight' => 10))
       ->save();
 
     // Check that entity_get_display() returns the correct object.
     $display = entity_get_display('entity_test', 'entity_test', 'default');
     $this->assertFalse($display->isNew());
     $this->assertEqual($display->id, 'entity_test.entity_test.default');
-    $this->assertEqual($display->getComponent('component_1'), array('weight' => 10));
+    $this->assertEqual($display->getComponent('default', 'component_1'), array('weight' => 10));
   }
 
   /**
@@ -112,20 +112,20 @@ public function testEntityGetDisplay() {
   public function testExtraFieldComponent() {
     $display = entity_create('entity_display', array(
       'targetEntityType' => 'entity_test',
-      'bundle' => 'entity_test',
+      'bundle' => 'bundle_with_extra_fields',
       'viewMode' => 'default',
     ));
 
-    // Check that the default visibility taken into account for extra fields
+    // Check that the default visibility is taken into account for extra fields
     // unknown in the display.
-    $this->assertEqual($display->getComponent('display_extra_field'), array('weight' => 5));
-    $this->assertNull($display->getComponent('display_extra_field_hidden'));
+    $this->assertEqual($display->getComponent('extra_field', 'display_extra_field'), array('weight' => 5));
+    $this->assertNull($display->getComponent('extra_field', 'display_extra_field_hidden'));
 
     // Check that setting explicit options overrides the defaults.
-    $display->removeComponent('display_extra_field');
-    $display->setComponent('display_extra_field_hidden', array('weight' => 10));
-    $this->assertNull($display->getComponent('display_extra_field'));
-    $this->assertEqual($display->getComponent('display_extra_field_hidden'), array('weight' => 10));
+    $display->removeComponent('extra_field', 'display_extra_field');
+    $display->setComponent('extra_field', 'display_extra_field_hidden', array('weight' => 10));
+    $this->assertNull($display->getComponent('extra_field', 'display_extra_field'));
+    $this->assertEqual($display->getComponent('extra_field', 'display_extra_field_hidden'), array('weight' => 10));
   }
 
   /**
@@ -154,20 +154,20 @@ public function testFieldComponent() {
     field_create_instance($instance);
 
     // Check that providing no options results in default values being used.
-    $display->setComponent($field['field_name']);
+    $display->setComponent('field', $field['field_name']);
     $field_type_info = field_info_field_types($field['type']);
     $default_formatter = $field_type_info['default_formatter'];
     $default_settings = field_info_formatter_settings($default_formatter);
     $expected = array(
       'weight' => 0,
       'label' => 'above',
-      'type' => $default_formatter,
+      'formatter' => $default_formatter,
       'settings' => $default_settings,
     );
-    $this->assertEqual($display->getComponent($field['field_name']), $expected);
+    $this->assertEqual($display->getComponent('field', $field['field_name']), $expected);
 
     // Check that the getFormatter() method returns the correct formatter plugin.
-    $formatter = $display->getFormatter($field['field_name']);
+    $formatter = $display->getRenderer('field', $field['field_name']);
     $this->assertEqual($formatter->getPluginId(), $default_formatter);
     $this->assertEqual($formatter->getSettings(), $default_settings);
 
@@ -175,26 +175,26 @@ public function testFieldComponent() {
     // arbitrary property and reading it back.
     $random_value = $this->randomString();
     $formatter->randomValue = $random_value;
-    $formatter = $display->getFormatter($field['field_name']);
+    $formatter = $display->getRenderer('field', $field['field_name']);
     $this->assertEqual($formatter->randomValue, $random_value );
 
     // Check that changing the definition creates a new formatter.
-    $display->setComponent($field['field_name'], array(
-      'type' => 'field_test_multiple',
+    $display->setComponent('field', $field['field_name'], array(
+      'formatter' => 'field_test_multiple',
     ));
-    $formatter = $display->getFormatter($field['field_name']);
+    $formatter = $display->getRenderer('field', $field['field_name']);
     $this->assertEqual($formatter->getPluginId(), 'field_test_multiple');
     $this->assertFalse(isset($formatter->randomValue));
 
     // Check that specifying an unknown formatter (e.g. case of a disabled
     // module) gets stored as is in the display, but results in the default
     // formatter being used.
-    $display->setComponent($field['field_name'], array(
-      'type' => 'unknown_formatter',
+    $display->setComponent('field', $field['field_name'], array(
+      'formatter' => 'unknown_formatter',
     ));
-    $options = $display->getComponent($field['field_name']);
-    $this->assertEqual($options['type'], 'unknown_formatter');
-    $formatter = $display->getFormatter($field['field_name']);
+    $options = $display->getComponent('field', $field['field_name']);
+    $this->assertEqual($options['formatter'], 'unknown_formatter');
+    $formatter = $display->getRenderer('field', $field['field_name']);
     $this->assertEqual($formatter->getPluginId(), $default_formatter);
   }
 
diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc
index 1a006ec..eb65309 100644
--- a/core/modules/field/field.attach.inc
+++ b/core/modules/field/field.attach.inc
@@ -1382,7 +1382,7 @@ function field_attach_prepare_view($entity_type, array $entities, array $display
   // the entity display.
   $target_function = function ($instance) use ($displays) {
     if (isset($displays[$instance['bundle']])) {
-      return $displays[$instance['bundle']]->getFormatter($instance['field_name']);
+      return $displays[$instance['bundle']]->getRenderer('field', $instance['field_name']);
     }
   };
   field_invoke_method_multiple('prepareView', $target_function, $prepare, $null, $null, $options);
@@ -1445,7 +1445,7 @@ function field_attach_view($entity_type, EntityInterface $entity, EntityDisplay
   // For each instance, call the view() method on the formatter object handed
   // by the entity display.
   $target_function = function ($instance) use ($display) {
-    return $display->getFormatter($instance['field_name']);
+    return $display->getRenderer('field', $instance['field_name']);
   };
   $null = NULL;
   $output = field_invoke_method('view', $target_function, $entity, $null, $null, $options);
diff --git a/core/modules/field/field.install b/core/modules/field/field.install
index 695fd89..b8271a3 100644
--- a/core/modules/field/field.install
+++ b/core/modules/field/field.install
@@ -424,9 +424,13 @@ function field_update_8002() {
 
       // The display object does not store hidden fields.
       if ($display_options['type'] != 'hidden') {
-        // We do not need the 'module' key anymore.
-        unset($display_options['module']);
-        $displays[$display_id]->set("content.$record->field_name", $display_options);
+        $displays[$display_id]->set("content.$record->field_name", array(
+          'handler_type' => 'field',
+          'weight' => $display_options['weight'],
+          'label' => $display_options['label'],
+          'formatter' => $display_options['type'],
+          'settings' => $display_options['settings'],
+        ));
       }
     }
 
@@ -459,7 +463,10 @@ function field_update_8002() {
             }
 
             // Set options in the display.
-            $new_options = array('visible' => $display_options['visible']);
+            $new_options = array(
+              'handler_type' => 'extra_field',
+              'visible' => $display_options['visible']
+            );
             // The display object only stores the weight for 'visible' extra
             // fields.
             if ($display_options['visible']) {
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 01b0122..6c82d98 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -744,7 +744,7 @@ function field_extra_fields_get_display($entity, $view_mode) {
 
   $options = array();
   foreach ($extra_fields as $name => $value) {
-    $options[$name] = $entity_display->getComponent($name);
+    $options[$name] = $entity_display->getComponent('extra_field', $name);
   }
 
   return $options;
@@ -890,7 +890,7 @@ function field_view_value($entity_type, $entity, $field_name, $item, $display =
  *     - label: (string) Position of the label. The default 'field' theme
  *       implementation supports the values 'inline', 'above' and 'hidden'.
  *       Defaults to 'above'.
- *     - type: (string) The formatter to use. Defaults to the
+ *     - formatter: (string) The formatter to use. Defaults to the
  *       'default_formatter' for the field type, specified in hook_field_info().
  *       The default formatter will also be used if the requested formatter is
  *       not available.
@@ -922,7 +922,7 @@ function field_view_field($entity_type, $entity, $field_name, $display_options =
   // Get the formatter object.
   if (is_string($display_options)) {
     $view_mode = $display_options;
-    $formatter = entity_get_render_display($entity, $view_mode)->getFormatter($field_name);
+    $formatter = entity_get_render_display($entity, $view_mode)->getRenderer('field', $field_name);
   }
   else {
     $view_mode = '_custom';
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
index 939df9c..a6d349d 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
@@ -56,7 +56,7 @@ public function __construct() {
    *     - label: (string) Position of the label. The default 'field' theme
    *       implementation supports the values 'inline', 'above' and 'hidden'.
    *       Defaults to 'above'.
-   *     - type: (string) The formatter to use. Defaults to the
+   *     - formatter: (string) The formatter to use. Defaults to the
    *       'default_formatter' for the field type, specified in
    *       hook_field_info(). The default formatter will also be used if the
    *       requested formatter is not available.
@@ -78,12 +78,12 @@ public function getInstance(array $options) {
       $configuration = $this->prepareConfiguration($field['type'], $configuration);
     }
 
-    $plugin_id = $configuration['type'];
+    $plugin_id = $configuration['formatter'];
 
     // Switch back to default formatter if either:
     // - $type_info doesn't exist (the widget type is unknown),
     // - the field type is not allowed for the widget.
-    $definition = $this->getDefinition($configuration['type']);
+    $definition = $this->getDefinition($plugin_id);
     if (!isset($definition['class']) || !in_array($field['type'], $definition['field_types'])) {
       // Grab the default widget for the field type.
       $field_type_definition = field_info_field_types($field['type']);
@@ -116,12 +116,12 @@ public function prepareConfiguration($field_type, array $configuration) {
       'weight' => 0,
     );
     // If no formatter is specified, use the default formatter.
-    if (!isset($configuration['type'])) {
+    if (!isset($configuration['formatter'])) {
       $field_type = field_info_field_types($field_type);
-      $configuration['type'] = $field_type['default_formatter'];
+      $configuration['formatter'] = $field_type['default_formatter'];
     }
     // Fill in default settings values for the formatter.
-    $configuration['settings'] += field_info_formatter_settings($configuration['type']);
+    $configuration['settings'] += field_info_formatter_settings($configuration['formatter']);
 
     return $configuration;
   }
diff --git a/core/modules/field/lib/Drupal/field/Plugin/entity/display_component_handler/FieldDisplayComponentHandler.php b/core/modules/field/lib/Drupal/field/Plugin/entity/display_component_handler/FieldDisplayComponentHandler.php
new file mode 100644
index 0000000..fee0f4d
--- /dev/null
+++ b/core/modules/field/lib/Drupal/field/Plugin/entity/display_component_handler/FieldDisplayComponentHandler.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\field\Plugin\entity\display_component_handler\FieldDisplayComponentHandler.
+ */
+
+namespace Drupal\field\Plugin\entity\display_component_handler;;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\entity\Plugin\Type\DisplayComponentHandlerBase;
+
+/**
+ * @todo
+ *
+ * @Plugin(
+ *   id = "field",
+ *   module = "field"
+ * )
+ */
+class FieldDisplayComponentHandler extends DisplayComponentHandlerBase {
+
+  public function massageIn($name, array $options = NULL) {
+    if (!is_null($options)) {
+      // @todo do we need to check the field exists on the bundle ?
+      // Do we need a more general check by the handler that the $name is a valid component ?
+      $field = field_info_field($name);
+      return drupal_container()->get('plugin.manager.field.formatter')->prepareConfiguration($field['type'], $options);
+    }
+  }
+
+  public function getRenderer($name, array $options = NULL) {
+    if ($options) {
+      return drupal_container()->get('plugin.manager.field.formatter')->getInstance(array(
+        'instance' => field_info_instance($this->context['entity_type'], $name, $this->context['bundle']),
+        'view_mode' => $this->context['view_mode'],
+        'configuration' => $options,
+        // No need to prepare, defaults have been merged when the options were written in the display.
+        'prepare' => FALSE,
+      ));
+    }
+  }
+
+}
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 eadd0b0..7751e18 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
@@ -276,7 +276,7 @@ protected function defineOptions() {
     $options['click_sort_column'] = array(
       'default' => $default_column,
     );
-    $options['type'] = array(
+    $options['formatter'] = array(
       'default' => $field_type['default_formatter'],
     );
     $options['settings'] = array(
@@ -356,11 +356,11 @@ public function buildOptionsForm(&$form, &$form_state) {
       );
     }
 
-    $form['type'] = array(
+    $form['formatter'] = array(
       '#type' => 'select',
       '#title' => t('Formatter'),
       '#options' => $formatters,
-      '#default_value' => $this->options['type'],
+      '#default_value' => $this->options['formatter'],
       '#ajax' => array(
         'path' => views_ui_build_form_url($form_state),
       ),
@@ -382,7 +382,7 @@ public function buildOptionsForm(&$form, &$form_state) {
     }
 
     // Get the currently selected formatter.
-    $format = $this->options['type'];
+    $format = $this->options['formatter'];
 
     $formatter = field_info_formatter_types($format);
     $settings = $this->options['settings'] + field_info_formatter_settings($format);
@@ -434,7 +434,7 @@ function fakeFieldInstance($formatter, $formatter_settings) {
       // Build a dummy display mode.
       'display' => array(
         '_custom' => array(
-          'type' => $formatter,
+          'formatter' => $formatter,
           'settings' => $formatter_settings,
         ),
       ),
@@ -652,7 +652,7 @@ function get_items($values) {
     }
 
     $display = array(
-      'type' => $this->options['type'],
+      'formatter' => $this->options['formatter'],
       'settings' => $this->options['settings'],
       'label' => 'hidden',
       // Pass the View object in the display so that fields can act on it.
diff --git a/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php b/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
index 32f91fd..adaa3cc 100644
--- a/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
@@ -46,13 +46,13 @@ function setUp() {
 
     $this->display_options = array(
       'default' => array(
-        'type' => 'field_test_default',
+        'formatter' => 'field_test_default',
         'settings' => array(
           'test_formatter_setting' => $this->randomName(),
         ),
       ),
       'teaser' => array(
-        'type' => 'field_test_default',
+        'formatter' => 'field_test_default',
         'settings' => array(
           'test_formatter_setting' => $this->randomName(),
         ),
@@ -63,11 +63,11 @@ function setUp() {
     field_create_instance($this->instance);
     // Create a display for the default view mode.
     entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->field_name, $this->display_options['default'])
+      ->setComponent('field', $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')
-      ->setComponent($this->field_name, $this->display_options['teaser'])
+      ->setComponent('field', $this->field_name, $this->display_options['teaser'])
       ->save();
 
     // Create an entity with values.
@@ -95,7 +95,7 @@ function testFieldViewField() {
     // Check that explicit display settings are used.
     $display = array(
       'label' => 'hidden',
-      'type' => 'field_test_multiple',
+      'formatter' => 'field_test_multiple',
       'settings' => array(
         'test_formatter_setting_multiple' => $this->randomName(),
         'alter' => TRUE,
@@ -115,7 +115,7 @@ function testFieldViewField() {
     // Check the prepare_view steps are invoked.
     $display = array(
       'label' => 'hidden',
-      'type' => 'field_test_with_prepare_view',
+      'formatter' => 'field_test_with_prepare_view',
       'settings' => array(
         'test_formatter_setting_additional' => $this->randomName(),
       ),
@@ -167,13 +167,12 @@ function testFieldViewValue() {
 
     // Check that explicit display settings are used.
     $display = array(
-      'type' => 'field_test_multiple',
+      'formatter' => 'field_test_multiple',
       'settings' => array(
         'test_formatter_setting_multiple' => $this->randomName(),
       ),
     );
     $setting = $display['settings']['test_formatter_setting_multiple'];
-    $array = array();
     foreach ($this->values as $delta => $value) {
       $item = $this->entity->{$this->field_name}[LANGUAGE_NOT_SPECIFIED][$delta];
       $output = field_view_value('test_entity', $this->entity, $this->field_name, $item, $display);
@@ -183,13 +182,12 @@ function testFieldViewValue() {
 
     // Check that prepare_view steps are invoked.
     $display = array(
-      'type' => 'field_test_with_prepare_view',
+      'formatter' => 'field_test_with_prepare_view',
       'settings' => array(
         'test_formatter_setting_additional' => $this->randomName(),
       ),
     );
     $setting = $display['settings']['test_formatter_setting_additional'];
-    $array = array();
     foreach ($this->values as $delta => $value) {
       $item = $this->entity->{$this->field_name}[LANGUAGE_NOT_SPECIFIED][$delta];
       $output = field_view_value('test_entity', $this->entity, $this->field_name, $item, $display);
@@ -217,4 +215,5 @@ function testFieldViewValue() {
       $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
     }
   }
+
 }
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php
index bc1a380..a967204 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php
@@ -55,7 +55,7 @@ function setUp() {
     // Assign display properties for the 'default' and 'teaser' view modes.
     foreach (array('default', 'teaser') as $view_mode) {
       entity_get_display('node', $this->content_type, $view_mode)
-        ->setComponent($this->field['field_name'])
+        ->setComponent('field', $this->field['field_name'])
         ->save();
     }
 
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
index 5f8ad5d..fb7ec67 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
@@ -46,22 +46,22 @@ function testFieldAttachView() {
     $formatter_setting = $this->randomName();
     $display_options = array(
       'label' => 'above',
-      'type' => 'field_test_default',
+      'formatter' => 'field_test_default',
       'settings' => array(
         'test_formatter_setting' => $formatter_setting,
       ),
     );
-    $display->setComponent($this->field['field_name'], $display_options);
+    $display->setComponent('field', $this->field['field_name'], $display_options);
 
     $formatter_setting_2 = $this->randomName();
     $display_options_2 = array(
       'label' => 'above',
-      'type' => 'field_test_default',
+      'formatter' => 'field_test_default',
       'settings' => array(
         'test_formatter_setting' => $formatter_setting_2,
       ),
     );
-    $display->setComponent($this->field_2['field_name'], $display_options_2);
+    $display->setComponent('field', $this->field_2['field_name'], $display_options_2);
 
     // View all fields.
     field_attach_prepare_view($entity_type, array($entity->ftid => $entity), $displays);
@@ -97,7 +97,7 @@ function testFieldAttachView() {
     // Label hidden.
     $entity = clone($entity_init);
     $display_options['label'] = 'hidden';
-    $display->setComponent($this->field['field_name'], $display_options);
+    $display->setComponent('field', $this->field['field_name'], $display_options);
     field_attach_prepare_view($entity_type, array($entity->ftid => $entity), $displays);
     $entity->content = field_attach_view($entity_type, $entity, $display);
     $output = drupal_render($entity->content);
@@ -106,7 +106,7 @@ function testFieldAttachView() {
 
     // Field hidden.
     $entity = clone($entity_init);
-    $display->removeComponent($this->field['field_name']);
+    $display->removeComponent('field', $this->field['field_name']);
     field_attach_prepare_view($entity_type, array($entity->ftid => $entity), $displays);
     $entity->content = field_attach_view($entity_type, $entity, $display);
     $output = drupal_render($entity->content);
@@ -119,9 +119,9 @@ function testFieldAttachView() {
     // Multiple formatter.
     $entity = clone($entity_init);
     $formatter_setting = $this->randomName();
-    $display->setComponent($this->field['field_name'], array(
+    $display->setComponent('field', $this->field['field_name'], array(
       'label' => 'above',
-      'type' => 'field_test_multiple',
+      'formatter' => 'field_test_multiple',
       'settings' => array(
         'test_formatter_setting_multiple' => $formatter_setting,
       ),
@@ -139,9 +139,9 @@ function testFieldAttachView() {
     // Test a formatter that uses hook_field_formatter_prepare_view().
     $entity = clone($entity_init);
     $formatter_setting = $this->randomName();
-    $display->setComponent($this->field['field_name'], array(
+    $display->setComponent('field', $this->field['field_name'], array(
       'label' => 'above',
-      'type' => 'field_test_with_prepare_view',
+      'formatter' => 'field_test_with_prepare_view',
       'settings' => array(
         'test_formatter_setting_additional' => $formatter_setting,
       ),
@@ -180,7 +180,7 @@ function testFieldAttachPrepareViewMultiple() {
 
     // Set the instance to be hidden.
     $display = entity_get_display('test_entity', 'test_bundle', 'full')
-      ->removeComponent($this->field['field_name']);
+      ->removeComponent('field', $this->field['field_name']);
 
     // Set up a second instance on another bundle, with a formatter that uses
     // hook_field_formatter_prepare_view().
@@ -191,8 +191,8 @@ function testFieldAttachPrepareViewMultiple() {
     field_create_instance($this->instance2);
 
     $display_2 = entity_get_display('test_entity', 'test_bundle_2', 'full')
-      ->setComponent($this->field['field_name'], array(
-        'type' => 'field_test_with_prepare_view',
+      ->setComponent('field', $this->field['field_name'], array(
+        'formatter' => 'field_test_with_prepare_view',
         'settings' => array(
           'test_formatter_setting_additional' => $formatter_setting,
         ),
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 3f5aea2..e1fbbb5 100644
--- a/core/modules/field/lib/Drupal/field/Tests/Views/HandlerFieldFieldTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/Views/HandlerFieldFieldTest.php
@@ -114,7 +114,7 @@ public function _testSimpleFieldRender() {
   public function _testFormatterSimpleFieldRender() {
     $view = views_get_view('test_view_fieldapi');
     $this->prepareView($view);
-    $view->displayHandlers['default']->options['fields'][$this->fields[0]['field_name']]['type'] = 'text_trimmed';
+    $view->displayHandlers['default']->options['fields'][$this->fields[0]['field_name']]['formatter'] = 'text_trimmed';
     $view->displayHandlers['default']->options['fields'][$this->fields[0]['field_name']]['settings'] = array(
       'trim_length' => 3,
     );
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index d3cabf3..ad2afe3 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -127,8 +127,9 @@ function field_ui_field_overview_row_region($row) {
 function field_ui_display_overview_row_region($row) {
   switch ($row['#row_type']) {
     case 'field':
+      return ($row['format']['formatter']['#value'] == 'hidden' ? 'hidden' : 'content');
     case 'extra_field':
-      return ($row['format']['type']['#value'] == 'hidden' ? 'hidden' : 'content');
+      return ($row['format']['visibility']['#value'] == 'hidden' ? 'hidden' : 'content');
   }
 }
 
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 0a86f78..fc9e505 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -102,7 +102,7 @@ public function form(array $form, array &$form_state) {
     // Field rows.
     foreach ($instances as $name => $instance) {
       $field = field_info_field($name);
-      $display_options = $entity_display->getComponent($name);
+      $display_options = $entity_display->getComponent('field', $name);
 
       $table[$name] = array(
         '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
@@ -151,13 +151,13 @@ public function form(array $form, array &$form_state) {
       $formatter_options = field_ui_formatter_options($field['type']);
       $formatter_options['hidden'] = t('<Hidden>');
       $table[$name]['format'] = array(
-        'type' => array(
+        'formatter' => array(
           '#type' => 'select',
           '#title' => t('Formatter for @title', array('@title' => $instance['label'])),
           '#title_display' => 'invisible',
           '#options' => $formatter_options,
-          '#default_value' => $display_options ? $display_options['type'] : 'hidden',
-          '#parents' => array('fields', $name, 'type'),
+          '#default_value' => $display_options ? $display_options['formatter'] : 'hidden',
+          '#parents' => array('fields', $name, 'formatter'),
           '#attributes' => array('class' => array('field-formatter-type')),
         ),
         'settings_edit_form' => array(),
@@ -165,15 +165,15 @@ public function form(array $form, array &$form_state) {
 
       // Check the currently selected formatter, and merge persisted values for
       // formatter settings.
-      if (isset($form_state['values']['fields'][$name]['type'])) {
-        $display_options['type'] = $form_state['values']['fields'][$name]['type'];
+      if (isset($form_state['values']['fields'][$name]['formatter'])) {
+        $display_options['formatter'] = $form_state['values']['fields'][$name]['formatter'];
       }
       if (isset($form_state['formatter_settings'][$name])) {
         $display_options['settings'] = $form_state['formatter_settings'][$name];
       }
 
       // Get the corresponding formatter object.
-      if ($display_options && $display_options['type'] != 'hidden') {
+      if ($display_options && $display_options['formatter'] != 'hidden') {
         $formatter = drupal_container()->get('plugin.manager.field.formatter')->getInstance(array(
           'instance' => $instance,
           'view_mode' => $this->view_mode,
@@ -239,7 +239,7 @@ public function form(array $form, array &$form_state) {
                   '#op' => 'cancel',
                   // Do not check errors for the 'Cancel' button, but make sure we
                   // get the value of the 'formatter type' select.
-                  '#limit_validation_errors' => array(array('fields', $name, 'type')),
+                  '#limit_validation_errors' => array(array('fields', $name, 'formatter')),
                 ),
               ),
             );
@@ -278,7 +278,7 @@ public function form(array $form, array &$form_state) {
               '#op' => 'edit',
               // Do not check errors for the 'Edit' button, but make sure we get
               // the value of the 'formatter type' select.
-              '#limit_validation_errors' => array(array('fields', $name, 'type')),
+              '#limit_validation_errors' => array(array('fields', $name, 'formatter')),
               '#prefix' => '<div class="field-formatter-settings-edit-wrapper">',
               '#suffix' => '</div>',
             );
@@ -289,7 +289,7 @@ public function form(array $form, array &$form_state) {
 
     // Non-field elements.
     foreach ($extra_fields as $name => $extra_field) {
-      $display_options = $entity_display->getComponent($name);
+      $display_options = $entity_display->getComponent('extra_field', $name);
 
       $table[$name] = array(
         '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
@@ -327,13 +327,13 @@ public function form(array $form, array &$form_state) {
           '#markup' => '&nbsp;',
         ),
         'format' => array(
-          'type' => array(
+          'visibility' => array(
             '#type' => 'select',
             '#title' => t('Visibility for @title', array('@title' => $extra_field['label'])),
             '#title_display' => 'invisible',
             '#options' => $extra_visibility_options,
             '#default_value' => $display_options ? 'visible' : 'hidden',
-            '#parents' => array('fields', $name, 'type'),
+            '#parents' => array('fields', $name, 'visibility'),
             '#attributes' => array('class' => array('field-formatter-type')),
           ),
         ),
@@ -429,8 +429,8 @@ public function submit(array $form, array &$form_state) {
       // values.
       $values = $form_values['fields'][$field_name];
 
-      if ($values['type'] == 'hidden') {
-        $display->removeComponent($field_name);
+      if ($values['formatter'] == 'hidden') {
+        $display->removeComponent('field', $field_name);
       }
       else {
         // Get formatter settings. They lie either directly in submitted form
@@ -443,17 +443,17 @@ public function submit(array $form, array &$form_state) {
         elseif (isset($form_state['formatter_settings'][$field_name])) {
           $settings = $form_state['formatter_settings'][$field_name];
         }
-        elseif ($current_options = $display->getComponent($field_name)) {
+        elseif ($current_options = $display->getComponent('field', $field_name)) {
           $settings = $current_options['settings'];
         }
 
         // Only save settings actually used by the selected formatter.
-        $default_settings = field_info_formatter_settings($values['type']);
+        $default_settings = field_info_formatter_settings($values['formatter']);
         $settings = array_intersect_key($settings, $default_settings);
 
-        $display->setComponent($field_name, array(
+        $display->setComponent('field', $field_name, array(
           'label' => $values['label'],
-          'type' => $values['type'],
+          'formatter' => $values['formatter'],
           'weight' => $values['weight'],
           'settings' => $settings,
         ));
@@ -462,11 +462,11 @@ public function submit(array $form, array &$form_state) {
 
     // Collect data for 'extra' fields.
     foreach ($form['#extra'] as $name) {
-      if ($form_values['fields'][$name]['type'] == 'hidden') {
-        $display->removeComponent($name);
+      if ($form_values['fields'][$name]['visibility'] == 'hidden') {
+        $display->removeComponent('extra_field', $name);
       }
       else {
-        $display->setComponent($name, array(
+        $display->setComponent('extra_field', $name, array(
           'weight' => $form_values['fields'][$name]['weight'],
         ));
       }
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 a977df9..bfe7c17 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
@@ -590,7 +590,7 @@ public function submit(array $form, array &$form_state) {
         // 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')
-          ->setComponent($field['field_name'])
+          ->setComponent('field', $field['field_name'])
           ->save();
 
         // Always show the field settings step, as the cardinality needs to be
@@ -632,7 +632,7 @@ public function submit(array $form, array &$form_state) {
           // 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')
-            ->setComponent($field['field_name'])
+            ->setComponent('field', $field['field_name'])
             ->save();
 
           $destinations[] = $this->adminPath . '/fields/' . $instance['field_name'];
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
index 45de66e..6e312ec 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
@@ -45,8 +45,8 @@ function testFormatterUI() {
 
     // Clear the test-side cache and get the saved field instance.
     $display = entity_get_display('node', $this->type, 'default');
-    $display_options = $display->getComponent('field_test');
-    $format = $display_options['type'];
+    $display_options = $display->getComponent('field', 'field_test');
+    $format = $display_options['formatter'];
     $default_settings = field_info_formatter_settings($format);
     $setting_name = key($default_settings);
     $setting_value = $display_options['settings'][$setting_name];
@@ -54,24 +54,24 @@ function testFormatterUI() {
     // Display the "Manage display" screen and check that the expected formatter is
     // selected.
     $this->drupalGet($manage_display);
-    $this->assertFieldByName('fields[field_test][type]', $format, 'The expected formatter is selected.');
+    $this->assertFieldByName('fields[field_test][formatter]', $format, 'The expected formatter is selected.');
     $this->assertText("$setting_name: $setting_value", 'The expected summary is displayed.');
 
     // Change the formatter and check that the summary is updated.
-    $edit = array('fields[field_test][type]' => 'field_test_multiple', 'refresh_rows' => 'field_test');
+    $edit = array('fields[field_test][formatter]' => 'field_test_multiple', 'refresh_rows' => 'field_test');
     $this->drupalPostAJAX(NULL, $edit, array('op' => t('Refresh')));
     $format = 'field_test_multiple';
     $default_settings = field_info_formatter_settings($format);
     $setting_name = key($default_settings);
     $setting_value = $default_settings[$setting_name];
-    $this->assertFieldByName('fields[field_test][type]', $format, 'The expected formatter is selected.');
+    $this->assertFieldByName('fields[field_test][formatter]', $format, 'The expected formatter is selected.');
     $this->assertText("$setting_name: $setting_value", 'The expected summary is displayed.');
 
     // Submit the form and check that the display is updated.
     $this->drupalPost(NULL, array(), t('Save'));
     $display = entity_get_display('node', $this->type, 'default');
-    $display_options = $display->getComponent('field_test');
-    $current_format = $display_options['type'];
+    $display_options = $display->getComponent('field', 'field_test');
+    $current_format = $display_options['formatter'];
     $current_setting_value = $display_options['settings'][$setting_name];
     $this->assertEqual($current_format, $format, 'The formatter was updated.');
     $this->assertEqual($current_setting_value, $setting_value, 'The setting was updated.');
@@ -130,7 +130,7 @@ function testViewModeCustom() {
     // Change fomatter for 'default' mode, check that the field is displayed
     // accordingly in 'rss' mode.
     $edit = array(
-      'fields[field_test][type]' => 'field_test_with_prepare_view',
+      'fields[field_test][formatter]' => 'field_test_with_prepare_view',
     );
     $this->drupalPost('admin/structure/types/manage/' . $this->type . '/display', $edit, t('Save'));
     $this->assertNodeViewText($node, 'rss', $output['field_test_with_prepare_view'], "The field is displayed as expected in view modes that use 'default' settings.");
@@ -145,7 +145,7 @@ function testViewModeCustom() {
     // Set the field to 'hidden' in the view mode, check that the field is
     // hidden.
     $edit = array(
-      'fields[field_test][type]' => 'hidden',
+      'fields[field_test][formatter]' => 'hidden',
     );
     $this->drupalPost('admin/structure/types/manage/' . $this->type . '/display/rss', $edit, t('Save'));
     $this->assertNodeViewNoText($node, 'rss', $value, "The field is hidden in 'rss' mode.");
@@ -185,7 +185,7 @@ function testNonInitializedFields() {
     // Check that the field appears as 'hidden' on the 'Manage display' page
     // for the 'teaser' mode.
     $this->drupalGet('admin/structure/types/manage/' . $this->type . '/display/teaser');
-    $this->assertFieldByName('fields[field_test][type]', 'hidden', 'The field is displayed as \'hidden \'.');
+    $this->assertFieldByName('fields[field_test][formatter]', 'hidden', 'The field is displayed as \'hidden \'.');
   }
 
   /**
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php
index 9d7dd30..cc4b836 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php
@@ -43,7 +43,7 @@ function testNodeDisplay() {
     $file_formatters = array('file_default', 'file_table', 'file_url_plain', 'hidden');
     foreach ($file_formatters as $formatter) {
       $edit = array(
-        "fields[$field_name][type]" => $formatter,
+        "fields[$field_name][formatter]" => $formatter,
       );
       $this->drupalPost("admin/structure/types/manage/$type_name/display", $edit, t('Save'));
       $this->drupalGet('node/' . $node->nid);
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldRSSContentTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldRSSContentTest.php
index f69d9f7..7af9e4a 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldRSSContentTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldRSSContentTest.php
@@ -46,7 +46,7 @@ function testFileFieldRSSContent() {
 
     // Change the format to 'RSS enclosure'.
     $this->drupalGet("admin/structure/types/manage/$type_name/display/rss");
-    $edit = array("fields[$field_name][type]" => 'file_rss_enclosure');
+    $edit = array("fields[$field_name][formatter]" => 'file_rss_enclosure');
     $this->drupalPost(NULL, $edit, t('Save'));
 
     // Create a new node with a file field set. Promote to frontpage
diff --git a/core/modules/forum/forum.install b/core/modules/forum/forum.install
index b1e63de..1c1749e 100644
--- a/core/modules/forum/forum.install
+++ b/core/modules/forum/forum.install
@@ -95,14 +95,14 @@ function forum_enable() {
 
     // Assign display settings for the 'default' and 'teaser' view modes.
     entity_get_display('node', 'forum', 'default')
-      ->setComponent('taxonomy_forums', array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', 'taxonomy_forums', array(
+        'formatter' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
     entity_get_display('node', 'forum', 'teaser')
-      ->setComponent('taxonomy_forums', array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', 'taxonomy_forums', array(
+        'formatter' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index 556467b..a3f92d4 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -338,14 +338,14 @@ function image_image_style_save($style) {
         $view_modes = array('default') + array_keys($entity_info['view_modes']);
         foreach ($view_modes as $view_mode) {
           $display = entity_get_display($instance['entity_type'], $instance['bundle'], $view_mode);
-          $display_options = $display->getComponent($instance['field_name']);
+          $display_options = $display->getComponent('field', $instance['field_name']);
 
           // Check if the formatter involves an image style.
-          if ($display_options && $display_options['type'] == 'image' && $display_options['settings']['image_style'] == $style->getOriginalID()) {
+          if ($display_options && $display_options['formatter'] == 'image' && $display_options['settings']['image_style'] == $style->getOriginalID()) {
             // Update display information for any instance using the image
             // style that was just deleted.
             $display_options['settings']['image_style'] = $style->id();
-            $display->setComponent($instance['field_name'], $display_options)
+            $display->setComponent('field', $instance['field_name'], $display_options)
               ->save();
           }
         }
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php
index 0d09461..503aa7e 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php
@@ -254,8 +254,8 @@ function testStyleReplacement() {
     $field_name = strtolower($this->randomName(10));
     $this->createImageField($field_name, 'article');
     entity_get_display('node', 'article', 'default')
-      ->setComponent($field_name, array(
-        'type' => 'image',
+      ->setComponent('field', $field_name, array(
+        'formatter' => 'image',
         'settings' => array('image_style' => $style_name),
       ))
       ->save();
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
index 01fa5f4..2a225f8 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
@@ -70,7 +70,7 @@ function testDefaultImages() {
     field_create_instance($instance2);
     $instance2 = field_info_instance('node', $field_name, 'page');
     entity_get_display('node', 'page', 'default')
-      ->setComponent($field['field_name'])
+      ->setComponent('field', $field['field_name'])
       ->save();
 
     // Confirm the defaults are present on the article field settings form.
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
index 1cfda9f..4feb532 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
@@ -67,11 +67,11 @@ function _testImageFieldFormatters($scheme) {
 
     // Test the image linked to file formatter.
     $display_options = array(
-      'type' => 'image',
+      'formatter' => 'image',
       'settings' => array('image_link' => 'file'),
     );
     $display = entity_get_display('node', $node->type, 'default');
-    $display->setComponent($field_name, $display_options)
+    $display->setComponent('field', $field_name, $display_options)
       ->save();
 
     $default_output = l(theme('image', $image_info), file_create_url($image_uri), array('html' => TRUE));
@@ -96,7 +96,7 @@ function _testImageFieldFormatters($scheme) {
 
     // Test the image linked to content formatter.
     $display_options['settings']['image_link'] = 'content';
-    $display->setComponent($field_name, $display_options)
+    $display->setComponent('field', $field_name, $display_options)
       ->save();
     $default_output = l(theme('image', $image_info), 'node/' . $nid, array('html' => TRUE, 'attributes' => array('class' => 'active')));
     $this->drupalGet('node/' . $nid);
@@ -105,7 +105,7 @@ function _testImageFieldFormatters($scheme) {
     // Test the image style 'thumbnail' formatter.
     $display_options['settings']['image_link'] = '';
     $display_options['settings']['image_style'] = 'thumbnail';
-    $display->setComponent($field_name, $display_options)
+    $display->setComponent('field', $field_name, $display_options)
       ->save();
 
     // Ensure the derivative image is generated so we do not have to deal with
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
index 439db01..8252513 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
@@ -97,7 +97,7 @@ function createImageField($name, $type_name, $field_settings = array(), $instanc
     $field_instance = field_create_instance($instance);
 
     entity_get_display('node', $type_name, 'default')
-      ->setComponent($field['field_name'])
+      ->setComponent('field', $field['field_name'])
       ->save();
 
     return $field_instance;
diff --git a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
index a04a43f..253e5ba 100644
--- a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
+++ b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
@@ -65,8 +65,8 @@ function testURLValidation() {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field['field_name'], array(
-        'type' => 'link',
+      ->setComponent('field', $this->field['field_name'], array(
+        'formatter' => 'link',
       ))
       ->save();
 
@@ -134,8 +134,8 @@ function testLinkTitle() {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field['field_name'], array(
-        'type' => 'link',
+      ->setComponent('field', $this->field['field_name'], array(
+        'formatter' => 'link',
         'label' => 'hidden',
       ))
       ->save();
@@ -238,13 +238,13 @@ function testLinkFormatter() {
         'type' => 'link_default',
       ),
     );
+    field_create_instance($this->instance);
     $display_options = array(
-      'type' => 'link',
+      'formatter' => 'link',
       'label' => 'hidden',
     );
-    field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field['field_name'], $display_options)
+      ->setComponent('field', $this->field['field_name'], $display_options)
       ->save();
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
@@ -298,7 +298,7 @@ function testLinkFormatter() {
           $display_options['settings'] = $new_value;
         }
         entity_get_display('test_entity', 'test_bundle', 'full')
-          ->setComponent($this->field['field_name'], $display_options)
+          ->setComponent('field', $this->field['field_name'], $display_options)
           ->save();
 
         $this->renderTestEntity($id);
@@ -374,13 +374,13 @@ function testLinkSeparateFormatter() {
         'type' => 'link_default',
       ),
     );
+    field_create_instance($this->instance);
     $display_options = array(
-      'type' => 'link_separate',
+      'formatter' => 'link_separate',
       'label' => 'hidden',
     );
-    field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field['field_name'], $display_options)
+      ->setComponent('field', $this->field['field_name'], $display_options)
       ->save();
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
@@ -416,7 +416,7 @@ function testLinkSeparateFormatter() {
         // Update the field formatter settings.
         $display_options['settings'] = array($setting => $new_value);
         entity_get_display('test_entity', 'test_bundle', 'full')
-          ->setComponent($this->field['field_name'], $display_options)
+          ->setComponent('field', $this->field['field_name'], $display_options)
           ->save();
 
         $this->renderTestEntity($id);
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php
index 1794e89..d12fd4e 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php
@@ -46,7 +46,7 @@ public function setUp() {
     );
     $this->instance = field_create_instance($instance);
     entity_get_display('node', 'page', 'default')
-      ->setComponent($this->field_name)
+      ->setComponent('field', $this->field_name)
       ->save();
   }
 
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
index b689141..8522bdb 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
@@ -83,7 +83,7 @@ function testNodeTypeInitialLanguageDefaults() {
     $language_display = $this->xpath('//*[@id="language"]');
     $this->assert(!empty($language_display), 'Language field is visible on manage display tab.');
     // Tests if the language field is hidden by default.
-    $this->assertOptionSelected('edit-fields-language-type', 'hidden', 'Language is hidden by default on manage display tab.');
+    $this->assertOptionSelected('edit-fields-language-visibility', 'hidden', 'Language is hidden by default on manage display tab.');
 
     // Changes the inital language settings.
     $edit = array(
@@ -118,11 +118,11 @@ function testLanguageFieldVisibility() {
 
     // Changes Language field visibility to true and check if it is saved.
     $edit = array(
-      'fields[language][type]' => 'visible',
+      'fields[language][visibility]' => 'visible',
     );
     $this->drupalPost('admin/structure/types/manage/article/display', $edit, t('Save'));
     $this->drupalGet('admin/structure/types/manage/article/display');
-    $this->assertOptionSelected('edit-fields-language-type', 'visible', 'Language field has been set to visible.');
+    $this->assertOptionSelected('edit-fields-language-visibility', 'visible', 'Language field has been set to visible.');
 
     // Loads node page and check if Language field is shown.
     $this->drupalGet('node/' . $node->nid);
diff --git a/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php b/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php
index 6b966e8..da699f8 100644
--- a/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php
@@ -47,9 +47,9 @@ function testSummaryLength() {
 
     // Change the teaser length for "Basic page" content type.
     $display = entity_get_display('node', $node->type, 'teaser');
-    $display_options = $display->getComponent('body');
+    $display_options = $display->getComponent('field', 'body');
     $display_options['settings']['trim_length'] = 200;
-    $display->setComponent('body', $display_options)
+    $display->setComponent('field', 'body', $display_options)
       ->save();
 
     // Render the node as a teaser again and check that the summary is now only
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index d56bee5..d6c1d45 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -218,11 +218,9 @@ function node_entity_info(&$info) {
 function node_entity_display_alter(EntityDisplay $display, $context) {
   // Hide field labels in search index.
   if ($context['entity_type'] == 'node' && $context['view_mode'] == 'search_index') {
-    foreach ($display->getComponents() as $name => $options) {
-      if (isset($options['label'])) {
-        $options['label'] = 'hidden';
-        $display->setComponent($name, $options);
-      }
+    foreach ($display->getComponents('field') as $name => $options) {
+      $options['label'] = 'hidden';
+      $display->setComponent('field', $name, $options);
     }
   }
 }
@@ -570,15 +568,15 @@ function node_add_body_field($type, $label = 'Body') {
 
     // Assign display settings for the 'default' and 'teaser' view modes.
     entity_get_display('node', $type->type, 'default')
-      ->setComponent($field['field_name'], array(
+      ->setComponent('field', $field['field_name'], array(
         'label' => 'hidden',
-        'type' => 'text_default',
+        'formatter' => 'text_default',
       ))
       ->save();
     entity_get_display('node', $type->type, 'teaser')
-      ->setComponent($field['field_name'], array(
+      ->setComponent('field', $field['field_name'], array(
         'label' => 'hidden',
-        'type' => 'text_summary_or_trimmed',
+        'formatter' => 'text_summary_or_trimmed',
       ))
       ->save();
   }
diff --git a/core/modules/node/node.tokens.inc b/core/modules/node/node.tokens.inc
index 8827b98..dd57c48 100644
--- a/core/modules/node/node.tokens.inc
+++ b/core/modules/node/node.tokens.inc
@@ -152,7 +152,7 @@ function node_tokens($type, $tokens, array $data = array(), array $options = arr
 
                 // Get the 'trim_length' size used for the 'teaser' mode, if
                 // present, or use the default trim_length size.
-                $display_options = entity_get_display('node', $node->type, 'teaser')->getComponent('body');
+                $display_options = entity_get_display('node', $node->type, 'teaser')->getComponent('field', 'body');
                 if (isset($display_options['settings']['trim_length'])) {
                   $length = $display_options['settings']['trim_length'];
                 }
diff --git a/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php b/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php
index 232acea..e912015 100644
--- a/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php
+++ b/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php
@@ -71,7 +71,7 @@ function testNumberDecimalField() {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'default')
-      ->setComponent($this->field['field_name'])
+      ->setComponent('field', $this->field['field_name'])
       ->save();
 
     // Display creation form.
@@ -156,11 +156,11 @@ function testNumberIntegerField() {
     // check that the settings summary does not generate warnings.
     $this->drupalGet("admin/structure/types/manage/$type/display");
     $edit = array(
-      "fields[field_$field_name][type]" => 'number_integer',
+      "fields[field_$field_name][formatter]" => 'number_integer',
     );
     $this->drupalPost(NULL, $edit, t('Save'));
     $edit = array(
-      "fields[field_$field_name][type]" => 'number_unformatted',
+      "fields[field_$field_name][formatter]" => 'number_unformatted',
     );
     $this->drupalPost(NULL, $edit, t('Save'));
   }
diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
index 9b0c3d5..3a42e10 100644
--- a/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
@@ -132,12 +132,11 @@ public function _testPictureFieldFormatters($scheme) {
 
     // Use the picture formatter linked to file formatter.
     $display_options = array(
-      'type' => 'picture',
-      'module' => 'picture',
+      'formatter' => 'picture',
       'settings' => array('image_link' => 'file'),
     );
     $display = entity_get_display('node', 'article', 'default');
-    $display->setComponent($field_name, $display_options)
+    $display->setComponent('field', $field_name, $display_options)
       ->save();
 
     $default_output = l(theme('image', $image_info), file_create_url($image_uri), array('html' => TRUE));
@@ -162,7 +161,7 @@ public function _testPictureFieldFormatters($scheme) {
 
     // Use the picture formatter with a picture mapping.
     $display_options['settings']['picture_mapping'] = 'mapping_one';
-    $display->setComponent($field_name, $display_options)
+    $display->setComponent('field', $field_name, $display_options)
       ->save();
 
     // Output should contain all image styles and all breakpoints.
@@ -177,7 +176,7 @@ public function _testPictureFieldFormatters($scheme) {
     // Test the fallback image style.
     $display_options['settings']['image_link'] = '';
     $display_options['settings']['fallback_image_style'] = 'large';
-    $display->setComponent($field_name, $display_options)
+    $display->setComponent('field', $field_name, $display_options)
       ->save();
 
     $this->drupalGet(image_style_url('large', $image_uri));
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
index 368d221..087111e 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
@@ -118,8 +118,8 @@ function testAttributesInMarkupFile() {
     );
     field_create_instance($instance);
     entity_get_display('node', $bundle_name, 'teaser')
-      ->setComponent($field_name, array(
-        'type' => 'file_default',
+      ->setComponent('field', $field_name, array(
+        'formatter' => 'file_default',
       ))
       ->save();
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php
index c0de21b..c479209 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php
@@ -52,14 +52,16 @@ public function testEntityDisplayUpgrade() {
     // Check that the 'body' field is configured as expected.
     $expected = array(
       'default' => array(
+        'handler_type' => 'field',
         'label' => 'hidden',
-        'type' => 'text_default',
+        'formatter' => 'text_default',
         'weight' => 0,
         'settings' => array(),
       ),
       'teaser' => array(
+        'handler_type' => 'field',
         'label' => 'hidden',
-        'type' => 'text_summary_or_trimmed',
+        'formatter' => 'text_summary_or_trimmed',
         'weight' => 0,
         'settings' => array(
           'trim_length' => 600,
@@ -76,10 +78,12 @@ public function testEntityDisplayUpgrade() {
     // Check that the 'language' extra field is configured as expected.
     $expected = array(
       'default' => array(
+        'handler_type' => 'extra_field',
         'weight' => -1,
         'visible' => 1,
       ),
       'teaser' => array(
+        'handler_type' => 'extra_field',
         'visible' => 0,
       ),
     );
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
index 04070c9..e083b4b 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
@@ -58,12 +58,12 @@ public function testUserPictureUpgrade() {
     $this->assertEqual($instance['description'], 'These are user picture guidelines.', 'User picture guidelines are now the user picture field description.');
     $this->assertEqual($instance['settings']['file_directory'], 'user_pictures_dir', 'User picture directory path has been migrated.');
 
-    $display_options = entity_get_display('user', 'user', 'default')->getComponent('user_picture');
+    $display_options = entity_get_display('user', 'user', 'default')->getComponent('field', 'user_picture');
     $this->assertEqual($display_options['settings']['image_style'], 'thumbnail', 'User picture image style setting has been migrated.');
 
     // Verify compact view mode default settings.
     $this->drupalGet('admin/config/people/accounts/display/compact');
-    $this->assertFieldByName('fields[member_for][type]', 'hidden');
+    $this->assertFieldByName('fields[member_for][visibility]', 'hidden');
 
     // Check the user picture and file usage record.
     $user = user_load(1);
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index f2b5b38..323528b 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -22,7 +22,7 @@ function entity_test_entity_info_alter(&$info) {
  * Implements hook_field_extra_fields().
  */
 function entity_test_field_extra_fields() {
-  $extra['entity_test']['entity_test'] = array(
+  $extra['entity_test']['bundle_with_extra_fields'] = array(
     'display' => array(
       // Note: those extra fields do not currently display anything, they are
       // just used in \Drupal\entity\Tests\EntityDisplayTest to test the
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
index 278db90..366829d 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
@@ -59,8 +59,8 @@ function setUp() {
     );
     field_create_instance($this->instance);
     entity_get_display('node', 'article', 'default')
-      ->setComponent('taxonomy_' . $this->vocabulary->id(), array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', 'taxonomy_' . $this->vocabulary->id(), array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
   }
@@ -84,7 +84,7 @@ function testTaxonomyRss() {
     // Change the format to 'RSS category'.
     $this->drupalGet("admin/structure/types/manage/article/display/rss");
     $edit = array(
-      "fields[taxonomy_" . $this->vocabulary->id() . "][type]" => 'taxonomy_term_reference_rss_category',
+      'fields[taxonomy_' . $this->vocabulary->id() . '][formatter]' => 'taxonomy_term_reference_rss_category',
     );
     $this->drupalPost(NULL, $edit, t('Save'));
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php
index 25bcc07..facecb5 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php
@@ -69,8 +69,8 @@ function setUp() {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field_name, array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $this->field_name, array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
   }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php
index c20acf7..bf37660 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php
@@ -64,8 +64,8 @@ function setUp() {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field_name, array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $this->field_name, array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
   }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
index f9cba0d..62fb97a 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
@@ -55,8 +55,8 @@ function setUp() {
     );
     field_create_instance($this->instance_1);
     entity_get_display('node', 'article', 'default')
-      ->setComponent($this->field_name_1, array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $this->field_name_1, array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
 
@@ -85,8 +85,8 @@ function setUp() {
     );
     field_create_instance($this->instance_2);
     entity_get_display('node', 'article', 'default')
-      ->setComponent($this->field_name_2, array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $this->field_name_2, array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
   }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
index 93cc8d4..f6a10c3 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
@@ -51,8 +51,8 @@ function setUp() {
     );
     field_create_instance($this->instance);
     entity_get_display('node', 'article', 'default')
-      ->setComponent($this->instance['field_name'], array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $this->instance['field_name'], array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
   }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
index ea73152..6c62b31 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
@@ -52,8 +52,8 @@ function setUp() {
     );
     field_create_instance($this->instance);
     entity_get_display('node', 'article', 'default')
-      ->setComponent('taxonomy_' . $this->vocabulary->id(), array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', 'taxonomy_' . $this->vocabulary->id(), array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
   }
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 67adc3a..be99c1c 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
@@ -108,14 +108,14 @@ protected function mockStandardInstall() {
     field_create_instance($instance);
 
     entity_get_display('node', 'article', 'default')
-      ->setComponent($instance['field_name'], array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $instance['field_name'], array(
+        'formatter' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
     entity_get_display('node', 'article', 'teaser')
-      ->setComponent($instance['field_name'], array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $instance['field_name'], array(
+        'formatter' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
diff --git a/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php b/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php
index 6bf7fe4..503c166 100644
--- a/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php
+++ b/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php
@@ -68,7 +68,7 @@ function testTextFieldValidation() {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'default')
-      ->setComponent($this->field['field_name'])
+      ->setComponent('field', $this->field['field_name'])
       ->save();
 
     // Test valid and invalid values with field_attach_validate().
@@ -120,7 +120,7 @@ function _testTextfieldWidgets($field_type, $widget_type) {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field_name)
+      ->setComponent('field', $this->field_name)
       ->save();
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
@@ -180,7 +180,7 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
     );
     field_create_instance($this->instance);
     entity_get_display('test_entity', 'test_bundle', 'full')
-      ->setComponent($this->field_name)
+      ->setComponent('field', $this->field_name)
       ->save();
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index f0b921c..112158d 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -393,9 +393,9 @@ function user_install_picture_field() {
 
   // Assign display settings for the 'default' and 'compact' view modes.
   entity_get_display('user', 'user', 'default')
-    ->setComponent('user_picture', array(
+    ->setComponent('field', 'user_picture', array(
       'label' => 'hidden',
-      'type' => 'image',
+      'formatter' => 'image',
       'settings' => array(
         'image_style' => 'thumbnail',
         'image_link' => 'content',
@@ -403,16 +403,16 @@ function user_install_picture_field() {
     ))
     ->save();
   entity_get_display('user', 'user', 'compact')
-    ->setComponent('user_picture', array(
+    ->setComponent('field', 'user_picture', array(
       'label' => 'hidden',
-      'type' => 'image',
+      'formatter' => 'image',
       'settings' => array(
         'image_style' => 'thumbnail',
         'image_link' => 'content',
       ),
     ))
     // Additionally, hide 'summary' pseudo-field from compact view mode..
-    ->removeComponent('member_for')
+    ->removeComponent('extra_field', 'member_for')
     ->save();
 }
 
@@ -801,8 +801,9 @@ function user_update_8011() {
 
   $display = _update_8000_entity_get_display('user', 'user', 'default');
   $display->set('content.user_picture', array(
+      'handler_type' => 'field',
       'label' => 'hidden',
-      'type' => $formatter,
+      'formatter' => $formatter,
       'settings' => array(
         'image_style' => 'thumbnail',
         'image_link' => 'content',
@@ -814,8 +815,9 @@ function user_update_8011() {
 
   $display = _update_8000_entity_get_display('user', 'user', 'compact');
   $display->set('content.user_picture', array(
+      'handler_type' => 'field',
       'label' => 'hidden',
-      'type' => $formatter,
+      'formatter' => $formatter,
       'settings' => array(
         'image_style' => update_variable_get('user_picture_style', ''),
         'image_link' => 'content',
diff --git a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
index 1e5b72f..751bd65 100644
--- a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
@@ -80,8 +80,8 @@ protected function setUp() {
     );
     field_create_instance($this->instance);
     entity_get_display('node', 'page', 'full')
-      ->setComponent($this->field_name, array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', $this->field_name, array(
+        'formatter' => 'taxonomy_term_reference_link',
       ))
       ->save();
 
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 693ed68..3948f72 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
@@ -81,14 +81,14 @@ function setUp() {
     field_create_instance($this->tag_instance);
 
     entity_get_display('node', $this->node_type_with_tags->type, 'default')
-      ->setComponent('field_views_testing_tags', array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', 'field_views_testing_tags', array(
+        'formatter' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
     entity_get_display('node', $this->node_type_with_tags->type, 'teaser')
-      ->setComponent('field_views_testing_tags', array(
-        'type' => 'taxonomy_term_reference_link',
+      ->setComponent('field', 'field_views_testing_tags', array(
+        'formatter' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index 0961820..c5e4ffc 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -300,14 +300,14 @@ function standard_install() {
 
   // Assign display settings for the 'default' and 'teaser' view modes.
   entity_get_display('node', 'article', 'default')
-    ->setComponent($instance['field_name'], array(
-      'type' => 'taxonomy_term_reference_link',
+    ->setComponent('field', $instance['field_name'], array(
+      'formatter' => 'taxonomy_term_reference_link',
       'weight' => 10,
     ))
     ->save();
   entity_get_display('node', 'article', 'teaser')
-    ->setComponent($instance['field_name'], array(
-      'type' => 'taxonomy_term_reference_link',
+    ->setComponent('field', $instance['field_name'], array(
+      'formatter' => 'taxonomy_term_reference_link',
       'weight' => 10,
     ))
     ->save();
@@ -367,17 +367,17 @@ function standard_install() {
 
   // Assign display settings for the 'default' and 'teaser' view modes.
   entity_get_display('node', 'article', 'default')
-    ->setComponent($instance['field_name'], array(
+    ->setComponent('field', $instance['field_name'], array(
       'label' => 'hidden',
-      'type' => 'image',
+      'formatter' => 'image',
       'settings' => array('image_style' => 'large', 'image_link' => ''),
       'weight' => -1,
     ))
     ->save();
   entity_get_display('node', 'article', 'teaser')
-    ->setComponent($instance['field_name'], array(
+    ->setComponent('field', $instance['field_name'], array(
       'label' => 'hidden',
-      'type' => 'image',
+      'formatter' => 'image',
       'settings' => array('image_style' => 'medium', 'image_link' => 'content'),
       'weight' => -1,
     ))
