diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
index 809f186..8432d15 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
@@ -38,13 +38,6 @@
 class ConfigStorageController extends EntityStorageControllerBase {
 
   /**
-   * Name of the entity's UUID property.
-   *
-   * @var string
-   */
-  protected $uuidKey = 'uuid';
-
-  /**
    * The UUID service.
    *
    * @var \Drupal\Component\Uuid\UuidInterface
@@ -96,7 +89,6 @@ class ConfigStorageController extends EntityStorageControllerBase {
   public function __construct(EntityTypeInterface $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, UuidInterface $uuid_service) {
     parent::__construct($entity_info);
 
-    $this->idKey = $this->entityInfo->getKey('id');
     $this->statusKey = $this->entityInfo->getKey('status');
 
     $this->configFactory = $config_factory;
@@ -263,6 +255,7 @@ protected function buildQuery($ids, $revision_id = FALSE) {
     foreach ($this->configFactory->loadMultiple($names) as $config) {
       $result[$config->get($this->idKey)] = new $config_class($config->get(), $this->entityType);
     }
+
     return $result;
   }
 
@@ -274,7 +267,7 @@ public function create(array $values) {
     $class::preCreate($this, $values);
 
     // Set default language to site default if not provided.
-    $values += array('langcode' => language_default()->id);
+    $values += array($this->langcodeKey => language_default()->id);
 
     $entity = new $class($values, $this->entityType);
     // 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 7a54191..af9da64 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -441,7 +441,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->entityInfo()->getKey('langcode'));
     $this->get($name)->setValue($value, $notify);
   }
 
@@ -561,8 +561,9 @@ public function language() {
    * Populates the local cache for the default language code.
    */
   protected function setDefaultLangcode() {
+    $langcode_key = $this->entityInfo()->getKey('langcode');
     // Get the language code if the property exists.
-    if ($this->getPropertyDefinition('langcode') && ($item = $this->get('langcode')) && isset($item->language)) {
+    if ($this->getPropertyDefinition($langcode_key) && ($item = $this->get($langcode_key)) && isset($item->language)) {
       $this->defaultLangcode = $item->language->id;
     }
     if (empty($this->defaultLangcode)) {
@@ -571,8 +572,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[$langcode_key])) {
+      $this->fields[$langcode_key][Language::LANGCODE_DEFAULT]->setLangcode($this->defaultLangcode);
     }
   }
 
@@ -594,7 +595,7 @@ protected function updateFieldLangcodes($langcode) {
    * {@inheritdoc}
    */
   public function onChange($name) {
-    if ($name == 'langcode') {
+    if ($name == $this->entityInfo()->getKey('langcode')) {
       $this->setDefaultLangcode();
       if (isset($this->translations[$this->defaultLangcode])) {
         $message = format_string('A translation already exists for the specified language (@langcode).', array('@langcode' => $this->defaultLangcode));
@@ -717,7 +718,7 @@ public function addTranslation($langcode, array $values = array()) {
     // Instantiate a new empty entity so default values will be populated in the
     // specified language.
     $info = $this->entityInfo();
-    $default_values = array($info->getKey('bundle') => $this->bundle, 'langcode' => $langcode);
+    $default_values = array($info->getKey('bundle') => $this->bundle, $info->getKey('langcode') => $langcode);
     $entity = \Drupal::entityManager()
       ->getStorageController($this->entityType())
       ->create($default_values);
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index bfbdfb4..18c8514 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -84,12 +84,6 @@ public function __construct(EntityTypeInterface $entity_info, Connection $databa
 
     $this->database = $database;
     $this->uuidService = $uuid_service;
-
-    // Check if the entity type supports IDs.
-    $this->idKey = $this->entityInfo->getKey('id');
-
-    // Check if the entity type supports UUIDs.
-    $this->uuidKey = $this->entityInfo->getKey('uuid');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 2461202..7e30c96 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -17,13 +17,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
@@ -283,7 +276,7 @@ public function access($operation = 'view', AccountInterface $account = NULL) {
    * {@inheritdoc}
    */
   public function language() {
-    $language = language_load($this->langcode);
+    $language = language_load($this->{$this->entityInfo()->getKey('langcode')});
     if (!$language) {
       // Make sure we return a proper language object.
       $language = new Language(array('id' => Language::LANGCODE_NOT_SPECIFIED));
@@ -292,6 +285,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/EntityStorageControllerBase.php b/core/lib/Drupal/Core/Entity/EntityStorageControllerBase.php
index 7db28fc..52bb5fe 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;
 
@@ -61,6 +62,13 @@
   protected $uuidKey;
 
   /**
+   * The name of the entity langcode property.
+   *
+   * @var string
+   */
+  protected $langcodeKey;
+
+  /**
    * Constructs an EntityStorageControllerBase instance.
    *
    * @param \Drupal\Core\Entity\EntityTypeInterface $entity_info
@@ -71,6 +79,11 @@ public function __construct(EntityTypeInterface $entity_info) {
     $this->entityInfo = $entity_info;
     // Check if the entity type supports static caching of loaded entities.
     $this->cache = $this->entityInfo->isStaticallyCacheable();
+
+    $this->idKey = $this->entityInfo->getKey('id');
+    // Check if the entity type supports UUIDs.
+    $this->uuidKey = $this->entityInfo->getKey('uuid');
+    $this->langcodeKey = $this->entityInfo->getKey('langcode');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index b4fe29c..9edc094 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -236,7 +236,7 @@ public function isFieldDataCacheable() {
    * {@inheritdoc}
    */
   public function getKeys() {
-    return $this->entity_keys + array('revision' => '', 'bundle' => '');
+    return $this->entity_keys + array('revision' => '', 'bundle' => '', 'langcode' => 'langcode');
   }
 
   /**
