diff --git a/core/lib/Drupal/Core/Config/Entity/DraggableListBuilder.php b/core/lib/Drupal/Core/Config/Entity/DraggableListBuilder.php
index 3729f2d..5dfbc3d 100644
--- a/core/lib/Drupal/Core/Config/Entity/DraggableListBuilder.php
+++ b/core/lib/Drupal/Core/Config/Entity/DraggableListBuilder.php
@@ -119,8 +119,9 @@ public function buildForm(array $form, array &$form_state) {
     $this->entities = $this->load();
     foreach ($this->entities as $entity) {
       $row = $this->buildRow($entity);
-      if (isset($row['label'])) {
-        $row['label'] = array('#markup' => $row['label']);
+      $label_key = $this->entityType->getKey('label');
+      if (isset($row[$label_key])) {
+        $row[$label_key] = array('#markup' => $row[$label_key]);
       }
       $form[$this->entitiesKey][$entity->id()] = $row;
     }
diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index 4575983..d3fd337 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -91,22 +91,22 @@ class Language implements LanguageInterface {
   /**
    * Constructs a new class instance.
    *
-   * @param array $options
+   * @param array $values
    *   The properties used to construct the language.
    */
-  public function __construct(array $options = array()) {
+  public function __construct(array $values = array()) {
     // Set all the provided properties for the language.
-    foreach ($options as $name => $value) {
-      $this->{$name} = $value;
+    foreach ($values as $key => $value) {
+      $this->{$key} = $value;
     }
     // If some options were not set, set sane defaults of a predefined language.
-    if (!isset($options['name']) || !isset($options['direction'])) {
+    if (!isset($values['name']) || !isset($values['direction'])) {
       $predefined = LanguageManager::getStandardLanguageList();
       if (isset($predefined[$this->id])) {
-        if (!isset($options['name'])) {
+        if (!isset($values['name'])) {
           $this->name = $predefined[$this->id][0];
         }
-        if (!isset($options['direction']) && isset($predefined[$this->id][2])) {
+        if (!isset($values['direction']) && isset($predefined[$this->id][2])) {
           $this->direction = $predefined[$this->id][2];
         }
       }
diff --git a/core/lib/Drupal/Core/Language/LanguageDefault.php b/core/lib/Drupal/Core/Language/LanguageDefault.php
index a72b8b1..53f40d2 100644
--- a/core/lib/Drupal/Core/Language/LanguageDefault.php
+++ b/core/lib/Drupal/Core/Language/LanguageDefault.php
@@ -22,7 +22,7 @@ class LanguageDefault {
   /**
    * The default language.
    *
-   * @var \Drupal\Core\Language\Language
+   * @var \Drupal\Core\Language\LanguageInterface
    */
   protected $language;
 
@@ -39,7 +39,7 @@ public function __construct(array $values) {
   /**
    * Gets the default language.
    *
-   * @return \Drupal\Core\Language\Language
+   * @return \Drupal\Core\Language\LanguageInterface
    *   The default language.
    */
   public function get() {
@@ -49,11 +49,11 @@ public function get() {
   /**
    * Sets the default language.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   The default language.
    */
-  public function set(Language $language) {
-    $language->default = TRUE;
+  public function set(LanguageInterface $language) {
+    $language->setDefault(TRUE);
     $this->language = $language;
   }
 
diff --git a/core/lib/Drupal/Core/Language/LanguageInterface.php b/core/lib/Drupal/Core/Language/LanguageInterface.php
index e718749..fce6e2e 100644
--- a/core/lib/Drupal/Core/Language/LanguageInterface.php
+++ b/core/lib/Drupal/Core/Language/LanguageInterface.php
@@ -100,7 +100,7 @@
    * Gets the name of the language.
    *
    * @return string
-   *   The human-readable English name of the language.
+   *   The human-readable name of the language.
    */
   public function getName();
 
@@ -108,7 +108,7 @@ public function getName();
    * Sets the name of the language.
    *
    * @param string $name
-   *   The human-readable English name of the language.
+   *   The human-readable name of the language.
    *
    * @return $this
    */
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 6a17f73..3975c49 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -427,7 +427,7 @@ function language_save($language) {
   $language->is_new = $language_entity->isNew();
 
   // Assign language properties to language entity.
-  $language_entity->label = isset($language->name) ? $language->name : '';
+  $language_entity->name = isset($language->name) ? $language->name : '';
   $language_entity->direction = isset($language->direction) ? $language->direction : '0';
   $language_entity->locked = !empty($language->locked);
   $language_entity->weight = isset($language->weight) ? $language->weight : 0;
diff --git a/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php b/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php
index b164cd5..7c0875a 100644
--- a/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php
+++ b/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php
@@ -288,7 +288,6 @@ public function getLanguages($flags = Language::STATE_CONFIGURABLE) {
         // Initialize default property so callers have an easy reference and can
         // save the same object without data loss.
         $data['default'] = ($langcode == $default->id);
-        $data['name'] = $data['label'];
         $this->languages[$langcode] = new Language($data);
         $weight = max(array($weight, $this->languages[$langcode]->weight));
       }
diff --git a/core/modules/language/lib/Drupal/language/Entity/Language.php b/core/modules/language/lib/Drupal/language/Entity/Language.php
index 77015cd..399491e 100644
--- a/core/modules/language/lib/Drupal/language/Entity/Language.php
+++ b/core/modules/language/lib/Drupal/language/Entity/Language.php
@@ -31,7 +31,7 @@
  *   config_prefix = "entity",
  *   entity_keys = {
  *     "id" = "id",
- *     "label" = "label",
+ *     "label" = "name",
  *     "weight" = "weight"
  *   },
  *   links = {
@@ -50,11 +50,11 @@ class Language extends ConfigEntityBase implements LanguageInterface {
   public $id;
 
   /**
-   * The human-readable label for the language.
+   * The human-readable name of the language.
    *
    * @var string
    */
-  public $label;
+  public $name;
 
   /**
    * The direction of language, either DIRECTION_LTR or DIRECTION_RTL.
@@ -71,6 +71,16 @@ class Language extends ConfigEntityBase implements LanguageInterface {
   public $weight = 0;
 
   /**
+   * The language negotiation method used when a language was detected.
+   *
+   * The method ID, for example
+   * \Drupal\language\LanguageNegotiatorInterface::METHOD_ID.
+   *
+   * @var string
+   */
+  public $method_id;
+
+  /**
    * Locked languages cannot be edited.
    *
    * @var bool
@@ -80,6 +90,107 @@ class Language extends ConfigEntityBase implements LanguageInterface {
   /**
    * {@inheritdoc}
    */
+  public function getName() {
+    return $this->name;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setName($name) {
+    $this->name = $name;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getId() {
+    return $this->id;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setId($id) {
+    $this->id = $id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDirection() {
+    return $this->direction;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDirection($direction) {
+    $this->direction = $direction;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getWeight() {
+    return $this->weight;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setWeight($weight) {
+    $this->weight = $weight;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isDefault() {
+    return $this->getId() == $this->config('system.site')->get('langcode');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDefault($default) {
+    $this->config('system.site')->set('langcode', $default)->save();
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getNegotiationMethodId() {
+    return $this->method_id;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setNegotiationMethodId($method_id) {
+    $this->method_id = $method_id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function toArray() {
+    $array = parent::toArray();
+    // Do not save the ID of the negotiation method as that is dynamically
+    // derived data.
+    unset($array['method_id']);
+    return $array;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function preSave(EntityStorageInterface $storage) {
     parent::preSave($storage);
     // Languages are picked from a predefined list which is given in English.
@@ -94,11 +205,24 @@ public function preSave(EntityStorageInterface $storage) {
    * @throws \RuntimeException
    */
   public static function preDelete(EntityStorageInterface $storage, array $entities) {
-    $default_language = \Drupal::service('language.default')->get();
     foreach ($entities as $entity) {
-      if ($entity->id() == $default_language->id && !$entity->isUninstalling()) {
+      if ($entity->isDefault() && !$entity->isUninstalling()) {
         throw new DeleteDefaultLanguageException('Can not delete the default language');
       }
     }
   }
+
+  /**
+   * Retrieves a configuration object.
+   *
+   * @param string $name
+   *   The name of the configuration object to retrieve.
+   *
+   * @return \Drupal\Core\Config\Config
+   *   A configuration object.
+   */
+  public static function config($name) {
+    return \Drupal::config($name);
+  }
+
 }
diff --git a/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php b/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php
index 33d5fa1..5ad5f8c 100644
--- a/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php
+++ b/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php
@@ -17,6 +17,13 @@
 abstract class LanguageFormBase extends EntityFormController {
 
   /**
+   * {@inheritdoc}
+   *
+   * @var \Drupal\language\LanguageInterface
+   */
+  protected $entity;
+
+  /**
    * Common elements of the language addition and editing form.
    */
   public function commonForm(array &$form) {
@@ -25,11 +32,11 @@ public function commonForm(array &$form) {
       $form['langcode_view'] = array(
         '#type' => 'item',
         '#title' => $this->t('Language code'),
-        '#markup' => $language->id
+        '#markup' => $language->getId(),
       );
       $form['langcode'] = array(
         '#type' => 'value',
-        '#value' => $language->id
+        '#value' => $language->getId(),
       );
     }
     else {
@@ -47,7 +54,7 @@ public function commonForm(array &$form) {
       '#type' => 'textfield',
       '#title' => $this->t('Language name in English'),
       '#maxlength' => 64,
-      '#default_value' => $language->label,
+      '#default_value' => $language->getName(),
       '#required' => TRUE,
     );
     $form['direction'] = array(
@@ -55,7 +62,7 @@ public function commonForm(array &$form) {
       '#title' => $this->t('Direction'),
       '#required' => TRUE,
       '#description' => $this->t('Direction that text in this language is presented.'),
-      '#default_value' => $language->direction,
+      '#default_value' => $language->getDirection(),
       '#options' => array(
         Language::DIRECTION_LTR => $this->t('Left to right'),
         Language::DIRECTION_RTL => $this->t('Right to left'),
diff --git a/core/modules/language/lib/Drupal/language/LanguageInterface.php b/core/modules/language/lib/Drupal/language/LanguageInterface.php
index b2bfe26..2e427a3 100644
--- a/core/modules/language/lib/Drupal/language/LanguageInterface.php
+++ b/core/modules/language/lib/Drupal/language/LanguageInterface.php
@@ -8,10 +8,11 @@
 namespace Drupal\language;
 
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Language\LanguageInterface as CoreLanguageInterface;
 
 /**
  * Provides an interface defining a language entity.
  */
-interface LanguageInterface extends ConfigEntityInterface {
+interface LanguageInterface extends CoreLanguageInterface, ConfigEntityInterface {
 
 }
diff --git a/core/modules/language/lib/Drupal/language/LanguageListBuilder.php b/core/modules/language/lib/Drupal/language/LanguageListBuilder.php
index c5bd66a..c2b0983 100644
--- a/core/modules/language/lib/Drupal/language/LanguageListBuilder.php
+++ b/core/modules/language/lib/Drupal/language/LanguageListBuilder.php
@@ -60,7 +60,7 @@ public function getDefaultOperations(EntityInterface $entity) {
    * {@inheritdoc}
    */
   public function buildHeader() {
-    $header['label'] = t('Name');
+    $header['name'] = t('Name');
     return $header + parent::buildHeader();
   }
 
@@ -68,7 +68,7 @@ public function buildHeader() {
    * {@inheritdoc}
    */
   public function buildRow(EntityInterface $entity) {
-    $row['label'] = $this->getLabel($entity);
+    $row['name'] = $this->getLabel($entity);
     return $row + parent::buildRow($entity);
   }
 
