diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index b54c064..4d06005 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -84,6 +84,13 @@ class EntityNG extends Entity {
   protected $language;
 
   /**
+   * Local cache for the available language objects.
+   *
+   * @var array
+   */
+  protected $languages;
+
+  /**
    * Local cache for field definitions.
    *
    * @see EntityNG::getPropertyDefinitions()
@@ -133,6 +140,7 @@ class EntityNG extends Entity {
   public function __construct(array $values, $entity_type, $bundle = FALSE, $translations = array()) {
     $this->entityType = $entity_type;
     $this->bundle = $bundle ? $bundle : $this->entityType;
+    $this->languages = language_list(Language::STATE_ALL);
 
     foreach ($values as $key => $value) {
       // If the key matches an existing property set the value to the property
@@ -288,7 +296,10 @@ public function get($property_name) {
    * @return \Drupal\Core\Entity\Field\FieldInterface
    */
   protected function getTranslatedField($property_name, $langcode) {
-    $this->checkTranslationStatus();
+    if ($this->translations[$this->activeLangcode]['status'] == self::$TRANSLATION_REMOVED) {
+      $message = 'The entity object refers to a removed translation (@langcode) and cannot be manipulated.';
+      throw new \InvalidArgumentException(format_string($message, array('@langcode' => $this->activeLangcode)));
+    }
     // Populate $this->fields to speed-up further look-ups and to keep track of
     // fields objects, possibly holding changes to field values.
     if (!isset($this->fields[$property_name][$langcode])) {
@@ -421,12 +432,14 @@ public function access($operation = 'view', AccountInterface $account = NULL) {
    */
   public function language() {
     if ($this->activeLangcode != Language::LANGCODE_DEFAULT) {
-      $languages = language_list(Language::STATE_ALL);
-      if (isset($languages[$this->activeLangcode])) {
-        return $languages[$this->activeLangcode];
+      if (!isset($this->languages[$this->activeLangcode])) {
+        $this->languages += language_list(Language::STATE_ALL);
       }
+      return $this->languages[$this->activeLangcode];
+    }
+    else {
+      return $this->language ?: $this->getDefaultLanguage();
     }
-    return $this->getDefaultLanguage();
   }
 
   /**
@@ -470,8 +483,11 @@ public function onChange($property_name) {
   public function getTranslation($langcode) {
     // Ensure we always use the default language code when dealing with the
     // original entity language.
-    if ($langcode != Language::LANGCODE_DEFAULT && $langcode == $this->getDefaultLanguage()->langcode) {
-      $langcode = Language::LANGCODE_DEFAULT;
+    if ($langcode != Language::LANGCODE_DEFAULT) {
+      $default_language = $this->language ?: $this->getDefaultLanguage();
+      if ($langcode == $default_language->langcode) {
+        $langcode = Language::LANGCODE_DEFAULT;
+      }
     }
 
     // Populate entity translation object cache so it will be available for all
@@ -512,6 +528,14 @@ public function getTranslation($langcode) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getUntranslated() {
+    $langcode = Language::LANGCODE_DEFAULT;
+    return isset($this->translations[$langcode]['entity']) ? $this->translations[$langcode]['entity'] : $this->getTranslation($langcode);
+  }
+
+  /**
    * Instantiates a translation object for an existing translation.
    *
    * The translated entity will be a clone of the current entity with the
@@ -619,24 +643,6 @@ public function initTranslation($langcode) {
   }
 
   /**
-   * Checks wether the current translation object has a valid status.
-   *
-   * To avoid manipulating stale data, we invalidate a translation object as
-   * soon as the related translation has been removed. Any attempt to access
-   * invalid data causes an exception to be thrown.
-   *
-   * @return bool
-   *   TRUE if the translation object has a valid status.
-   */
-  protected function checkTranslationStatus() {
-    if ($this->translations[$this->activeLangcode]['status'] == self::$TRANSLATION_REMOVED) {
-      $message = 'The entity object refers to a removed translation (@langcode) and cannot be manipulated.';
-      throw new \InvalidArgumentException(format_string($message, array('@langcode' => $this->activeLangcode)));
-    }
-    return TRUE;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getTranslationLanguages($include_default = TRUE) {
@@ -776,7 +782,10 @@ public function __unset($name) {
    * Overrides Entity::createDuplicate().
    */
   public function createDuplicate() {
-    $this->checkTranslationStatus();
+    if ($this->translations[$this->activeLangcode]['status'] == self::$TRANSLATION_REMOVED) {
+      $message = 'The entity object refers to a removed translation (@langcode) and cannot be manipulated.';
+      throw new \InvalidArgumentException(format_string($message, array('@langcode' => $this->activeLangcode)));
+    }
 
     $duplicate = clone $this;
     $entity_info = $this->entityInfo();
