diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
index e8f8088..189e1e0 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
@@ -24,6 +24,13 @@ class ConfigEntityType extends EntityType {
   /**
    * {@inheritdoc}
    */
+  public function getKeys() {
+    return array('language' => 'langcode') + parent::getKeys();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getControllerClasses() {
     return parent::getControllerClasses() + array(
       'storage' => 'Drupal\Core\Config\Entity\ConfigStorageController',
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
index a70ad36..eaf3681 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
@@ -89,7 +89,6 @@ class ConfigStorageController extends EntityStorageControllerBase implements Con
   public function __construct(EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, UuidInterface $uuid_service) {
     parent::__construct($entity_type);
 
-    $this->idKey = $this->entityType->getKey('id');
     $this->statusKey = $this->entityType->getKey('status');
 
     $this->configFactory = $config_factory;
@@ -246,7 +245,7 @@ public function create(array $values = array()) {
     $class::preCreate($this, $values);
 
     // Set default language to site default if not provided.
-    $values += array('langcode' => language_default()->id);
+    $values += array($this->languageKey => language_default()->id);
 
     $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/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 82e5241..417f77b 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -80,6 +80,13 @@
   protected $languages;
 
   /**
+   * The language entity key.
+   *
+   * @var string
+   */
+  protected $languageKey;
+
+  /**
    * Language code identifying the entity active language.
    *
    * This is the language field accessors will use to determine which field
@@ -134,7 +141,9 @@
   public function __construct(array $values, $entity_type, $bundle = FALSE, $translations = array()) {
     $this->entityTypeId = $entity_type;
     $this->bundle = $bundle ? $bundle : $this->entityTypeId;
-    $this->languages = language_list(Language::STATE_ALL);
+    $this->languages = \Drupal::languageManager()->getLanguages(Language::STATE_ALL);
+    $this->languageKey = $this->getEntityType()->getKey('language');
+
 
     foreach ($values as $key => $value) {
       // If the key matches an existing property set the value to the property
@@ -439,7 +448,7 @@ protected function getTranslatedField($name, $langcode) {
    */
   public function set($name, $value, $notify = TRUE) {
     // If default language changes we need to react to that.
-    $notify = $name == 'langcode';
+    $notify = ($name == $this->languageKey);
     $this->get($name)->setValue($value, $notify);
   }
 
@@ -559,7 +568,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)) {
+    if ($this->hasField($this->languageKey) && ($item = $this->get($this->languageKey)) && isset($item->language)) {
       $this->defaultLangcode = $item->language->id;
     }
     if (empty($this->defaultLangcode)) {
@@ -568,8 +577,8 @@ protected function setDefaultLangcode() {
     }
     // This needs to be initialized manually as it is skipped when instantiating
     // the language field object to avoid infinite recursion.
-    if (!empty($this->fields['langcode'])) {
-      $this->fields['langcode'][Language::LANGCODE_DEFAULT]->setLangcode($this->defaultLangcode);
+    if (!empty($this->fields[$this->languageKey])) {
+      $this->fields[$this->languageKey][Language::LANGCODE_DEFAULT]->setLangcode($this->defaultLangcode);
     }
   }
 
@@ -591,7 +600,7 @@ protected function updateFieldLangcodes($langcode) {
    * {@inheritdoc}
    */
   public function onChange($name) {
-    if ($name == 'langcode') {
+    if ($name == $this->languageKey) {
       $this->setDefaultLangcode();
       if (isset($this->translations[$this->defaultLangcode])) {
         $message = format_string('A translation already exists for the specified language (@langcode).', array('@langcode' => $this->defaultLangcode));
@@ -713,8 +722,11 @@ public function addTranslation($langcode, array $values = array()) {
 
     // Instantiate a new empty entity so default values will be populated in the
     // specified language.
-    $entity_type = $this->getEntityType();
-    $default_values = array($entity_type->getKey('bundle') => $this->bundle, 'langcode' => $langcode);
+    $info = $this->getEntityType();
+    $default_values = array(
+      $info->getKey('bundle') => $this->bundle,
+      $this->languageKey => $langcode,
+    );
     $entity = \Drupal::entityManager()
       ->getStorageController($this->getEntityTypeId())
       ->create($default_values);
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index 2056ae1..3bbabaa 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -82,12 +82,6 @@ public function __construct(EntityTypeInterface $entity_type, Connection $databa
 
     $this->database = $database;
     $this->uuidService = $uuid_service;
-
-    // Check if the entity type supports IDs.
-    $this->idKey = $this->entityType->getKey('id');
-
-    // Check if the entity type supports UUIDs.
-    $this->uuidKey = $this->entityType->getKey('uuid');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 5d70510..dc77b5b 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -16,13 +16,6 @@
 abstract class Entity implements EntityInterface {
 
   /**
-   * The language code of the entity's default language.
-   *
-   * @var string
-   */
-  public $langcode = Language::LANGCODE_NOT_SPECIFIED;
-
-  /**
    * The entity type.
    *
    * @var string
@@ -262,7 +255,8 @@ public function access($operation = 'view', AccountInterface $account = NULL) {
    * {@inheritdoc}
    */
   public function language() {
-    $language = language_load($this->langcode);
+    $langcode = $this->{$this->entityInfo()->getKey('language')};
+    $language = \Drupal::languageManager()->getLanguage($langcode);
     if (!$language) {
       // Make sure we return a proper language object.
       $language = new Language(array('id' => Language::LANGCODE_NOT_SPECIFIED));
@@ -271,6 +265,17 @@ public function language() {
   }
 
   /**
+   * Returns the current langcode.
+   *
+   * @todo Add this to interface.
+   *
+   * @return string
+   */
+  public function langcode() {
+    return $this->language()->id;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function save() {
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 5bfd687..d1987ce 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -346,8 +346,8 @@ protected function buildBaseFieldDefinitions($entity_type_id) {
     $this->moduleHandler->alter('entity_base_field_info', $base_field_definitions, $entity_type);
 
     // Ensure all basic fields are not defined as translatable.
-    $keys = array_intersect_key(array_filter($entity_type->getKeys()), array_flip(array('id', 'revision', 'uuid', 'bundle')));
-    $untranslatable_fields = array_flip(array('langcode') + $keys);
+    $untranslatable_keys = array_flip(array('id', 'revision', 'uuid', 'bundle', 'langcode'));
+    $untranslatable_fields = array_intersect_key(array_filter($entity_type->getKeys()), $untranslatable_keys);
     foreach ($base_field_definitions as $field_name => $definition) {
       if (isset($untranslatable_fields[$field_name]) && $definition->isTranslatable()) {
         throw new \LogicException(String::format('The @field field cannot be translatable.', array('@field' => $definition->getLabel())));
diff --git a/core/lib/Drupal/Core/Entity/EntityStorageControllerBase.php b/core/lib/Drupal/Core/Entity/EntityStorageControllerBase.php
index 5416935..b483bfa 100644
--- a/core/lib/Drupal/Core/Entity/EntityStorageControllerBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityStorageControllerBase.php
@@ -6,6 +6,7 @@
  */
 
 namespace Drupal\Core\Entity;
+
 use Drupal\Core\Entity\Query\QueryInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 
@@ -59,6 +60,13 @@
   protected $uuidKey;
 
   /**
+   * The name of the entity langcode property.
+   *
+   * @var string
+   */
+  protected $languageKey;
+
+  /**
    * Constructs an EntityStorageControllerBase instance.
    *
    * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
@@ -69,6 +77,10 @@ public function __construct(EntityTypeInterface $entity_type) {
     $this->entityType = $entity_type;
     // Check if the entity type supports static caching of loaded entities.
     $this->cache = $this->entityType->isStaticallyCacheable();
+
+    $this->idKey = $this->entityType->getKey('id');
+    $this->uuidKey = $this->entityType->getKey('uuid');
+    $this->languageKey = $this->entityType->getKey('language');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 4eae0df..4676642 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -229,7 +229,11 @@ public function isFieldDataCacheable() {
    * {@inheritdoc}
    */
   public function getKeys() {
-    return $this->entity_keys + array('revision' => '', 'bundle' => '');
+    return $this->entity_keys + array(
+      'revision' => '',
+      'bundle' => '',
+      'language' => '',
+    );
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php b/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
index eaa4951..db7c00d 100644
--- a/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
@@ -279,7 +279,8 @@ protected function attachPropertyData(array &$entities) {
 
         // Field values in default language are stored with
         // Language::LANGCODE_DEFAULT as key.
-        $langcode = empty($values['default_langcode']) ? $values['langcode'] : Language::LANGCODE_DEFAULT;
+        // @todo Consider adding a 'default_language' key.
+        $langcode = empty($values["default_{$this->languageKey}"]) ? $values[$this->languageKey] : Language::LANGCODE_DEFAULT;
         $translations[$id][$langcode] = TRUE;
 
         foreach (array_keys($field_definitions) as $field_name) {
@@ -357,13 +358,15 @@ protected function buildPropertyQuery(QueryInterface $entity_query, array $value
       //   apply to the default language. See http://drupal.org/node/1866330.
       // Default to the original entity language if not explicitly specified
       // otherwise.
-      if (!array_key_exists('default_langcode', $values)) {
-        $values['default_langcode'] = 1;
+      // @todo Consider adding a 'default_language' key.
+      $default_language_key = "default_{$this->languageKey}";
+      if (!array_key_exists($default_language_key, $values)) {
+        $values[$default_language_key] = 1;
       }
       // If the 'default_langcode' flag is explicitly not set, we do not care
       // whether the queried values are in the original entity language or not.
-      elseif ($values['default_langcode'] === NULL) {
-        unset($values['default_langcode']);
+      elseif ($values[$default_language_key] === NULL) {
+        unset($values[$default_language_key]);
       }
     }
 
diff --git a/core/modules/node/lib/Drupal/node/Entity/Node.php b/core/modules/node/lib/Drupal/node/Entity/Node.php
index 62f697f..c971466 100644
--- a/core/modules/node/lib/Drupal/node/Entity/Node.php
+++ b/core/modules/node/lib/Drupal/node/Entity/Node.php
@@ -45,6 +45,7 @@
  *     "id" = "nid",
  *     "revision" = "vid",
  *     "bundle" = "type",
+ *     "language" = "langcode",
  *     "label" = "title",
  *     "uuid" = "uuid"
  *   },
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Entity/Shortcut.php b/core/modules/shortcut/lib/Drupal/shortcut/Entity/Shortcut.php
index 2ba7625..6a344b4 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/Entity/Shortcut.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/Entity/Shortcut.php
@@ -38,6 +38,7 @@
  *     "id" = "id",
  *     "uuid" = "uuid",
  *     "bundle" = "shortcut_set",
+ *     "language" = "langcode",
  *     "label" = "title"
  *   },
  *   links = {
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMul.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMul.php
index 49f7d5f..fa7c385 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMul.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMul.php
@@ -33,6 +33,7 @@
  *     "id" = "id",
  *     "uuid" = "uuid",
  *     "bundle" = "type",
+ *     "language" = "langcode",
  *     "label" = "name"
  *   },
  *   links = {
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMulRev.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMulRev.php
index 870af93..f82bb0e 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMulRev.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestMulRev.php
@@ -34,6 +34,7 @@
  *     "id" = "id",
  *     "uuid" = "uuid",
  *     "revision" = "revision_id",
+ *     "language" = "langcode",
  *     "bundle" = "type"
  *   },
  *   links = {
