diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 7d23bb9..408b2bc 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -19,6 +19,7 @@
 use Drupal\Core\StringTranslation\Translator\FileTranslation;
 use Drupal\Core\Extension\ExtensionDiscovery;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
@@ -1548,30 +1549,14 @@ function install_import_translations(&$install_state) {
   include_once __DIR__ . '/../modules/locale/locale.bulk.inc';
 
   $langcode = $install_state['parameters']['langcode'];
-  $standard_languages = LanguageManager::getStandardLanguageList();
-  if (!isset($standard_languages[$langcode])) {
-    // Drupal does not know about this language, so we prefill its values with
-    // our best guess. The user will be able to edit afterwards.
-    $language = new Language(array(
-      'id' => $langcode,
-      'name' => $langcode,
-      'default' => TRUE,
-    ));
-    language_save($language);
-  }
-  else {
-    // A known predefined language, details will be filled in properly.
-    $language = new Language(array(
-      'id' => $langcode,
-      'default' => TRUE,
-    ));
-    language_save($language);
-  }
+  $language = ConfigurableLanguage::createFromLangcode($langcode);
+  $language->set('default', TRUE);
+  $language->save();
 
   // If a non-English language was selected, remove English and import the
   // translations.
   if ($langcode != 'en') {
-    language_delete('en');
+    entity_delete_multiple('configurable_language', array('en'));
 
     // Set up a batch to import translations for the newly added language.
     _install_prepare_import($langcode);
diff --git a/core/modules/aggregator/src/Tests/FeedLanguageTest.php b/core/modules/aggregator/src/Tests/FeedLanguageTest.php
index aabf111..ecf9030 100644
--- a/core/modules/aggregator/src/Tests/FeedLanguageTest.php
+++ b/core/modules/aggregator/src/Tests/FeedLanguageTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\aggregator\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests aggregator feeds in multiple languages.
@@ -34,13 +34,13 @@ protected function setUp() {
     parent::setUp();
 
     // Create test languages.
-    $this->langcodes = array(language_load('en'));
+    $this->langcodes = array(ConfigurableLanguage::load('en'));
     for ($i = 1; $i < 3; ++$i) {
-      $language = new Language(array(
+      $language = ConfigurableLanguage::create(array(
         'id' => 'l' . $i,
-        'name' => $this->randomString(),
+        'label' => $this->randomString(),
       ));
-      language_save($language);
+      $language->save();
       $this->langcodes[$i] = $language;
     }
   }
diff --git a/core/modules/basic_auth/src/Tests/Authentication/BasicAuthTest.php b/core/modules/basic_auth/src/Tests/Authentication/BasicAuthTest.php
index 7c79554..1c4a919 100644
--- a/core/modules/basic_auth/src/Tests/Authentication/BasicAuthTest.php
+++ b/core/modules/basic_auth/src/Tests/Authentication/BasicAuthTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\basic_auth\Tests\Authentication;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -119,8 +119,7 @@ function testPerUserLoginFloodControl() {
    * Tests compatibility with locale/UI translation.
    */
   function testLocale() {
-    $language = new Language(array('id' => 'de', 'default' => TRUE));
-    language_save($language);
+    ConfigurableLanguage::create(array('id' => 'de', 'label' => 'German', 'default' => TRUE))->save();
 
     $account = $this->drupalCreateUser();
 
diff --git a/core/modules/block/src/Tests/BlockLanguageCacheTest.php b/core/modules/block/src/Tests/BlockLanguageCacheTest.php
index d370072..432c387 100644
--- a/core/modules/block/src/Tests/BlockLanguageCacheTest.php
+++ b/core/modules/block/src/Tests/BlockLanguageCacheTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\block\Tests;
 
 use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -36,13 +36,13 @@ protected function setUp() {
     parent::setUp();
 
     // Create test languages.
-    $this->langcodes = array(language_load('en'));
+    $this->langcodes = array(ConfigurableLanguage::load('en'));
     for ($i = 1; $i < 3; ++$i) {
-      $language = new Language(array(
+      $language = ConfigurableLanguage::create(array(
         'id' => 'l' . $i,
-        'name' => $this->randomString(),
+        'label' => $this->randomString(),
       ));
-      language_save($language);
+      $language->save();
       $this->langcodes[$i] = $language;
     }
   }
diff --git a/core/modules/comment/src/Tests/Views/CommentFieldFilterTest.php b/core/modules/comment/src/Tests/Views/CommentFieldFilterTest.php
index 9632449..6139eb2 100644
--- a/core/modules/comment/src/Tests/Views/CommentFieldFilterTest.php
+++ b/core/modules/comment/src/Tests/Views/CommentFieldFilterTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\comment\Tests\Views;
 
-use Drupal\Core\Language\Language;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests comment field filters with translations.
@@ -40,17 +40,8 @@ function setUp() {
     parent::setUp();
 
     // Add two new languages.
-    $language = new Language(array(
-      'id' => 'fr',
-      'name' => 'French',
-    ));
-    language_save($language);
-
-    $language = new Language(array(
-      'id' => 'es',
-      'name' => 'Spanish',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Make the comment body field translatable. The title is already
     // translatable by definition.
diff --git a/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php b/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php
index 837ee47..1a95b3f 100644
--- a/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php
+++ b/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\DrupalUnitTestBase;
 
 /**
@@ -44,14 +44,8 @@ function testConfigLanguageOverride() {
     $raw = $config->getRawData();
     $this->assertIdentical($raw['foo'], 'bar');
 
-    language_save(new Language(array(
-      'name' => 'French',
-      'id' => 'fr',
-    )));
-    language_save(new Language(array(
-      'name' => 'German',
-      'id' => 'de',
-    )));
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('de')->save();
 
     \Drupal::languageManager()->setConfigOverrideLanguage(language_load('fr'));
     $config = \Drupal::config('config_test.system');
diff --git a/core/modules/config/src/Tests/ConfigLanguageOverrideWebTest.php b/core/modules/config/src/Tests/ConfigLanguageOverrideWebTest.php
index 2c5b9ef..82f4d37 100644
--- a/core/modules/config/src/Tests/ConfigLanguageOverrideWebTest.php
+++ b/core/modules/config/src/Tests/ConfigLanguageOverrideWebTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\config\Tests;
 
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -36,7 +37,7 @@ function testSiteNameTranslation() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -66,10 +67,11 @@ function testSiteNameTranslation() {
     // overrides still work.
     $language_manager = \Drupal::languageManager()->reset();
     $this->assertTrue($language_manager->isMultilingual(), 'The test site is multilingual.');
-    $language = \Drupal::languageManager()->getLanguage('xx');
-    $language->default = TRUE;
-    language_save($language);
-    language_delete('en');
+    $language = ConfigurableLanguage::load('xx');
+    $language->set('default', TRUE);
+    $language->save();
+
+    ConfigurableLanguage::load('en')->delete();
     $this->assertFalse($language_manager->isMultilingual(), 'The test site is monolingual.');
 
     $this->drupalGet('xx');
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationFormTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationFormTest.php
index 8a42151..da049df 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationFormTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationFormTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config_translation\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -45,8 +45,7 @@ protected function setUp() {
     $this->pluginId = key($definitions);
 
     $this->langcode = 'xx';
-    $language = new Language(array('id' => $this->langcode, 'name' => 'XX'));
-    language_save($language);
+    ConfigurableLanguage::create(array('id' => $this->langcode, 'label' => 'XX'))->save();
 
     \Drupal::state()->set('config_translation_test_alter_form_alter', TRUE);
   }
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
index 7f88fdc..3d7c0c3 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\config_translation\Tests;
 
 use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -325,8 +325,7 @@ public function doUserRoleListTest() {
   public function doLanguageListTest() {
     // Create a test language to decouple looking for translate operations
     // link so this does not test more than necessary.
-    $language = new Language(array('id' => 'ga', 'name' => 'Irish'));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('ga')->save();
 
     // Get the language listing.
     $this->drupalGet('admin/config/regional/language');
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php
index f14b92a..2864317 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\config_translation\Tests;
 
 use Drupal\Component\Utility\String;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -55,8 +55,7 @@ protected function setUp() {
 
     // Add languages.
     foreach ($this->langcodes as $langcode) {
-      $language = new Language(array('id' => $langcode));
-      language_save($language);
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
     $this->localeStorage = $this->container->get('locale.storage');
   }
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
index 22bcaaf..690beee 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Config\FileStorage;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -78,8 +79,7 @@ protected function setUp() {
 
     // Add languages.
     foreach ($this->langcodes as $langcode) {
-      $language = new Language(array('id' => $langcode));
-      language_save($language);
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
     $this->localeStorage = $this->container->get('locale.storage');
   }
@@ -570,7 +570,7 @@ public function testLocaleDBStorage() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => Language::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationUiThemeTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationUiThemeTest.php
index 7ed761f..bb39379 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationUiThemeTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationUiThemeTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config_translation\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -52,8 +52,7 @@ protected function setUp() {
 
     // Add languages.
     foreach ($this->langcodes as $langcode) {
-      $language = new Language(array('id' => $langcode));
-      language_save($language);
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
   }
 
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php b/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
index 9033d83..23c19bd 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\content_translation\Tests;
 
 use Drupal\Component\Serialization\Json;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\node\Entity\NodeType;
 use Drupal\simpletest\WebTestBase;
 
@@ -65,7 +65,7 @@ protected function setUp() {
     parent::setUp();
     // Set up an additional language.
     $this->langcodes = array(language_default()->id, 'es');
-    language_save(new Language(array('id' => 'es')));
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Create a content type.
     $this->bundle = $this->randomMachineName();
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationTestBase.php b/core/modules/content_translation/src/Tests/ContentTranslationTestBase.php
index 4c92719..f2fa13d 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationTestBase.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationTestBase.php
@@ -8,7 +8,7 @@
 namespace Drupal\content_translation\Tests;
 
 use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -101,7 +101,7 @@ protected function setUp() {
   protected function setupLanguages() {
     $this->langcodes = array('it', 'fr');
     foreach ($this->langcodes as $langcode) {
-      language_save(new Language(array('id' => $langcode)));
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
     array_unshift($this->langcodes, \Drupal::languageManager()->getDefaultLanguage()->id);
   }
diff --git a/core/modules/field/src/Tests/TranslationTest.php b/core/modules/field/src/Tests/TranslationTest.php
index 50c31aa..f37bdf6 100644
--- a/core/modules/field/src/Tests/TranslationTest.php
+++ b/core/modules/field/src/Tests/TranslationTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\field\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests multilanguage fields logic.
@@ -97,11 +97,10 @@ protected function setUp() {
     $this->instance->save();
 
     for ($i = 0; $i < 3; ++$i) {
-      $language = new Language(array(
+      ConfigurableLanguage::create(array(
         'id' => 'l' . $i,
-        'name' => $this->randomString(),
-      ));
-      language_save($language);
+        'label' => $this->randomString(),
+      ))->save();
     }
   }
 
diff --git a/core/modules/field/src/Tests/TranslationWebTest.php b/core/modules/field/src/Tests/TranslationWebTest.php
index 6646072..f3b3ead 100644
--- a/core/modules/field/src/Tests/TranslationWebTest.php
+++ b/core/modules/field/src/Tests/TranslationWebTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\field\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests multilanguage fields logic that require a full environment.
@@ -78,11 +78,10 @@ protected function setUp() {
       ->save();
 
     for ($i = 0; $i < 3; ++$i) {
-      $language = new Language(array(
+      ConfigurableLanguage::create(array(
         'id' => 'l' . $i,
-        'name' => $this->randomString(),
-      ));
-      language_save($language);
+        'label' => $this->randomString(),
+      ))->save();
     }
   }
 
diff --git a/core/modules/hal/src/Tests/NormalizerTestBase.php b/core/modules/hal/src/Tests/NormalizerTestBase.php
index 4ef6037..da9ca47 100644
--- a/core/modules/hal/src/Tests/NormalizerTestBase.php
+++ b/core/modules/hal/src/Tests/NormalizerTestBase.php
@@ -8,12 +8,12 @@
 namespace Drupal\hal\Tests;
 
 use Drupal\Core\Cache\MemoryBackend;
-use Drupal\Core\Language\Language;
 use Drupal\hal\Encoder\JsonEncoder;
 use Drupal\hal\Normalizer\ContentEntityNormalizer;
 use Drupal\hal\Normalizer\EntityReferenceItemNormalizer;
 use Drupal\hal\Normalizer\FieldItemNormalizer;
 use Drupal\hal\Normalizer\FieldNormalizer;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\rest\LinkManager\LinkManager;
 use Drupal\rest\LinkManager\RelationLinkManager;
 use Drupal\rest\LinkManager\TypeLinkManager;
@@ -66,19 +66,12 @@ protected function setUp() {
     $this->installEntitySchema('entity_test');
     $this->installConfig(array('field', 'language'));
 
-    // Add English as a language.
-    $english = new Language(array(
-      'id' => 'en',
-      'name' => 'English',
-    ));
-    language_save($english);
     // Add German as a language.
-    $german = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'de',
-      'name' => 'Deutsch',
+      'label' => 'Deutsch',
       'weight' => -1,
-    ));
-    language_save($german);
+    ))->save();
 
     // Create the test text field.
     entity_create('field_storage_config', array(
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index e095d8d..afe7665 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -6,11 +6,8 @@
  */
 
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\PhpStorage\PhpStorageFactory;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
-use Drupal\language\ConfigurableLanguageManager;
-use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUI;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
@@ -411,78 +408,6 @@ function language_get_default_langcode($entity_type, $bundle) {
 }
 
 /**
- * API function to add or update a language.
- *
- * @param $language
- *   Language object with properties corresponding to the 'language'
- *   configuration properties.
- */
-function language_save($language) {
-  $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();
-
-  // 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) {
-    // 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);
-  }
-  else {
-    \Drupal::logger('language')->notice('The %language (%langcode) language has been updated.', $t_args);
-  }
-
-  return $language;
-}
-
-/**
- * Delete a language.
- *
- * @param $langcode
- *   Language code of the language to be deleted.
- *
- * @return
- *   TRUE if language is successfully deleted. Otherwise FALSE.
- */
-function language_delete($langcode) {
-  $languages = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
-  if (isset($languages[$langcode]) && !$languages[$langcode]->locked) {
-    $language = $languages[$langcode];
-
-    // Remove the language.
-    entity_delete_multiple('configurable_language', array($language->id));
-
-    $language_manager = \Drupal::languageManager();
-    $language_manager->reset();
-    if ($language_manager instanceof ConfigurableLanguageManagerInterface) {
-      $language_manager->updateLockedLanguageWeights();
-    }
-
-    // If after deleting this language the site will become monolingual, we need
-    // to rebuild language services.
-    if (!\Drupal::languageManager()->isMultilingual()) {
-      ConfigurableLanguageManager::rebuildServices();
-    }
-
-    $t_args = array('%language' => $language->name, '%langcode' => $language->id);
-    \Drupal::logger('language')->notice('The %language (%langcode) language has been removed.', $t_args);
-    return TRUE;
-  }
-  return FALSE;
-}
-
-/**
  * Implements hook_language_types_info().
  *
  * Defines the three core language types:
@@ -679,10 +604,9 @@ function language_form_system_regional_settings_alter(&$form, FormStateInterface
  * @see language_form_system_regional_settings_alter()
  */
 function language_system_regional_settings_form_submit($form, FormStateInterface $form_state) {
-  $languages = \Drupal::languageManager()->getLanguages();
-  $language = $languages[$form_state->getValue('site_default_language')];
-  $language->default = TRUE;
-  language_save($language);
+  $default_language = ConfigurableLanguage::load($form_state->getValue('site_default_language'));
+  $default_language->set('default', TRUE);
+  $default_language->save();
 }
 
 /**
diff --git a/core/modules/language/src/Entity/ConfigurableLanguage.php b/core/modules/language/src/Entity/ConfigurableLanguage.php
index eda4d9a..d3b703a 100644
--- a/core/modules/language/src/Entity/ConfigurableLanguage.php
+++ b/core/modules/language/src/Entity/ConfigurableLanguage.php
@@ -10,6 +10,8 @@
 use Drupal\Core\Language\Language as LanguageObject;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\language\ConfigurableLanguageManager;
 use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\language\Exception\DeleteDefaultLanguageException;
 use Drupal\language\ConfigurableLanguageInterface;
@@ -187,6 +189,10 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
     if (!$this->preSaveMultilingual && !$update && $language_manager instanceof ConfigurableLanguageManagerInterface) {
       $language_manager::rebuildServices();
     }
+    if (!$update) {
+      // Install any available language configuration overrides for the language.
+      \Drupal::service('language.config_factory_override')->installLanguageOverrides($this->id());
+    }
   }
 
   /**
@@ -228,6 +234,23 @@ public static function preDelete(EntityStorageInterface $storage, array $entitie
   /**
    * {@inheritdoc}
    */
+  public static function postDelete(EntityStorageInterface $storage, array $entities) {
+    parent::postDelete($storage, $entities);
+    $language_manager = \Drupal::languageManager();
+    $language_manager->reset();
+    if ($language_manager instanceof ConfigurableLanguageManagerInterface) {
+      $language_manager->updateLockedLanguageWeights();
+    }
+    // If after deleting this language the site will become monolingual, we need
+    // to rebuild language services.
+    if (!\Drupal::languageManager()->isMultilingual()) {
+      ConfigurableLanguageManager::rebuildServices();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function get($property_name) {
     if ($property_name == 'default') {
       return $this->isDefault();
@@ -319,4 +342,34 @@ public function setNegotiationMethodId($method_id) {
     return $this;
   }
 
+  /**
+   * Creates a configurable language object from a langcode.
+   *
+   * @param string $langcode
+   *   The language code to use to create the object.
+   *
+   * @return $this
+   *
+   * @see \Drupal\Core\Language\LanguageManager::getStandardLanguageList()
+   */
+  public static function createFromLangcode($langcode) {
+    $standard_languages = LanguageManager::getStandardLanguageList();
+    if (!isset($standard_languages[$langcode])) {
+      // Drupal does not know about this language, so we set its values with the
+      // best guess. The user will be able to edit afterwards.
+      return static::create(array(
+        'id' => $langcode,
+        'label' => $langcode,
+      ));
+    }
+    else {
+      // A known predefined language, details will be filled in properly.
+      return static::create(array(
+        'id' => $langcode,
+        'label' => $standard_languages[$langcode][0],
+        'direction' => isset($standard_languages[$langcode][2]) ? $standard_languages[$langcode][2] : static::DIRECTION_LTR,
+      ));
+    }
+  }
+
 }
diff --git a/core/modules/language/src/Form/LanguageAddForm.php b/core/modules/language/src/Form/LanguageAddForm.php
index acef863..e228393 100644
--- a/core/modules/language/src/Form/LanguageAddForm.php
+++ b/core/modules/language/src/Form/LanguageAddForm.php
@@ -7,7 +7,10 @@
 
 namespace Drupal\language\Form;
 
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\language\Form\LanguageFormBase;
 use Drupal\Core\Language\Language;
 
@@ -50,7 +53,7 @@ public function form(array $form, FormStateInterface $form_state) {
         ),
       ),
       '#validate' => array('::validatePredefined'),
-      '#submit' => array('::submitForm'),
+      '#submit' => array('::submitForm', '::save'),
     );
 
     $custom_language_states_conditions = array(
@@ -66,14 +69,14 @@ public function form(array $form, FormStateInterface $form_state) {
     $form['custom_language']['langcode']['#states'] = array(
       'required' => $custom_language_states_conditions,
     );
-    $form['custom_language']['name']['#states'] = array(
+    $form['custom_language']['label']['#states'] = array(
       'required' => $custom_language_states_conditions,
     );
     $form['custom_language']['submit'] = array(
       '#type' => 'submit',
       '#value' => $this->t('Add custom language'),
       '#validate' => array('::validateCustom'),
-      '#submit' => array('::submitForm'),
+      '#submit' => array('::submitForm', '::save'),
     );
 
     return $form;
@@ -82,24 +85,12 @@ public function form(array $form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    $langcode = $form_state->getValue('predefined_langcode');
-    if ($langcode == 'custom') {
-      $langcode = $form_state->getValue('langcode');
-      // Custom language form.
-      $language = new Language(array(
-        'id' => $langcode,
-        'name' => $form_state->getValue('name'),
-        'direction' => $form_state->getValue('direction'),
-      ));
-    }
-    else {
-      $language = new Language(array('id' => $langcode));
-    }
-    // Save the language and inform the user that it happened.
-    $language = language_save($language);
+  public function save(array $form, FormStateInterface $form_state) {
+    parent::save($form, $form_state);
 
-    drupal_set_message($this->t('The language %language has been created and can now be used.', array('%language' => $language->name)));
+    $t_args = array('%language' => $this->entity->label(), '%langcode' => $this->entity->id());
+    $this->logger('language')->notice('The %language (%langcode) language has been created.', $t_args);
+    drupal_set_message($this->t('The language %language has been created and can now be used.', $t_args));
 
     // Tell the user they have the option to add a language switcher block
     // to their theme so they can switch between the languages.
@@ -148,4 +139,24 @@ public function validatePredefined($form, FormStateInterface $form_state) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state) {
+    $langcode = $form_state->getValue('predefined_langcode');
+    if ($langcode == 'custom') {
+      $langcode = $form_state->getValue('langcode');
+      $label = $form_state->getValue('label');
+      $direction = $form_state->getValue('direction');
+    }
+    else {
+      $standard_languages = LanguageManager::getStandardLanguageList();
+      $label = $standard_languages[$langcode][0];
+      $direction = isset($standard_languages[$langcode][2]) ? $standard_languages[$langcode][2] : ConfigurableLanguage::DIRECTION_LTR;
+    }
+    $entity->set('id', $langcode);
+    $entity->set('label', $label);
+    $entity->set('direction', $direction);
+  }
+
 }
diff --git a/core/modules/language/src/Form/LanguageDeleteForm.php b/core/modules/language/src/Form/LanguageDeleteForm.php
index a90ee03..5b1d2f6 100644
--- a/core/modules/language/src/Form/LanguageDeleteForm.php
+++ b/core/modules/language/src/Form/LanguageDeleteForm.php
@@ -107,13 +107,11 @@ public function buildForm(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    // @todo This should be replaced with $this->entity->delete() when the
-    //   additional logic in language_delete() is ported.
-    $success = language_delete($this->entity->id());
+    $this->entity->delete();
+    $t_args = array('%language' => $this->entity->label(), '%langcode' => $this->entity->id());
+    $this->logger('language')->notice('The %language (%langcode) language has been removed.', $t_args);
 
-    if ($success) {
-      drupal_set_message($this->t('The %language (%langcode) language has been removed.', array('%language' => $this->entity->label(), '%langcode' => $this->entity->id())));
-    }
+    drupal_set_message($this->t('The %language (%langcode) language has been removed.', $t_args));
 
     $form_state->setRedirectUrl($this->getCancelUrl());
   }
diff --git a/core/modules/language/src/Form/LanguageEditForm.php b/core/modules/language/src/Form/LanguageEditForm.php
index de2213a..58b9951 100644
--- a/core/modules/language/src/Form/LanguageEditForm.php
+++ b/core/modules/language/src/Form/LanguageEditForm.php
@@ -39,7 +39,7 @@ public function actions(array $form, FormStateInterface $form_state) {
       '#type' => 'submit',
       '#value' => $this->t('Save language'),
       '#validate' => array('::validateCommon'),
-      '#submit' => array('::submitForm'),
+      '#submit' => array('::submitForm', '::save'),
     );
     return $actions;
   }
@@ -47,16 +47,10 @@ public function actions(array $form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    // Prepare a language object for saving.
-    $languages = language_list();
-    $langcode = $form_state->getValue('langcode');
-    $language = $languages[$langcode];
-    $language->name = $form_state->getValue('name');
-    $language->direction = $form_state->getValue('direction');
-    language_save($language);
-
+  public function save(array $form, FormStateInterface $form_state) {
+    parent::save($form, $form_state);
     $form_state->setRedirect('language.admin_overview');
+    $this->logger('language')->notice('The %language (%langcode) language has been updated.', array('%language' => $this->entity->label(), '%langcode' => $this->entity->id()));
   }
 
 }
diff --git a/core/modules/language/src/Form/LanguageFormBase.php b/core/modules/language/src/Form/LanguageFormBase.php
index 2c14193..f463270 100644
--- a/core/modules/language/src/Form/LanguageFormBase.php
+++ b/core/modules/language/src/Form/LanguageFormBase.php
@@ -49,16 +49,17 @@ public static function create(ContainerInterface $container) {
    * Common elements of the language addition and editing form.
    */
   public function commonForm(array &$form) {
+    /** @var $language \Drupal\language\Entity\ConfigurableLanguage */
     $language = $this->entity;
-    if (isset($language->id)) {
+    if ($language->id()) {
       $form['langcode_view'] = array(
         '#type' => 'item',
         '#title' => $this->t('Language code'),
-        '#markup' => $language->id
+        '#markup' => $language->id()
       );
       $form['langcode'] = array(
         '#type' => 'value',
-        '#value' => $language->id
+        '#value' => $language->id()
       );
     }
     else {
@@ -72,11 +73,11 @@ public function commonForm(array &$form) {
         '#description' => $this->t('Use language codes as <a href="@w3ctags">defined by the W3C</a> for interoperability. <em>Examples: "en", "en-gb" and "zh-hant".</em>', array('@w3ctags' => 'http://www.w3.org/International/articles/language-tags/')),
       );
     }
-    $form['name'] = array(
+    $form['label'] = array(
       '#type' => 'textfield',
       '#title' => $this->t('Language name in English'),
       '#maxlength' => 64,
-      '#default_value' => $language->label,
+      '#default_value' => $language->label(),
       '#required' => TRUE,
     );
     $form['direction'] = array(
@@ -84,7 +85,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(
         LanguageInterface::DIRECTION_LTR => $this->t('Left to right'),
         LanguageInterface::DIRECTION_RTL => $this->t('Right to left'),
@@ -102,8 +103,8 @@ public function validateCommon(array $form, FormStateInterface $form_state) {
     if (!isset($form['langcode_view']) && preg_match('@[^a-zA-Z_-]@', $form_state->getValue('langcode'))) {
       $form_state->setErrorByName('langcode', $this->t('%field may only contain characters a-z, underscores, or hyphens.', array('%field' => $form['langcode']['#title'])));
     }
-    if ($form_state->getValue('name') != String::checkPlain($form_state->getValue('name'))) {
-      $form_state->setErrorByName('name', $this->t('%field cannot contain any markup.', array('%field' => $form['name']['#title'])));
+    if ($form_state->getValue('label') != String::checkPlain($form_state->getValue('label'))) {
+      $form_state->setErrorByName('label', $this->t('%field cannot contain any markup.', array('%field' => $form['label']['#title'])));
     }
   }
 
diff --git a/core/modules/language/src/Tests/Condition/LanguageConditionTest.php b/core/modules/language/src/Tests/Condition/LanguageConditionTest.php
index bb3ea54..882a154 100644
--- a/core/modules/language/src/Tests/Condition/LanguageConditionTest.php
+++ b/core/modules/language/src/Tests/Condition/LanguageConditionTest.php
@@ -7,9 +7,9 @@
 
 namespace Drupal\language\Tests\Condition;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\DrupalUnitTestBase;
 use Drupal\Core\Condition\ConditionManager;
-use Drupal\Core\Language\Language;
 
 /**
  * Tests that the language condition, provided by the language module, is
@@ -44,17 +44,8 @@ protected function setUp() {
     parent::setUp();
 
     $this->installConfig(array('language'));
-
-    // Setup English.
-    language_save(\Drupal::languageManager()->getDefaultLanguage());
-
     // Setup Italian.
-    $language = new Language(array(
-      'id' => 'it',
-      'name' => 'Italian',
-      'direction' => Language::DIRECTION_LTR,
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('it')->save();
 
     $this->manager = $this->container->get('plugin.manager.condition');
   }
diff --git a/core/modules/language/src/Tests/LanguageConfigOverrideImportTest.php b/core/modules/language/src/Tests/LanguageConfigOverrideImportTest.php
index 9220476..8e2f00e 100644
--- a/core/modules/language/src/Tests/LanguageConfigOverrideImportTest.php
+++ b/core/modules/language/src/Tests/LanguageConfigOverrideImportTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\language\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -28,10 +28,7 @@ class LanguageConfigOverrideImportTest extends WebTestBase {
    * Tests that language can be enabled and overrides are created during a sync.
    */
   public function testConfigOverrideImport() {
-    language_save(new Language(array(
-      'name' => 'French',
-      'id' => 'fr',
-    )));
+    ConfigurableLanguage::createFromLangcode('fr')->save();
     /* @var \Drupal\Core\Config\StorageInterface $staging */
     $staging = \Drupal::service('config.storage.staging');
     $this->copyConfig(\Drupal::service('config.storage'), $staging);
@@ -72,10 +69,8 @@ public function testConfigOverrideImportEvents() {
     \Drupal::moduleHandler()->install(array('config_events_test'));
     $this->rebuildContainer();
 
-    language_save(new Language(array(
-      'name' => 'French',
-      'id' => 'fr',
-    )));
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+
     /* @var \Drupal\Core\Config\StorageInterface $staging */
     $staging = \Drupal::service('config.storage.staging');
     $this->copyConfig(\Drupal::service('config.storage'), $staging);
diff --git a/core/modules/language/src/Tests/LanguageConfigOverrideInstallTest.php b/core/modules/language/src/Tests/LanguageConfigOverrideInstallTest.php
index 281ca3e..0364079 100644
--- a/core/modules/language/src/Tests/LanguageConfigOverrideInstallTest.php
+++ b/core/modules/language/src/Tests/LanguageConfigOverrideInstallTest.php
@@ -6,7 +6,7 @@
  */
 namespace Drupal\language\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -27,7 +27,7 @@ class LanguageConfigOverrideInstallTest extends KernelTestBase {
    * Tests the configuration events are not fired during install of overrides.
    */
   public function testLanguageConfigOverrideInstall() {
-    language_save(new Language(array('id' => 'de')));
+    ConfigurableLanguage::createFromLangcode('de')->save();
     // Need to enable test module after creating the language otherwise saving
     // the language will install the configuration.
     $this->enableModules(array('language_config_override_test'));
diff --git a/core/modules/language/src/Tests/LanguageConfigurationElementTest.php b/core/modules/language/src/Tests/LanguageConfigurationElementTest.php
index 635633c..4f3d880 100644
--- a/core/modules/language/src/Tests/LanguageConfigurationElementTest.php
+++ b/core/modules/language/src/Tests/LanguageConfigurationElementTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\language\Tests;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
-use Drupal\Core\Language\Language;
 
 /**
  * Tests the features of the language configuration element field.
@@ -62,11 +62,10 @@ public function testLanguageConfigurationElement() {
   public function testDefaultLangcode() {
     // Add some custom languages.
     foreach (array('aa', 'bb', 'cc') as $language_code) {
-      $language = new Language(array(
+      ConfigurableLanguage::create(array(
         'id' => $language_code,
-        'name' => $this->randomMachineName(),
-      ));
-      language_save($language);
+        'label' => $this->randomMachineName(),
+      ))->save();
     }
 
     // Fixed language.
@@ -85,11 +84,10 @@ public function testDefaultLangcode() {
     // Ensure the language entity default value is correct.
     $configurable_language = entity_load('configurable_language', $old_default->getId());
     $this->assertTrue($configurable_language->get('default'), 'The en language entity is flagged as the default language.');
-    $old_default->default = FALSE;
-    language_save($old_default);
-    $new_default = \Drupal::languageManager()->getLanguage('cc');
-    $new_default->default = TRUE;
-    language_save($new_default);
+
+    $new_default = ConfigurableLanguage::load('cc');
+    $new_default->set('default', TRUE);
+    $new_default->save();
     language_save_default_configuration('custom_type', 'custom_bundle', array('langcode' => 'site_default', 'language_show' => TRUE));
     $langcode = language_get_default_langcode('custom_type', 'custom_bundle');
     $this->assertEqual($langcode, 'cc');
diff --git a/core/modules/language/src/Tests/LanguageCustomLanguageConfigurationTest.php b/core/modules/language/src/Tests/LanguageCustomLanguageConfigurationTest.php
index a4c8a5d..bbad439 100644
--- a/core/modules/language/src/Tests/LanguageCustomLanguageConfigurationTest.php
+++ b/core/modules/language/src/Tests/LanguageCustomLanguageConfigurationTest.php
@@ -50,7 +50,7 @@ public function testLanguageConfiguration() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => 'white space',
-      'name' => '<strong>evil markup</strong>',
+      'label' => '<strong>evil markup</strong>',
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -62,7 +62,7 @@ public function testLanguageConfiguration() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => 'de',
-      'name' => 'German',
+      'label' => 'German',
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
 
@@ -70,7 +70,7 @@ public function testLanguageConfiguration() {
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
     $this->assertRaw(t(
       'The language %language has been created and can now be used.',
-      array('%language' => $edit['name'])
+      array('%language' => $edit['label'])
     ));
     $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
 
@@ -78,7 +78,7 @@ public function testLanguageConfiguration() {
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
     $this->assertRaw(t(
       'The language %language (%langcode) already exists.',
-      array('%language' => $edit['name'], '%langcode' => $edit['langcode'])
+      array('%language' => $edit['label'], '%langcode' => $edit['langcode'])
     ));
     $this->assertEqual($this->getUrl(), url('admin/config/regional/language/add', array('absolute' => TRUE)), 'Correct page redirection.');
   }
diff --git a/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php b/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php
index caed431..44776bb 100644
--- a/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php
+++ b/core/modules/language/src/Tests/LanguageDependencyInjectionTest.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\language\Exception\DeleteDefaultLanguageException;
 
 /**
@@ -39,17 +40,15 @@ function testDependencyInjectedNewLanguage() {
    * @see \Drupal\Core\Language\Language
    */
   function testDependencyInjectedNewDefaultLanguage() {
-    $default_language = \Drupal::languageManager()->getDefaultLanguage();
+    $default_language = ConfigurableLanguage::load(\Drupal::languageManager()->getDefaultLanguage()->getId());
     // Change the language default object to different values.
-    $new_language_default = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'fr',
-      'name' => 'French',
+      'label' => 'French',
       'direction' => Language::DIRECTION_LTR,
       'weight' => 0,
-      'method_id' => 'language-default',
       'default' => TRUE,
-    ));
-    language_save($new_language_default);
+    ))->save();
 
     // The language system creates a Language object which contains the
     // same properties as the new default language object.
@@ -58,7 +57,7 @@ function testDependencyInjectedNewDefaultLanguage() {
 
     // Delete the language to check that we fallback to the default.
     try {
-      language_delete('fr');
+      entity_delete_multiple('configurable_language', array('fr'));
       $this->fail('Expected DeleteDefaultLanguageException thrown.');
     }
     catch (DeleteDefaultLanguageException $e) {
@@ -66,8 +65,9 @@ function testDependencyInjectedNewDefaultLanguage() {
     }
 
     // Re-save the previous default language and the delete should work.
-    language_save($default_language);
-    language_delete('fr');
+    $default_language->set('default', TRUE);
+    $default_language->save();
+    entity_delete_multiple('configurable_language', array('fr'));
     $result = \Drupal::languageManager()->getCurrentLanguage();
     $this->assertIdentical($result->id, $default_language->id);
   }
diff --git a/core/modules/language/src/Tests/LanguageFallbackTest.php b/core/modules/language/src/Tests/LanguageFallbackTest.php
index b3d3672..c57df3d 100644
--- a/core/modules/language/src/Tests/LanguageFallbackTest.php
+++ b/core/modules/language/src/Tests/LanguageFallbackTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\language\Tests;
 
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the language fallback behavior.
@@ -25,11 +25,9 @@ protected function setUp() {
 
     $i = 0;
     foreach (array('af', 'am', 'ar') as $langcode) {
-      $language = new Language(array(
-        'id' => $langcode,
-        'weight' => $i--,
-      ));
-      language_save($language);
+      $language = ConfigurableLanguage::createFromLangcode($langcode);
+      $language->set('weight', $i--);
+      $language->save();
     }
   }
 
@@ -60,12 +58,13 @@ public function testCandidates() {
     $this->assertEqual(array_values($candidates), $expected, 'Language fallback candidates are alterable for specific operations.');
 
     // Check that when the site is monolingual no language fallback is applied.
-    $default_langcode = $this->languageManager->getDefaultLanguage()->id;
+    $langcodes_to_delete = array();
     foreach ($language_list as $langcode => $language) {
-      if ($langcode != $default_langcode) {
-        language_delete($langcode);
+      if (!$language->isDefault()) {
+        $langcodes_to_delete[] = $langcode;
       }
     }
+    entity_delete_multiple('configurable_language', $langcodes_to_delete);
     $candidates = $this->languageManager->getFallbackCandidates();
     $this->assertEqual(array_values($candidates), array(LanguageInterface::LANGCODE_DEFAULT), 'Language fallback is not applied when the Language module is not enabled.');
   }
diff --git a/core/modules/language/src/Tests/LanguageListTest.php b/core/modules/language/src/Tests/LanguageListTest.php
index e37573d..8d9c8dc 100644
--- a/core/modules/language/src/Tests/LanguageListTest.php
+++ b/core/modules/language/src/Tests/LanguageListTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\language\Tests;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
@@ -48,7 +49,7 @@ function testLanguageList() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => Language::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -79,7 +80,7 @@ function testLanguageList() {
     // Edit a language.
     $name = $this->randomMachineName(16);
     $edit = array(
-      'name' => $name,
+      'label' => $name,
     );
     $this->drupalPostForm('admin/config/regional/language/edit/' . $langcode, $edit, t('Save language'));
     $this->assertRaw($name, 'The language has been updated.');
@@ -132,7 +133,7 @@ function testLanguageList() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => Language::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -162,10 +163,10 @@ function testLanguageList() {
    */
   function testLanguageStates() {
     // Add some languages, and also lock some of them.
-    language_save(new Language(array('name' => $this->randomMachineName(), 'id' => 'l1')));
-    language_save(new Language(array('name' => $this->randomMachineName(), 'id' => 'l2', 'locked' => TRUE)));
-    language_save(new Language(array('name' => $this->randomMachineName(), 'id' => 'l3')));
-    language_save(new Language(array('name' => $this->randomMachineName(), 'id' => 'l4', 'locked' => TRUE)));
+    ConfigurableLanguage::create(array('label' => $this->randomMachineName(), 'id' => 'l1'))->save();
+    ConfigurableLanguage::create(array('label' => $this->randomMachineName(), 'id' => 'l2', 'locked' => TRUE))->save();
+    ConfigurableLanguage::create(array('label' => $this->randomMachineName(), 'id' => 'l3'))->save();
+    ConfigurableLanguage::create(array('label' => $this->randomMachineName(), 'id' => 'l4', 'locked' => TRUE))->save();
     $expected_locked_languages = array('l4' => 'l4', 'l2' => 'l2', 'und' => 'und', 'zxx' => 'zxx');
     $expected_all_languages = array('l4' => 'l4', 'l3' => 'l3', 'l2' => 'l2', 'l1' => 'l1', 'en' => 'en', 'und' => 'und', 'zxx' => 'zxx');
     $expected_conf_languages = array('l3' => 'l3', 'l1' => 'l1', 'en' => 'en');
diff --git a/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php b/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php
index ca0d558..76720e8 100644
--- a/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php
+++ b/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\language\Tests;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationBrowser;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationSelected;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
@@ -88,15 +89,10 @@ function testUILanguageNegotiation() {
     // is for some reason not found when doing translate search. This might
     // be some bug.
     $default_language = \Drupal::languageManager()->getDefaultLanguage();
-    $language = new Language(array(
-      'id' => $langcode_browser_fallback,
-      'default' => TRUE,
-    ));
-    language_save($language);
-    $language = new Language(array(
-      'id' => $langcode,
-    ));
-    language_save($language);
+    $language = ConfigurableLanguage::createFromLangcode($langcode_browser_fallback);
+    $language->set('default', TRUE);
+    $language->save();
+    ConfigurableLanguage::createFromLangcode($langcode)->save();
 
     // We will look for this string in the admin/config screen to see if the
     // corresponding translated string is shown.
@@ -108,7 +104,9 @@ function testUILanguageNegotiation() {
     // Now the t()'ed string is in db so switch the language back to default.
     // This will rebuild the container so we need to rebuild the container in
     // the test environment.
-    language_save($default_language);
+    $default_language = ConfigurableLanguage::load($default_language->getId());
+    $default_language->set('default', TRUE);
+    $default_language->save();
     \Drupal::config('language.negotiation')->set('url.prefixes.en', '')->save();
     $this->rebuildContainer();
 
@@ -349,10 +347,7 @@ protected function runTest($test) {
   function testUrlLanguageFallback() {
     // Add the Italian language.
     $langcode_browser_fallback = 'it';
-    $language = new Language(array(
-      'id' => $langcode_browser_fallback,
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode($langcode_browser_fallback)->save();
     $languages = $this->container->get('language_manager')->getLanguages();
 
     // Enable the path prefix for the default language: this way any unprefixed
@@ -400,11 +395,8 @@ function testUrlLanguageFallback() {
    */
   function testLanguageDomain() {
     // Add the Italian language.
-    $langcode = 'it';
-    $language = new Language(array(
-      'id' => $langcode,
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('it')->save();
+
     $languages = $this->container->get('language_manager')->getLanguages();
 
     // Enable browser and URL language detection.
diff --git a/core/modules/language/src/Tests/Views/LanguageTestBase.php b/core/modules/language/src/Tests/Views/LanguageTestBase.php
index 7c53a1c..39e0355 100644
--- a/core/modules/language/src/Tests/Views/LanguageTestBase.php
+++ b/core/modules/language/src/Tests/Views/LanguageTestBase.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\language\Tests\Views;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\views\Tests\ViewUnitTestBase;
-use Drupal\Core\Language\Language;
 
 /**
  * Defines the base class for all Language handler tests.
@@ -26,11 +26,8 @@ protected function setUp() {
     parent::setUp();
     $this->installConfig(array('language'));
 
-    // Create English and another language beside English.
-    $language = new Language(array('id' => 'en'));
-    language_save($language);
-    $language = new Language(array('id' => 'xx-lolspeak', 'name' => 'Lolspeak'));
-    language_save($language);
+    // Create another language beside English.
+    ConfigurableLanguage::create(array('id' => 'xx-lolspeak', 'label' => 'Lolspeak'))->save();
   }
 
   /**
diff --git a/core/modules/locale/src/Form/ImportForm.php b/core/modules/locale/src/Form/ImportForm.php
index 426187f..eda1567 100644
--- a/core/modules/locale/src/Form/ImportForm.php
+++ b/core/modules/locale/src/Form/ImportForm.php
@@ -10,8 +10,8 @@
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Language\Language;
 use Drupal\language\ConfigurableLanguageManagerInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -174,11 +174,9 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     // Add language, if not yet supported.
     $language = $this->languageManager->getLanguage($form_state->getValue('langcode'));
     if (empty($language)) {
-      $language = new Language(array(
-        'id' => $form_state->getValue('langcode'),
-      ));
-      $language = language_save($language);
-      drupal_set_message($this->t('The language %language has been created.', array('%language' => $this->t($language->name))));
+      $language = ConfigurableLanguage::createFromLangcode($form_state->getValue('langcode'));
+      $language->save();
+      drupal_set_message($this->t('The language %language has been created.', array('%language' => $this->t($language->label()))));
     }
     $options = array(
       'langcode' => $form_state->getValue('langcode'),
diff --git a/core/modules/locale/src/Tests/LocaleConfigManagerTest.php b/core/modules/locale/src/Tests/LocaleConfigManagerTest.php
index 80c5149..0395ddd 100644
--- a/core/modules/locale/src/Tests/LocaleConfigManagerTest.php
+++ b/core/modules/locale/src/Tests/LocaleConfigManagerTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\locale\Tests;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\locale\LocaleConfigManager;
-use Drupal\Core\Language\Language;
 use Drupal\Core\Config\StorageException;
 use Drupal\simpletest\DrupalUnitTestBase;
 
@@ -33,7 +33,8 @@ public function testHasTranslation() {
     $this->installConfig(array('locale_test'));
     $locale_config_manager = \Drupal::service('locale.config.typed');
 
-    $language = language_save(new Language(array('id' => 'de')));
+    $language = ConfigurableLanguage::createFromLangcode('de');
+    $language->save();
     $result = $locale_config_manager->hasTranslation('locale_test.no_translation', $language);
     $this->assertFalse($result, 'There is no translation for locale_test.no_translation configuration.');
 
diff --git a/core/modules/locale/src/Tests/LocaleConfigTranslationTest.php b/core/modules/locale/src/Tests/LocaleConfigTranslationTest.php
index a28f996..e97588a 100644
--- a/core/modules/locale/src/Tests/LocaleConfigTranslationTest.php
+++ b/core/modules/locale/src/Tests/LocaleConfigTranslationTest.php
@@ -52,7 +52,7 @@ public function testConfigTranslation() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/locale/src/Tests/LocaleContentTest.php b/core/modules/locale/src/Tests/LocaleContentTest.php
index 3ec3c71..3b8ba1a 100644
--- a/core/modules/locale/src/Tests/LocaleContentTest.php
+++ b/core/modules/locale/src/Tests/LocaleContentTest.php
@@ -75,7 +75,7 @@ public function testContentTypeLanguageConfiguration() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/locale/src/Tests/LocaleImportFunctionalTest.php b/core/modules/locale/src/Tests/LocaleImportFunctionalTest.php
index 2dd198d..ff993ef 100644
--- a/core/modules/locale/src/Tests/LocaleImportFunctionalTest.php
+++ b/core/modules/locale/src/Tests/LocaleImportFunctionalTest.php
@@ -297,7 +297,7 @@ public function testConfigPoFile() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $this->randomMachineName(16),
+      'label' => $this->randomMachineName(16),
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php b/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php
index 68dc3b0..99635a2 100644
--- a/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php
+++ b/core/modules/locale/src/Tests/LocaleLocaleLookupTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\locale\Tests;
 
 use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -31,15 +32,14 @@ public function setUp() {
     parent::setUp();
 
     // Change the language default object to different values.
-    $new_language_default = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'fr',
       'name' => 'French',
       'direction' => LANGUAGE::DIRECTION_LTR,
       'weight' => 0,
       'method_id' => 'language-default',
       'default' => TRUE,
-    ));
-    language_save($new_language_default);
+    ))->save();
     $this->drupalLogin($this->root_user);
   }
 
diff --git a/core/modules/locale/src/Tests/LocalePathTest.php b/core/modules/locale/src/Tests/LocalePathTest.php
index d9efbaa..ae4b9db 100644
--- a/core/modules/locale/src/Tests/LocalePathTest.php
+++ b/core/modules/locale/src/Tests/LocalePathTest.php
@@ -52,7 +52,7 @@ public function testPathLanguageConfiguration() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/locale/src/Tests/LocaleStringTest.php b/core/modules/locale/src/Tests/LocaleStringTest.php
index cabc838..c608d62 100644
--- a/core/modules/locale/src/Tests/LocaleStringTest.php
+++ b/core/modules/locale/src/Tests/LocaleStringTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\locale\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -40,8 +40,7 @@ protected function setUp() {
     $this->storage = $this->container->get('locale.storage');
     // Create two languages: Spanish and German.
     foreach (array('es', 'de') as $langcode) {
-      $language = new Language(array('id' => $langcode));
-      $languages[$langcode] = language_save($language);
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
   }
 
diff --git a/core/modules/locale/src/Tests/LocaleTranslationUiTest.php b/core/modules/locale/src/Tests/LocaleTranslationUiTest.php
index 1aed818..341f39d 100644
--- a/core/modules/locale/src/Tests/LocaleTranslationUiTest.php
+++ b/core/modules/locale/src/Tests/LocaleTranslationUiTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\locale\Tests;
 
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Component\Utility\String;
 
@@ -59,7 +59,7 @@ public function testStringTranslation() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -215,7 +215,7 @@ public function testJavaScriptTranslation() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -285,7 +285,7 @@ public function testStringValidation() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -335,7 +335,7 @@ public function testStringSearch() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -343,7 +343,7 @@ public function testStringSearch() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => 'yy',
-      'name' => $this->randomMachineName(16),
+      'label' => $this->randomMachineName(16),
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -462,8 +462,7 @@ public function testStringSearch() {
   public function testUICustomizedStrings() {
     $user = $this->drupalCreateUser(array('translate interface', 'administer languages', 'access administration pages'));
     $this->drupalLogin($user);
-    $language = new Language(array('id' => 'de'));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('de')->save();
 
     // Create test source string.
     $string = $this->container->get('locale.storage')->createString(array(
diff --git a/core/modules/locale/src/Tests/LocaleUpdateTest.php b/core/modules/locale/src/Tests/LocaleUpdateTest.php
index f564652..d72d112 100644
--- a/core/modules/locale/src/Tests/LocaleUpdateTest.php
+++ b/core/modules/locale/src/Tests/LocaleUpdateTest.php
@@ -411,7 +411,7 @@ public function testEnableCustomLanguage() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/menu_ui/src/Tests/MenuLanguageTest.php b/core/modules/menu_ui/src/Tests/MenuLanguageTest.php
index 9d93b45..f5d32f8 100644
--- a/core/modules/menu_ui/src/Tests/MenuLanguageTest.php
+++ b/core/modules/menu_ui/src/Tests/MenuLanguageTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\menu_ui\Tests;
 
 use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\system\Entity\Menu;
 
 /**
@@ -38,11 +38,10 @@ protected function setUp() {
 
     // Add some custom languages.
     foreach (array('aa', 'bb', 'cc', 'cs') as $language_code) {
-      $language = new Language(array(
+      ConfigurableLanguage::create(array(
         'id' => $language_code,
-        'name' => $this->randomMachineName(),
-      ));
-      language_save($language);
+        'label' => $this->randomMachineName(),
+      ))->save();
     }
   }
 
@@ -151,10 +150,10 @@ function testMenuLanguageRemovedEnglish() {
 
     // Remove English language. To do that another language has to be set as
     // default.
-    $language = language_load('cs');
-    $language->default = TRUE;
-    language_save($language);
-    language_delete('en');
+    $language = ConfigurableLanguage::load('cs');
+    $language->set('default', TRUE);
+    $language->save();
+    entity_delete_multiple('configurable_language', array('en'));
 
     // Save the menu again and check if the language is still the same.
     $this->drupalPostForm("admin/structure/menu/manage/$menu_name", array(), t('Save'));
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php b/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
index 5252a35..0ae66c0 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\node\Tests;
 
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests node access functionality with multiple languages and two node access
@@ -78,14 +78,8 @@ protected function setUp() {
     node_access_rebuild();
 
     // Add Hungarian and Catalan.
-    $language = new Language(array(
-      'id' => 'hu',
-    ));
-    language_save($language);
-    $language = new Language(array(
-      'id' => 'ca',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('hu')->save();
+    ConfigurableLanguage::createFromLangcode('ca')->save();
 
     // Create a normal authenticated user.
     $this->web_user = $this->drupalCreateUser(array('access content'));
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php b/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
index 77ba270..618a5e9 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\node\Tests;
 
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests node_access and db_select() with node_access tag functionality with
@@ -76,14 +76,8 @@ protected function setUp() {
     $this->admin_user = user_load(1);
 
     // Add Hungarian and Catalan.
-    $language = new Language(array(
-      'id' => 'hu',
-    ));
-    language_save($language);
-    $language = new Language(array(
-      'id' => 'ca',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('hu')->save();
+    ConfigurableLanguage::createFromLangcode('ca')->save();
 
     // The node_access_test_language module allows individual translations of a
     // node to be marked private (not viewable by normal users).
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageTest.php b/core/modules/node/src/Tests/NodeAccessLanguageTest.php
index 6aeaf75..aa29d40 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\node\Tests;
 
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests node_access and db_select() with node_access tag functionality with
@@ -36,19 +36,10 @@ protected function setUp() {
     // Enable the private node feature of the node_access_test module.
     \Drupal::state()->set('node_access_test.private', TRUE);
 
-    // Add Hungarian and Catalan.
-    $language = new Language(array(
-      'id' => 'hu',
-    ));
-    language_save($language);
-    $language = new Language(array(
-      'id' => 'ca',
-    ));
-    language_save($language);
-    $language = new Language(array(
-      'id' => 'hr',
-    ));
-    language_save($language);
+    // Add Hungarian, Catalan and Croatian.
+    ConfigurableLanguage::createFromLangcode('hu')->save();
+    ConfigurableLanguage::createFromLangcode('ca')->save();
+    ConfigurableLanguage::createFromLangcode('hr')->save();
   }
 
   /**
diff --git a/core/modules/node/src/Tests/NodeFieldMultilingualTest.php b/core/modules/node/src/Tests/NodeFieldMultilingualTest.php
index ad65a3f..8649a35 100644
--- a/core/modules/node/src/Tests/NodeFieldMultilingualTest.php
+++ b/core/modules/node/src/Tests/NodeFieldMultilingualTest.php
@@ -8,9 +8,9 @@
 namespace Drupal\node\Tests;
 
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
 use Drupal\simpletest\WebTestBase;
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
 
 /**
@@ -38,11 +38,7 @@ protected function setUp() {
     $this->drupalLogin($admin_user);
 
     // Add a new language.
-    $language = new Language(array(
-      'id' => 'it',
-      'name' => 'Italian',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('it')->save();
 
     // Enable URL language detection and selection.
     $edit = array('language_interface[enabled][language-url]' => '1');
diff --git a/core/modules/node/src/Tests/NodeViewLanguageTest.php b/core/modules/node/src/Tests/NodeViewLanguageTest.php
index dbb07ae..733b10d 100644
--- a/core/modules/node/src/Tests/NodeViewLanguageTest.php
+++ b/core/modules/node/src/Tests/NodeViewLanguageTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\node\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the node language extra field display.
@@ -28,8 +28,7 @@ class NodeViewLanguageTest extends NodeTestBase {
    */
   public function testViewLanguage() {
     // Add Spanish language.
-    $language = new Language(array('id' => 'es'));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Set language field visible.
     entity_get_display('node', 'page', 'full')
diff --git a/core/modules/node/src/Tests/Views/NodeFieldFilterTest.php b/core/modules/node/src/Tests/Views/NodeFieldFilterTest.php
index 9460c7b..62f4034 100644
--- a/core/modules/node/src/Tests/Views/NodeFieldFilterTest.php
+++ b/core/modules/node/src/Tests/Views/NodeFieldFilterTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\node\Tests\Views;
 
-use Drupal\Core\Language\Language;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests node field filters with translations.
@@ -45,17 +45,8 @@ function setUp() {
     }
 
     // Add two new languages.
-    $language = new Language(array(
-      'id' => 'fr',
-      'name' => 'French',
-    ));
-    language_save($language);
-
-    $language = new Language(array(
-      'id' => 'es',
-      'name' => 'Spanish',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Make the body field translatable. The title is already translatable by
     // definition.
diff --git a/core/modules/node/src/Tests/Views/NodeLanguageTest.php b/core/modules/node/src/Tests/Views/NodeLanguageTest.php
index 8300ad0..290d9d8 100644
--- a/core/modules/node/src/Tests/Views/NodeLanguageTest.php
+++ b/core/modules/node/src/Tests/Views/NodeLanguageTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\node\Tests\Views;
 
-use Drupal\Core\Language\Language;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests node language fields, filters, and sorting.
@@ -48,17 +48,8 @@ protected function setUp() {
     }
 
     // Add two new languages.
-    $language = new Language(array(
-      'id' => 'fr',
-      'name' => 'French',
-    ));
-    language_save($language);
-
-    $language = new Language(array(
-      'id' => 'es',
-      'name' => 'Spanish',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Make the body field translatable. The title is already translatable by
     // definition.
diff --git a/core/modules/search/src/Tests/SearchLanguageTest.php b/core/modules/search/src/Tests/SearchLanguageTest.php
index 8b76a90..5dbd988 100644
--- a/core/modules/search/src/Tests/SearchLanguageTest.php
+++ b/core/modules/search/src/Tests/SearchLanguageTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\search\Tests;
 
-use Drupal\Core\Language\Language;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests advanced search with different languages added.
@@ -32,11 +32,7 @@ protected function setUp() {
     $this->drupalLogin($test_user);
 
     // Add a new language.
-    $language = new Language(array(
-      'id' => 'es',
-      'name' => 'Spanish',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Make the body field translatable. The title is already translatable by
     // definition. The parent class has already created the article and page
diff --git a/core/modules/search/src/Tests/SearchMultilingualEntityTest.php b/core/modules/search/src/Tests/SearchMultilingualEntityTest.php
index 0e1e543..832200e 100644
--- a/core/modules/search/src/Tests/SearchMultilingualEntityTest.php
+++ b/core/modules/search/src/Tests/SearchMultilingualEntityTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\search\Tests;
 
-use Drupal\Core\Language\Language;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests entities with multilingual fields.
@@ -51,17 +51,8 @@ protected function setUp() {
     $this->assertIndexCounts(0, 0, 'before adding nodes');
 
     // Add two new languages.
-    $language = new Language(array(
-      'id' => 'hu',
-      'name' => 'Hungarian',
-    ));
-    language_save($language);
-
-    $language = new Language(array(
-      'id' => 'sv',
-      'name' => 'Swedish',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('hu')->save();
+    ConfigurableLanguage::createFromLangcode('sv')->save();
 
     // Make the body field translatable. The title is already translatable by
     // definition. The parent class has already created the article and page
diff --git a/core/modules/system/src/Tests/Common/FormatDateTest.php b/core/modules/system/src/Tests/Common/FormatDateTest.php
index dd42c35..9c75f29 100644
--- a/core/modules/system/src/Tests/Common/FormatDateTest.php
+++ b/core/modules/system/src/Tests/Common/FormatDateTest.php
@@ -7,8 +7,7 @@
 
 namespace Drupal\system\Tests\Common;
 
-use Drupal\Core\Language\Language;
-use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -49,8 +48,7 @@ protected function setUp() {
       'Long month name' => array('March' => 'marzo'),
     ));
 
-    $language = new Language(array('id' => static::LANGCODE));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode(static::LANGCODE)->save();
     $this->resetAll();
   }
 
@@ -98,8 +96,9 @@ function testFormatDate() {
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London', 'en'), 'Monday, 26-Mar-07 01:00:00 BST', 'Test a different time zone.');
 
     // Change the default language and timezone.
-    $language = new Language(array('id' => static::LANGCODE, 'name' => self::LANGCODE, 'default' => TRUE));
-    language_save($language);
+    $language = ConfigurableLanguage::load(static::LANGCODE);
+    $language->set('default', TRUE);
+    $language->save();
     date_default_timezone_set('America/Los_Angeles');
 
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Sunday, 25-Mar-07 17:00:00 PDT', 'Test a different language.');
diff --git a/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php b/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php
index fa3b2b2..76e87f4 100644
--- a/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php
@@ -7,10 +7,10 @@
 
 namespace Drupal\system\Tests\Entity;
 
-use Drupal\Core\Language\Language;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Access\AccessibleInterface;
 use Drupal\Core\Entity\EntityAccessControlHandler;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the entity access control handler.
@@ -97,11 +97,10 @@ function testEntityTranslationAccess() {
 
     // Create two test languages.
     foreach (array('foo', 'bar') as $langcode) {
-      $language = new Language(array(
+      ConfigurableLanguage::create(array(
         'id' => $langcode,
-        'name' => $this->randomString(),
-      ));
-      language_save($language);
+        'label' => $this->randomString(),
+      ))->save();
     }
 
     $entity = entity_create('entity_test', array(
diff --git a/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php b/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php
index 21f1c56..bdb5dda 100644
--- a/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\system\Tests\Entity;
 
-use Drupal\Core\Language\Language;
 use Drupal\field\Entity\FieldInstanceConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Base class for language-aware entity tests.
@@ -111,13 +111,13 @@ protected function setUp() {
     // Create test languages.
     $this->langcodes = array();
     for ($i = 0; $i < 3; ++$i) {
-      $language = new Language(array(
+      $language = ConfigurableLanguage::create(array(
         'id' => 'l' . $i,
-        'name' => $this->randomString(),
+        'label' => $this->randomString(),
         'weight' => $i,
       ));
-      $this->langcodes[$i] = $language->id;
-      language_save($language);
+      $this->langcodes[$i] = $language->id();
+      $language->save();
     }
   }
 
diff --git a/core/modules/system/src/Tests/Entity/EntityQueryTest.php b/core/modules/system/src/Tests/Entity/EntityQueryTest.php
index 182ca05..c07cadc 100644
--- a/core/modules/system/src/Tests/Entity/EntityQueryTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityQueryTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\system\Tests\Entity;
 
 use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
@@ -105,21 +105,8 @@ protected function setUp() {
       'format' => 'format-pl'
     ));
     // Make these languages available to the greetings field.
-    $langcode = new Language(array(
-      'id' => 'en',
-      'name' => $this->randomString(),
-    ));
-    language_save($langcode);
-    $langcode = new Language(array(
-      'id' => 'tr',
-      'name' => $this->randomString(),
-    ));
-    language_save($langcode);
-    $langcode = new Language(array(
-      'id' => 'pl',
-      'name' => $this->randomString(),
-    ));
-    language_save($langcode);
+    ConfigurableLanguage::createFromLangcode('tr')->save();
+    ConfigurableLanguage::createFromLangcode('pl')->save();
     // Calculate the cartesian product of the unit array by looking at the
     // bits of $i and add the unit at the bits that are 1. For example,
     // decimal 13 is binary 1101 so unit 3,2 and 0 will be added to the
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
index 32a154d..f670d00 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
@@ -9,8 +9,8 @@
 
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
-use Drupal\Core\Language\Language;
 
 /**
  * Tests entity translation form.
@@ -36,12 +36,12 @@ protected function setUp() {
     // Create test languages.
     $this->langcodes = array();
     for ($i = 0; $i < 2; ++$i) {
-      $language = new Language(array(
+      $language = ConfigurableLanguage::create(array(
         'id' => 'l' . $i,
-        'name' => $this->randomString(),
+        'label' => $this->randomString(),
       ));
-      $this->langcodes[$i] = $language->id;
-      language_save($language);
+      $this->langcodes[$i] = $language->id();
+      $language->save();
     }
   }
 
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
index 1cb7c82..6f9b011 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\entity_test\Entity\EntityTestMulRev;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests entity translation functionality.
@@ -477,8 +478,9 @@ function testLanguageFallback() {
 
     // Check that language fallback respects language weight by default.
     $languages = $this->languageManager->getLanguages();
-    $languages[$langcode]->weight = -1;
-    language_save($languages[$langcode]);
+    $language = ConfigurableLanguage::load($languages[$langcode]->getId());
+    $language->set('weight', -1);
+    $language->save();
     $translation = $this->entityManager->getTranslationFromContext($entity, $langcode2);
     $this->assertEqual($translation->language()->id, $langcode, 'The current translation language matches the expected one.');
 
diff --git a/core/modules/system/src/Tests/Form/LanguageSelectElementTest.php b/core/modules/system/src/Tests/Form/LanguageSelectElementTest.php
index be393be..2f4408a 100644
--- a/core/modules/system/src/Tests/Form/LanguageSelectElementTest.php
+++ b/core/modules/system/src/Tests/Form/LanguageSelectElementTest.php
@@ -9,8 +9,8 @@
 
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
-use Drupal\Core\Language\Language;
 
 /**
  * Tests that the language select form element prints and submits the right
@@ -32,17 +32,15 @@ class LanguageSelectElementTest extends WebTestBase {
    */
   function testLanguageSelectElementOptions() {
     // Add some languages.
-    $language = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'aaa',
-      'name' => $this->randomMachineName(),
-    ));
-    language_save($language);
+      'label' => $this->randomMachineName(),
+    ))->save();
 
-    $language = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'bbb',
-      'name' => $this->randomMachineName(),
-    ));
-    language_save($language);
+      'label' => $this->randomMachineName(),
+    ))->save();
 
     \Drupal::languageManager()->reset();
 
diff --git a/core/modules/system/src/Tests/Theme/TwigTransTest.php b/core/modules/system/src/Tests/Theme/TwigTransTest.php
index 10adc3b..98a6e9f 100644
--- a/core/modules/system/src/Tests/Theme/TwigTransTest.php
+++ b/core/modules/system/src/Tests/Theme/TwigTransTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\system\Tests\Theme;
 
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -69,9 +70,9 @@ protected function setUp() {
     $this->installLanguages();
 
     // Assign Lolspeak (xx) to be the default language.
-    $language = \Drupal::languageManager()->getLanguage('xx');
-    $language->default = TRUE;
-    language_save($language);
+    $language = ConfigurableLanguage::load('xx');
+    $language->set('default', TRUE);
+    $language->save();
     $this->rebuildContainer();
 
     // Check that lolspeak is the default language for the site.
@@ -218,7 +219,7 @@ protected function installLanguages() {
         $edit = array(
           'predefined_langcode' => 'custom',
           'langcode' => $langcode,
-          'name' => $name,
+          'label' => $name,
           'direction' => LanguageInterface::DIRECTION_LTR,
         );
 
diff --git a/core/modules/taxonomy/src/Tests/TermLanguageTest.php b/core/modules/taxonomy/src/Tests/TermLanguageTest.php
index 030dd7e..be67e5d 100644
--- a/core/modules/taxonomy/src/Tests/TermLanguageTest.php
+++ b/core/modules/taxonomy/src/Tests/TermLanguageTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\taxonomy\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the language functionality for the taxonomy terms.
@@ -30,11 +30,10 @@ protected function setUp() {
 
     // Add some custom languages.
     foreach (array('aa', 'bb', 'cc') as $language_code) {
-      $language = new Language(array(
+      ConfigurableLanguage::create(array(
         'id' => $language_code,
-        'name' => $this->randomMachineName(),
-      ));
-      language_save($language);
+        'label' => $this->randomMachineName(),
+      ))->save();
     }
   }
 
@@ -96,12 +95,9 @@ function testDefaultTermLanguage() {
 
     // Change the default language of the site and check if the default terms
     // language is still correctly selected.
-    $old_default = \Drupal::languageManager()->getDefaultLanguage();
-    $old_default->default = FALSE;
-    language_save($old_default);
-    $new_default = \Drupal::languageManager()->getLanguage('cc');
-    $new_default->default = TRUE;
-    language_save($new_default);
+    $new_default = ConfigurableLanguage::load('cc');
+    $new_default->set('default', TRUE);
+    $new_default->save();
     $edit = array(
       'default_language[langcode]' => 'site_default',
       'default_language[language_show]' => TRUE,
diff --git a/core/modules/taxonomy/src/Tests/Views/TaxonomyFieldFilterTest.php b/core/modules/taxonomy/src/Tests/Views/TaxonomyFieldFilterTest.php
index c1d7065..aa253a2 100644
--- a/core/modules/taxonomy/src/Tests/Views/TaxonomyFieldFilterTest.php
+++ b/core/modules/taxonomy/src/Tests/Views/TaxonomyFieldFilterTest.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\taxonomy\Tests\Views;
 
-use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\views\Tests\ViewTestBase;
 use Drupal\views\Tests\ViewTestData;
 
@@ -42,17 +42,8 @@ function setUp() {
     parent::setUp();
 
     // Add two new languages.
-    $language = new Language(array(
-      'id' => 'fr',
-      'name' => 'French',
-    ));
-    language_save($language);
-
-    $language = new Language(array(
-      'id' => 'es',
-      'name' => 'Spanish',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Set up term names.
     $this->term_names = array(
diff --git a/core/modules/taxonomy/src/Tests/VocabularyLanguageTest.php b/core/modules/taxonomy/src/Tests/VocabularyLanguageTest.php
index 5728a8a..0b400e7 100644
--- a/core/modules/taxonomy/src/Tests/VocabularyLanguageTest.php
+++ b/core/modules/taxonomy/src/Tests/VocabularyLanguageTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\taxonomy\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the language functionality for vocabularies.
@@ -26,17 +26,15 @@ protected function setUp() {
     $this->drupalLogin($this->admin_user);
 
     // Add some custom languages.
-    $language = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'aa',
-      'name' => $this->randomMachineName(),
-    ));
-    language_save($language);
+      'label' => $this->randomMachineName(),
+    ))->save();
 
-    $language = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'bb',
-      'name' => $this->randomMachineName(),
-    ));
-    language_save($language);
+      'label' => $this->randomMachineName(),
+    ))->save();
   }
 
   /**
diff --git a/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php b/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php
index 151297b..fefb74b 100644
--- a/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php
+++ b/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php
@@ -357,7 +357,7 @@ function testLocaleTranslationSubtreesHashCacheClear() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -443,7 +443,7 @@ function testSubtreesJsonRequest() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
@@ -468,7 +468,7 @@ function testLanguageSwitching() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/tour/src/Tests/TourTest.php b/core/modules/tour/src/Tests/TourTest.php
index 5608a4f..47a05d5 100644
--- a/core/modules/tour/src/Tests/TourTest.php
+++ b/core/modules/tour/src/Tests/TourTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\tour\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the functionality of tour tips.
@@ -86,7 +86,7 @@ public function testTourFunctionality() {
 
     // Enable Italian language and navigate to it/tour-test1 and verify italian
     // version of tip is found.
-    language_save(new Language(array('id' => 'it')));
+    ConfigurableLanguage::createFromLangcode('it')->save();
     $this->drupalGet('it/tour-test-1');
 
     $elements = $this->cssSelect("li[data-id=tour-test-1] h2:contains('La pioggia cade in spagna')");
@@ -95,8 +95,6 @@ public function testTourFunctionality() {
     $elements = $this->cssSelect("li[data-id=tour-test-2] h2:contains('The quick brown fox')");
     $this->assertNotEqual(count($elements), 1, 'Did not find English variant of tip 1.');
 
-    language_save(new Language(array('id' => 'en')));
-
     // Programmatically create a tour for use through the remainder of the test.
     $tour = entity_create('tour', array(
       'id' => 'tour-entity-create-test-en',
diff --git a/core/modules/user/src/Tests/UserAdminLanguageTest.php b/core/modules/user/src/Tests/UserAdminLanguageTest.php
index 1c9cf18..5ef37ab 100644
--- a/core/modules/user/src/Tests/UserAdminLanguageTest.php
+++ b/core/modules/user/src/Tests/UserAdminLanguageTest.php
@@ -180,7 +180,7 @@ function addCustomLanguage() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/user/src/Tests/UserLanguageCreationTest.php b/core/modules/user/src/Tests/UserLanguageCreationTest.php
index a7558d9..65e37f9 100644
--- a/core/modules/user/src/Tests/UserLanguageCreationTest.php
+++ b/core/modules/user/src/Tests/UserLanguageCreationTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\user\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -35,8 +35,7 @@ function testLocalUserCreation() {
 
     // Add predefined language.
     $langcode = 'fr';
-    $language = new Language(array('id' => $langcode));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode($langcode)->save();
 
     // Set language negotiation.
     $edit = array(
diff --git a/core/modules/user/src/Tests/UserLanguageTest.php b/core/modules/user/src/Tests/UserLanguageTest.php
index 650d823..550aeff 100644
--- a/core/modules/user/src/Tests/UserLanguageTest.php
+++ b/core/modules/user/src/Tests/UserLanguageTest.php
@@ -42,7 +42,7 @@ function testUserLanguageConfiguration() {
     $edit = array(
       'predefined_langcode' => 'custom',
       'langcode' => $langcode,
-      'name' => $name,
+      'label' => $name,
       'direction' => LanguageInterface::DIRECTION_LTR,
     );
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
diff --git a/core/modules/user/src/Tests/UserTokenReplaceTest.php b/core/modules/user/src/Tests/UserTokenReplaceTest.php
index 2c9ff11..315c4ae 100644
--- a/core/modules/user/src/Tests/UserTokenReplaceTest.php
+++ b/core/modules/user/src/Tests/UserTokenReplaceTest.php
@@ -8,8 +8,8 @@
 namespace Drupal\user\Tests;
 
 use Drupal\Component\Utility\String;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
-use Drupal\Core\Language\Language;
 
 /**
  * Generates text using placeholders for dummy content to check user token
@@ -28,10 +28,7 @@ class UserTokenReplaceTest extends WebTestBase {
 
   protected function setUp() {
     parent::setUp();
-    $language = new Language(array(
-      'id' => 'de',
-    ));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('de')->save();
   }
 
   /**
diff --git a/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php b/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
index 7dbc987..f53b53e 100644
--- a/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
+++ b/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\views\Tests\Entity;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\node\Entity\NodeType;
 use Drupal\views\Tests\ViewUnitTestBase;
 use Drupal\views\Views;
@@ -59,8 +59,7 @@ protected function setUp() {
     for ($i = 0; $i < 2; $i++) {
       $langcode = 'l' . $i;
       $this->langcodes[] = $langcode;
-      $language = new Language(array('id' => $langcode));
-      language_save($language);
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
 
     // Make sure we do not try to render non-existing user data.
diff --git a/core/modules/views/src/Tests/SearchMultilingualTest.php b/core/modules/views/src/Tests/SearchMultilingualTest.php
index e66ce54..ee8f20b 100644
--- a/core/modules/views/src/Tests/SearchMultilingualTest.php
+++ b/core/modules/views/src/Tests/SearchMultilingualTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\views\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests search integration filters with multilingual nodes.
@@ -40,7 +40,7 @@ public function testMultilingualSearchFilter() {
     $this->drupalLogin($user);
 
     // Add Spanish language programmatically.
-    language_save(new Language(array('id' => 'es')));
+    ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Create a content type and make it translatable.
     $type = $this->drupalCreateContentType();
diff --git a/core/modules/views/src/Tests/Wizard/WizardPluginBaseUnitTest.php b/core/modules/views/src/Tests/Wizard/WizardPluginBaseUnitTest.php
index 07d0783..dd7f6c0 100644
--- a/core/modules/views/src/Tests/Wizard/WizardPluginBaseUnitTest.php
+++ b/core/modules/views/src/Tests/Wizard/WizardPluginBaseUnitTest.php
@@ -8,7 +8,7 @@
 namespace Drupal\views\Tests\Wizard;
 
 use Drupal\Core\Form\FormState;
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\views\Tests\ViewUnitTestBase;
 use Drupal\views_ui\ViewUI;
 
@@ -56,12 +56,11 @@ public function testCreateView() {
     $random_description = $this->randomMachineName();
 
     // Add a new language and mark it as default.
-    $language = new Language(array(
+    ConfigurableLanguage::create(array(
       'id' => 'it',
-      'name' => 'Italian',
+      'label' => 'Italian',
       'default' => TRUE,
-    ));
-    language_save($language);
+    ))->save();
 
     $form_state->setValues([
       'id' => $random_id,
diff --git a/core/modules/views_ui/src/Tests/StorageTest.php b/core/modules/views_ui/src/Tests/StorageTest.php
index 9204799..73fe632 100644
--- a/core/modules/views_ui/src/Tests/StorageTest.php
+++ b/core/modules/views_ui/src/Tests/StorageTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\views_ui\Tests;
 
-use Drupal\Core\Language\Language;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\views\Views;
 
 /**
@@ -39,8 +39,7 @@ class StorageTest extends UITestBase {
   public function testDetails() {
     $view_name = 'test_view';
 
-    $language = new Language(array('name' => 'French', 'id' => 'fr'));
-    language_save($language);
+    ConfigurableLanguage::createFromLangcode('fr')->save();
 
     $edit = array(
       'label' => $this->randomMachineName(),
