diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 702a56e..1e0e742 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -143,6 +143,72 @@ function entity_get_view_modes($entity_type = NULL) {
 }
 
 /**
+ * Returns view mode settings in a given bundle.
+ *
+ * @param $entity_type
+ *   The type of entity; e.g. 'node' or 'user'.
+ * @param $bundle
+ *   The bundle name to return view mode settings for.
+ *
+ * @return
+ *   An array keyed by view mode, with the following key/value pairs:
+ *   - status: Boolean specifying whether the view mode uses a dedicated set of
+ *     display options (TRUE), or the 'default' options (FALSE). Defaults to
+ *     FALSE.
+ */
+function entity_view_mode_settings($entity_type, $bundle) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($cache[$entity_type][$bundle])) {
+    $settings = entity_bundle_settings($entity_type, $bundle);
+    // Include view modes for which nothing has been stored yet, but whose
+    // definition in hook_entity_info_alter() specify they should use custom
+    // settings by default.
+    $view_modes = entity_get_view_modes($entity_type);
+    foreach ($view_modes as $view_mode => $view_mode_info) {
+      if (!isset($settings[$view_mode]['status']) && $view_mode_info['status']) {
+        $settings[$view_mode]['status'] = TRUE;
+      }
+    }
+    $cache[$entity_type][$bundle] = $settings;
+  }
+
+  return $cache[$entity_type][$bundle];
+}
+
+/**
+ * Gets or sets administratively defined bundle settings.
+ *
+ * @param string $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param string $bundle
+ *   The bundle name.
+ * @param array|null $settings
+ *   (optional) The settings to store, an associative array with the following
+ *   elements:
+ *   - view_modes: An associative array keyed by view mode, with the following
+ *     key/value pairs:
+ *     - status: Boolean specifying whether the view mode uses a dedicated set
+ *       of display options (TRUE), or the 'default' options (FALSE). Defaults
+ *       to FALSE.
+ *
+ * @return array|null
+ *   If no $settings are passed, the current settings are returned.
+ */
+function entity_bundle_settings($entity_type, $bundle, $settings = NULL) {
+  if (isset($settings)) {
+    config('entity.view_mode_settings.' . $entity_type . '.' . $bundle)
+      ->set('view_modes', $settings)
+      ->save();
+    field_info_cache_clear();
+  }
+  else {
+    $settings = config('entity.view_mode_settings.' . $entity_type . '.' . $bundle)->get('view_modes') ?: array();
+    return $settings;
+  }
+}
+
+/**
  * Loads an entity from the database.
  *
  * @param string $entity_type
@@ -701,7 +767,7 @@ function entity_get_render_display(EntityInterface $entity, $view_mode) {
   // Determine the display to use for rendering this entity. Depending on the
   // configuration of the view mode for this bundle, this will be either the
   // display associated to the view mode, or the 'default' display.
-  $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+  $view_mode_settings = entity_view_mode_settings($entity_type, $bundle);
   $render_view_mode = !empty($view_mode_settings[$view_mode]['status']) ? $view_mode : 'default';
 
   $display = entity_get_display($entity_type, $bundle, $render_view_mode);
diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc
index baa7ff4..1cabbd8 100644
--- a/core/modules/field/field.attach.inc
+++ b/core/modules/field/field.attach.inc
@@ -1589,9 +1589,8 @@ function field_entity_bundle_rename($entity_type, $bundle_old, $bundle_new) {
   field_cache_clear();
 
   // Update bundle settings.
-  $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle_old, array());
-  variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle_new, $settings);
-  variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle_old);
+  config('entity.view_mode_settings.' . $entity_type . '.' . $bundle_old)
+    ->rename('entity.view_mode_settings.' . $entity_type . '.' . $bundle_new);
 }
 
 /**
diff --git a/core/modules/field/field.info.inc b/core/modules/field/field.info.inc
index f69649d..1dc48eb 100644
--- a/core/modules/field/field.info.inc
+++ b/core/modules/field/field.info.inc
@@ -30,7 +30,7 @@
  * the purged records, but no actual field data items are affected.
  */
 function field_info_cache_clear() {
-  drupal_static_reset('field_view_mode_settings');
+  drupal_static_reset('entity_bundle_settings');
   drupal_static_reset('field_available_languages');
 
   // @todo: Remove this when field_attach_*_bundle() bundle management
diff --git a/core/modules/field/field.install b/core/modules/field/field.install
index dc20e25..bdb2799 100644
--- a/core/modules/field/field.install
+++ b/core/modules/field/field.install
@@ -314,13 +314,12 @@ function field_update_8002() {
       ->execute();
   }
 
-  // Migration of 'extra_fields' display settings. Avoid calling
+  // Migration of 'extra_fields'  and view mode display settings. Avoid calling
   // entity_get_info() by fetching the relevant variables directly in the
   // variable table.
   $variables = array_map('unserialize', db_query("SELECT name, value FROM {variable} WHERE name LIKE '%field_bundle_settings_%'")->fetchAllKeyed());
   foreach ($variables as $variable_name => $variable_value) {
     if (preg_match('/field_bundle_settings_(.*)__(.*)/', $variable_name, $matches)) {
-      $variable_needs_update = FALSE;
       $entity_type = $matches[1];
       $bundle = $matches[2];
 
@@ -334,10 +333,6 @@ function field_update_8002() {
           }
           $form_displays[$form_display_id]->set("content.$field_name", $field_settings);
         }
-
-        // Remove the old entry.
-        unset($variable_value['extra_fields']['form']);
-        $variable_needs_update = TRUE;
       }
 
       if (isset($variable_value['extra_fields']['display'])) {
@@ -360,15 +355,16 @@ function field_update_8002() {
             $displays[$display_id]->set("content.$field_name", $new_options);
           }
         }
-
-        // Remove the old entry.
-        unset($variable_value['extra_fields']['display']);
-        $variable_needs_update = TRUE;
       }
 
-      if ($variable_needs_update) {
-        variable_set($variable_name, $variable_value);
+      if (isset($variable_value['view_modes'])) {
+        config('entity.view_mode_settings.'. $entity_type . '.' . $bundle)
+          ->set('view_modes', $variable_value['view_modes'])
+          ->save();
       }
+
+      // Remove the variable.
+      update_variable_del($variable_name);
     }
   }
 
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index a720c4d..d860c0a 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -564,88 +564,6 @@ function _field_sort_items_value_helper($a, $b) {
 }
 
 /**
- * Gets or sets administratively defined bundle settings.
- *
- * @param string $entity_type
- *   The type of $entity; e.g., 'node' or 'user'.
- * @param string $bundle
- *   The bundle name.
- * @param array|null $settings
- *   (optional) The settings to store, an associative array with the following
- *   elements:
- *   - view_modes: An associative array keyed by view mode, with the following
- *     key/value pairs:
- *     - status: Boolean specifying whether the view mode uses a dedicated set
- *       of display options (TRUE), or the 'default' options (FALSE). Defaults
- *       to FALSE.
- *   - extra_fields: An associative array containing the form and display
- *     settings for extra fields (also known as pseudo-fields):
- *     - form: An associative array whose keys are the names of extra fields,
- *       and whose values are associative arrays with the following elements:
- *       - weight: The weight of the extra field, determining its position on an
- *         entity form.
- *     - display: An associative array whose keys are the names of extra fields,
- *       and whose values are associative arrays keyed by the name of view
- *       modes. This array must include an item for the 'default' view mode.
- *       Each view mode sub-array contains the following elements:
- *       - weight: The weight of the extra field, determining its position when
- *         an entity is viewed.
- *       - visible: TRUE if the extra field is visible, FALSE otherwise.
- *
- * @return array|null
- *   If no $settings are passed, the current settings are returned.
- */
-function field_bundle_settings($entity_type, $bundle, $settings = NULL) {
-  if (isset($settings)) {
-    variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle, $settings);
-    field_info_cache_clear();
-  }
-  else {
-    $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle, array());
-    $settings += array(
-      'view_modes' => array(),
-    );
-
-    return $settings;
-  }
-}
-
-/**
- * Returns view mode settings in a given bundle.
- *
- * @param $entity_type
- *   The type of entity; e.g. 'node' or 'user'.
- * @param $bundle
- *   The bundle name to return view mode settings for.
- *
- * @return
- *   An array keyed by view mode, with the following key/value pairs:
- *   - status: Boolean specifying whether the view mode uses a dedicated set of
- *     display options (TRUE), or the 'default' options (FALSE). Defaults to
- *     FALSE.
- */
-function field_view_mode_settings($entity_type, $bundle) {
-  $cache = &drupal_static(__FUNCTION__, array());
-
-  if (!isset($cache[$entity_type][$bundle])) {
-    $bundle_settings = field_bundle_settings($entity_type, $bundle);
-    $settings = $bundle_settings['view_modes'];
-    // Include view modes for which nothing has been stored yet, but whose
-    // definition in hook_entity_info_alter() specify they should use custom
-    // settings by default.
-    $view_modes = entity_get_view_modes($entity_type);
-    foreach ($view_modes as $view_mode => $view_mode_info) {
-      if (!isset($settings[$view_mode]['status']) && $view_mode_info['status']) {
-        $settings[$view_mode]['status'] = TRUE;
-      }
-    }
-    $cache[$entity_type][$bundle] = $settings;
-  }
-
-  return $cache[$entity_type][$bundle];
-}
-
-/**
  * Clears the field info and field data caches.
  */
 function field_cache_clear() {
diff --git a/core/modules/field/lib/Drupal/field/FieldInfo.php b/core/modules/field/lib/Drupal/field/FieldInfo.php
index 6d95788..f65ed37 100644
--- a/core/modules/field/lib/Drupal/field/FieldInfo.php
+++ b/core/modules/field/lib/Drupal/field/FieldInfo.php
@@ -509,10 +509,6 @@ public function getBundleExtraFields($entity_type, $bundle) {
     $info = array();
     $extra = $this->moduleHandler->invokeAll('field_extra_fields');
     drupal_alter('field_extra_fields', $extra);
-    // Merge in saved settings.
-    if (isset($extra[$entity_type][$bundle])) {
-      $info = $this->prepareExtraFields($extra[$entity_type][$bundle], $entity_type, $bundle);
-    }
 
     // Store in the 'static' and persistent caches.
     $this->bundleExtraFields[$entity_type][$bundle] = $info;
@@ -561,38 +557,4 @@ public function prepareInstance($instance, $field_type) {
     return $instance;
   }
 
-  /**
-   * Prepares 'extra fields' for the current run-time context.
-   *
-   * @param $extra_fields
-   *   The array of extra fields, as collected in hook_field_extra_fields().
-   * @param $entity_type
-   *   The entity type.
-   * @param $bundle
-   *   The bundle name.
-   *
-   * @return
-   *   The list of extra fields completed for the current runtime context.
-   */
-  public function prepareExtraFields($extra_fields, $entity_type, $bundle) {
-    $entity_type_info = entity_get_info($entity_type);
-    $bundle_settings = field_bundle_settings($entity_type, $bundle);
-    $extra_fields += array('form' => array(), 'display' => array());
-
-    $result = array();
-    // Extra fields in forms.
-    foreach ($extra_fields['form'] as $name => $field_data) {
-      $settings = isset($bundle_settings['extra_fields']['form'][$name]) ? $bundle_settings['extra_fields']['form'][$name] : array();
-      if (isset($settings['weight'])) {
-        $field_data['weight'] = $settings['weight'];
-      }
-      $result['form'][$name] = $field_data;
-    }
-
-    // Extra fields in displayed entities.
-    $result['display'] = $extra_fields['display'];
-
-    return $result;
-  }
-
 }
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php b/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php
index 1ddb8b5..70baf46 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php
@@ -31,7 +31,7 @@ public function access(Route $route, Request $request) {
       $bundle = $request->attributes->get('bundle');
       $view_mode = $request->attributes->get('view_mode');
 
-      $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+      $view_mode_settings = entity_view_mode_settings($entity_type, $bundle);
       $visibility = ($view_mode == 'default') || !empty($view_mode_settings[$view_mode]['status']);
       if ($visibility) {
         $permission = $route->getRequirement('_field_ui_view_mode_access');
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 e6caf4e..e7dafee 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -358,7 +358,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
         // checkboxes.
         $options = array();
         $default = array();
-        $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle);
+        $view_mode_settings = entity_view_mode_settings($this->entity_type, $this->bundle);
         foreach ($view_modes as $view_mode_name => $view_mode_info) {
           $options[$view_mode_name] = $view_mode_info['label'];
           if (!empty($view_mode_settings[$view_mode_name]['status'])) {
@@ -472,8 +472,7 @@ public function submitForm(array &$form, array &$form_state) {
     if ($this->mode == 'default' && !empty($form_values['view_modes_custom'])) {
       $entity_info = entity_get_info($this->entity_type);
       $view_modes = entity_get_view_modes($this->entity_type);
-      $bundle_settings = field_bundle_settings($this->entity_type, $this->bundle);
-      $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle);
+      $view_mode_settings = entity_view_mode_settings($this->entity_type, $this->bundle);
 
       foreach ($form_values['view_modes_custom'] as $view_mode => $value) {
         if (!empty($value) && empty($view_mode_settings[$view_mode]['status'])) {
@@ -489,11 +488,11 @@ public function submitForm(array &$form, array &$form_state) {
           $path = $this->entityManager->getAdminPath($this->entity_type, $this->bundle) . "/display/$view_mode";
           drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', array('%view_mode' => $view_mode_label, '@url' => url($path))));
         }
-        $bundle_settings['view_modes'][$view_mode]['status'] = !empty($value);
+        $view_mode_settings[$view_mode]['status'] = !empty($value);
       }
 
-      // Save updated bundle settings.
-      field_bundle_settings($this->entity_type, $this->bundle, $bundle_settings);
+      // Save updated view mode settings.
+      entity_bundle_settings($this->entity_type, $this->bundle, $view_mode_settings);
     }
 
     drupal_set_message(t('Your settings have been saved.'));
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 9819cde..6608303 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -385,11 +385,12 @@ function user_install_picture_field() {
  * The 'Member for' extra field has moved one level up in the array.
  */
 function user_update_8000() {
-  $settings = field_bundle_settings('user', 'user');
+  $name = 'field_bundle_settings_user__user';
+  $settings = update_variable_get($name, array());
   if (isset($settings['extra_fields']['display']['summary'])) {
     $settings['extra_fields']['display']['member_for'] = $settings['extra_fields']['display']['summary'];
     unset($settings['extra_fields']['display']['summary']);
-    field_bundle_settings('user', 'user', $settings);
+    update_variable_set($name, $settings);
   }
 }
 
