diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index a94876e..968183f 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -419,6 +419,15 @@ function language_language_negotiation_info() {
     'description' => t('Use an already detected language for URLs if none is found.'),
   );
 
+  $negotiation_info[LANGUAGE_NEGOTIATION_USER_ADMIN] = array(
+    'types' => array(LANGUAGE_TYPE_INTERFACE),
+    'callbacks' => array('negotiation' => 'language_from_user_admin'),
+    'file' => $file,
+    'weight' => 10,
+    'name' => t('User admin language'),
+    'description' => t("Follow the user's admin language preference."),
+  );
+
   return $negotiation_info;
 }
 
diff --git a/core/modules/language/language.negotiation.inc b/core/modules/language/language.negotiation.inc
index 48a8083..ab56b4e 100644
--- a/core/modules/language/language.negotiation.inc
+++ b/core/modules/language/language.negotiation.inc
@@ -31,6 +31,11 @@ const LANGUAGE_NEGOTIATION_URL_FALLBACK = 'language-url-fallback';
 const LANGUAGE_NEGOTIATION_USER = 'language-user';
 
 /**
+ * The language is set based on the user admin language settings.
+ */
+const LANGUAGE_NEGOTIATION_USER_ADMIN = 'language-user-admin';
+
+/**
  * The language is set based on the request/session parameters.
  */
 const LANGUAGE_NEGOTIATION_SESSION = 'language-session';
@@ -162,6 +167,27 @@ function language_from_user($languages) {
 }
 
 /**
+ * Identifies admin language from the user preferences.
+ *
+ * @param $languages
+ *   An array of valid language objects.
+ *
+ * @return
+ *   A valid language code on success, FALSE otherwise.
+ */
+function language_from_user_admin($languages) {
+  // User preference (only for logged users).
+  global $user;
+
+  if ($user->uid && !empty($user->preferred_admin_langcode) && path_is_admin(current_path())) {
+    return $user->preferred_admin_langcode;
+  }
+
+  // No language preference from the user or not on an admin path.
+  return FALSE;
+}
+
+/**
  * Identify language from a request/session parameter.
  *
  * @param $languages
diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php
index 31ca843..788c48e 100644
--- a/core/modules/user/lib/Drupal/user/AccountFormController.php
+++ b/core/modules/user/lib/Drupal/user/AccountFormController.php
@@ -205,6 +205,8 @@ abstract class AccountFormController extends EntityFormController {
 
     $user_preferred_language = $register ? $language_interface : user_preferred_language($account);
 
+    $user_preferred_admin_language = $register ? $language_interface : user_preferred_admin_language($account);
+
     // Is default the interface language?
     include_once DRUPAL_ROOT . '/core/includes/language.inc';
     $interface_language_is_default = language_negotiation_method_get_first(LANGUAGE_TYPE_INTERFACE) != LANGUAGE_NEGOTIATION_DEFAULT;
@@ -224,6 +226,15 @@ abstract class AccountFormController extends EntityFormController {
       '#description' => $interface_language_is_default ? t("This account's preferred language for e-mails and site presentation.") : t("This account's preferred language for e-mails."),
     );
 
+    $form['language']['preferred_admin_langcode'] = array(
+      '#type' => 'language_select',
+      '#title' => t('Admin language'),
+      '#languages' => LANGUAGE_CONFIGURABLE,
+      '#default_value' => $user_preferred_admin_language->langcode,
+      '#description' => t("This account's preferred language for administration pages."),
+      '#access' => user_access('access administration pages') && language_negotiation_method_enabled(LANGUAGE_NEGOTIATION_USER_ADMIN),
+    );
+
     // User entities contain both a langcode property (for identifying the
     // language of the entity data) and a preferred_langcode property (see
     // above). Rather than provide a UI forcing the user to choose both
diff --git a/core/modules/user/lib/Drupal/user/User.php b/core/modules/user/lib/Drupal/user/User.php
index 42f2d29..74e2bf3 100644
--- a/core/modules/user/lib/Drupal/user/User.php
+++ b/core/modules/user/lib/Drupal/user/User.php
@@ -122,6 +122,13 @@ class User extends Entity {
   public $preferred_langcode = LANGUAGE_NOT_SPECIFIED;
 
   /**
+   * The user's preferred langcode for viewing administration pages.
+   *
+   * @var string
+   */
+  public $preferred_admin_langcode = LANGUAGE_NOT_SPECIFIED;
+
+  /**
    * The file ID of the user's picture.
    *
    * @var integer
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index abb985b..c44be33 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -224,6 +224,13 @@ function user_schema() {
         'default' => '',
         'description' => 'The {language}.langcode that the user prefers for receiving emails and viewing the site.',
       ),
+      'preferred_admin_langcode' => array(
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The {language}.langcode that the user prefers for viewing administration pages.',
+      ),
       'picture' => array(
         'type' => 'int',
         'not null' => TRUE,
@@ -475,5 +482,18 @@ function user_update_8003() {
 }
 
 /**
+ * Creates a preferred_admin_langcode column.
+ */
+function user_update_8004() {
+   $spec = array(
+    'description' => 'The {language}.langcode that the user prefers for viewing administration pages.',
+    'type' => 'varchar',
+    'length' => 12,
+    'not null' => FALSE,
+  );
+  db_add_field('users', 'preferred_admin_langcode', $spec);
+}
+
+/**
  * @} End of "addtogroup updates-7.x-to-8.x".
  */
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 44cb266..4862fbf 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -2977,6 +2977,29 @@ function user_preferred_language($account, $default = NULL) {
 }
 
 /**
+ * Get the admin language object preferred by the user. This user preference can
+ * be set on the user account editing page, and is only available if there
+ * are more than one languages enabled on the site. If the user did not
+ * choose a preferred language the $default value, or if it is not set, the site
+ * default language will be returned.
+ *
+ * @param $account
+ *   User account to look up language for.
+ * @param $default
+ *   Optional default language object to return if the account
+ *   has no valid language.
+ */
+function user_preferred_admin_language($account, $default = NULL) {
+  $language_list = language_list();
+  if (!empty($account->preferred_admin_langcode) && isset($language_list[$account->preferred_admin_langcode])) {
+    return $language_list[$account->preferred_admin_langcode];
+  }
+  else {
+    return $default ? $default : language_default();
+  }
+}
+
+/**
  * Conditionally create and send a notification email when a certain
  * operation happens on the given user account.
  *
