diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index 38553e4..7523157 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\Core\Language;
 
-use Drupal\Component\Utility\SortArray;
-
 /**
  * An object containing the information for an interface language.
  *
@@ -70,16 +68,6 @@ class Language implements LanguageInterface {
   public $default = FALSE;
 
   /**
-   * 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 indicates a language used by the system, not an actual language.
    *
    * Examples of locked languages are, LANGCODE_NOT_SPECIFIED, und, and
@@ -126,15 +114,6 @@ public function getName() {
   /**
    * {@inheritdoc}
    */
-  public function setName($name) {
-    $this->name = $name;
-
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getId() {
     return $this->id;
   }
@@ -149,15 +128,6 @@ public function getDirection() {
   /**
    * {@inheritdoc}
    */
-  public function setDirection($direction) {
-    $this->direction = $direction;
-
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getWeight() {
     return $this->weight;
   }
@@ -165,45 +135,11 @@ public function getWeight() {
   /**
    * {@inheritdoc}
    */
-  public function setWeight($weight) {
-    $this->weight = $weight;
-
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function isDefault() {
     return $this->default;
   }
 
   /**
-   * {@inheritdoc}
-   */
-  public function setDefault($default) {
-    $this->default = $default;
-
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getNegotiationMethodId() {
-    return $this->method_id;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setNegotiationMethodId($method_id) {
-    $this->method_id = $method_id;
-
-    return $this;
-  }
-
-  /**
    * Sort language objects.
    *
    * @param \Drupal\Core\Language\LanguageInterface[] $languages
diff --git a/core/lib/Drupal/Core/Language/LanguageInterface.php b/core/lib/Drupal/Core/Language/LanguageInterface.php
index 04ad426..f2e58f3 100644
--- a/core/lib/Drupal/Core/Language/LanguageInterface.php
+++ b/core/lib/Drupal/Core/Language/LanguageInterface.php
@@ -105,16 +105,6 @@
   public function getName();
 
   /**
-   * Sets the name of the language.
-   *
-   * @param string $name
-   *   The human-readable English name of the language.
-   *
-   * @return $this
-   */
-  public function setName($name);
-
-  /**
    * Gets the ID (language code).
    *
    * @return string
@@ -131,16 +121,6 @@ public function getId();
   public function getDirection();
 
   /**
-   * Sets the direction of the language.
-   *
-   * @param int $direction
-   *   Either self::DIRECTION_LTR or self::DIRECTION_RTL.
-   *
-   * @return $this
-   */
-  public function setDirection($direction);
-
-  /**
    * Gets the weight of the language.
    *
    * @return int
@@ -150,17 +130,6 @@ public function setDirection($direction);
   public function getWeight();
 
   /**
-   * Sets the weight of the language.
-   *
-   * @param int $weight
-   *   The weight, used to order languages with larger positive weights sinking
-   *   items toward the bottom of lists.
-   *
-   * @return $this
-   */
-  public function setWeight($weight);
-
-  /**
    * Returns whether this language is the default language.
    *
    * @return bool
@@ -168,34 +137,4 @@ public function setWeight($weight);
    */
   public function isDefault();
 
-  /**
-   * Sets whether this language is the default language.
-   *
-   * @param bool $default
-   *   TRUE if it is the default language.
-   *
-   * @return $this
-   */
-  public function setDefault($default);
-
-  /**
-   * Gets the language negotiation method ID for this language.
-   *
-   * @return string
-   *   The method ID, for example
-   *   \Drupal\language\LanguageNegotiatorInterface::METHOD_ID.
-   */
-  public function getNegotiationMethodId();
-
-  /**
-   * Sets the language negotiation method ID for this language.
-   *
-   * @param string $method_id
-   *   The method ID, for example
-   *   \Drupal\language\LanguageNegotiatorInterface::METHOD_ID.
-   *
-   * @return $this
-   */
-  public function setNegotiationMethodId($method_id);
-
 }
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index e095d8d..9119faa 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -7,6 +7,7 @@
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\PhpStorage\PhpStorageFactory;
+use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\language\ConfigurableLanguageManager;
@@ -413,28 +414,25 @@ function language_get_default_langcode($entity_type, $bundle) {
 /**
  * API function to add or update a language.
  *
- * @param $language
+ * @param Language $language
  *   Language object with properties corresponding to the 'language'
- *   configuration properties.
+ *   configuration properties. Note that this is explicitly typed on the object
+ *   since the purpose is to save a Language object as a ConfigurableLanguage.
  */
-function language_save($language) {
+function language_save(Language $language) {
+  /** @var $configurable_language \Drupal\language\ConfigurableLanguageInterface */
   $configurable_language = entity_load('configurable_language', $language->id);
   if (!$configurable_language) {
     $configurable_language = entity_create('configurable_language', array(
       'id' => $language->id,
     ));
   }
-  $language->is_new = $configurable_language->isNew();
+  $is_new = $configurable_language->isNew();
 
   // Assign language properties to language entity.
-  $configurable_language->label = isset($language->name) ? $language->name : '';
-  $configurable_language->direction = isset($language->direction) ? $language->direction : '0';
-  $configurable_language->locked = !empty($language->locked);
-  $configurable_language->weight = isset($language->weight) ? $language->weight : 0;
-  $configurable_language->setDefault(!empty($language->default));
-  $configurable_language->save();
-  $t_args = array('%language' => $language->name, '%langcode' => $language->id);
-  if ($language->is_new) {
+  $configurable_language->setValuesFromLanguage($language)->save();
+  $t_args = array('%language' => $language->getName(), '%langcode' => $language->getId());
+  if ($is_new) {
     // Install any available language configuration overrides for the language.
     \Drupal::service('language.config_factory_override')->installLanguageOverrides($language->getId());
     \Drupal::logger('language')->notice('The %language (%langcode) language has been created.', $t_args);
diff --git a/core/modules/language/src/ConfigurableLanguageInterface.php b/core/modules/language/src/ConfigurableLanguageInterface.php
index 16536a1..b4a1801 100644
--- a/core/modules/language/src/ConfigurableLanguageInterface.php
+++ b/core/modules/language/src/ConfigurableLanguageInterface.php
@@ -8,6 +8,7 @@
 namespace Drupal\language;
 
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
 
 /**
@@ -15,4 +16,16 @@
  */
 interface ConfigurableLanguageInterface extends ConfigEntityInterface, LanguageInterface {
 
+  /**
+   * Set values from using the provided Language object.
+   *
+   * @param \Drupal\Core\Language\Language $language
+   *   The language object to get the values from.
+   *
+   * @return $this
+   *
+   * @see language_save()
+   */
+  public function setValuesFromLanguage(Language $language);
+
 }
diff --git a/core/modules/language/src/Entity/ConfigurableLanguage.php b/core/modules/language/src/Entity/ConfigurableLanguage.php
index eda4d9a..0e72740 100644
--- a/core/modules/language/src/Entity/ConfigurableLanguage.php
+++ b/core/modules/language/src/Entity/ConfigurableLanguage.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Language\Language as LanguageObject;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Language\Language;
 use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\language\Exception\DeleteDefaultLanguageException;
 use Drupal\language\ConfigurableLanguageInterface;
@@ -89,7 +90,6 @@ class ConfigurableLanguage extends ConfigEntityBase implements ConfigurableLangu
    *
    * @see \Drupal\language\Entity\ConfigurableLanguage::postSave()
    * @see \Drupal\language\Entity\ConfigurableLanguage::isDefault()
-   * @see \Drupal\language\Entity\ConfigurableLanguage::setDefault()
    *
    * @var bool
    */
@@ -109,26 +109,6 @@ class ConfigurableLanguage extends ConfigEntityBase implements ConfigurableLangu
   protected $preSaveMultilingual;
 
   /**
-   * The language negotiation method used when a language was detected.
-   *
-   * The method ID, for example
-   * \Drupal\language\LanguageNegotiatorInterface::METHOD_ID.
-   *
-   * @var string
-   */
-  public $methodId;
-
-  /**
-   * Sets the default flag on the language entity.
-   *
-   * @param bool $default
-   *   TRUE if the language entity is the site default language, FALSE if not.
-   */
-  public function setDefault($default) {
-    $this->default = $default;
-  }
-
-  /**
    * Checks if the language entity is the site default language.
    *
    * @return bool
@@ -210,6 +190,25 @@ protected function toLanguageObject() {
   }
 
   /**
+   * Converts the ConfigurableLanguage entity to a Core Language value object.
+   *
+   * @todo fix return type hint after https://drupal.org/node/2246665 and
+   *   https://drupal.org/node/2246679.
+   *
+   * @return \Drupal\Core\Language\LanguageInterface
+   *   The language configuration entity expressed as a Language value object.
+   */
+  public function setValuesFromLanguage(Language $language) {
+    $this->label = $language->getName();
+    $this->direction = $language->getDirection();
+    $this->default = $language->isDefault();
+    $this->weight = $language->getWeight();
+    $this->locked = $language->locked;
+
+    return $this;
+  }
+
+  /**
    * {@inheritdoc}
    *
    * @throws \DeleteDefaultLanguageException
@@ -258,15 +257,6 @@ public function getName() {
   /**
    * {@inheritdoc}
    */
-  public function setName($name) {
-    $this->label = $name;
-
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getId() {
     return $this->id();
   }
@@ -281,42 +271,8 @@ public function getDirection() {
   /**
    * {@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 getNegotiationMethodId() {
-    return $this->methodId;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setNegotiationMethodId($method_id) {
-    $this->methodId = $method_id;
-
-    return $this;
-  }
-
 }
diff --git a/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php b/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php
index caed431..0ca18c1 100644
--- a/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php
+++ b/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php
@@ -46,7 +46,6 @@ function testDependencyInjectedNewDefaultLanguage() {
       'name' => 'French',
       'direction' => Language::DIRECTION_LTR,
       'weight' => 0,
-      'method_id' => 'language-default',
       'default' => TRUE,
     ));
     language_save($new_language_default);
diff --git a/core/modules/language/tests/src/Unit/ConfigurableLanguageUnitTest.php b/core/modules/language/tests/src/Unit/ConfigurableLanguageUnitTest.php
index f3d8d38..e1db87d 100644
--- a/core/modules/language/tests/src/Unit/ConfigurableLanguageUnitTest.php
+++ b/core/modules/language/tests/src/Unit/ConfigurableLanguageUnitTest.php
@@ -6,6 +6,9 @@
 
 namespace Drupal\Tests\language\Unit;
 
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Entity\EntityType;
+use Drupal\Core\Language\Language;
 use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\Tests\UnitTestCase;
 
@@ -19,62 +22,62 @@
 class ConfigurableLanguageUnitTest extends UnitTestCase {
 
   /**
-   * The Entity under test.
-   *
-   * @var \Drupal\language\Entity\ConfigurableLanguage;
-   */
-  protected $configurableLanguage;
-
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->configurableLanguage = new ConfigurableLanguage(array(), 'configurable_language');
-  }
-
-  /**
-   * @covers ::setDirection
    * @covers ::getDirection
    */
   public function testDirection() {
     // Direction of language writing, an integer. Usually either
     // ConfigurableLanguage::DIRECTION_LTR or
     // ConfigurableLanguage::DIRECTION_RTL.
-    $set_direction_ltr = ConfigurableLanguage::DIRECTION_LTR;
-    $this->configurableLanguage->setDirection($set_direction_ltr);
-    $this->assertEquals($this->configurableLanguage->getDirection(), $set_direction_ltr, 'LTR direction written and read correctly.');
+    $configurableLanguage = new ConfigurableLanguage(array('direction' => ConfigurableLanguage::DIRECTION_LTR), 'configurable_language');
+    $this->assertEquals(ConfigurableLanguage::DIRECTION_LTR, $configurableLanguage->getDirection());
 
     // Test direction again, setting direction to RTL.
-    $set_direction_rtl = ConfigurableLanguage::DIRECTION_RTL;
-    $this->configurableLanguage->setDirection($set_direction_rtl);
-    $this->assertEquals($this->configurableLanguage->getDirection(), $set_direction_rtl, 'RTL direction written and read correctly.');
+    $configurableLanguage = new ConfigurableLanguage(array('direction' => ConfigurableLanguage::DIRECTION_RTL), 'configurable_language');
+    $this->assertEquals(ConfigurableLanguage::DIRECTION_RTL, $configurableLanguage->getDirection());
   }
 
   /**
-   * @covers ::setWeight
    * @covers ::getWeight
    */
   public function testWeight() {
     // The weight, an integer. Used to order languages with larger positive
     // weights sinking items toward the bottom of lists.
-    $set_weight = -5;
-    $this->configurableLanguage->setWeight($set_weight);
-    $this->assertEquals($this->configurableLanguage->getWeight(), $set_weight, 'Weight written and read correctly.');
+    $weight = -5;
+    $configurableLanguage = new ConfigurableLanguage(array('weight' => $weight), 'configurable_language');
+    $this->assertEquals($configurableLanguage->getWeight(), $weight);
   }
 
   /**
-   * @covers::setNegotiationMethodId
-   * @covers::setNegotiationMethodId
+   * @covers ::setValuesFromLanguage
    */
-  public function testNegotiationMethodId(){
-    // Language's negotiation method ID, a string. E.g.
-    // \Drupal\language\LanguageNegotiatorInterface::METHOD_ID.
-    $set_method_id = 'language-foomethod';
-    $this->configurableLanguage->setNegotiationMethodId($set_method_id);
-    $this->assertEquals($this->configurableLanguage->getNegotiationMethodId(), $set_method_id, 'Negotiation Method Identifier written and read correctly.');
+  public function testSetValuesFromLanguage() {
+    // Mock the entity manager and create an entity type so that
+    // ConfigurableLanguage::getName() works.
+    $entityType = new EntityType(array('id' => 'configurable_language', 'entity_keys' => array('id' => 'id', 'label' => 'label')));
+    $entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
+    $entityManager->expects($this->any())
+      ->method('getDefinition')
+      ->with('configurable_language')
+    ->will($this->returnValue($entityType));
+    $container = new ContainerBuilder();
+    $container->set('entity.manager', $entityManager);
+    \Drupal::setContainer($container);
+
+    $language = new Language(array(
+      'id' => $this->randomMachineName(2),
+      'weight' => 8,
+      'name' => $this->randomMachineName(),
+      'direction' => Language::DIRECTION_RTL,
+      'default' => TRUE,
+      'locked' => TRUE,
+    ));
+
+    $configurableLanguage = new ConfigurableLanguage(array(), 'configurable_language');
+    $configurableLanguage->setValuesFromLanguage($language);
+    $this->assertSame($language->getWeight(), $configurableLanguage->getWeight());
+    $this->assertSame($language->getName(), $configurableLanguage->getName());
+    $this->assertSame($language->getDirection(), $configurableLanguage->getDirection());
+    $this->assertSame($language->isDefault(), $configurableLanguage->isDefault());
   }
 
 }
diff --git a/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php b/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php
index 68dc3b0..43f2210 100644
--- a/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php
+++ b/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php
@@ -36,7 +36,6 @@ public function setUp() {
       'name' => 'French',
       'direction' => LANGUAGE::DIRECTION_LTR,
       'weight' => 0,
-      'method_id' => 'language-default',
       'default' => TRUE,
     ));
     language_save($new_language_default);
diff --git a/core/modules/user/src/Plugin/views/field/Language.php b/core/modules/user/src/Plugin/views/field/Language.php
index 0e287ab..59f74cc 100644
--- a/core/modules/user/src/Plugin/views/field/Language.php
+++ b/core/modules/user/src/Plugin/views/field/Language.php
@@ -37,7 +37,7 @@ protected function renderLink($data, ResultRow $values) {
       $lang = $lang[$data];
     }
 
-    return $this->sanitizeValue($lang->name);
+    return $this->sanitizeValue($lang->getName());
   }
 
   /**
diff --git a/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php b/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php
index a221eb1..75e1fd8 100644
--- a/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php
@@ -18,34 +18,16 @@
 class LanguageUnitTest extends UnitTestCase {
 
   /**
-   * The language under test.
-   *
-   * @var \Drupal\Core\Language\Language
-   */
-  protected $language;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    $this->language = new Language();
-  }
-
-  /**
-   * Tests name getter and setter methods.
-   *
    * @covers ::getName()
-   * @covers ::setName()
    */
   public function testGetName() {
     $name = $this->randomMachineName();
-    $this->assertSame($this->language, $this->language->setName($name));
-    $this->assertSame($name, $this->language->getName());
+    $language_code = $this->randomMachineName(2);
+    $language = new Language(array('id' => $language_code, 'name' => $name));
+    $this->assertSame($name, $language->getName());
   }
 
   /**
-   * Tests langcode ID getter and setter methods.
-   *
    * @covers ::getId()
    */
   public function testGetLangcode() {
@@ -55,39 +37,21 @@ public function testGetLangcode() {
   }
 
   /**
-   * Tests direction getter and setter methods.
-   *
    * @covers ::getDirection()
-   * @covers ::setDirection()
    */
   public function testGetDirection() {
-    $direction = LanguageInterface::DIRECTION_RTL;
-    $this->assertSame($this->language, $this->language->setDirection($direction));
-    $this->assertSame($direction, $this->language->getDirection());
+    $language_code = $this->randomMachineName(2);
+    $language = new Language(array('id' => $language_code, 'direction' => LanguageInterface::DIRECTION_RTL));
+    $this->assertSame(LanguageInterface::DIRECTION_RTL, $language->getDirection());
   }
 
   /**
-   * Tests isDefault() and default setter.
-   *
    * @covers ::isDefault()
-   * @covers ::setDefault()
    */
   public function testIsDefault() {
-    $default = TRUE;
-    $this->assertSame($this->language, $this->language->setDefault($default));
-    $this->assertSame($default, $this->language->isDefault());
-  }
-
-  /**
-   * Tests negotiationMethodId getter and setter methods.
-   *
-   * @covers ::getNegotiationMethodId()
-   * @covers ::setNegotiationMethodId()
-   */
-  public function testGetNegotiationMethodId() {
-    $method_id = $this->randomMachineName();
-    $this->assertSame($this->language, $this->language->setNegotiationMethodId($method_id));
-    $this->assertSame($method_id, $this->language->getNegotiationMethodId());
+    $language_code = $this->randomMachineName(2);
+    $language = new Language(array('id' => $language_code, 'default' => TRUE));
+    $this->assertTrue($language->isDefault());
   }
 
   /**
@@ -114,17 +78,9 @@ public function testSortArrayOfLanguages(array $languages, array $expected) {
    *   An array of test data.
    */
   public function providerTestSortArrayOfLanguages() {
-    $language9A = new Language(array('id' => 'dd'));
-    $language9A->setName('A');
-    $language9A->setWeight(9);
-
-    $language10A = new Language(array('id' => 'ee'));
-    $language10A->setName('A');
-    $language10A->setWeight(10);
-
-    $language10B = new Language(array('id' => 'ff'));
-    $language10B->setName('B');
-    $language10B->setWeight(10);
+    $language9A = new Language(array('id' => 'dd', 'name' => 'A', 'weight' => 9));
+    $language10A = new Language(array('id' => 'ee', 'name' => 'A', 'weight' => 10));
+    $language10B = new Language(array('id' => 'ff', 'name' => 'B', 'weight' => 10));
 
     return array(
       // Set up data set #0, already ordered by weight.
