diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 36a0627..c9a874f 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -20,7 +20,7 @@
 use Symfony\Component\DependencyInjection\Exception\RuntimeException as DependencyInjectionRuntimeException;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Lock\DatabaseLockBackend;
 use Drupal\Core\Lock\LockBackendInterface;
 use Drupal\Core\Session\AnonymousUserSession;
@@ -1910,14 +1910,14 @@ function language($type) {
  *   It can be: Language::STATE_CONFIGURABLE, Language::STATE_LOCKED,
  *   Language::STATE_ALL.
  *
- * @return array
+ * @return \Drupal\Core\Language\LanguageInterface[]
  *   An associative array of languages, keyed by the language code, ordered by
  *   weight ascending and name ascending.
  *
  * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
  *   Use \Drupal::languageManager()->getLanguages().
  */
-function language_list($flags = Language::STATE_CONFIGURABLE) {
+function language_list($flags = LanguageInterface::STATE_CONFIGURABLE) {
   return \Drupal::languageManager()->getLanguages($flags);
 }
 
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 658c1b6..a60844e 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -672,7 +672,7 @@ function filter_xss_bad_protocol($string) {
  * Arbitrary elements may be added using the $args associative array.
  */
 function format_rss_channel($title, $link, $description, $items, $langcode = NULL, $args = array()) {
-  $langcode = $langcode ? $langcode : \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT)->id;
+  $langcode = $langcode ? $langcode : \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT)->getId();
 
   $output = "<channel>\n";
   $output .= ' <title>' . String::checkPlain($title) . "</title>\n";
@@ -2076,7 +2076,7 @@ function _drupal_add_js($data = NULL, $options = NULL) {
             'currentPath' => $current_path,
             'currentPathIsAdmin' => $current_path_is_admin,
             'isFront' => drupal_is_front_page(),
-            'currentLanguage' => \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_URL)->id,
+            'currentLanguage' => \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_URL)->getId(),
           );
           if (!empty($current_query)) {
             ksort($current_query);
diff --git a/core/includes/form.inc b/core/includes/form.inc
index 54feee0..6cf7e48 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -1988,7 +1988,7 @@ function form_process_machine_name($element, &$form_state) {
       'machineName' => array(
         '#' . $source['#id'] => $element['#machine_name'],
       ),
-      'langcode' => $language->id,
+      'langcode' => $language->getId(),
     ),
   );
   $element['#attached']['library'][] = 'core/drupal.machine-name';
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 52ce316..e83e3e1 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2099,7 +2099,7 @@ function template_preprocess_page(&$variables) {
   $variables['front_page']        = url();
   $variables['feed_icons']        = drupal_get_feeds();
   $variables['language']          = $language_interface;
-  $variables['language']->dir     = $language_interface->direction ? 'rtl' : 'ltr';
+  $variables['language']->dir     = $language_interface->getDirection() ? 'rtl' : 'ltr';
   $variables['logo']              = theme_get_setting('logo.url');
   $variables['main_menu']         = theme_get_setting('features.main_menu') ? menu_main_menu() : array();
   $variables['secondary_menu']    = theme_get_setting('features.secondary_menu') ? menu_secondary_menu() : array();
@@ -2247,8 +2247,8 @@ function template_preprocess_maintenance_page(&$variables) {
   $variables['html_attributes'] = new Attribute;
 
   // HTML element attributes.
-  $variables['html_attributes']['lang'] = $language_interface->id;
-  $variables['html_attributes']['dir'] = $language_interface->direction ? 'rtl' : 'ltr';
+  $variables['html_attributes']['lang'] = $language_interface->getId();
+  $variables['html_attributes']['dir'] = $language_interface->getDirection() ? 'rtl' : 'ltr';
 
   // Add favicon
   if (theme_get_setting('features.favicon')) {
diff --git a/core/lib/Drupal/Core/Cache/LanguageCacheContext.php b/core/lib/Drupal/Core/Cache/LanguageCacheContext.php
index e2c1bd9..0a3f16c 100644
--- a/core/lib/Drupal/Core/Cache/LanguageCacheContext.php
+++ b/core/lib/Drupal/Core/Cache/LanguageCacheContext.php
@@ -45,7 +45,7 @@ public function getContext() {
     $context_parts = array();
     if ($this->languageManager->isMultilingual()) {
       foreach ($this->languageManager->getLanguageTypes() as $type) {
-        $context_parts[] = $this->languageManager->getCurrentLanguage($type)->id;
+        $context_parts[] = $this->languageManager->getCurrentLanguage($type)->getId();
       }
     }
     return implode(':', $context_parts);
diff --git a/core/lib/Drupal/Core/Config/ConfigModuleOverridesEvent.php b/core/lib/Drupal/Core/Config/ConfigModuleOverridesEvent.php
index 26692ea..ced4228 100644
--- a/core/lib/Drupal/Core/Config/ConfigModuleOverridesEvent.php
+++ b/core/lib/Drupal/Core/Config/ConfigModuleOverridesEvent.php
@@ -8,7 +8,7 @@
 namespace Drupal\Core\Config;
 
 use Drupal\Component\Utility\NestedArray;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Symfony\Component\EventDispatcher\Event;
 
 /**
@@ -42,10 +42,10 @@ class ConfigModuleOverridesEvent extends Event {
    *
    * @param array $names
    *   A list of configuration names.
-   * @param \Drupal\Core\Language\Language
+   * @param \Drupal\Core\Language\LanguageInterface
    *   (optional) The language for this configuration.
    */
-  public function __construct(array $names, Language $language = NULL) {
+  public function __construct(array $names, LanguageInterface $language = NULL) {
     $this->names = $names;
     $this->language = $language;
     $this->overrides = array();
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
index 2d773dc..ad47d24 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
@@ -256,7 +256,7 @@ public function create(array $values = array()) {
     $class::preCreate($this, $values);
 
     // Set default language to site default if not provided.
-    $values += array('langcode' => $this->languageManager->getDefaultLanguage()->id);
+    $values += array('langcode' => $this->languageManager->getDefaultLanguage()->getId());
 
     $entity = new $class($values, $this->entityTypeId);
     // Mark this entity as new, so isNew() returns TRUE. This does not check
diff --git a/core/lib/Drupal/Core/Datetime/Date.php b/core/lib/Drupal/Core/Datetime/Date.php
index 898a49e..031c2a3 100644
--- a/core/lib/Drupal/Core/Datetime/Date.php
+++ b/core/lib/Drupal/Core/Datetime/Date.php
@@ -130,7 +130,7 @@ public function format($timestamp, $type = 'medium', $format = '', $timezone = N
     }
 
     if (empty($langcode)) {
-      $langcode = $this->languageManager->getCurrentLanguage()->id;
+      $langcode = $this->languageManager->getCurrentLanguage()->getId();
     }
 
     // Create a DrupalDateTime object from the timestamp and timezone.
diff --git a/core/lib/Drupal/Core/Datetime/DrupalDateTime.php b/core/lib/Drupal/Core/Datetime/DrupalDateTime.php
index 2d4be46..ba57e74 100644
--- a/core/lib/Drupal/Core/Datetime/DrupalDateTime.php
+++ b/core/lib/Drupal/Core/Datetime/DrupalDateTime.php
@@ -53,7 +53,7 @@ class DrupalDateTime extends DateTimePlus {
   public function __construct($time = 'now', $timezone = NULL, $settings = array()) {
     // We can set the langcode and country using Drupal values.
     if (!isset($settings['langcode'])) {
-      $settings['langcode'] = \Drupal::languageManager()->getCurrentLanguage()->id;
+      $settings['langcode'] = \Drupal::languageManager()->getCurrentLanguage()->getId();
     }
 
     if (!isset($settings['country'])) {
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 992c728..066d7a8 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -553,7 +553,7 @@ public function language() {
   protected function setDefaultLangcode() {
     // Get the language code if the property exists.
     if ($this->hasField('langcode') && ($item = $this->get('langcode')) && isset($item->language)) {
-      $this->defaultLangcode = $item->language->id;
+      $this->defaultLangcode = $item->language->getId();
     }
     if (empty($this->defaultLangcode)) {
       // Make sure we return a proper language object.
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
index cc97849..c220851 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
@@ -725,9 +725,10 @@ protected function mapToStorageRecord(EntityInterface $entity, $table_key = 'bas
    *   The record to store.
    */
   protected function mapToDataStorageRecord(EntityInterface $entity, $table_key = 'data_table') {
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
     $record = $this->mapToStorageRecord($entity, $table_key);
-    $record->langcode = $entity->language()->id;
-    $record->default_langcode = intval($record->langcode == $entity->getUntranslated()->language()->id);
+    $record->langcode = $entity->language()->getId();
+    $record->default_langcode = intval($record->langcode == $entity->getUntranslated()->language()->getId());
     return $record;
   }
 
@@ -775,6 +776,7 @@ public function getQueryServiceName() {
    * {@inheritdoc}
    */
   protected function doLoadFieldItems($entities, $age) {
+    /** @var \Drupal\Core\Entity\ContentEntityInterface[] $entities */
     $load_current = $age == static::FIELD_LOAD_CURRENT;
 
     // Collect entities ids, bundles and languages.
@@ -784,7 +786,7 @@ protected function doLoadFieldItems($entities, $age) {
     foreach ($entities as $key => $entity) {
       $bundles[$entity->bundle()] = TRUE;
       $ids[] = $load_current ? $key : $entity->getRevisionId();
-      $default_langcodes[$key] = $entity->getUntranslated()->language()->id;
+      $default_langcodes[$key] = $entity->getUntranslated()->language()->getId();
     }
 
     // Collect impacted fields.
@@ -844,11 +846,12 @@ protected function doLoadFieldItems($entities, $age) {
    * {@inheritdoc}
    */
   protected function doSaveFieldItems(EntityInterface $entity, $update) {
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
     $vid = $entity->getRevisionId();
     $id = $entity->id();
     $bundle = $entity->bundle();
     $entity_type = $entity->getEntityTypeId();
-    $default_langcode = $entity->getUntranslated()->language()->id;
+    $default_langcode = $entity->getUntranslated()->language()->getId();
     $translation_langcodes = array_keys($entity->getTranslationLanguages());
 
     if (!isset($vid)) {
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index 90e4699..7ea7b55 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -37,7 +37,7 @@ public function id();
   /**
    * Returns the language of the entity.
    *
-   * @return \Drupal\Core\Language\Language
+   * @return \Drupal\Core\Language\LanguageInterface
    *   The language object.
    */
   public function language();
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 3ea9429..48c5070 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -157,7 +157,7 @@ public function __construct(\Traversable $namespaces, ContainerInterface $contai
     $this->discovery = new AnnotatedClassDiscovery('Entity', $namespaces, 'Drupal\Core\Entity\Annotation\EntityType');
     $this->discovery = new InfoHookDecorator($this->discovery, 'entity_type_build');
     $this->discovery = new AlterDecorator($this->discovery, 'entity_type');
-    $this->discovery = new CacheDecorator($this->discovery, 'entity_type:' . $this->languageManager->getCurrentLanguage()->id, 'default', Cache::PERMANENT, array('entity_types' => TRUE));
+    $this->discovery = new CacheDecorator($this->discovery, 'entity_type:' . $this->languageManager->getCurrentLanguage()->getId(), 'default', Cache::PERMANENT, array('entity_types' => TRUE));
 
     $this->container = $container;
   }
@@ -314,7 +314,7 @@ public function getBaseFieldDefinitions($entity_type_id) {
     // Check the static cache.
     if (!isset($this->baseFieldDefinitions[$entity_type_id])) {
       // Not prepared, try to load from cache.
-      $cid = 'entity_base_field_definitions:' . $entity_type_id . ':' . $this->languageManager->getCurrentLanguage()->id;
+      $cid = 'entity_base_field_definitions:' . $entity_type_id . ':' . $this->languageManager->getCurrentLanguage()->getId();
       if ($cache = $this->cache->get($cid)) {
         $this->baseFieldDefinitions[$entity_type_id] = $cache->data;
       }
@@ -404,7 +404,7 @@ public function getFieldDefinitions($entity_type_id, $bundle) {
     if (!isset($this->fieldDefinitions[$entity_type_id][$bundle])) {
       $base_field_definitions = $this->getBaseFieldDefinitions($entity_type_id);
       // Not prepared, try to load from cache.
-      $cid = 'entity_bundle_field_definitions:' . $entity_type_id . ':' . $bundle . ':' . $this->languageManager->getCurrentLanguage()->id;
+      $cid = 'entity_bundle_field_definitions:' . $entity_type_id . ':' . $bundle . ':' . $this->languageManager->getCurrentLanguage()->getId();
       if ($cache = $this->cache->get($cid)) {
         $bundle_field_definitions = $cache->data;
       }
@@ -505,7 +505,7 @@ public function getBundleInfo($entity_type) {
    */
   public function getAllBundleInfo() {
     if (!isset($this->bundleInfo)) {
-      $langcode = $this->languageManager->getCurrentLanguage()->id;
+      $langcode = $this->languageManager->getCurrentLanguage()->getId();
       if ($cache = $this->cache->get("entity_bundle_info:$langcode")) {
         $this->bundleInfo = $cache->data;
       }
@@ -537,7 +537,7 @@ public function getExtraFields($entity_type_id, $bundle) {
     // Read from the persistent cache. Since hook_entity_extra_field_info() and
     // hook_entity_extra_field_info_alter() might contain t() calls, we cache
     // per language.
-    $cache_id = 'entity_bundle_extra_fields:' . $entity_type_id . ':' . $bundle . ':' . $this->languageManager->getCurrentLanguage()->id;
+    $cache_id = 'entity_bundle_extra_fields:' . $entity_type_id . ':' . $bundle . ':' . $this->languageManager->getCurrentLanguage()->getId();
     $cached = $this->cache->get($cache_id);
     if ($cached) {
       $this->extraFields[$entity_type_id][$bundle] = $cached->data;
@@ -581,7 +581,7 @@ public function getTranslationFromContext(EntityInterface $entity, $langcode = N
 
     if ($entity instanceof TranslatableInterface) {
       if (empty($langcode)) {
-        $langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT)->id;
+        $langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT)->getId();
       }
 
       // Retrieve language fallback candidates to perform the entity language
@@ -592,7 +592,7 @@ public function getTranslationFromContext(EntityInterface $entity, $langcode = N
 
       // Ensure the default language has the proper language code.
       $default_language = $entity->getUntranslated()->language();
-      $candidates[$default_language->id] = Language::LANGCODE_DEFAULT;
+      $candidates[$default_language->getId()] = Language::LANGCODE_DEFAULT;
 
       // Return the most fitting entity translation.
       foreach ($candidates as $candidate) {
@@ -646,7 +646,7 @@ public function getFormModes($entity_type_id) {
   protected function getAllDisplayModesByEntityType($display_type) {
     if (!isset($this->displayModeInfo[$display_type])) {
       $key = 'entity_' . $display_type . '_info';
-      $langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_INTERFACE)->id;
+      $langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_INTERFACE)->getId();
       if ($cache = $this->cache->get("$key:$langcode")) {
         $this->displayModeInfo[$display_type] = $cache->data;
       }
diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index b4c72a4..16d7a09 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -205,7 +205,7 @@ public function view(EntityInterface $entity, $view_mode = 'full', $langcode = N
    */
   public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) {
     if (!isset($langcode)) {
-      $langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT)->id;
+      $langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT)->getId();
     }
 
     // Build the view modes and display objects.
diff --git a/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
index 8e4596f..0576520 100644
--- a/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
@@ -55,7 +55,7 @@ public function onRespond(FilterResponseEvent $event) {
     $response->headers->set('X-UA-Compatible', 'IE=edge,chrome=1', FALSE);
 
     // Set the Content-language header.
-    $response->headers->set('Content-language', $this->languageManager->getCurrentLanguage()->id);
+    $response->headers->set('Content-language', $this->languageManager->getCurrentLanguage()->getId());
 
     // Because pages are highly dynamic, set the last-modified time to now
     // since the page is in fact being regenerated right now.
diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index 4575983..b59c17b 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -35,14 +35,14 @@ class Language implements LanguageInterface {
    *
    * @var string
    */
-  public $name = '';
+  protected $name = '';
 
   /**
    * The ID, langcode.
    *
    * @var string
    */
-  public $id = '';
+  protected $id = '';
 
   /**
    * The direction, left-to-right, or right-to-left.
@@ -51,21 +51,21 @@ class Language implements LanguageInterface {
    *
    * @var int
    */
-  public $direction = self::DIRECTION_LTR;
+  protected $direction = self::DIRECTION_LTR;
 
   /**
    * The weight, used for ordering languages in lists, like selects or tables.
    *
    * @var int
    */
-  public $weight = 0;
+  protected $weight = 0;
 
   /**
    * Flag indicating if this is the only site default language.
    *
    * @var bool
    */
-  public $default = FALSE;
+  protected $default = FALSE;
 
   /**
    * The language negotiation method used when a language was detected.
@@ -75,7 +75,7 @@ class Language implements LanguageInterface {
    *
    * @var string
    */
-  public $method_id;
+  protected $negotiationMethodId;
 
   /**
    * Locked indicates a language used by the system, not an actual language.
@@ -86,7 +86,7 @@ class Language implements LanguageInterface {
    *
    * @var bool
    */
-  public $locked = FALSE;
+  protected $locked = FALSE;
 
   /**
    * Constructs a new class instance.
@@ -197,19 +197,26 @@ public function setDefault($default) {
    * {@inheritdoc}
    */
   public function getNegotiationMethodId() {
-    return $this->method_id;
+    return $this->negotiationMethodId;
   }
 
   /**
    * {@inheritdoc}
    */
   public function setNegotiationMethodId($method_id) {
-    $this->method_id = $method_id;
+    $this->negotiationMethodId = $method_id;
 
     return $this;
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function isLocked() {
+    return $this->locked;
+  }
+
+  /**
    * Sort language objects.
    *
    * @param array $languages
diff --git a/core/lib/Drupal/Core/Language/LanguageDefault.php b/core/lib/Drupal/Core/Language/LanguageDefault.php
index a72b8b1..53f40d2 100644
--- a/core/lib/Drupal/Core/Language/LanguageDefault.php
+++ b/core/lib/Drupal/Core/Language/LanguageDefault.php
@@ -22,7 +22,7 @@ class LanguageDefault {
   /**
    * The default language.
    *
-   * @var \Drupal\Core\Language\Language
+   * @var \Drupal\Core\Language\LanguageInterface
    */
   protected $language;
 
@@ -39,7 +39,7 @@ public function __construct(array $values) {
   /**
    * Gets the default language.
    *
-   * @return \Drupal\Core\Language\Language
+   * @return \Drupal\Core\Language\LanguageInterface
    *   The default language.
    */
   public function get() {
@@ -49,11 +49,11 @@ public function get() {
   /**
    * Sets the default language.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   The default language.
    */
-  public function set(Language $language) {
-    $language->default = TRUE;
+  public function set(LanguageInterface $language) {
+    $language->setDefault(TRUE);
     $this->language = $language;
   }
 
diff --git a/core/lib/Drupal/Core/Language/LanguageInterface.php b/core/lib/Drupal/Core/Language/LanguageInterface.php
index e718749..d3977b4 100644
--- a/core/lib/Drupal/Core/Language/LanguageInterface.php
+++ b/core/lib/Drupal/Core/Language/LanguageInterface.php
@@ -208,4 +208,17 @@ public function getNegotiationMethodId();
    */
   public function setNegotiationMethodId($method_id);
 
+  /**
+   * Checks if the language is locked.
+   *
+   * Locked indicates a language used by the system, not an actual language.
+   * Examples of locked languages are, LANGCODE_NOT_SPECIFIED, und, and
+   * LANGCODE_NOT_APPLICABLE, zxx, which are usually shown in language selects
+   * but hidden in places like the Language configuration and cannot be deleted.
+   *
+   * @return bool
+   *   TRUE if the language is locked.
+   */
+  public function isLocked();
+
 }
diff --git a/core/lib/Drupal/Core/Language/LanguageManager.php b/core/lib/Drupal/Core/Language/LanguageManager.php
index 3d943d0..badc786 100644
--- a/core/lib/Drupal/Core/Language/LanguageManager.php
+++ b/core/lib/Drupal/Core/Language/LanguageManager.php
@@ -26,7 +26,7 @@ class LanguageManager extends DependencySerialization implements LanguageManager
   /**
    * An array of all the available languages keyed by language code.
    *
-   * @var array
+   * @var \Drupal\Core\Language\LanguageInterface[]
    */
   protected $languages;
 
@@ -40,7 +40,7 @@ class LanguageManager extends DependencySerialization implements LanguageManager
   /**
    * Constructs the language manager.
    *
-   * @param \Drupal\Core\Language\Language $default_language
+   * @param \Drupal\Core\Language\LanguageDefault $default_language
    *   The default language.
    */
   public function __construct(LanguageDefault $default_language) {
@@ -112,9 +112,9 @@ public function getLanguages($flags = Language::STATE_CONFIGURABLE) {
     if (!isset($this->languages)) {
       // No language module, so use the default language only.
       $default = $this->getDefaultLanguage();
-      $this->languages = array($default->id => $default);
+      $this->languages = array($default->getId() => $default);
       // Add the special languages, they will be filtered later if needed.
-      $this->languages += $this->getDefaultLockedLanguages($default->weight);
+      $this->languages += $this->getDefaultLockedLanguages($default->getWeight());
     }
 
     // Filter the full list of languages based on the value of the $all flag. By
@@ -126,12 +126,12 @@ public function getLanguages($flags = Language::STATE_CONFIGURABLE) {
     if ($flags & Language::STATE_SITE_DEFAULT) {
       $default = isset($default) ? $default : $this->getDefaultLanguage();
       // Rename the default language.
-      $default->name = $this->t("Site's default language (@lang_name)", array('@lang_name' => $default->name));
+      $default->setName($this->t("Site's default language (@lang_name)", array('@lang_name' => $default->getName())));
       $filtered_languages['site_default'] = $default;
     }
 
     foreach ($this->languages as $id => $language) {
-      if (($language->locked && ($flags & Language::STATE_LOCKED)) || (!$language->locked && ($flags & Language::STATE_CONFIGURABLE))) {
+      if (($language->isLocked() && ($flags & Language::STATE_LOCKED)) || (!$language->isLocked() && ($flags & Language::STATE_CONFIGURABLE))) {
         $filtered_languages[$id] = $language;
       }
     }
@@ -155,7 +155,7 @@ public function getLanguageName($langcode) {
       return $this->t('None');
     }
     if ($language = $this->getLanguage($langcode)) {
-      return $language->name;
+      return $language->getName();
     }
     if (empty($langcode)) {
       return $this->t('Unknown');
@@ -193,7 +193,7 @@ public function getDefaultLockedLanguages($weight = 0) {
    */
   public function isLanguageLocked($langcode) {
     $language = $this->getLanguage($langcode);
-    return ($language ? $language->locked : FALSE);
+    return ($language ? $language->isLocked() : FALSE);
   }
 
   /**
@@ -339,7 +339,7 @@ public static function getStandardLanguageList() {
    *
    * @see \Drupal\language\ConfigurableLanguageManager::setConfigOverrideLanguage()
    */
-  public function setConfigOverrideLanguage(Language $language = NULL) {
+  public function setConfigOverrideLanguage(LanguageInterface $language = NULL) {
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Language/LanguageManagerInterface.php b/core/lib/Drupal/Core/Language/LanguageManagerInterface.php
index 33e8635..3e46f2a 100644
--- a/core/lib/Drupal/Core/Language/LanguageManagerInterface.php
+++ b/core/lib/Drupal/Core/Language/LanguageManagerInterface.php
@@ -50,7 +50,7 @@ public function getLanguageTypes();
    *   (optional) The language type, e.g. the interface or the content language.
    *   Defaults to \Drupal\Core\Language\Language::TYPE_INTERFACE.
    *
-   * @return \Drupal\Core\Language\Language
+   * @return \Drupal\Core\Language\LanguageInterface
    *   A language object for the given type.
    */
   public function getCurrentLanguage($type = Language::TYPE_INTERFACE);
@@ -71,7 +71,7 @@ public function reset($type = NULL);
   /**
    * Returns a language object representing the site's default language.
    *
-   * @return \Drupal\Core\Language\Language
+   * @return \Drupal\Core\Language\LanguageInterface
    *   A language object.
    */
   public function getDefaultLanguage();
@@ -84,7 +84,7 @@ public function getDefaultLanguage();
    *   It can be: Language::STATE_CONFIGURABLE,
    *   Language::STATE_LOCKED, Language::STATE_ALL.
    *
-   * @return array
+   * @return \Drupal\Core\Language\LanguageInterface[] array
    *   An associative array of languages, keyed by the language code, ordered
    *   by weight ascending and name ascending.
    */
@@ -96,7 +96,7 @@ public function getLanguages($flags = Language::STATE_CONFIGURABLE);
    * @param string $langcode
    *   The language code.
    *
-   * @return \Drupal\core\Language\Language|null
+   * @return \Drupal\core\Language\LanguageInterface|null
    *   A fully-populated language object or NULL.
    */
   public function getLanguage($langcode);
@@ -171,17 +171,17 @@ public function getLanguageSwitchLinks($type, $path);
   /**
    * Sets the configuration override language.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   The language to override configuration with.
    *
    * @return $this
    */
-  public function setConfigOverrideLanguage(Language $language = NULL);
+  public function setConfigOverrideLanguage(LanguageInterface $language = NULL);
 
   /**
    * Gets the current configuration override language.
    *
-   * @return \Drupal\Core\Language\Language $language
+   * @return \Drupal\Core\Language\LanguageInterface
    *   The current configuration override language.
    */
   public function getConfigOverrideLanguage();
diff --git a/core/lib/Drupal/Core/Page/DefaultHtmlFragmentRenderer.php b/core/lib/Drupal/Core/Page/DefaultHtmlFragmentRenderer.php
index 8de2067..1dca230 100644
--- a/core/lib/Drupal/Core/Page/DefaultHtmlFragmentRenderer.php
+++ b/core/lib/Drupal/Core/Page/DefaultHtmlFragmentRenderer.php
@@ -82,8 +82,8 @@ public function preparePage(HtmlPage $page, &$page_array) {
     // HTML element attributes.
     $language_interface = $this->languageManager->getCurrentLanguage();
     $html_attributes = $page->getHtmlAttributes();
-    $html_attributes['lang'] = $language_interface->id;
-    $html_attributes['dir'] = $language_interface->direction ? 'rtl' : 'ltr';
+    $html_attributes['lang'] = $language_interface->getId();
+    $html_attributes['dir'] = $language_interface->getDirection() ? 'rtl' : 'ltr';
 
     return $page;
   }
diff --git a/core/lib/Drupal/Core/Path/AliasManager.php b/core/lib/Drupal/Core/Path/AliasManager.php
index 84dbb02..448be88 100644
--- a/core/lib/Drupal/Core/Path/AliasManager.php
+++ b/core/lib/Drupal/Core/Path/AliasManager.php
@@ -95,7 +95,7 @@ public function getSystemPath($path, $path_language = NULL) {
     // language. If we used a language different from the one conveyed by the
     // requested URL, we might end up being unable to check if there is a path
     // alias matching the URL path.
-    $path_language = $path_language ?: $this->languageManager->getCurrentLanguage(Language::TYPE_URL)->id;
+    $path_language = $path_language ?: $this->languageManager->getCurrentLanguage(Language::TYPE_URL)->getId();
     // Lookup the path alias first.
     if (!empty($path) && $source = $this->lookupPathSource($path, $path_language)) {
       $path = $source;
@@ -112,7 +112,7 @@ public function getPathAlias($path, $path_language = NULL) {
     // language. If we used a language different from the one conveyed by the
     // requested URL, we might end up being unable to check if there is a path
     // alias matching the URL path.
-    $path_language = $path_language ?: $this->languageManager->getCurrentLanguage(Language::TYPE_URL)->id;
+    $path_language = $path_language ?: $this->languageManager->getCurrentLanguage(Language::TYPE_URL)->getId();
     $result = $path;
     if (!empty($path) && $alias = $this->lookupPathAlias($path, $path_language)) {
       $result = $alias;
diff --git a/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php b/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php
index 66979d1..6690133 100644
--- a/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php
+++ b/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php
@@ -45,7 +45,7 @@ public function processInbound($path, Request $request) {
    */
   public function processOutbound($path, &$options = array(), Request $request = NULL) {
     if (empty($options['alias'])) {
-      $langcode = isset($options['language']) ? $options['language']->id : NULL;
+      $langcode = isset($options['language']) ? $options['language']->getId() : NULL;
       $path = $this->aliasManager->getPathAlias($path, $langcode);
     }
     return $path;
diff --git a/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php b/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
index e9c4ce9..f79949d 100644
--- a/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
+++ b/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php
@@ -146,7 +146,7 @@ public function setCacheBackend(CacheBackendInterface $cache_backend, LanguageMa
     $this->languageManager = $language_manager;
     $this->cacheBackend = $cache_backend;
     $this->cacheKeyPrefix = $cache_key_prefix;
-    $this->cacheKey = $cache_key_prefix . ':' . $language_manager->getCurrentLanguage()->id;
+    $this->cacheKey = $cache_key_prefix . ':' . $language_manager->getCurrentLanguage()->getId();
     $this->cacheTags = $cache_tags;
   }
 
diff --git a/core/lib/Drupal/Core/StringTranslation/TranslationManager.php b/core/lib/Drupal/Core/StringTranslation/TranslationManager.php
index bd1b3b3..f8b6bb1 100644
--- a/core/lib/Drupal/Core/StringTranslation/TranslationManager.php
+++ b/core/lib/Drupal/Core/StringTranslation/TranslationManager.php
@@ -60,7 +60,7 @@ class TranslationManager implements TranslationInterface, TranslatorInterface {
    */
   public function __construct(LanguageManagerInterface $language_manager) {
     $this->languageManager = $language_manager;
-    $this->defaultLangcode = $language_manager->getDefaultLanguage()->id;
+    $this->defaultLangcode = $language_manager->getDefaultLanguage()->getId();
   }
 
   /**
diff --git a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
index af66bfe..32925a5 100644
--- a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
@@ -29,7 +29,7 @@ public function language();
    *   (optional) Whether the default language should be included. Defaults to
    *   TRUE.
    *
-   * @return
+   * @return \Drupal\Core\Language\LanguageInterface[]
    *   An array of language objects, keyed by language codes.
    */
   public function getTranslationLanguages($include_default = TRUE);
diff --git a/core/lib/Drupal/Core/Validation/DrupalTranslator.php b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
index 5b4d99d..8247e13 100644
--- a/core/lib/Drupal/Core/Validation/DrupalTranslator.php
+++ b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
@@ -56,7 +56,7 @@ public function setLocale($locale) {
    * Implements \Symfony\Component\Translation\TranslatorInterface::getLocale().
    */
   public function getLocale() {
-    return $this->locale ? $this->locale : \Drupal::languageManager()->getCurrentLanguage()->id;
+    return $this->locale ? $this->locale : \Drupal::languageManager()->getCurrentLanguage()->getId();
   }
 
   /**
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
index 73d1adc..cba823e 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php
@@ -102,7 +102,7 @@ public function form(array $form, array &$form_state) {
       // Set the correct default language.
       if ($block->isNew()) {
         $language_default = $this->languageManager->getCurrentLanguage($language_configuration['langcode']);
-        $block->langcode->value = $language_default->id;
+        $block->langcode->value = $language_default->getId();
       }
     }
 
diff --git a/core/modules/block/lib/Drupal/block/BlockAccessController.php b/core/modules/block/lib/Drupal/block/BlockAccessController.php
index 4f5182b..3e05566 100644
--- a/core/modules/block/lib/Drupal/block/BlockAccessController.php
+++ b/core/modules/block/lib/Drupal/block/BlockAccessController.php
@@ -117,7 +117,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A
 
     // Language visibility settings.
     if (!empty($visibility['language']['langcodes']) && array_filter($visibility['language']['langcodes'])) {
-      if (empty($visibility['language']['langcodes'][\Drupal::languageManager()->getCurrentLanguage($visibility['language']['language_type'])->id])) {
+      if (empty($visibility['language']['langcodes'][\Drupal::languageManager()->getCurrentLanguage($visibility['language']['language_type'])->getId()])) {
         return FALSE;
       }
     }
diff --git a/core/modules/block/lib/Drupal/block/BlockFormController.php b/core/modules/block/lib/Drupal/block/BlockFormController.php
index 4b4c859..f4cd92f 100644
--- a/core/modules/block/lib/Drupal/block/BlockFormController.php
+++ b/core/modules/block/lib/Drupal/block/BlockFormController.php
@@ -174,7 +174,7 @@ public function form(array $form, array &$form_state) {
       foreach ($languages as $language) {
         // @todo $language->name is not wrapped with t(), it should be replaced
         //   by CMI translation implementation.
-        $langcodes_options[$language->id] = $language->name;
+        $langcodes_options[$language->getId()] = $language->getName();
       }
       $form['visibility']['language'] = array(
         '#type' => 'details',
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 8c52221..24857e0 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -488,13 +488,13 @@ function template_preprocess_book_export_html(&$variables) {
   $variables['title'] = String::checkPlain($variables['title']);
   $variables['base_url'] = $base_url;
   $variables['language'] = $language_interface;
-  $variables['language_rtl'] = ($language_interface->direction == Language::DIRECTION_RTL);
+  $variables['language_rtl'] = ($language_interface->getDirection() == Language::DIRECTION_RTL);
   $variables['head'] = drupal_get_html_head();
 
   // HTML element attributes.
   $attributes = array();
-  $attributes['lang'] = $language_interface->id;
-  $attributes['dir'] = $language_interface->direction ? 'rtl' : 'ltr';
+  $attributes['lang'] = $language_interface->getId();
+  $attributes['dir'] = $language_interface->getDirection() ? 'rtl' : 'ltr';
   $variables['html_attributes'] = new Attribute($attributes);
 }
 
diff --git a/core/modules/book/lib/Drupal/book/BookManager.php b/core/modules/book/lib/Drupal/book/BookManager.php
index 3e0a6aa..49e904c 100644
--- a/core/modules/book/lib/Drupal/book/BookManager.php
+++ b/core/modules/book/lib/Drupal/book/BookManager.php
@@ -479,7 +479,7 @@ public function bookTreeAllData($bid, $link = NULL, $max_depth = NULL) {
     $nid = isset($link['nid']) ? $link['nid'] : 0;
     // Generate a cache ID (cid) specific for this $bid, $link, $language, and
     // depth.
-    $cid = 'book-links:' . $bid . ':all:' . $nid . ':' . $language_interface->id . ':' . (int) $max_depth;
+    $cid = 'book-links:' . $bid . ':all:' . $nid . ':' . $language_interface->getId() . ':' . (int) $max_depth;
 
     if (!isset($tree[$cid])) {
       // If the tree data was not in the static cache, build $tree_parameters.
@@ -632,7 +632,7 @@ protected function doBookTreeBuild($bid, array $parameters = array()) {
     if (isset($parameters['expanded'])) {
       sort($parameters['expanded']);
     }
-    $tree_cid = 'book-links:' . $bid . ':tree-data:' . $language_interface->id . ':' . hash('sha256', serialize($parameters));
+    $tree_cid = 'book-links:' . $bid . ':tree-data:' . $language_interface->getId() . ':' . hash('sha256', serialize($parameters));
 
     // If we do not have this tree in the static cache, check {cache_data}.
     if (!isset($trees[$tree_cid])) {
diff --git a/core/modules/ckeditor/ckeditor.admin.inc b/core/modules/ckeditor/ckeditor.admin.inc
index 7d763c7..8636093 100644
--- a/core/modules/ckeditor/ckeditor.admin.inc
+++ b/core/modules/ckeditor/ckeditor.admin.inc
@@ -21,7 +21,7 @@
 function template_preprocess_ckeditor_settings_toolbar(&$variables) {
   // Simplify the language direction information for toolbar buttons.
   $language_interface = \Drupal::languageManager()->getCurrentLanguage();
-  $language_direction = $language_interface->direction ? 'rtl' : 'ltr';
+  $language_direction = $language_interface->getDirection() ? 'rtl' : 'ltr';
 
   // Create lists of active and disabled buttons.
   $editor = $variables['editor'];
diff --git a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/Editor/CKEditor.php b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/Editor/CKEditor.php
index f248e22..f8618ce 100644
--- a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/Editor/CKEditor.php
+++ b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/Editor/CKEditor.php
@@ -269,8 +269,8 @@ public function getJSSettings(EditorEntity $editor) {
     // Map the interface language code to a CKEditor translation.
     $ckeditor_langcodes = $this->getLangcodes();
     $language_interface = $this->languageManager->getCurrentLanguage();
-    if (isset($ckeditor_langcodes[$language_interface->id])) {
-      $display_langcode = $ckeditor_langcodes[$language_interface->id];
+    if (isset($ckeditor_langcodes[$language_interface->getId()])) {
+      $display_langcode = $ckeditor_langcodes[$language_interface->getId()];
     }
 
     // Next, set the most fundamental CKEditor settings.
diff --git a/core/modules/comment/lib/Drupal/comment/CommentFormController.php b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
index e9759eb..063a7b7 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentFormController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
@@ -75,7 +75,7 @@ protected function init(array &$form_state) {
     // set.
     if ($comment->isNew()) {
       $language_content = \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT);
-      $comment->langcode->value = $language_content->id;
+      $comment->langcode->value = $language_content->getId();
     }
 
     parent::init($form_state);
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php
index 0d2a4b2..9523e43 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php
@@ -63,8 +63,8 @@ function testCommentTokenReplacement() {
     $tests['[comment:body]'] = $comment->comment_body->processed;
     $tests['[comment:url]'] = url('comment/' . $comment->id(), $url_options + array('fragment' => 'comment-' . $comment->id()));
     $tests['[comment:edit-url]'] = url('comment/' . $comment->id() . '/edit', $url_options);
-    $tests['[comment:created:since]'] = format_interval(REQUEST_TIME - $comment->getCreatedTime(), 2, $language_interface->id);
-    $tests['[comment:changed:since]'] = format_interval(REQUEST_TIME - $comment->getChangedTime(), 2, $language_interface->id);
+    $tests['[comment:created:since]'] = format_interval(REQUEST_TIME - $comment->getCreatedTime(), 2, $language_interface->getId());
+    $tests['[comment:changed:since]'] = format_interval(REQUEST_TIME - $comment->getChangedTime(), 2, $language_interface->getId());
     $tests['[comment:parent:cid]'] = $comment->hasParentComment() ? $comment->getParentComment()->id() : NULL;
     $tests['[comment:parent:title]'] = check_plain($parent_comment->getSubject());
     $tests['[comment:node:nid]'] = $comment->getCommentedEntityId();
@@ -76,7 +76,7 @@ function testCommentTokenReplacement() {
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('comment' => $comment), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('comment' => $comment), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Sanitized comment token %token replaced.', array('%token' => $input)));
     }
 
@@ -93,7 +93,7 @@ function testCommentTokenReplacement() {
     $tests['[comment:author:name]'] = $this->admin_user->getUsername();
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('comment' => $comment), array('langcode' => $language_interface->id, 'sanitize' => FALSE));
+      $output = $token_service->replace($input, array('comment' => $comment), array('langcode' => $language_interface->getId(), 'sanitize' => FALSE));
       $this->assertEqual($output, $expected, format_string('Unsanitized comment token %token replaced.', array('%token' => $input)));
     }
 
@@ -108,7 +108,7 @@ function testCommentTokenReplacement() {
     $tests['[node:comment-count]'] = 2;
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('entity' => $node, 'node' => $node), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('entity' => $node, 'node' => $node), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Node comment token %token replaced.', array('%token' => $input)));
     }
   }
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigLanguageOverrideWebTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigLanguageOverrideWebTest.php
index 34f5172..5ac458a 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigLanguageOverrideWebTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigLanguageOverrideWebTest.php
@@ -72,7 +72,7 @@ function testSiteNameTranslation() {
     $language_manager = \Drupal::languageManager()->reset();
     $this->assertTrue($language_manager->isMultilingual(), 'The test site is multilingual.');
     $language = \Drupal::languageManager()->getLanguage('xx');
-    $language->default = TRUE;
+    $language->setDefault(TRUE);
     language_save($language);
     language_delete('en');
     $this->assertFalse($language_manager->isMultilingual(), 'The test site is monolingual.');
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigOverridesPriorityTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigOverridesPriorityTest.php
index 6deab96..d294514 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigOverridesPriorityTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigOverridesPriorityTest.php
@@ -61,7 +61,7 @@ public function testOverridePriorities() {
     ));
     \Drupal::languageManager()->setConfigOverrideLanguage($language);
     \Drupal::languageManager()
-      ->getLanguageConfigOverride($language->id, 'system.site')
+      ->getLanguageConfigOverride($language->getId(), 'system.site')
       ->set('name', $language_overridden_name)
       ->set('mail', $language_overridden_mail)
       ->save();
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigTranslationFormAccess.php b/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigTranslationFormAccess.php
index 10c5f25..da2d2bc 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigTranslationFormAccess.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigTranslationFormAccess.php
@@ -32,8 +32,8 @@ public function access(Route $route, Request $request, AccountInterface $account
       // that is logically not a good idea.
       $access =
         !empty($target_language) &&
-        !$target_language->locked &&
-        $target_language->id != $this->sourceLanguage->id;
+        !$target_language->isLocked() &&
+        $target_language->getId() != $this->sourceLanguage->getId();
 
       return $access ? static::ALLOW : static::DENY;
     }
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperInterface.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperInterface.php
index b572708..e97e802 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperInterface.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigMapperInterface.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config_translation;
 
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
@@ -260,14 +260,14 @@ public function hasTranslatable();
   /**
    * Checks whether there is already a translation for this mapper.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   A language object.
    *
    * @return bool
    *   TRUE if any of the configuration elements have a translation in the
    *   given language, FALSE otherwise.
    */
-  public function hasTranslation(Language $language);
+  public function hasTranslation(LanguageInterface $language);
 
   /**
    * Populate the config mapper with request data.
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php
index 9dc32bb..832d402 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigNamesMapper.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\StringTranslation\TranslationInterface;
@@ -413,7 +414,7 @@ public function hasTranslatable() {
   /**
    * {@inheritdoc}
    */
-  public function hasTranslation(Language $language) {
+  public function hasTranslation(LanguageInterface $language) {
     foreach ($this->getConfigNames() as $name) {
       if ($this->localeConfigManager->hasTranslation($name, $language)) {
         return TRUE;
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php
index 0235678..07edfbb 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php
@@ -152,7 +152,7 @@ public function itemPage(Request $request, $plugin_id) {
       '#header' => array($this->t('Language'), $this->t('Operations')),
     );
     foreach ($languages as $language) {
-      $langcode = $language->id;
+      $langcode = $language->getId();
 
       // This is needed because
       // ConfigMapperInterface::getAddRouteParameters(), for example,
@@ -163,7 +163,7 @@ public function itemPage(Request $request, $plugin_id) {
       // Prepare the language name and the operations depending on whether this
       // is the original language or not.
       if ($langcode == $original_langcode) {
-        $language_name = '<strong>' . $this->t('@language (original)', array('@language' => $language->name)) . '</strong>';
+        $language_name = '<strong>' . $this->t('@language (original)', array('@language' => $language->getName())) . '</strong>';
 
         // Check access for the path/route for editing, so we can decide to
         // include a link to edit or not.
@@ -189,7 +189,7 @@ public function itemPage(Request $request, $plugin_id) {
         }
       }
       else {
-        $language_name = $language->name;
+        $language_name = $language->getName();
 
         $operations = array();
         // If no translation exists for this language, link to add one.
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php
index f7f9b2e..a23023c 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php
@@ -137,7 +137,7 @@ public function buildForm(array $form, array &$form_state, Request $request = NU
    */
   public function submitForm(array &$form, array &$form_state) {
     foreach ($this->mapper->getConfigNames() as $name) {
-      $this->languageManager->getLanguageConfigOverride($this->language->id, $name)->delete();
+      $this->languageManager->getLanguageConfigOverride($this->language->getId(), $name)->delete();
     }
 
     // Flush all persistent caches.
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationFormBase.php b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationFormBase.php
index 4d2bd68..55021c5 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationFormBase.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationFormBase.php
@@ -15,7 +15,7 @@
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\BaseFormIdInterface;
 use Drupal\Core\Form\FormBase;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\locale\StringStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -227,7 +227,7 @@ public function submitForm(array &$form, array &$form_state) {
     foreach ($this->mapper->getConfigNames() as $name) {
       // Set configuration values based on form submission and source values.
       $base_config = $this->config($name);
-      $config_translation = $this->languageManager->getLanguageConfigOverride($this->language->id, $name);
+      $config_translation = $this->languageManager->getLanguageConfigOverride($this->language->getId(), $name);
       $locations = $this->localeStorage->getLocations(array('type' => 'configuration', 'name' => $name));
 
       $this->setConfig($this->language, $base_config, $config_translation, $form_values[$name], !empty($locations));
@@ -327,12 +327,12 @@ protected function buildConfigForm(Element $schema, $config_data, $base_config_d
           '#theme' => 'config_translation_manage_form_element',
         );
         $build[$element_key]['source'] = array(
-          '#markup' => $base_config_data[$key] ? ('<span lang="' . $this->sourceLanguage->id . '">' . nl2br($base_config_data[$key] . '</span>')) : t('(Empty)'),
+          '#markup' => $base_config_data[$key] ? ('<span lang="' . $this->sourceLanguage->getId() . '">' . nl2br($base_config_data[$key] . '</span>')) : t('(Empty)'),
           '#title' => $this->t(
             '!label <span class="visually-hidden">(!source_language)</span>',
             array(
               '!label' => $this->t($definition['label']),
-              '!source_language' => $this->sourceLanguage->name,
+              '!source_language' => $this->sourceLanguage->getName(),
             )
           ),
           '#type' => 'item',
@@ -351,7 +351,7 @@ protected function buildConfigForm(Element $schema, $config_data, $base_config_d
   /**
    * Sets configuration based on a nested form value array.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   Set the configuration in this language.
    * @param \Drupal\Core\Config\Config $base_config
    *   Base configuration values, in the source language.
@@ -375,7 +375,7 @@ protected function buildConfigForm(Element $schema, $config_data, $base_config_d
    * @return array
    *   Translation configuration override data.
    */
-  protected function setConfig(Language $language, Config $base_config, Config $config_translation, array $config_values, $shipped_config = FALSE) {
+  protected function setConfig(LanguageInterface $language, Config $base_config, Config $config_translation, array $config_values, $shipped_config = FALSE) {
     foreach ($config_values as $key => $value) {
       if (is_array($value) && !isset($value['translation'])) {
         // Traverse into this level in the configuration.
@@ -391,7 +391,7 @@ protected function setConfig(Language $language, Config $base_config, Config $co
           // Get the translation for this original source string from locale.
           $conditions = array(
             'lid' => $source_string->lid,
-            'language' => $language->id,
+            'language' => $language->getId(),
           );
           $translations = $this->localeStorage->getTranslations($conditions + array('translated' => TRUE));
           // If we got a translation, take that, otherwise create a new one.
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/DateFormat.php b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/DateFormat.php
index 3cc9867..69a0871 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/DateFormat.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/DateFormat.php
@@ -10,7 +10,7 @@
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\ReplaceCommand;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Defines the date format element for the configuration translation interface.
@@ -20,7 +20,7 @@ class DateFormat extends Element {
   /**
    * {@inheritdoc}
    */
-  public function getFormElement(array $definition, Language $language, $value) {
+  public function getFormElement(array $definition, LanguageInterface $language, $value) {
     if (class_exists('intlDateFormatter')) {
       $description = $this->t('A user-defined date format. See the <a href="@url">PHP manual</a> for available options.', array('@url' => 'http://userguide.icu-project.org/formatparse/datetime'));
     }
@@ -30,10 +30,10 @@ public function getFormElement(array $definition, Language $language, $value) {
     $format = $this->t('Displayed as %date_format', array('%date_format' => \Drupal::service('date')->format(REQUEST_TIME, 'custom', $value)));
     return array(
       '#type' => 'textfield',
-      '#title' => $this->t($definition['label']) . '<span class="visually-hidden"> (' . $language->name . ')</span>',
+      '#title' => $this->t($definition['label']) . '<span class="visually-hidden"> (' . $language->getName() . ')</span>',
       '#description' => $description,
       '#default_value' => $value,
-      '#attributes' => array('lang' => $language->id),
+      '#attributes' => array('lang' => $language->getId()),
       '#field_suffix' => ' <div class="edit-date-format-suffix"><small id="edit-date-format-suffix">' . $format . '</small></div>',
       '#ajax' => array(
         'callback' => 'Drupal\config_translation\FormElement\DateFormat::ajaxSample',
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/ElementInterface.php b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/ElementInterface.php
index 9072cfc..ecc93f0 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/ElementInterface.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/ElementInterface.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config_translation\FormElement;
 
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Provides an interface for configuration translation form elements.
@@ -19,7 +19,7 @@
    *
    * @param array $definition
    *   Configuration schema type definition of the element.
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   Language object to display the translation form for.
    * @param string $value
    *   Default value for the form element.
@@ -27,6 +27,6 @@
    * @return array
    *   Form API array to represent the form element.
    */
-  public function getFormElement(array $definition, Language $language, $value);
+  public function getFormElement(array $definition, LanguageInterface $language, $value);
 
 }
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textarea.php b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textarea.php
index e79107e..adff4bb 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textarea.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textarea.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config_translation\FormElement;
 
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Defines the textarea element for the configuration translation interface.
@@ -17,7 +17,7 @@ class Textarea extends Element {
   /**
    * {@inheritdoc}
    */
-  public function getFormElement(array $definition, Language $language, $value) {
+  public function getFormElement(array $definition, LanguageInterface $language, $value) {
     // Estimate a comfortable size of the input textarea.
     $rows_words = ceil(str_word_count($value) / 5);
     $rows_newlines = substr_count($value, "\n" ) + 1;
@@ -26,9 +26,9 @@ public function getFormElement(array $definition, Language $language, $value) {
     return array(
       '#type' => 'textarea',
       '#default_value' => $value,
-      '#title' => $this->t($definition['label']) . '<span class="visually-hidden"> (' . $language->name . ')</span>',
+      '#title' => $this->t($definition['label']) . '<span class="visually-hidden"> (' . $language->getName() . ')</span>',
       '#rows' => $rows,
-      '#attributes' => array('lang' => $language->id),
+      '#attributes' => array('lang' => $language->getId()),
     );
   }
 
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textfield.php b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textfield.php
index 1791961..5c58b98 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textfield.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/FormElement/Textfield.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\config_translation\FormElement;
 
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Defines the textfield element for the configuration translation interface.
@@ -17,12 +17,12 @@ class Textfield extends Element {
   /**
    * {@inheritdoc}
    */
-  public function getFormElement(array $definition, Language $language, $value) {
+  public function getFormElement(array $definition, LanguageInterface $language, $value) {
     return array(
       '#type' => 'textfield',
       '#default_value' => $value,
-      '#title' => $this->t($definition['label']) . '<span class="visually-hidden"> (' . $language->name . ')</span>',
-      '#attributes' => array('lang' => $language->id),
+      '#title' => $this->t($definition['label']) . '<span class="visually-hidden"> (' . $language->getName() . ')</span>',
+      '#attributes' => array('lang' => $language->getId()),
     );
   }
 
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index 17db732..3188e56 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -161,14 +161,14 @@ function contact_mail($key, &$message, $params) {
     $variables['!sender-url'] = $params['sender']->getEmail();
   }
 
-  $options = array('langcode' => $language->id);
+  $options = array('langcode' => $language->getId());
 
   switch ($key) {
     case 'page_mail':
     case 'page_copy':
       $message['subject'] .= t('[!category] !subject', $variables, $options);
       $message['body'][] = t("!sender-name (!sender-url) sent a message using the contact form at !form-url.", $variables, $options);
-      $build = entity_view($contact_message, 'mail', $language->id);
+      $build = entity_view($contact_message, 'mail', $language->getId());
       $message['body'][] = drupal_render($build);
       break;
 
@@ -187,7 +187,7 @@ function contact_mail($key, &$message, $params) {
       $message['body'][] = t('Hello !recipient-name,', $variables, $options);
       $message['body'][] = t("!sender-name (!sender-url) has sent you a message via your contact form at !site-name.", $variables, $options);
       $message['body'][] = t("If you don't want to receive such e-mails, you can change your settings at !recipient-edit-url.", $variables, $options);
-      $build = entity_view($contact_message, 'mail', $language->id);
+      $build = entity_view($contact_message, 'mail', $language->getId());
       $message['body'][] = drupal_render($build);
       break;
   }
diff --git a/core/modules/contact/lib/Drupal/contact/MessageFormController.php b/core/modules/contact/lib/Drupal/contact/MessageFormController.php
index 2058887..22e2b71 100644
--- a/core/modules/contact/lib/Drupal/contact/MessageFormController.php
+++ b/core/modules/contact/lib/Drupal/contact/MessageFormController.php
@@ -213,7 +213,7 @@ public function save(array $form, array &$form_state) {
       $params['contact_category'] = $category;
 
       $to = implode(', ', $category->recipients);
-      $recipient_langcode = language_default()->id;
+      $recipient_langcode = language_default()->getId();
     }
     elseif ($recipient = $message->getPersonalRecipient()) {
       // Send to the user in the user's preferred language.
@@ -231,14 +231,14 @@ public function save(array $form, array &$form_state) {
 
     // If requested, send a copy to the user, using the current language.
     if ($message->copySender()) {
-      drupal_mail('contact', $key_prefix . '_copy', $sender->getEmail(), $language_interface->id, $params, $sender->getEmail());
+      drupal_mail('contact', $key_prefix . '_copy', $sender->getEmail(), $language_interface->getId(), $params, $sender->getEmail());
     }
 
     // If configured, send an auto-reply, using the current language.
     if (!$message->isPersonal() && $category->reply) {
       // User contact forms do not support an auto-reply message, so this
       // message always originates from the site.
-      drupal_mail('contact', 'page_autoreply', $sender->getEmail(), $language_interface->id, $params);
+      drupal_mail('contact', 'page_autoreply', $sender->getEmail(), $language_interface->getId(), $params);
     }
 
     $config = $this->configFactory->get('contact.settings');
diff --git a/core/modules/content_translation/content_translation.pages.inc b/core/modules/content_translation/content_translation.pages.inc
index 16864bf..231e6f9 100644
--- a/core/modules/content_translation/content_translation.pages.inc
+++ b/core/modules/content_translation/content_translation.pages.inc
@@ -5,7 +5,7 @@
  * The content translation user interface.
  */
 
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\ContentEntityInterface;
 
@@ -45,8 +45,8 @@ function content_translation_overview(EntityInterface $entity) {
     }
 
     foreach ($languages as $language) {
-      $language_name = $language->name;
-      $langcode = $language->id;
+      $language_name = $language->getName();
+      $langcode = $language->getId();
 
       $add_path = $rel['drupal:content-translation-overview'] . '/add/' . $original . '/' . $langcode;
       $translate_path = $rel['drupal:content-translation-overview'] . '/edit/' . $langcode;
@@ -110,7 +110,7 @@ function content_translation_overview(EntityInterface $entity) {
       else {
         // No such translation in the set yet: help user to create it.
         $row_title = $source_name = t('n/a');
-        $source = $entity->language()->id;
+        $source = $entity->language()->getId();
 
         if ($source != $langcode && $controller->getTranslationAccess($entity, 'create')) {
           if ($translatable) {
@@ -154,12 +154,13 @@ function content_translation_overview(EntityInterface $entity) {
  *   A renderable array of language switch links.
  */
 function _content_translation_get_switch_links($path) {
-  $links = \Drupal::languageManager()->getLanguageSwitchLinks(Language::TYPE_CONTENT, $path);
+  $links = \Drupal::languageManager()->getLanguageSwitchLinks(LanguageInterface::TYPE_CONTENT, $path);
   if (empty($links)) {
     // If content language is set up to fall back to the interface language,
-    // then there will be no switch links for Language::TYPE_CONTENT, ergo we
-    // also need to use interface switch links.
-    $links = \Drupal::languageManager()->getLanguageSwitchLinks(Language::TYPE_INTERFACE, $path);
+    // then there will be no switch links for
+    // \Drupal\Core\Language\LanguageInterface::TYPE_CONTENT, ergo we also need
+    // to use interface switch links.
+    $links = \Drupal::languageManager()->getLanguageSwitchLinks(LanguageInterface::TYPE_INTERFACE, $path);
   }
   return $links;
 }
@@ -169,10 +170,10 @@ function _content_translation_get_switch_links($path) {
  *
  * @param EntityInterface $entity
  *   The entity being translated.
- * @param Language $source
+ * @param \Drupal\Core\Language\LanguageInterface $source
  *   (optional) The language of the values being translated. Defaults to the
  *   entity language.
- * @param Language $target
+ * @param \Drupal\Core\Language\LanguageInterface $target
  *   (optional) The language of the translated values. Defaults to the current
  *   content language.
  *
@@ -182,12 +183,12 @@ function _content_translation_get_switch_links($path) {
  * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
  *   Use \Drupal\content_translation\Controller\ContentTranslationController::add().
  */
-function content_translation_add_page(EntityInterface $entity, Language $source = NULL, Language $target = NULL) {
+function content_translation_add_page(EntityInterface $entity, LanguageInterface $source = NULL, LanguageInterface $target = NULL) {
   $source = !empty($source) ? $source : $entity->language();
-  $target = !empty($target) ? $target : \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT);
+  $target = !empty($target) ? $target : \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
   // @todo Exploit the upcoming hook_entity_prepare() when available.
   content_translation_prepare_translation($entity, $source, $target);
-  $form_state['langcode'] = $target->id;
+  $form_state['langcode'] = $target->getId();
   $form_state['content_translation']['source'] = $source;
   $form_state['content_translation']['target'] = $target;
   $form_state['content_translation']['translation_form'] = !$entity->access('update');
@@ -199,7 +200,7 @@ function content_translation_add_page(EntityInterface $entity, Language $source
  *
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entity being translated.
- * @param \Drupal\Core\Language\Language $language
+ * @param \Drupal\Core\Language\LanguageInterface $language
  *   (optional) The language of the translated values. Defaults to the current
  *   content language.
  *
@@ -209,9 +210,9 @@ function content_translation_add_page(EntityInterface $entity, Language $source
  * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
  *   Use \Drupal\content_translation\Controller\ContentTranslationController::edit().
  */
-function content_translation_edit_page(EntityInterface $entity, Language $language = NULL) {
-  $language = !empty($language) ? $language : \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT);
-  $form_state['langcode'] = $language->id;
+function content_translation_edit_page(EntityInterface $entity, LanguageInterface $language = NULL) {
+  $language = !empty($language) ? $language : \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
+  $form_state['langcode'] = $language->getId();
   $form_state['content_translation']['translation_form'] = TRUE;
   return \Drupal::service('entity.form_builder')->getForm($entity, 'default', $form_state);
 }
@@ -221,14 +222,14 @@ function content_translation_edit_page(EntityInterface $entity, Language $langua
  *
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entitiy being translated.
- * @param \Drupal\Core\Language\Language $source
+ * @param \Drupal\Core\Language\LanguageInterface $source
  *   The language to be used as source.
- * @param \Drupal\Core\Language\Language $target
+ * @param \Drupal\Core\Language\LanguageInterface $target
  *   The language to be used as target.
  */
-function content_translation_prepare_translation(EntityInterface $entity, Language $source, Language $target) {
+function content_translation_prepare_translation(EntityInterface $entity, LanguageInterface $source, LanguageInterface $target) {
   if ($entity instanceof ContentEntityInterface) {
-    $source_translation = $entity->getTranslation($source->id);
-    $entity->addTranslation($target->id, $source_translation->toArray());
+    $source_translation = $entity->getTranslation($source->getId());
+    $entity->addTranslation($target->getId(), $source_translation->toArray());
   }
 }
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php b/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php
index b9b4904..8e3a81b 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php
@@ -57,10 +57,10 @@ public function access(Route $route, Request $request, AccountInterface $account
           $target = language_load($request->attributes->get('target'));
           $source = !empty($source) ? $source : $entity->language();
           $target = !empty($target) ? $target : \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT);
-          return ($source->id != $target->id
-            && isset($languages[$source->id])
-            && isset($languages[$target->id])
-            && !isset($translations[$target->id])
+          return ($source->getId() != $target->getId()
+            && isset($languages[$source->getId()])
+            && isset($languages[$target->getId()])
+            && !isset($translations[$target->getId()])
             && $controller->getTranslationAccess($entity, $operation))
             ? static::ALLOW : static::DENY;
 
@@ -68,9 +68,9 @@ public function access(Route $route, Request $request, AccountInterface $account
         case 'delete':
           $language = language_load($request->attributes->get('language'));
           $language = !empty($language) ? $language : \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT);
-          return isset($languages[$language->id])
-            && $language->id != $entity->getUntranslated()->language()->id
-            && isset($translations[$language->id])
+          return isset($languages[$language->getId()])
+            && $language->getId() != $entity->getUntranslated()->language()->id
+            && isset($translations[$language->getId()])
             && $controller->getTranslationAccess($entity, $operation)
             ? static::ALLOW : static::DENY;
       }
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/ContentTranslationHandler.php b/core/modules/content_translation/lib/Drupal/content_translation/ContentTranslationHandler.php
index 76723c2..39cbae2 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/ContentTranslationHandler.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/ContentTranslationHandler.php
@@ -130,8 +130,8 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
         ),
       );
       foreach (language_list(Language::STATE_CONFIGURABLE) as $language) {
-        if (isset($translations[$language->id])) {
-          $form['source_langcode']['source']['#options'][$language->id] = $language->name;
+        if (isset($translations[$language->getId()])) {
+          $form['source_langcode']['source']['#options'][$language->getId()] = $language->getName();
         }
       }
     }
@@ -143,8 +143,8 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
     if ($language_widget && $has_translations) {
       $form['langcode']['#options'] = array();
       foreach (language_list(Language::STATE_CONFIGURABLE) as $language) {
-        if (empty($translations[$language->id]) || $language->id == $entity_langcode) {
-          $form['langcode']['#options'][$language->id] = $language->name;
+        if (empty($translations[$language->getId()]) || $language->getId() == $entity_langcode) {
+          $form['langcode']['#options'][$language->getId()] = $language->getName();
         }
       }
     }
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Form/ContentTranslationDeleteForm.php b/core/modules/content_translation/lib/Drupal/content_translation/Form/ContentTranslationDeleteForm.php
index 07acc16..2096605 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Form/ContentTranslationDeleteForm.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Form/ContentTranslationDeleteForm.php
@@ -75,14 +75,14 @@ public function getCancelRoute() {
    */
   public function submitForm(array &$form, array &$form_state) {
     // Remove the translated values.
-    $this->entity->removeTranslation($this->language->id);
+    $this->entity->removeTranslation($this->language->getId());
     $this->entity->save();
 
     // Remove any existing path alias for the removed translation.
     // @todo This should be taken care of by the Path module.
     if (\Drupal::moduleHandler()->moduleExists('path')) {
       $path = $this->entity->getSystemPath();
-      $conditions = array('source' => $path, 'langcode' => $this->language->id);
+      $conditions = array('source' => $path, 'langcode' => $this->language->getId());
       \Drupal::service('path.alias_storage')->delete($conditions);
     }
 
diff --git a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
index 2628dfa..788239c 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
@@ -255,7 +255,7 @@ public function query($use_groupby = FALSE) {
         $column = $this->tableAlias . '.langcode';
         // By the same reason as field_language the field might be Language::LANGCODE_NOT_SPECIFIED in reality so allow it as well.
         // @see this::field_langcode()
-        $default_langcode = language_default()->id;
+        $default_langcode = language_default()->getId();
         $langcode = str_replace(
           array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'),
           array($this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT), $default_langcode),
@@ -861,7 +861,7 @@ protected function addSelfTokens(&$tokens, $item) {
    */
   function field_langcode(EntityInterface $entity) {
     if ($this->field_info->isTranslatable()) {
-      $default_langcode = language_default()->id;
+      $default_langcode = language_default()->getId();
       $langcode = str_replace(
         array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'),
         array($this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT), $default_langcode),
@@ -873,7 +873,7 @@ function field_langcode(EntityInterface $entity) {
       // for the selected language. FieldItemListInterface::view() does this as
       // well, but since the returned language code is used before calling it,
       // the fallback needs to happen explicitly.
-      $langcode = $this->entityManager->getTranslationFromContext($entity, $langcode)->language()->id;
+      $langcode = $this->entityManager->getTranslationFromContext($entity, $langcode)->language()->getId();
 
       return $langcode;
     }
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php b/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php
index 35bb593..4474dd9 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php
@@ -53,10 +53,10 @@ function testFileTokenReplacement() {
     $tests['[file:mime]'] = check_plain($file->getMimeType());
     $tests['[file:size]'] = format_size($file->getSize());
     $tests['[file:url]'] = check_plain(file_create_url($file->getFileUri()));
-    $tests['[file:created]'] = format_date($file->getCreatedTime(), 'medium', '', NULL, $language_interface->id);
-    $tests['[file:created:short]'] = format_date($file->getCreatedTime(), 'short', '', NULL, $language_interface->id);
-    $tests['[file:changed]'] = format_date($file->getChangedTime(), 'medium', '', NULL, $language_interface->id);
-    $tests['[file:changed:short]'] = format_date($file->getChangedTime(), 'short', '', NULL, $language_interface->id);
+    $tests['[file:created]'] = format_date($file->getCreatedTime(), 'medium', '', NULL, $language_interface->getId());
+    $tests['[file:created:short]'] = format_date($file->getCreatedTime(), 'short', '', NULL, $language_interface->getId());
+    $tests['[file:changed]'] = format_date($file->getChangedTime(), 'medium', '', NULL, $language_interface->getId());
+    $tests['[file:changed:short]'] = format_date($file->getChangedTime(), 'short', '', NULL, $language_interface->getId());
     $tests['[file:owner]'] = check_plain(user_format_name($this->admin_user));
     $tests['[file:owner:uid]'] = $file->getOwnerId();
 
@@ -64,7 +64,7 @@ function testFileTokenReplacement() {
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('file' => $file), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('file' => $file), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Sanitized file token %token replaced.', array('%token' => $input)));
     }
 
@@ -75,7 +75,7 @@ function testFileTokenReplacement() {
     $tests['[file:size]'] = format_size($file->getSize());
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('file' => $file), array('langcode' => $language_interface->id, 'sanitize' => FALSE));
+      $output = $token_service->replace($input, array('file' => $file), array('langcode' => $language_interface->getId(), 'sanitize' => FALSE));
       $this->assertEqual($output, $expected, format_string('Unsanitized file token %token replaced.', array('%token' => $input)));
     }
   }
diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 2e71d68..4098b35 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -142,13 +142,13 @@ function filter_formats(AccountInterface $account = NULL) {
   // All available formats are cached for performance.
   if (!isset($formats['all'])) {
     $language_interface = \Drupal::languageManager()->getCurrentLanguage();
-    if ($cache = \Drupal::cache()->get("filter_formats:{$language_interface->id}")) {
+    if ($cache = \Drupal::cache()->get("filter_formats:{$language_interface->getId()}")) {
       $formats['all'] = $cache->data;
     }
     else {
       $formats['all'] = \Drupal::entityManager()->getStorage('filter_format')->loadByProperties(array('status' => TRUE));
       uasort($formats['all'], 'Drupal\Core\Config\Entity\ConfigEntityBase::sort');
-      \Drupal::cache()->set("filter_formats:{$language_interface->id}", $formats['all'], Cache::PERMANENT, array('filter_formats' => TRUE));
+      \Drupal::cache()->set("filter_formats:{$language_interface->getId()}", $formats['all'], Cache::PERMANENT, array('filter_formats' => TRUE));
     }
   }
 
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
index 99a669c..f928633 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
@@ -26,9 +26,11 @@ class FieldNormalizer extends NormalizerBase {
    * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize()
    */
   public function normalize($field, $format = NULL, array $context = array()) {
+    /** @var \Drupal\Core\Field\FieldItemInterface $field */
     $normalized_field_items = array();
 
     // Get the field definition.
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
     $entity = $field->getEntity();
     $field_name = $field->getName();
     $field_definition = $field->getFieldDefinition();
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 71db626..0e3935a 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -6,7 +6,7 @@
  */
 
 use Drupal\Core\PhpStorage\PhpStorageFactory;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\language\ConfigurableLanguageManager;
 use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\language\Entity\Language as LanguageEntity;
@@ -162,7 +162,7 @@ function language_process_language_select($element) {
   if (!isset($element['#options'])) {
     $element['#options'] = array();
     foreach (\Drupal::languageManager()->getLanguages($element['#languages']) as $langcode => $language) {
-      $element['#options'][$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
+      $element['#options'][$langcode] = $language->isLocked() ? t('- @name -', array('@name' => $language->getName())) : $language->getName();
     }
   }
   // Add "Built-in English" language to the select when the default value is
@@ -203,14 +203,14 @@ function language_element_info() {
  */
 function language_configuration_element_default_options() {
   $language_options = array(
-    'site_default' => t("Site's default language (!language)", array('!language' => \Drupal::languageManager()->getDefaultLanguage()->name)),
+    'site_default' => t("Site's default language (!language)", array('!language' => \Drupal::languageManager()->getDefaultLanguage()->getName())),
     'current_interface' => t('Current interface language'),
     'authors_default' => t("Author's preferred language"),
   );
 
-  $languages = \Drupal::languageManager()->getLanguages(Language::STATE_ALL);
+  $languages = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
   foreach ($languages as $langcode => $language) {
-    $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
+    $language_options[$langcode] = $language->isLocked() ? t('- @name -', array('@name' => $language->getName())) : $language->getName();
   }
 
   return $language_options;
@@ -383,11 +383,11 @@ function language_get_default_langcode($entity_type, $bundle) {
   $language_interface = \Drupal::languageManager()->getCurrentLanguage();
   switch ($configuration['langcode']) {
     case 'site_default':
-      $default_value = \Drupal::languageManager()->getDefaultLanguage()->id;
+      $default_value = \Drupal::languageManager()->getDefaultLanguage()->getId();
       break;
 
     case 'current_interface':
-      $default_value = $language_interface->id;
+      $default_value = $language_interface->getId();
       break;
 
     case 'authors_default':
@@ -397,7 +397,7 @@ function language_get_default_langcode($entity_type, $bundle) {
         $default_value = $language_code;
       }
       else {
-        $default_value = $language_interface->id;
+        $default_value = $language_interface->getId();
       }
       break;
   }
@@ -413,15 +413,15 @@ function language_get_default_langcode($entity_type, $bundle) {
 /**
  * API function to add or update a language.
  *
- * @param $language
+ * @param \Drupal\Core\Language\LanguageInterface $language
  *   Language object with properties corresponding to the 'language'
  *   configuration properties.
  */
-function language_save($language) {
-  $language_entity = entity_load('language_entity', $language->id);
+function language_save(LanguageInterface $language) {
+  $language_entity = entity_load('language_entity', $language->getId());
   if (!$language_entity) {
     $language_entity = entity_create('language_entity', array(
-      'id' => $language->id,
+      'id' => $language->getId(),
     ));
   }
   $language->is_new = $language_entity->isNew();
@@ -435,7 +435,7 @@ function language_save($language) {
   // Save the record and inform others about the change.
   $multilingual = \Drupal::languageManager()->isMultilingual();
   $language_entity->save();
-  $t_args = array('%language' => $language->name, '%langcode' => $language->id);
+  $t_args = array('%language' => $language->name, '%langcode' => $language->getId());
   if ($language->is_new) {
     watchdog('language', 'The %language (%langcode) language has been created.', $t_args);
   }
@@ -443,10 +443,10 @@ function language_save($language) {
     watchdog('language', 'The %language (%langcode) language has been updated.', $t_args);
   }
 
-  if (!empty($language->default)) {
+  if ($language->isDefault()) {
     // Update the config. Saving the configuration fires and event that causes
     // the container to be rebuilt.
-    \Drupal::config('system.site')->set('langcode', $language->id)->save();
+    \Drupal::config('system.site')->set('langcode', $language->getId())->save();
     \Drupal::service('language.default')->set($language);
   }
 
@@ -480,12 +480,12 @@ function language_save($language) {
  *   TRUE if language is successfully deleted. Otherwise FALSE.
  */
 function language_delete($langcode) {
-  $languages = \Drupal::languageManager()->getLanguages(Language::STATE_ALL);
+  $languages = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
   if (isset($languages[$langcode]) && !$languages[$langcode]->locked) {
     $language = $languages[$langcode];
 
     // Remove the language.
-    entity_delete_multiple('language_entity', array($language->id));
+    entity_delete_multiple('language_entity', array($language->getId()));
 
     $language_manager = \Drupal::languageManager();
     $language_manager->reset();
@@ -499,7 +499,7 @@ function language_delete($langcode) {
       ConfigurableLanguageManager::rebuildServices();
     }
 
-    $t_args = array('%language' => $language->name, '%langcode' => $language->id);
+    $t_args = array('%language' => $language->getName(), '%langcode' => $language->getId());
     watchdog('language', 'The %language (%langcode) language has been removed.', $t_args);
     return TRUE;
   }
@@ -555,10 +555,10 @@ function language_negotiation_url_prefixes_update() {
   foreach (\Drupal::languageManager()->getLanguages() as $language) {
     // The prefix for this language should be updated if it's not assigned yet
     // or the prefix is set to the empty string.
-    if (empty($prefixes[$language->id])) {
+    if (empty($prefixes[$language->getId()])) {
       // For the default language, set the prefix to the empty string,
       // otherwise use the langcode.
-      $prefixes[$language->id] = !empty($language->default) ? '' : $language->id;
+      $prefixes[$language->getId()] = $language->isDefault() ? '' : $language->getId();
     }
     // Otherwise we keep the configured prefix.
   }
@@ -688,7 +688,7 @@ function language_form_system_regional_settings_alter(&$form, &$form_state) {
   $form['locale']['site_default_language'] = array(
     '#type' => 'select',
     '#title' => t('Default language'),
-    '#default_value' => $default->id,
+    '#default_value' => $default->getId(),
     '#options' => $language_options,
     '#description' => t('It is not recommended to change the default language on a working site. <a href="@language-detection">Configure the Selected language</a> setting on the detection and selection page to change the fallback language for language selection.', array('@language-detection' => url('admin/config/regional/language/detection'))),
     '#weight' => -1,
@@ -705,6 +705,6 @@ function language_form_system_regional_settings_alter(&$form, &$form_state) {
 function language_system_regional_settings_form_submit($form, &$form_state) {
   $languages = \Drupal::languageManager()->getLanguages();
   $language = $languages[$form_state['values']['site_default_language']];
-  $language->default = TRUE;
+  $language->setDefault(TRUE);
   language_save($language);
 }
diff --git a/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverride.php b/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverride.php
index bfadec0..983283b 100644
--- a/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverride.php
+++ b/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverride.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Config\Config;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\Config\TypedConfigManagerInterface;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageDefault;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
@@ -73,7 +73,7 @@ public function loadOverrides($names) {
       $data = $this->storage->readMultiple(array_values($language_names));
       // Re-key the data array to use configuration names rather than override
       // names.
-      $prefix_length = strlen(static::LANGUAGE_CONFIG_PREFIX . '.' . $this->language->id) + 1;
+      $prefix_length = strlen(static::LANGUAGE_CONFIG_PREFIX . '.' . $this->language->getId()) + 1;
       foreach ($data as $key => $value) {
         unset($data[$key]);
         $key = substr($key, $prefix_length);
@@ -109,7 +109,7 @@ protected function getLanguageConfigNames(array $names) {
     $language_names = array();
     if (isset($this->language)) {
       foreach ($names as $name) {
-        if ($language_name = $this->getLanguageConfigName($this->language->id, $name)) {
+        if ($language_name = $this->getLanguageConfigName($this->language->getId(), $name)) {
           $language_names[$name] = $language_name;
         }
       }
@@ -139,7 +139,7 @@ protected function getLanguageConfigName($langcode, $name) {
    * {@inheritdoc}
    */
   public function getCacheSuffix() {
-    return $this->language ? $this->language->id : NULL;
+    return $this->language ? $this->language->getId() : NULL;
   }
 
   /**
@@ -152,7 +152,7 @@ public function getLanguage() {
   /**
    * {@inheritdoc}
    */
-  public function setLanguage(Language $language = NULL) {
+  public function setLanguage(LanguageInterface $language = NULL) {
     $this->language = $language;
     return $this;
   }
diff --git a/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverrideInterface.php b/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverrideInterface.php
index 1c3de55..81b2e39 100644
--- a/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverrideInterface.php
+++ b/core/modules/language/lib/Drupal/language/Config/LanguageConfigFactoryOverrideInterface.php
@@ -8,7 +8,7 @@
 namespace Drupal\language\Config;
 
 use Drupal\Core\Config\ConfigFactoryOverrideInterface;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageDefault;
 
 /**
@@ -32,12 +32,12 @@ public function getLanguage();
   /**
    * Sets the language to be used in configuration overrides.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   The language object used to override configuration data.
    *
    * @return $this
    */
-  public function setLanguage(Language $language = NULL);
+  public function setLanguage(LanguageInterface $language = NULL);
 
   /**
    * Sets the language to be used in configuration overrides from the default.
diff --git a/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php b/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php
index 6b13ebc..55803af 100644
--- a/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php
+++ b/core/modules/language/lib/Drupal/language/ConfigurableLanguageManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\language;
 
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\PhpStorage\PhpStorageFactory;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
@@ -274,7 +275,7 @@ public function getLanguages($flags = Language::STATE_CONFIGURABLE) {
       // Prepopulate the language list with the default language to keep things
       // working even if we have no configuration.
       $default = $this->getDefaultLanguage();
-      $this->languages = array($default->id => $default);
+      $this->languages = array($default->getId() => $default);
 
       // Retrieve the config storage to list available languages.
       $prefix = 'language.entity.';
@@ -287,7 +288,7 @@ public function getLanguages($flags = Language::STATE_CONFIGURABLE) {
         $langcode = $data['id'];
         // Initialize default property so callers have an easy reference and can
         // save the same object without data loss.
-        $data['default'] = ($langcode == $default->id);
+        $data['default'] = ($langcode == $default->getId());
         $data['name'] = $data['label'];
         $this->languages[$langcode] = new Language($data);
         $weight = max(array($weight, $this->languages[$langcode]->weight));
@@ -311,14 +312,14 @@ public function updateLockedLanguageWeights() {
 
     // Get maximum weight to update the system languages to keep them on bottom.
     foreach ($this->getLanguages(Language::STATE_CONFIGURABLE) as $language) {
-      if (!$language->locked && $language->weight > $max_weight) {
-        $max_weight = $language->weight;
+      if (!$language->isLocked() && $language->getWeight() > $max_weight) {
+        $max_weight = $language->getWeight();
       }
     }
 
     // Loop locked languages to maintain the existing order.
     $locked_languages = $this->getLanguages(Language::STATE_LOCKED);
-    $config_ids = array_map(function($language) { return 'language.entity.' . $language->id; }, $locked_languages);
+    $config_ids = array_map(function(LanguageInterface $language) { return 'language.entity.' . $language->getId(); }, $locked_languages);
     foreach ($this->configFactory->loadMultiple($config_ids) as $config_id => $config) {
       // Update system languages weight.
       $max_weight++;
@@ -388,7 +389,7 @@ public function getLanguageSwitchLinks($type, $path) {
   /**
    * {@inheritdoc}
    */
-  public function setConfigOverrideLanguage(Language $language = NULL) {
+  public function setConfigOverrideLanguage(LanguageInterface $language = NULL) {
     $this->configFactoryOverride->setLanguage($language);
     return $this;
   }
diff --git a/core/modules/language/lib/Drupal/language/Entity/Language.php b/core/modules/language/lib/Drupal/language/Entity/Language.php
index 77015cd..3a8cc66 100644
--- a/core/modules/language/lib/Drupal/language/Entity/Language.php
+++ b/core/modules/language/lib/Drupal/language/Entity/Language.php
@@ -94,9 +94,10 @@ public function preSave(EntityStorageInterface $storage) {
    * @throws \RuntimeException
    */
   public static function preDelete(EntityStorageInterface $storage, array $entities) {
-    $default_language = \Drupal::service('language.default')->get();
+    /** @var \Drupal\Core\Language\LanguageDefault $language_default */
+    $language_default = \Drupal::service('language.default');
     foreach ($entities as $entity) {
-      if ($entity->id() == $default_language->id && !$entity->isUninstalling()) {
+      if ($entity->id() == $language_default->get()->getId() && !$entity->isUninstalling()) {
         throw new DeleteDefaultLanguageException('Can not delete the default language');
       }
     }
diff --git a/core/modules/language/lib/Drupal/language/EventSubscriber/LanguageRequestSubscriber.php b/core/modules/language/lib/Drupal/language/EventSubscriber/LanguageRequestSubscriber.php
index 7700611..fcbd232 100644
--- a/core/modules/language/lib/Drupal/language/EventSubscriber/LanguageRequestSubscriber.php
+++ b/core/modules/language/lib/Drupal/language/EventSubscriber/LanguageRequestSubscriber.php
@@ -86,7 +86,7 @@ public function onKernelRequestLanguage(GetResponseEvent $event) {
       }
       // After the language manager has initialized, set the default langcode
       // for the string translations.
-      $langcode = $this->languageManager->getCurrentLanguage()->id;
+      $langcode = $this->languageManager->getCurrentLanguage()->getId();
       $this->translation->setDefaultLangcode($langcode);
     }
   }
diff --git a/core/modules/language/lib/Drupal/language/Form/NegotiationUrlForm.php b/core/modules/language/lib/Drupal/language/Form/NegotiationUrlForm.php
index 6f9cdf5..5d0a77e 100644
--- a/core/modules/language/lib/Drupal/language/Form/NegotiationUrlForm.php
+++ b/core/modules/language/lib/Drupal/language/Form/NegotiationUrlForm.php
@@ -72,17 +72,17 @@ public function buildForm(array $form, array &$form_state) {
     $prefixes = language_negotiation_url_prefixes();
     $domains = language_negotiation_url_domains();
     foreach ($languages as $langcode => $language) {
-      $t_args = array('%language' => $language->name, '%langcode' => $language->id);
+      $t_args = array('%language' => $language->getName(), '%langcode' => $language->getId());
       $form['prefix'][$langcode] = array(
         '#type' => 'textfield',
-        '#title' => $language->default ? t('%language (%langcode) path prefix (Default language)', $t_args) : t('%language (%langcode) path prefix', $t_args),
+        '#title' => $language->isDefault() ? t('%language (%langcode) path prefix (Default language)', $t_args) : t('%language (%langcode) path prefix', $t_args),
         '#maxlength' => 64,
         '#default_value' => isset($prefixes[$langcode]) ? $prefixes[$langcode] : '',
         '#field_prefix' => $base_url . '/',
       );
       $form['domain'][$langcode] = array(
         '#type' => 'textfield',
-        '#title' => t('%language (%langcode) domain', array('%language' => $language->name, '%langcode' => $language->id)),
+        '#title' => t('%language (%langcode) domain', array('%language' => $language->getName(), '%langcode' => $language->getId())),
         '#maxlength' => 128,
         '#default_value' => isset($domains[$langcode]) ? $domains[$langcode] : '',
       );
@@ -105,7 +105,7 @@ public function validateForm(array &$form, array &$form_state) {
       $value = $form_state['values']['prefix'][$langcode];
 
       if ($value === '') {
-        if (!$language->default && $form_state['values']['language_negotiation_url_part'] == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {
+        if (!$language->isDefault() && $form_state['values']['language_negotiation_url_part'] == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {
           // Throw a form error if the prefix is blank for a non-default language,
           // although it is required for selected negotiation type.
           $this->setFormError("prefix][$langcode", $form_state, t('The prefix may only be left blank for the default language.'));
@@ -119,7 +119,7 @@ public function validateForm(array &$form, array &$form_state) {
       elseif (isset($count[$value]) && $count[$value] > 1) {
         // Throw a form error if there are two languages with the same
         // domain/prefix.
-        $this->setFormError("prefix][$langcode", $form_state, t('The prefix for %language, %value, is not unique.', array('%language' => $language->name, '%value' => $value)));
+        $this->setFormError("prefix][$langcode", $form_state, t('The prefix for %language, %value, is not unique.', array('%language' => $language->getName(), '%value' => $value)));
       }
     }
 
@@ -129,7 +129,7 @@ public function validateForm(array &$form, array &$form_state) {
       $value = $form_state['values']['domain'][$langcode];
 
       if ($value === '') {
-        if (!$language->default && $form_state['values']['language_negotiation_url_part'] == LanguageNegotiationUrl::CONFIG_DOMAIN) {
+        if (!$language->isDefault() && $form_state['values']['language_negotiation_url_part'] == LanguageNegotiationUrl::CONFIG_DOMAIN) {
           // Throw a form error if the domain is blank for a non-default language,
           // although it is required for selected negotiation type.
           $this->setFormError("domain][$langcode", $form_state, t('The domain may only be left blank for the default language.'));
@@ -138,7 +138,7 @@ public function validateForm(array &$form, array &$form_state) {
       elseif (isset($count[$value]) && $count[$value] > 1) {
         // Throw a form error if there are two languages with the same
         // domain/domain.
-        $this->setFormError("domain][$langcode", $form_state, t('The domain for %language, %value, is not unique.', array('%language' => $language->name, '%value' => $value)));
+        $this->setFormError("domain][$langcode", $form_state, t('The domain for %language, %value, is not unique.', array('%language' => $language->getName(), '%value' => $value)));
       }
     }
 
diff --git a/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodBase.php b/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodBase.php
index 9ed0f7c..ca4fbd6 100644
--- a/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodBase.php
+++ b/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodBase.php
@@ -8,7 +8,7 @@
 namespace Drupal\language;
 
 use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Session\AccountInterface;
 
 /**
@@ -61,9 +61,9 @@ public function setCurrentUser(AccountInterface $current_user) {
   /**
    * {@inheritdoc}
    */
-  public function persist(Language $language) {
+  public function persist(LanguageInterface $language) {
     // Remember the method ID used to detect the language.
-    $language->method_id = static::METHOD_ID;
+    $language->setNegotiationMethodId(static::METHOD_ID);
   }
 
 }
diff --git a/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodInterface.php b/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodInterface.php
index fefa585..2d44f32 100644
--- a/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodInterface.php
+++ b/core/modules/language/lib/Drupal/language/LanguageNegotiationMethodInterface.php
@@ -8,7 +8,7 @@
 namespace Drupal\language;
 
 use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -57,9 +57,9 @@ public function getLangcode(Request $request = NULL);
   /**
    * Notifies the plugin that the language code it returned has been accepted.
    *
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   The accepted language.
    */
-  public function persist(Language $language);
+  public function persist(LanguageInterface $language);
 
 }
diff --git a/core/modules/language/lib/Drupal/language/LanguageNegotiator.php b/core/modules/language/lib/Drupal/language/LanguageNegotiator.php
index 7841bab..298cf88 100644
--- a/core/modules/language/lib/Drupal/language/LanguageNegotiator.php
+++ b/core/modules/language/lib/Drupal/language/LanguageNegotiator.php
@@ -159,7 +159,7 @@ public function initializeType($type) {
     if (!$language) {
       // If no other language was found use the default one.
       $language = $this->languageManager->getDefaultLanguage();
-      $language->method_id = LanguageNegotiatorInterface::METHOD_ID;
+      $language->setNegotiationMethodId(LanguageNegotiatorInterface::METHOD_ID);
     }
 
     return $language;
diff --git a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationSession.php b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationSession.php
index e56278d..d20a187 100644
--- a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationSession.php
+++ b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationSession.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\language\Plugin\LanguageNegotiation;
 
-use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
 use Drupal\language\LanguageNegotiationMethodBase;
 use Drupal\language\LanguageSwitcherInterface;
@@ -68,12 +68,12 @@ public function getLangcode(Request $request = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function persist(Language $language) {
+  public function persist(LanguageInterface $language) {
     parent::persist($language);
 
     // We need to update the session parameter with the request value only if we
     // have an authenticated user.
-    $langcode = $language->id;
+    $langcode = $language->getId();
     if ($langcode && $this->languageManager) {
       $languages = $this->languageManager->getLanguages();
       if ($this->currentUser->isAuthenticated() && isset($languages[$langcode])) {
@@ -127,15 +127,15 @@ function getLanguageSwitchLinks(Request $request, $type, $path) {
     $links = array();
     $config = $this->config->get('language.negotiation')->get('session');
     $param = $config['parameter'];
-    $language_query = isset($_SESSION[$param]) ? $_SESSION[$param] : $this->languageManager->getCurrentLanguage($type)->id;
+    $language_query = isset($_SESSION[$param]) ? $_SESSION[$param] : $this->languageManager->getCurrentLanguage($type)->getId();
     $query = array();
     parse_str($request->getQueryString(), $query);
 
     foreach ($this->languageManager->getLanguages() as $language) {
-      $langcode = $language->id;
+      $langcode = $language->getId();
       $links[$langcode] = array(
         'href' => $path,
-        'title' => $language->name,
+        'title' => $language->getName(),
         'attributes' => array('class' => array('language-link')),
         'query' => $query,
       );
diff --git a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUI.php b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUI.php
index 3b64974..92d3b01 100644
--- a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUI.php
+++ b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUI.php
@@ -32,7 +32,7 @@ class LanguageNegotiationUI extends LanguageNegotiationMethodBase {
    * {@inheritdoc}
    */
   public function getLangcode(Request $request = NULL) {
-    return $this->languageManager ? $this->languageManager->getCurrentLanguage()->id : NULL;
+    return $this->languageManager ? $this->languageManager->getCurrentLanguage()->getId() : NULL;
   }
 
 }
diff --git a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php
index eacb5c4..b1e266d 100644
--- a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php
+++ b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php
@@ -138,12 +138,12 @@ public function processOutbound($path, &$options = array(), Request $request = N
     }
     $config = $this->config->get('language.negotiation')->get('url');
     if ($config['source'] == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {
-      if (is_object($options['language']) && !empty($config['prefixes'][$options['language']->id])) {
-        return empty($path) ? $config['prefixes'][$options['language']->id] : $config['prefixes'][$options['language']->id] . '/' . $path;
+      if (is_object($options['language']) && !empty($config['prefixes'][$options['language']->getId()])) {
+        return empty($path) ? $config['prefixes'][$options['language']->getId()] : $config['prefixes'][$options['language']->getId()] . '/' . $path;
       }
     }
     elseif ($config['source'] ==  LanguageNegotiationUrl::CONFIG_DOMAIN) {
-      if (is_object($options['language']) && !empty($config['domains'][$options['language']->id])) {
+      if (is_object($options['language']) && !empty($config['domains'][$options['language']->getId()])) {
 
         // Save the original base URL. If it contains a port, we need to
         // retain it below.
@@ -154,7 +154,7 @@ public function processOutbound($path, &$options = array(), Request $request = N
 
         // Ask for an absolute URL with our modified base URL.
         $options['absolute'] = TRUE;
-        $options['base_url'] = $url_scheme . '://' . $config['domains'][$options['language']->id];
+        $options['base_url'] = $url_scheme . '://' . $config['domains'][$options['language']->getId()];
 
         // In case either the original base URL or the HTTP host contains a
         // port, retain it.
diff --git a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrlFallback.php b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrlFallback.php
index 2310153..7c4fddf 100644
--- a/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrlFallback.php
+++ b/core/modules/language/lib/Drupal/language/Plugin/LanguageNegotiation/LanguageNegotiationUrlFallback.php
@@ -62,11 +62,11 @@ public function getLangcode(Request $request = NULL) {
       // information, a missing URL language information indicates that URL
       // language should be the default one, otherwise we fall back to an
       // already detected language.
-      if (($prefix && empty($config['prefixes'][$default->id])) || (!$prefix && empty($config['domains'][$default->id]))) {
-        $langcode = $default->id;
+      if (($prefix && empty($config['prefixes'][$default->getId()])) || (!$prefix && empty($config['domains'][$default->getId()]))) {
+        $langcode = $default->getId();
       }
       else {
-        $langcode = $this->languageManager->getCurrentLanguage()->id;
+        $langcode = $this->languageManager->getCurrentLanguage()->getId();
       }
     }
 
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
index 0a507f2..ee918b4 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
@@ -84,14 +84,14 @@ public function testDefaultLangcode() {
     language_save_default_configuration('custom_type', 'custom_bundle', array('langcode' => 'current_interface', 'language_show' => TRUE));
     $langcode = language_get_default_langcode('custom_type', 'custom_bundle');
     $language_interface = \Drupal::languageManager()->getCurrentLanguage();
-    $this->assertEqual($langcode, $language_interface->id);
+    $this->assertEqual($langcode, $language_interface->getId());
 
     // Site's default.
     $old_default = \Drupal::languageManager()->getDefaultLanguage();
-    $old_default->default = FALSE;
+    $old_default->setDefault(FALSE);
     language_save($old_default);
     $new_default = \Drupal::languageManager()->getLanguage('cc');
-    $new_default->default = TRUE;
+    $new_default->setDefault(TRUE);
     language_save($new_default);
     language_save_default_configuration('custom_type', 'custom_bundle', array('langcode' => 'site_default', 'language_show' => TRUE));
     $langcode = language_get_default_langcode('custom_type', 'custom_bundle');
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageDependencyInjectionTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageDependencyInjectionTest.php
index 067c477..7701e13 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageDependencyInjectionTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageDependencyInjectionTest.php
@@ -62,7 +62,7 @@ function testDependencyInjectedNewDefaultLanguage() {
     // The language system creates a Language object which contains the
     // same properties as the new default language object.
     $result = \Drupal::languageManager()->getCurrentLanguage();
-    $this->assertIdentical($result->id, 'fr');
+    $this->assertIdentical($result->getId(), 'fr');
 
     // Delete the language to check that we fallback to the default.
     try {
@@ -77,7 +77,7 @@ function testDependencyInjectedNewDefaultLanguage() {
     language_save($default_language);
     language_delete('fr');
     $result = \Drupal::languageManager()->getCurrentLanguage();
-    $this->assertIdentical($result->id, $default_language->id);
+    $this->assertIdentical($result->getId(), $default_language->getId());
   }
 
 }
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageFallbackTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageFallbackTest.php
index fb621d8..5a8c685 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageFallbackTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageFallbackTest.php
@@ -30,8 +30,8 @@ protected function setUp() {
 
     for ($i = 0; $i < 3; $i++) {
       $language = new Language();
-      $language->id = $this->randomName(2);
-      $language->weight = -$i;
+      $language->setId($this->randomName(2));
+      $language->setWeight(-$i);
       language_save($language);
     }
   }
@@ -63,7 +63,7 @@ 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;
+    $default_langcode = $this->languageManager->getDefaultLanguage()->getId();
     foreach ($language_list as $langcode => $language) {
       if ($langcode != $default_langcode) {
         language_delete($langcode);
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageUrlRewritingTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageUrlRewritingTest.php
index 39ad3f8..e2d29e8 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageUrlRewritingTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageUrlRewritingTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\language\Tests;
 
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\HttpFoundation\Request;
@@ -71,14 +72,13 @@ function testUrlRewritingEdgeCases() {
    * check that language prefixes are not added to it and that the prefixed URL
    * is actually not working.
    *
-   * @param string $language
-   *   The language prefix, e.g. 'es'.
+   * @param \Drupal\Core\Language\LanguageInterface $language
    * @param string $message1
    *   Message to display in assertion that language prefixes are not added.
    * @param string $message2
    *   The message to display confirming prefixed URL is not working.
    */
-  private function checkUrl($language, $message1, $message2) {
+  private function checkUrl(LanguageInterface $language, $message1, $message2) {
     $options = array('language' => $language, 'script' => '');
     $base_path = trim(base_path(), '/');
     $rewritten_path = trim(str_replace($base_path, '', url('node', $options)), '/');
@@ -89,7 +89,7 @@ private function checkUrl($language, $message1, $message2) {
     // If the rewritten URL has not a language prefix we pick a random prefix so
     // we can always check the prefixed URL.
     $prefixes = language_negotiation_url_prefixes();
-    $stored_prefix = isset($prefixes[$language->id]) ? $prefixes[$language->id] : $this->randomName();
+    $stored_prefix = isset($prefixes[$language->getId()]) ? $prefixes[$language->getId()] : $this->randomName();
     if ($this->assertNotEqual($stored_prefix, $prefix, $message1)) {
       $prefix = $stored_prefix;
     }
diff --git a/core/modules/language/tests/language_test/language_test.module b/core/modules/language/tests/language_test/language_test.module
index e1fd47e..296d091 100644
--- a/core/modules/language/tests/language_test/language_test.module
+++ b/core/modules/language/tests/language_test/language_test.module
@@ -13,8 +13,8 @@
  */
 function language_test_page_build() {
   language_test_store_language_negotiation();
-  if (isset(\Drupal::languageManager()->getCurrentLanguage()->id) && isset(\Drupal::languageManager()->getCurrentLanguage()->method_id)) {
-    drupal_set_message(t('Language negotiation method: @name', array('@name' => \Drupal::languageManager()->getCurrentLanguage()->method_id)));
+  if (\Drupal::languageManager()->getCurrentLanguage()->getId() && \Drupal::languageManager()->getCurrentLanguage()->getNegotiationMethodId()) {
+    drupal_set_message(t('Language negotiation method: @name', array('@name' => \Drupal::languageManager()->getCurrentLanguage()->getNegotiationMethodId())));
   }
 }
 
@@ -69,7 +69,7 @@ function language_test_store_language_negotiation() {
   if (\Drupal::moduleHandler()->moduleExists('language')) {
     $last = array();
     foreach (\Drupal::languageManager()->getDefinedLanguageTypes() as $type) {
-      $last[$type] = \Drupal::languageManager()->getCurrentLanguage($type)->id;
+      $last[$type] = \Drupal::languageManager()->getCurrentLanguage($type)->getId();
     }
     \Drupal::state()->set('language_test.language_negotiation_last', $last);
   }
diff --git a/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php b/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php
index 433c8c9..0aba70e 100644
--- a/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php
+++ b/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php
@@ -61,7 +61,7 @@ public function buildForm(array $form, array &$form_state) {
     $language_options = array();
     foreach ($languages as $langcode => $language) {
       if ($langcode != 'en' || locale_translate_english()) {
-        $language_options[$langcode] = $language->name;
+        $language_options[$langcode] = $language->getName();
       }
     }
     $language_default = $this->languageManager->getDefaultLanguage();
@@ -82,7 +82,7 @@ public function buildForm(array $form, array &$form_state) {
         '#type' => 'select',
         '#title' => $this->t('Language'),
         '#options' => $language_options,
-        '#default_value' => $language_default->id,
+        '#default_value' => $language_default->getId(),
         '#empty_option' => $this->t('Source text only, no translations'),
         '#empty_value' => Language::LANGCODE_SYSTEM,
       );
@@ -139,11 +139,11 @@ public function submitForm(array &$form, array &$form_state) {
     $reader = new PoDatabaseReader();
     $languageName = '';
     if ($language != NULL) {
-      $reader->setLangcode($language->id);
+      $reader->setLangcode($language->getId());
       $reader->setOptions($content_options);
       $languages = $this->languageManager->getLanguages();
-      $languageName = isset($languages[$language->id]) ? $languages[$language->id]->name : '';
-      $filename = $language->id .'.po';
+      $languageName = isset($languages[$language->getId()]) ? $languages[$language->getId()]->getName() : '';
+      $filename = $language->getId() .'.po';
     }
     else {
       // Template required.
diff --git a/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php b/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php
index c5447e0..efd59a5 100644
--- a/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php
+++ b/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php
@@ -171,7 +171,7 @@ protected function translateFilters() {
     }
 
     // Pick the current interface language code for the filter.
-    $default_langcode = $this->languageManager->getCurrentLanguage()->id;
+    $default_langcode = $this->languageManager->getCurrentLanguage()->getId();
     if (!isset($language_options[$default_langcode])) {
       $available_langcodes = array_keys($language_options);
       $default_langcode = array_shift($available_langcodes);
diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
index 3c0dc57..5ff5175 100644
--- a/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
+++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
@@ -8,10 +8,10 @@
 namespace Drupal\locale;
 
 use Drupal\Core\Cache\CacheBackendInterface;
-use Drupal\Core\Language\Language;
 use Drupal\Core\Config\TypedConfigManager;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\language\Config\LanguageConfigFactoryOverrideInterface;
 use Drupal\language\ConfigurableLanguageManagerInterface;
 
@@ -308,14 +308,14 @@ public function translateString($name, $langcode, $source, $context) {
    *
    * @param string $name
    *   Configuration name.
-   * @param \Drupal\Core\Language\Language $language
+   * @param \Drupal\Core\Language\LanguageInterface $language
    *   A language object.
    *
    * @return bool
    *   A boolean indicating if a language has configuration translations.
    */
-  public function hasTranslation($name, Language $language) {
-    $translation = $this->languageManager->getLanguageConfigOverride($language->id, $name);
+  public function hasTranslation($name, LanguageInterface $language) {
+    $translation = $this->languageManager->getLanguageConfigOverride($language->getId(), $name);
     return !$translation->isNew();
   }
 
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleStringTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleStringTest.php
index 865023e..67eb8fe 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleStringTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleStringTest.php
@@ -195,8 +195,10 @@ function buildSourceString($values = array()) {
    */
   function createAllTranslations($source, $values = array()) {
     $list = array();
-    foreach ($this->container->get('language_manager')->getLanguages() as $language) {
-      $list[$language->id] = $this->createTranslation($source, $language->id, $values);
+    /** @var \Drupal\Core\Language\LanguageManagerInterface $language_manager */
+    $language_manager = $this->container->get('language_manager');
+    foreach ($language_manager->getLanguages() as $language) {
+      $list[$language->getId()] = $this->createTranslation($source, $language->getId(), $values);
     }
     return $list;
   }
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 881ca9a..984f491 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -301,7 +301,7 @@ function locale_get_plural($count, $langcode = NULL) {
   // individually for each language.
   $plural_indexes = &drupal_static(__FUNCTION__ . ':plurals', array());
 
-  $langcode = $langcode ? $langcode : $language_interface->id;
+  $langcode = $langcode ? $langcode : $language_interface->getId();
 
   if (!isset($plural_indexes[$langcode][$count])) {
     // Retrieve and statically cache the plural formulas for all languages.
@@ -588,11 +588,11 @@ function locale_js_translate(array $files = array()) {
   }
 
   // If necessary, rebuild the translation file for the current language.
-  if (!empty($parsed['refresh:' . $language_interface->id])) {
+  if (!empty($parsed['refresh:' . $language_interface->getId()])) {
     // Don't clear the refresh flag on failure, so that another try will
     // be performed later.
     if (_locale_rebuild_js()) {
-      unset($parsed['refresh:' . $language_interface->id]);
+      unset($parsed['refresh:' . $language_interface->getId()]);
     }
     // Store any changes after refresh was attempted.
     \Drupal::state()->set('system.javascript_parsed', $parsed);
@@ -606,9 +606,9 @@ function locale_js_translate(array $files = array()) {
   // Add the translation JavaScript file to the page.
   $locale_javascripts = \Drupal::state()->get('locale.translation.javascript') ?: array();
   $translation_file = NULL;
-  if (!empty($files) && !empty($locale_javascripts[$language_interface->id])) {
+  if (!empty($files) && !empty($locale_javascripts[$language_interface->getId()])) {
     // Add the translation JavaScript file to the page.
-    $translation_file = $dir . '/' . $language_interface->id . '_' . $locale_javascripts[$language_interface->id] . '.js';
+    $translation_file = $dir . '/' . $language_interface->getId() . '_' . $locale_javascripts[$language_interface->getId()] . '.js';
   }
   return $translation_file;
 }
@@ -626,7 +626,7 @@ function locale_library_alter(array &$library, $name) {
 
     $language_interface = \Drupal::languageManager()->getCurrentLanguage();
     $settings['jquery']['ui']['datepicker'] = array(
-      'isRTL' => $language_interface->direction == Language::DIRECTION_RTL,
+      'isRTL' => $language_interface->getDirection() == Language::DIRECTION_RTL,
       'firstDay' => \Drupal::config('system.date')->get('first_day'),
     );
     $library['js'][] = array(
@@ -799,20 +799,22 @@ function locale_system_file_system_settings_submit(&$form, $form_state) {
  * Implements hook_preprocess_HOOK() for node templates.
  */
 function locale_preprocess_node(&$variables) {
-  if ($variables['node']->language()->id != Language::LANGCODE_NOT_SPECIFIED) {
+  /** @var \Drupal\node\NodeInterface $node */
+  $node = $variables['node'];
+  if ($node->language()->getId() != Language::LANGCODE_NOT_SPECIFIED) {
     $language_interface = \Drupal::languageManager()->getCurrentLanguage();
 
-    $node_language = $variables['node']->language();
-    if ($node_language->id != $language_interface->id) {
+    $node_language = $node->language();
+    if ($node_language->getId() != $language_interface->getId()) {
       // If the node language was different from the page language, we should
       // add markup to identify the language. Otherwise the page language is
       // inherited.
-      $variables['attributes']['lang'] = $node_language->id;
-      if ($node_language->direction != $language_interface->direction) {
+      $variables['attributes']['lang'] = $node_language->getId();
+      if ($node_language->getDirection() != $language_interface->getDirection()) {
         // If text direction is different form the page's text direction, add
         // direction information as well.
         $dir = array('ltr', 'rtl');
-        $variables['attributes']['dir'] = $dir[$node_language->direction];
+        $variables['attributes']['dir'] = $dir[$node_language->getDirection()];
       }
     }
   }
@@ -1264,7 +1266,7 @@ function _locale_rebuild_js($langcode = NULL) {
   // Only add strings with a translation to the translations array.
   $conditions = array(
     'type' => 'javascript',
-    'language' =>  $language->id,
+    'language' =>  $language->getId(),
     'translated' => TRUE,
   );
   $translations = array();
@@ -1281,8 +1283,8 @@ function _locale_rebuild_js($langcode = NULL) {
     );
 
     $locale_plurals = \Drupal::state()->get('locale.translation.plurals') ?: array();
-    if (!empty($locale_plurals[$language->id]['formula'])) {
-      $data['pluralFormula'] = $locale_plurals[$language->id]['formula'];
+    if (!empty($locale_plurals[$language->getId()]['formula'])) {
+      $data['pluralFormula'] = $locale_plurals[$language->getId()]['formula'];
     }
 
     $data = 'Drupal.locale = ' . Json::encode($data) . ';';
@@ -1295,23 +1297,23 @@ function _locale_rebuild_js($langcode = NULL) {
 
   // Delete old file, if we have no translations anymore, or a different file to be saved.
   $locale_javascripts = \Drupal::state()->get('locale.translation.javascript') ?: array();
-  $changed_hash = !isset($locale_javascripts[$language->id]) || ($locale_javascripts[$language->id] != $data_hash);
-  if (!empty($locale_javascripts[$language->id]) && (!$data || $changed_hash)) {
-    file_unmanaged_delete($dir . '/' . $language->id . '_' . $locale_javascripts[$language->id] . '.js');
-    $locale_javascripts[$language->id] = '';
+  $changed_hash = !isset($locale_javascripts[$language->getId()]) || ($locale_javascripts[$language->getId()] != $data_hash);
+  if (!empty($locale_javascripts[$language->getId()]) && (!$data || $changed_hash)) {
+    file_unmanaged_delete($dir . '/' . $language->getId() . '_' . $locale_javascripts[$language->getId()] . '.js');
+    $locale_javascripts[$language->getId()] = '';
     $status = 'deleted';
   }
 
   // Only create a new file if the content has changed or the original file got
   // lost.
-  $dest = $dir . '/' . $language->id . '_' . $data_hash . '.js';
+  $dest = $dir . '/' . $language->getId() . '_' . $data_hash . '.js';
   if ($data && ($changed_hash || !file_exists($dest))) {
     // Ensure that the directory exists and is writable, if possible.
     file_prepare_directory($dir, FILE_CREATE_DIRECTORY);
 
     // Save the file.
     if (file_unmanaged_save_data($data, $dest)) {
-      $locale_javascripts[$language->id] = $data_hash;
+      $locale_javascripts[$language->getId()] = $data_hash;
       // If we deleted a previous version of the file and we replace it with a
       // new one we have an update.
       if ($status == 'deleted') {
@@ -1329,7 +1331,7 @@ function _locale_rebuild_js($langcode = NULL) {
       }
     }
     else {
-      $locale_javascripts[$language->id] = '';
+      $locale_javascripts[$language->getId()] = '';
       $status = 'error';
     }
   }
@@ -1344,21 +1346,21 @@ function _locale_rebuild_js($langcode = NULL) {
   // Log the operation and return success flag.
   switch ($status) {
     case 'updated':
-      watchdog('locale', 'Updated JavaScript translation file for the language %language.', array('%language' => $language->name));
+      watchdog('locale', 'Updated JavaScript translation file for the language %language.', array('%language' => $language->getName()));
       return TRUE;
 
     case 'rebuilt':
-      watchdog('locale', 'JavaScript translation file %file.js was lost.', array('%file' => $locale_javascripts[$language->id]), WATCHDOG_WARNING);
+      watchdog('locale', 'JavaScript translation file %file.js was lost.', array('%file' => $locale_javascripts[$language->getId()]), WATCHDOG_WARNING);
     // Proceed to the 'created' case as the JavaScript translation file has
     // been created again.
     case 'created':
-      watchdog('locale', 'Created JavaScript translation file for the language %language.', array('%language' => $language->name));
+      watchdog('locale', 'Created JavaScript translation file for the language %language.', array('%language' => $language->getName()));
       return TRUE;
     case 'deleted':
-      watchdog('locale', 'Removed JavaScript translation file for the language %language because no translations currently exist for that language.', array('%language' => $language->name));
+      watchdog('locale', 'Removed JavaScript translation file for the language %language because no translations currently exist for that language.', array('%language' => $language->getName()));
       return TRUE;
     case 'error':
-      watchdog('locale', 'An error occurred during creation of the JavaScript translation file for the language %language.', array('%language' => $language->name), WATCHDOG_ERROR);
+      watchdog('locale', 'An error occurred during creation of the JavaScript translation file for the language %language.', array('%language' => $language->getName()), WATCHDOG_ERROR);
       return FALSE;
     default:
       // No operation needed.
diff --git a/core/modules/menu/lib/Drupal/menu/Tests/MenuLanguageTest.php b/core/modules/menu/lib/Drupal/menu/Tests/MenuLanguageTest.php
index 9e9af49..03e839c 100644
--- a/core/modules/menu/lib/Drupal/menu/Tests/MenuLanguageTest.php
+++ b/core/modules/menu/lib/Drupal/menu/Tests/MenuLanguageTest.php
@@ -180,7 +180,7 @@ function testMenuLanguageRemovedEnglish() {
     // Remove English language. To do that another language has to be set as
     // default.
     $language = language_load('cs');
-    $language->default = TRUE;
+    $language->setDefault(TRUE);
     language_save($language);
     language_delete('en');
 
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuTree.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuTree.php
index 24a531f..ea2f440 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuTree.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuTree.php
@@ -155,7 +155,7 @@ public function buildAllData($menu_name, $link = NULL, $max_depth = NULL) {
     $mlid = isset($link['mlid']) ? $link['mlid'] : 0;
     // Generate a cache ID (cid) specific for this $menu_name, $link, $language,
     // and depth.
-    $cid = 'links:' . $menu_name . ':all:' . $mlid . ':' . $language_interface->id . ':' . (int) $max_depth;
+    $cid = 'links:' . $menu_name . ':all:' . $mlid . ':' . $language_interface->getId() . ':' . (int) $max_depth;
 
     if (!isset($this->menuFullTrees[$cid])) {
       // If the static variable doesn't have the data, check {cache_menu}.
@@ -218,7 +218,7 @@ public function buildPageData($menu_name, $max_depth = NULL, $only_active_trail
         $max_depth = min($max_depth, MENU_MAX_DEPTH);
       }
       // Generate a cache ID (cid) specific for this page.
-      $cid = 'links:' . $menu_name . ':page:' . $system_path . ':' . $language_interface->id . ':' . $page_not_403 . ':' . (int) $max_depth;
+      $cid = 'links:' . $menu_name . ':page:' . $system_path . ':' . $language_interface->getId() . ':' . $page_not_403 . ':' . (int) $max_depth;
       // If we are asked for the active trail only, and $menu_name has not been
       // built and cached for this page yet, then this likely means that it
       // won't be built anymore, as this function is invoked from
@@ -455,7 +455,7 @@ protected function doBuildTree($menu_name, array $parameters = array()) {
     if (isset($parameters['expanded'])) {
       sort($parameters['expanded']);
     }
-    $tree_cid = 'links:' . $menu_name . ':tree-data:' . $language_interface->id . ':' . hash('sha256', serialize($parameters));
+    $tree_cid = 'links:' . $menu_name . ':tree-data:' . $language_interface->getId() . ':' . hash('sha256', serialize($parameters));
 
     // If we do not have this tree in the static cache, check {cache_menu}.
     if (!isset($this->menuTree[$tree_cid])) {
diff --git a/core/modules/node/lib/Drupal/node/Controller/NodeController.php b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
index b16b93d..9939437 100644
--- a/core/modules/node/lib/Drupal/node/Controller/NodeController.php
+++ b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
@@ -69,7 +69,7 @@ public function add(NodeTypeInterface $node_type) {
       'uid' => $account->id(),
       'name' => $account->getUsername() ?: '',
       'type' => $node_type->type,
-      'langcode' => $langcode ? $langcode : $this->languageManager()->getCurrentLanguage()->id,
+      'langcode' => $langcode ? $langcode : $this->languageManager()->getCurrentLanguage()->getId(),
     ));
 
     $form = $this->entityFormBuilder()->getForm($node);
diff --git a/core/modules/node/lib/Drupal/node/Entity/Node.php b/core/modules/node/lib/Drupal/node/Entity/Node.php
index d5aea78..e9790ae 100644
--- a/core/modules/node/lib/Drupal/node/Entity/Node.php
+++ b/core/modules/node/lib/Drupal/node/Entity/Node.php
@@ -176,7 +176,7 @@ public function prepareLangcode() {
       // Load languages the node exists in.
       $node_translations = $this->getTranslationLanguages();
       // Load the language from content negotiation.
-      $content_negotiation_langcode = \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT)->id;
+      $content_negotiation_langcode = \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT)->getId();
       // If there is a translation available, use it.
       if (isset($node_translations[$content_negotiation_langcode])) {
         $langcode = $content_negotiation_langcode;
diff --git a/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php b/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php
index bcbfff8..7999007 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php
@@ -326,23 +326,23 @@ protected function indexNode(NodeInterface $node) {
     $node_render = $this->entityManager->getViewBuilder('node');
 
     foreach ($languages as $language) {
-      $node = $node->getTranslation($language->id);
+      $node = $node->getTranslation($language->getId());
       // Render the node.
-      $build = $node_render->view($node, 'search_index', $language->id);
+      $build = $node_render->view($node, 'search_index', $language->getId());
 
       unset($build['#theme']);
       $node->rendered = drupal_render($build);
 
-      $text = '<h1>' . check_plain($node->label($language->id)) . '</h1>' . $node->rendered;
+      $text = '<h1>' . check_plain($node->label($language->getId())) . '</h1>' . $node->rendered;
 
       // Fetch extra data normally not visible.
-      $extra = $this->moduleHandler->invokeAll('node_update_index', array($node, $language->id));
+      $extra = $this->moduleHandler->invokeAll('node_update_index', array($node, $language->getId()));
       foreach ($extra as $t) {
         $text .= $t;
       }
 
       // Update index.
-      search_index($node->id(), $this->getPluginId(), $text, $language->id);
+      search_index($node->id(), $this->getPluginId(), $text, $language->getId());
     }
   }
 
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index d793975..d9d9437 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -318,7 +318,7 @@ function node_type_get_types() {
  *   An array of node type labels, keyed by the node type name.
  */
 function node_type_get_names() {
-  $cid = 'node_type:names:' . \Drupal::languageManager()->getCurrentLanguage()->id;
+  $cid = 'node_type:names:' . \Drupal::languageManager()->getCurrentLanguage()->getId();
   if ($cache = \Drupal::cache()->get($cid)) {
     return $cache->data;
   }
@@ -1173,7 +1173,7 @@ function node_feed($nids = FALSE, $channel = array()) {
     'title'       => \Drupal::config('system.site')->get('name'),
     'link'        => $base_url,
     'description' => $rss_config->get('channel.description'),
-    'language'    => $language_content->id
+    'language'    => $language_content->getId()
   );
   $channel_extras = array_diff_key($channel, $channel_defaults);
   $channel = array_merge($channel_defaults, $channel);
diff --git a/core/modules/search/search.pages.inc b/core/modules/search/search.pages.inc
index 34b235c..1dc7ed0 100644
--- a/core/modules/search/search.pages.inc
+++ b/core/modules/search/search.pages.inc
@@ -36,7 +36,7 @@ function template_preprocess_search_result(&$variables) {
   $result = $variables['result'];
   $variables['url'] = check_url($result['link']);
   $variables['title'] = check_plain($result['title']);
-  if (isset($result['language']) && $result['language'] != $language_interface->id && $result['language'] != Language::LANGCODE_NOT_SPECIFIED) {
+  if (isset($result['language']) && $result['language'] != $language_interface->getId() && $result['language'] != Language::LANGCODE_NOT_SPECIFIED) {
     $variables['title_attributes']['lang'] = $result['language'];
     $variables['content_attributes']['lang'] = $result['language'];
   }
diff --git a/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php b/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php
index 712c5ab..115b1c9 100644
--- a/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php
+++ b/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php
@@ -56,7 +56,7 @@ function testStatisticsTokenReplacement() {
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
 
     foreach ($tests as $input => $expected) {
-      $output = \Drupal::token()->replace($input, array('node' => $node), array('langcode' => $language_interface->id));
+      $output = \Drupal::token()->replace($input, array('node' => $node), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Statistics token %token replaced.', array('%token' => $input)));
     }
   }
diff --git a/core/modules/system/core.api.php b/core/modules/system/core.api.php
index 5ff42fe..cd92418 100644
--- a/core/modules/system/core.api.php
+++ b/core/modules/system/core.api.php
@@ -201,7 +201,7 @@
  *
  * Example:
  * @code
- * $cid = 'mymodule_example:' . \Drupal::languageManager()->getCurrentLanguage()->id();
+ * $cid = 'mymodule_example:' . \Drupal::languageManager()->getCurrentLanguage()->getId();
  *
  * $data = NULL;
  * if ($cache = \Drupal::cache()->get($cid)) {
diff --git a/core/modules/system/language.api.php b/core/modules/system/language.api.php
index ed6de6c..7ed7fce 100644
--- a/core/modules/system/language.api.php
+++ b/core/modules/system/language.api.php
@@ -28,7 +28,7 @@ function hook_language_switch_links_alter(array &$links, $type, $path) {
   $language_interface = \Drupal::languageManager()->getCurrentLanguage();
 
   if ($type == \Drupal\Core\Language\Language::TYPE_CONTENT && isset($links[$language_interface->id])) {
-    foreach ($links[$language_interface->id] as $link) {
+    foreach ($links[$language_interface->getId()] as $link) {
       $link['attributes']['class'][] = 'active-language';
     }
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php
index 1a6b758..aa085bf 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php
@@ -132,8 +132,8 @@ function testFormatDate() {
     // Save the original user and language and then replace it with the test user and language.
     $real_user = $user;
     $user = user_load($test_user->id(), TRUE);
-    $real_language = $language_interface->id;
-    $language_interface->id = $user->getPreferredLangcode();
+    $real_language = $language_interface->getId();
+    $language_interface->setId($user->getPreferredLangcode());
     // Simulate a Drupal bootstrap with the logged-in user.
     date_default_timezone_set(drupal_get_user_timezone());
 
@@ -155,7 +155,7 @@ function testFormatDate() {
 
     // Restore the original user and language, and enable session saving.
     $user = $real_user;
-    $language_interface->id = $real_language;
+    $language_interface->setId($real_language);
     // Restore default time zone.
     date_default_timezone_set(drupal_get_user_timezone());
     drupal_save_session(TRUE);
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/RenderElementTypesTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/RenderElementTypesTest.php
index 001b807..c6196bf 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/RenderElementTypesTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/RenderElementTypesTest.php
@@ -156,9 +156,9 @@ function testMaintenancePage() {
 
     // HTML element attributes.
     $html_attributes = new Attribute;
-    $language_interface = \Drupal::service('language_manager')->getCurrentLanguage();
-    $html_attributes['lang'] = $language_interface->id;
-    $html_attributes['dir'] = $language_interface->direction ? 'rtl' : 'ltr';
+    $language_interface = \Drupal::languageManager()->getCurrentLanguage();
+    $html_attributes['lang'] = $language_interface->getId();
+    $html_attributes['dir'] = $language_interface->getDirection() ? 'rtl' : 'ltr';
 
     $site_config = \Drupal::config('system.site');
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/UrlTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/UrlTest.php
index 3487fd4..fedc36e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/UrlTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/UrlTest.php
@@ -66,7 +66,7 @@ function testLinkAttributes() {
       '#href' => 'http://drupal.org',
       '#title' => 'bar',
     );
-    $langcode = $language->id;
+    $langcode = $language->getId();
 
     // Test that the default hreflang handling for links does not override a
     // hreflang attribute explicitly set in the render array.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityLanguageTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityLanguageTestBase.php
index bd2ceb9..f99b888 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityLanguageTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityLanguageTestBase.php
@@ -119,7 +119,7 @@ function setUp() {
         'name' => $this->randomString(),
         'weight' => $i,
       ));
-      $this->langcodes[$i] = $language->id;
+      $this->langcodes[$i] = $language->getId();
       language_save($language);
     }
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
index 46b81bf..a4a24cd 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
@@ -44,7 +44,7 @@ function setUp() {
         'id' => 'l' . $i,
         'name' => $this->randomString(),
       ));
-      $this->langcodes[$i] = $language->id;
+      $this->langcodes[$i] = $language->getId();
       language_save($language);
     }
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
index 58ad4c3..e6c8aa4 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
@@ -448,7 +448,7 @@ function testEntityTranslationAPI() {
    * Tests language fallback applied to field and entity translations.
    */
   function testLanguageFallback() {
-    $current_langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT)->id;
+    $current_langcode = $this->languageManager->getCurrentLanguage(Language::TYPE_CONTENT)->getId();
     $this->langcodes[] = $current_langcode;
 
     $values = array();
diff --git a/core/modules/system/lib/Drupal/system/Tests/Mail/MailTest.php b/core/modules/system/lib/Drupal/system/Tests/Mail/MailTest.php
index 56aef7f..27d0d87 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Mail/MailTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Mail/MailTest.php
@@ -67,7 +67,7 @@ public function testCancelMessage() {
     \Drupal::state()->set('system.test_mail_collector', array());
 
     // Send a test message that simpletest_mail_alter should cancel.
-    drupal_mail('simpletest', 'cancel_test', 'cancel@example.com', $language_interface->id);
+    drupal_mail('simpletest', 'cancel_test', 'cancel@example.com', $language_interface->getId());
     // Retrieve sent message.
     $captured_emails = \Drupal::state()->get('system.test_mail_collector');
     $sent_message = end($captured_emails);
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php
index 47d4557..7e8f3c6 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/TwigTransTest.php
@@ -81,12 +81,12 @@ protected function setUp() {
 
     // Assign Lolspeak (xx) to be the default language.
     $language = \Drupal::languageManager()->getLanguage('xx');
-    $language->default = TRUE;
+    $language->setDefault(TRUE);
     language_save($language);
     $this->rebuildContainer();
 
     // Check that lolspeak is the default language for the site.
-    $this->assertEqual(\Drupal::languageManager()->getDefaultLanguage()->id, 'xx', 'Lolspeak is the default language');
+    $this->assertEqual(\Drupal::languageManager()->getDefaultLanguage()->getId(), 'xx', 'Lolspeak is the default language');
   }
 
   /**
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index b995551..1f5eb6e 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -327,7 +327,7 @@ function hook_library_alter(array &$library, $name) {
 
     $language_interface = \Drupal::languageManager()->getCurrentLanguage();
     $settings['jquery']['ui']['datepicker'] = array(
-      'isRTL' => $language_interface->direction == Language::DIRECTION_RTL,
+      'isRTL' => $language_interface->getDirection() == Language::DIRECTION_RTL,
       'firstDay' => \Drupal::config('system.date')->get('first_day'),
     );
     $library['js'][] = array(
@@ -1285,7 +1285,7 @@ function hook_watchdog(array $log_entry) {
     '@message'       => strip_tags($log_entry['message']),
   ));
 
-  drupal_mail('emaillog', 'entry', $to, $language_interface->id, $params);
+  drupal_mail('emaillog', 'entry', $to, $language_interface->getId(), $params);
 }
 
 /**
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index ad8c084..b125268 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -967,7 +967,7 @@ function system_page_build(&$page) {
       array(
         'path' => current_path(),
         'front' => drupal_is_front_page(),
-        'language' => \Drupal::languageManager()->getCurrentLanguage(\Drupal\Core\Language\Language::TYPE_URL)->id,
+        'language' => \Drupal::languageManager()->getCurrentLanguage(\Drupal\Core\Language\Language::TYPE_URL)->getId(),
         'query' => \Drupal::service('request')->query->all(),
       )
     );
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/CachedMockBlockManager.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/CachedMockBlockManager.php
index df79b31..61ad702 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/CachedMockBlockManager.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/CachedMockBlockManager.php
@@ -25,6 +25,6 @@ public function __construct() {
     // The CacheDecorator allows us to cache these plugin definitions for
     // quicker retrieval. In this case we are generating a cache key by
     // language.
-    $this->discovery = new CacheDecorator($this->discovery, 'mock_block:' . \Drupal::languageManager()->getCurrentLanguage()->id, 'default',  1542646800, array('plugin_test'));
+    $this->discovery = new CacheDecorator($this->discovery, 'mock_block:' . \Drupal::languageManager()->getCurrentLanguage()->getId(), 'default',  1542646800, array('plugin_test'));
   }
 }
diff --git a/core/modules/system/theme.api.php b/core/modules/system/theme.api.php
index 50fa74e..8d121f6 100644
--- a/core/modules/system/theme.api.php
+++ b/core/modules/system/theme.api.php
@@ -288,7 +288,7 @@ function hook_theme_suggestions_HOOK(array $variables) {
  */
 function hook_theme_suggestions_alter(array &$suggestions, array $variables, $hook) {
   // Add an interface-language specific suggestion to all theme hooks.
-  $suggestions[] = $hook . '__' . \Drupal::languageManager()->getCurrentLanguage()->id;
+  $suggestions[] = $hook . '__' . \Drupal::languageManager()->getCurrentLanguage()->getId();
 }
 
 /**
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
index a09cbc2..806f43a 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
@@ -97,7 +97,7 @@ function testTaxonomyTokenReplacement() {
     $tests['[term:vocabulary:name]'] = String::checkPlain($this->vocabulary->name);
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('term' => $term1), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('term' => $term1), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Sanitized taxonomy term token %token replaced.', array('%token' => $input)));
     }
 
@@ -117,7 +117,7 @@ function testTaxonomyTokenReplacement() {
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('term' => $term2), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('term' => $term2), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Sanitized taxonomy term token %token replaced.', array('%token' => $input)));
     }
 
@@ -128,7 +128,7 @@ function testTaxonomyTokenReplacement() {
     $tests['[term:vocabulary:name]'] = $this->vocabulary->name;
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('term' => $term2), array('langcode' => $language_interface->id, 'sanitize' => FALSE));
+      $output = $token_service->replace($input, array('term' => $term2), array('langcode' => $language_interface->getId(), 'sanitize' => FALSE));
       $this->assertEqual($output, $expected, format_string('Unsanitized taxonomy term token %token replaced.', array('%token' => $input)));
     }
 
@@ -144,7 +144,7 @@ function testTaxonomyTokenReplacement() {
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('vocabulary' => $this->vocabulary), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('vocabulary' => $this->vocabulary), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Sanitized taxonomy vocabulary token %token replaced.', array('%token' => $input)));
     }
 
@@ -153,7 +153,7 @@ function testTaxonomyTokenReplacement() {
     $tests['[vocabulary:description]'] = $this->vocabulary->description;
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('vocabulary' => $this->vocabulary), array('langcode' => $language_interface->id, 'sanitize' => FALSE));
+      $output = $token_service->replace($input, array('vocabulary' => $this->vocabulary), array('langcode' => $language_interface->getId(), 'sanitize' => FALSE));
       $this->assertEqual($output, $expected, format_string('Unsanitized taxonomy vocabulary token %token replaced.', array('%token' => $input)));
     }
   }
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index bc53e48..ecdd62c 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -791,7 +791,7 @@ function taxonomy_build_node_index($node) {
       $field_name = $field->getName();
       if ($field->module == 'taxonomy') {
         foreach ($node->getTranslationLanguages() as $language) {
-          foreach ($node->getTranslation($language->id)->$field_name as $item) {
+          foreach ($node->getTranslation($language->getId())->$field_name as $item) {
             if (!$item->isEmpty()) {
               $tid_all[$item->target_id] = $item->target_id;
             }
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index 0f58cb2..776feed 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -378,7 +378,7 @@ function toolbar_toolbar() {
   // toolbar_subtrees route. We provide the JavaScript requesting that JSONP
   // script here with the hash parameter that is needed for that route.
   // @see toolbar_subtrees_jsonp()
-  $langcode = \Drupal::languageManager()->getCurrentLanguage()->id;
+  $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
   $menu['toolbar_administration']['#attached']['js'][] = array(
     'type' => 'setting',
     'data' => array('toolbar' => array(
diff --git a/core/modules/update/update.fetch.inc b/core/modules/update/update.fetch.inc
index d456801..1d3340c 100644
--- a/core/modules/update/update.fetch.inc
+++ b/core/modules/update/update.fetch.inc
@@ -110,7 +110,7 @@ function _update_cron_notify() {
   if (!empty($params)) {
     $notify_list = $update_config->get('notification.emails');
     if (!empty($notify_list)) {
-      $default_langcode = \Drupal::languageManager()->getDefaultLanguage()->id;
+      $default_langcode = \Drupal::languageManager()->getDefaultLanguage()->getId();
       foreach ($notify_list as $target) {
         if ($target_user = user_load_by_mail($target)) {
           $target_langcode = $target_user->getPreferredLangcode();
diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php
index ed4cc07..11df204 100644
--- a/core/modules/user/lib/Drupal/user/AccountFormController.php
+++ b/core/modules/user/lib/Drupal/user/AccountFormController.php
@@ -233,9 +233,9 @@ public function form(array $form, array &$form_state) {
       );
     }
 
-    $user_preferred_langcode = $register ? $language_interface->id : $account->getPreferredLangcode();
+    $user_preferred_langcode = $register ? $language_interface->getId() : $account->getPreferredLangcode();
 
-    $user_preferred_admin_langcode = $register ? $language_interface->id : $account->getPreferredAdminLangcode();
+    $user_preferred_admin_langcode = $register ? $language_interface->getId() : $account->getPreferredAdminLangcode();
 
     // Is the user preferred language enabled?
     $user_language_enabled = FALSE;
diff --git a/core/modules/user/lib/Drupal/user/Entity/User.php b/core/modules/user/lib/Drupal/user/Entity/User.php
index 8bb2f51..945aa48 100644
--- a/core/modules/user/lib/Drupal/user/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Entity/User.php
@@ -383,10 +383,10 @@ function getPreferredLangcode($default = NULL) {
     $language_list = language_list();
     $preferred_langcode = $this->get('preferred_langcode')->value;
     if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
-      return $language_list[$preferred_langcode]->id;
+      return $language_list[$preferred_langcode]->getId();
     }
     else {
-      return $default ? $default : language_default()->id;
+      return $default ? $default : language_default()->getId();
     }
   }
 
@@ -397,10 +397,10 @@ function getPreferredAdminLangcode($default = NULL) {
     $language_list = language_list();
     $preferred_langcode = $this->get('preferred_admin_langcode')->value;
     if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
-      return $language_list[$preferred_langcode]->id;
+      return $language_list[$preferred_langcode]->getId();
     }
     else {
-      return $default ? $default : language_default()->id;
+      return $default ? $default : language_default()->getId();
     }
   }
 
diff --git a/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php b/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php
index 15d48c8..3ee7e6b 100644
--- a/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php
+++ b/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php
@@ -128,7 +128,7 @@ public function validateForm(array &$form, array &$form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, array &$form_state) {
-    $langcode = $this->languageManager->getCurrentLanguage()->id;
+    $langcode = $this->languageManager->getCurrentLanguage()->getId();
 
     $account = $form_state['values']['account'];
     // Mail one time login URL and instructions using current language.
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php b/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php
index c9be29c..e87fbe1 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php
@@ -66,17 +66,17 @@ function testUserTokenReplacement() {
     $tests['[user:mail]'] = check_plain($account->getEmail());
     $tests['[user:url]'] = url("user/" . $account->id(), $url_options);
     $tests['[user:edit-url]'] = url("user/" . $account->id() . "/edit", $url_options);
-    $tests['[user:last-login]'] = format_date($account->getLastLoginTime(), 'medium', '', NULL, $language_interface->id);
-    $tests['[user:last-login:short]'] = format_date($account->getLastLoginTime(), 'short', '', NULL, $language_interface->id);
-    $tests['[user:created]'] = format_date($account->getCreatedTime(), 'medium', '', NULL, $language_interface->id);
-    $tests['[user:created:short]'] = format_date($account->getCreatedTime(), 'short', '', NULL, $language_interface->id);
+    $tests['[user:last-login]'] = format_date($account->getLastLoginTime(), 'medium', '', NULL, $language_interface->getId());
+    $tests['[user:last-login:short]'] = format_date($account->getLastLoginTime(), 'short', '', NULL, $language_interface->getId());
+    $tests['[user:created]'] = format_date($account->getCreatedTime(), 'medium', '', NULL, $language_interface->getId());
+    $tests['[user:created:short]'] = format_date($account->getCreatedTime(), 'short', '', NULL, $language_interface->getId());
     $tests['[current-user:name]'] = check_plain(user_format_name($global_account));
 
     // Test to make sure that we generated something for each token.
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->id));
+      $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->getId()));
       $this->assertEqual($output, $expected, format_string('Sanitized user token %token replaced.', array('%token' => $input)));
     }
 
@@ -86,7 +86,7 @@ function testUserTokenReplacement() {
     $tests['[current-user:name]'] = user_format_name($global_account);
 
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->id, 'sanitize' => FALSE));
+      $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->getId(), 'sanitize' => FALSE));
       $this->assertEqual($output, $expected, format_string('Unsanitized user token %token replaced.', array('%token' => $input)));
     }
 
@@ -98,7 +98,7 @@ function testUserTokenReplacement() {
     // Generate tokens with interface language.
     $link = url('user', array('absolute' => TRUE));
     foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->id, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
+      $output = $token_service->replace($input, array('user' => $account), array('langcode' => $language_interface->getId(), 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
       $this->assertTrue(strpos($output, $link) === 0, 'Generated URL is in interface language.');
     }
 
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 97515a2..b5affcd 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -227,7 +227,7 @@ function user_install() {
       'uuid' => \Drupal::service('uuid')->generate(),
       'name' => '',
       'mail' => '',
-      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
+      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
     ))
     ->execute();
 
@@ -241,7 +241,7 @@ function user_install() {
       'mail' => 'placeholder-for-uid-1',
       'created' => REQUEST_TIME,
       'status' => 1,
-      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
+      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
     ))
     ->execute();
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php
index 9363e85..a438ed7 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php
@@ -294,7 +294,7 @@ public function generateResultsKey() {
         'build_info' => $build_info,
         'roles' => $user->getRoles(),
         'super-user' => $user->id() == 1, // special caching for super user.
-        'langcode' => \Drupal::languageManager()->getCurrentLanguage()->id,
+        'langcode' => \Drupal::languageManager()->getCurrentLanguage()->getId(),
         'base_url' => $GLOBALS['base_url'],
       );
       $request = \Drupal::request();
@@ -324,7 +324,7 @@ public function generateOutputKey() {
         'roles' => $user->getRoles(),
         'super-user' => $user->id() == 1, // special caching for super user.
         'theme' => $GLOBALS['theme'],
-        'langcode' => \Drupal::languageManager()->getCurrentLanguage()->id,
+        'langcode' => \Drupal::languageManager()->getCurrentLanguage()->getId(),
         'base_url' => $GLOBALS['base_url'],
       );
 
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
index d6fe40a..07db860 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
@@ -157,7 +157,7 @@ public function initDisplay(ViewExecutable $view, array &$display, array &$optio
     $skip_cache = \Drupal::config('views.settings')->get('skip_cache');
 
     if (empty($view->editing) || !$skip_cache) {
-      $cid = 'views:unpack_options:' . hash('sha256', serialize(array($this->options, $options))) . ':' . \Drupal::languageManager()->getCurrentLanguage()->id;
+      $cid = 'views:unpack_options:' . hash('sha256', serialize(array($this->options, $options))) . ':' . \Drupal::languageManager()->getCurrentLanguage()->getId();
       if (empty(static::$unpackOptions[$cid])) {
         $cache = \Drupal::cache('data')->get($cid);
         if (!empty($cache->data)) {
diff --git a/core/modules/views/lib/Drupal/views/ViewsData.php b/core/modules/views/lib/Drupal/views/ViewsData.php
index a1e2da4..2b17a8b 100644
--- a/core/modules/views/lib/Drupal/views/ViewsData.php
+++ b/core/modules/views/lib/Drupal/views/ViewsData.php
@@ -96,7 +96,7 @@ public function __construct(CacheBackendInterface $cache_backend, ConfigFactoryI
     $this->moduleHandler = $module_handler;
     $this->languageManager = $language_manager;
 
-    $this->langcode = $this->languageManager->getCurrentLanguage()->id;
+    $this->langcode = $this->languageManager->getCurrentLanguage()->getId();
     $this->skipCache = $config->get('views.settings')->get('skip_cache');
   }
 
diff --git a/core/modules/views/views.api.php b/core/modules/views/views.api.php
index f1551e2..06ef97d 100644
--- a/core/modules/views/views.api.php
+++ b/core/modules/views/views.api.php
@@ -341,8 +341,8 @@ function hook_views_query_substitutions(ViewExecutable $view) {
   return array(
     '***CURRENT_VERSION***' => \Drupal::VERSION,
     '***CURRENT_TIME***' => REQUEST_TIME,
-    '***CURRENT_LANGUAGE***' => \Drupal::languageManager()->getCurrentLanguage(\Drupal\Core\Language\Language::TYPE_CONTENT)->id,
-    '***DEFAULT_LANGUAGE***' => \Drupal::languageManager()->getDefaultLanguage()->id,
+    '***CURRENT_LANGUAGE***' => \Drupal::languageManager()->getCurrentLanguage(\Drupal\Core\Language\Language::TYPE_CONTENT)->getId(),
+    '***DEFAULT_LANGUAGE***' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
   );
 }
 
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index dfb4e45..688ff4f 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -518,7 +518,7 @@ function views_language_list($field = 'name', $flags = Language::STATE_ALL) {
   $languages = \Drupal::languageManager()->getLanguages($flags);
   $list = array();
   foreach ($languages as $language) {
-    $list[$language->id] = ($field == 'name') ? t($language->name) : $language->$field;
+    $list[$language->getId()] = ($field == 'name') ? t($language->getName()) : $language->$field;
   }
   return $list;
 }
diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc
index d01235d..eae32ff 100644
--- a/core/modules/views/views.theme.inc
+++ b/core/modules/views/views.theme.inc
@@ -995,7 +995,7 @@ function template_preprocess_views_view_rss(&$variables) {
     $variables['link'] = check_url(url($path, $url_options));
   }
 
-  $variables['langcode'] = String::checkPlain(\Drupal::languageManager()->getCurrentLanguage()->id);
+  $variables['langcode'] = String::checkPlain(\Drupal::languageManager()->getCurrentLanguage()->getId());
   $variables['namespaces'] = new Attribute($style->namespaces);
   $variables['items'] = $items;
   $variables['channel_elements'] = format_xml_elements($style->channel_elements);
diff --git a/core/modules/views/views.views_execution.inc b/core/modules/views/views.views_execution.inc
index d1c040f..e6d4910 100644
--- a/core/modules/views/views.views_execution.inc
+++ b/core/modules/views/views.views_execution.inc
@@ -17,7 +17,7 @@ function views_views_query_substitutions(ViewExecutable $view) {
   return array(
     '***CURRENT_VERSION***' => \Drupal::VERSION,
     '***CURRENT_TIME***' => REQUEST_TIME,
-    '***CURRENT_LANGUAGE***' => \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT)->id,
-    '***DEFAULT_LANGUAGE***' => \Drupal::languageManager()->getDefaultLanguage()->id,
+    '***CURRENT_LANGUAGE***' => \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_CONTENT)->getId(),
+    '***DEFAULT_LANGUAGE***' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
   );
 }
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
index b16008c..13b54f5 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityManagerTest.php
@@ -843,7 +843,7 @@ function testgetExtraFields() {
     $cache_id = 'entity_bundle_extra_fields:' . $entity_type_id . ':' . $bundle . ':' . $language_code;
 
     $language = new Language();
-    $language->id = $language_code;
+    $language->setId($language_code);
 
     $this->languageManager->expects($this->once())
       ->method('getCurrentLanguage')
diff --git a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php
index 9197085..8e4d258 100644
--- a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php
+++ b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php
@@ -26,6 +26,9 @@
  */
 class PathProcessorTest extends UnitTestCase {
 
+  /**
+   * @var \Drupal\Core\Language\LanguageInterface[]
+   */
   protected $languages;
   protected $languageManager;
 
@@ -42,9 +45,13 @@ public function setUp() {
     // Set up some languages to be used by the language-based path processor.
     $languages = array();
     foreach (array('en' => 'English', 'fr' => 'French') as $langcode => $language_name) {
-      $language = new \stdClass();
-      $language->id = $langcode;
-      $language->name = $language_name;
+      $language = $this->getMock('\Drupal\Core\Language\LanguageInterface');
+      $language->expects($this->any())
+        ->method('getId')
+        ->will($this->returnValue($langcode));
+      $language->expects($this->any())
+        ->method('getName')
+        ->will($this->returnValue($language_name));
       $languages[$langcode] = $language;
     }
     $this->languages = $languages;
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
old mode 100644
new mode 100755
