diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index c54485b..7105b26 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -522,14 +522,14 @@ public function isTranslatable() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::getOriginal().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::getOriginal().
    */
   public function getOriginal() {
     return $this->getTranslation(Language::LANGCODE_DEFAULT);
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::hasTranslation().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::hasTranslation().
    */
   public function hasTranslation($langcode) {
     $translations = $this->getTranslationLanguages();
@@ -537,20 +537,25 @@ public function hasTranslation($langcode) {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::addTranslation().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::addTranslation().
    */
   public function addTranslation($langcode, array $values = array()) {}
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::removeTranslation().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::removeTranslation().
    */
   public function removeTranslation($langcode) {}
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::getTranslationStatus().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslationStatus().
    */
   public function getTranslationStatus() {
     return TranslatableInterface::TRANSLATION_EXISTING;
   }
 
+  /**
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::initTranslation().
+   */
+  public function initTranslation($langcode) {}
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
index 2d55b11..71e88f8 100644
--- a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
+++ b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
@@ -562,4 +562,11 @@ public function getTranslationStatus() {
    return $this->decorated->getTranslationStatus();
   }
 
+  /**
+   * Forwards the call to the decorated entity.
+   */
+  public function initTranslation($langcode) {
+    $this->decorated->initTranslation($langcode);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index efa1991..2c2313e 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -323,16 +323,27 @@ public function isEmpty() {
    * Implements \Drupal\Core\TypedData\TranslatableInterface::language().
    */
   public function language() {
-    // Get the language code if the property exists.
-    if ($this->getPropertyDefinition('langcode')) {
-      if ($this->activeLangcode != Language::LANGCODE_DEFAULT) {
-        $languages = language_list(Language::STATE_ALL);
-        $language = isset($languages[$this->activeLangcode]) ? $languages[$this->activeLangcode] : NULL;
-      }
-      elseif (($item = $this->get('langcode')) && isset($item->language)) {
-        $language = $item->language;
+    if ($this->activeLangcode != Language::LANGCODE_DEFAULT) {
+      $languages = language_list(Language::STATE_ALL);
+      if (isset($languages[$this->activeLangcode])) {
+        return $languages[$this->activeLangcode];
       }
     }
+    return $this->getOriginalLanguage();
+  }
+
+  /**
+   * Returns the entity original language.
+   *
+   * @return \Drupal\Core\Language\Language
+   *   The entity language object.
+   */
+  protected function getOriginalLanguage() {
+    $language = NULL;
+    // Get the language code if the property exists.
+    if ($this->getPropertyDefinition('langcode') && ($item = $this->get('langcode')) && isset($item->language)) {
+      $language = $item->language;
+    }
     if (empty($language)) {
       // Make sure we return a proper language object.
       $language = new Language(array('langcode' => Language::LANGCODE_NOT_SPECIFIED));
@@ -348,7 +359,7 @@ public function language() {
   public function getTranslation($langcode, $strict = TRUE) {
     // Ensure we always use the default language code when dealing with the
     // original entity language.
-    if ($langcode != Language::LANGCODE_DEFAULT && $langcode == $this->get('langcode')->language->langcode) {
+    if ($langcode != Language::LANGCODE_DEFAULT && $langcode == $this->getOriginalLanguage()->langcode) {
       $langcode = Language::LANGCODE_DEFAULT;
     }
 
@@ -452,6 +463,13 @@ public function getTranslationStatus() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function initTranslation($langcode) {
+    $this->translations[$langcode]['status'] = self::TRANSLATION_EXISTING;
+  }
+
+  /**
    * Checks wether the current translation object has a valid status.
    *
    * To avoid manipulating stale data, we invalidate a translation object as
@@ -484,7 +502,7 @@ public function getTranslationLanguages($include_default = TRUE, $include_remove
     unset($translations[Language::LANGCODE_DEFAULT]);
 
     if ($include_default) {
-      $langcode = $this->get('langcode')->language->langcode;
+      $langcode = $this->getOriginalLanguage()->langcode;
       $translations[$langcode] = TRUE;
     }
 
diff --git a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
index 1fbdfbf..63a264b 100644
--- a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
@@ -118,4 +118,13 @@ public function removeTranslation($langcode);
    */
   public function getTranslationStatus();
 
+  /**
+   * Marks the translation identified by the given language code as existing.
+   *
+   * @todo Remove this as soon as all translatable entities have a data table.
+   *
+   * @param string $langcode
+   */
+  public function initTranslation($langcode);
+
 }
diff --git a/core/modules/comment/lib/Drupal/comment/CommentFormController.php b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
index dd4e13d..c06a0de 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentFormController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
@@ -158,9 +158,10 @@ public function form(array $form, array &$form_state) {
     }
 
     // Add internal comment properties.
+    $original = $comment->getOriginal();
     foreach (array('cid', 'pid', 'nid', 'uid', 'node_type', 'langcode') as $key) {
       $key_name = key($comment->$key->offsetGet(0)->getPropertyDefinitions());
-      $form[$key] = array('#type' => 'value', '#value' => $comment->$key->{$key_name});
+      $form[$key] = array('#type' => 'value', '#value' => $original->$key->{$key_name});
     }
 
     return parent::form($form, $form_state, $comment);
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
index 832a0cf..8e98c4f 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
@@ -47,7 +47,7 @@ public function form(array $form, array &$form_state) {
       '#type' => 'language_select',
       '#title' => t('Language'),
       '#languages' => Language::STATE_ALL,
-      '#default_value' => $term->langcode->value,
+      '#default_value' => $term->getOriginal()->language()->langcode,
       '#access' => !is_null($language_configuration['language_show']) && $language_configuration['language_show'],
     );
 
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index f92139e..695e57d 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -704,7 +704,11 @@ function translation_entity_load_translation_metadata(array $entities, $entity_t
     // @todo Declare these as entity (translation?) properties.
     foreach ($record as $field_name => $value) {
       if (!in_array($field_name, $exclude)) {
-        $entity->translation[$record->langcode][$field_name] = $value;
+        $langcode = $record->langcode;
+        $entity->translation[$langcode][$field_name] = $value;
+        if (!$entity->hasTranslation($langcode)) {
+          $entity->initTranslation($langcode);
+        }
       }
     }
   }
diff --git a/core/modules/user/lib/Drupal/user/ProfileTranslationController.php b/core/modules/user/lib/Drupal/user/ProfileTranslationController.php
index c1b2414..59a34f9 100644
--- a/core/modules/user/lib/Drupal/user/ProfileTranslationController.php
+++ b/core/modules/user/lib/Drupal/user/ProfileTranslationController.php
@@ -8,12 +8,12 @@
 namespace Drupal\user;
 
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\translation_entity\EntityTranslationController;
+use Drupal\translation_entity\EntityTranslationControllerNG;
 
 /**
  * Defines the translation controller class for terms.
  */
-class ProfileTranslationController extends EntityTranslationController {
+class ProfileTranslationController extends EntityTranslationControllerNG {
 
   /**
    * Overrides EntityTranslationController::entityFormAlter().
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
index 660c335..0103583 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -923,7 +923,8 @@ public function getExportProperties() {
    * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslation().
    */
   public function getTranslation($langcode, $strict = TRUE) {
-    return $this->storage->getTranslation($langcode, $strict);
+    // @todo Revisit this once config entities are converted to NG.
+    return $this;
   }
 
   /**
@@ -1046,41 +1047,48 @@ public function isTranslatable() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::getOriginal().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::getOriginal().
    */
   public function getOriginal() {
     return $this->storage->getOriginal();
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::hasTranslation().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::hasTranslation().
    */
   public function hasTranslation($langcode) {
     return $this->storage->hasTranslation($langcode);
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::addTranslation().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::addTranslation().
    */
   public function addTranslation($langcode, array $values = array()) {
     return $this->storage->addTranslation($langcode, $values);
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::removeTranslation().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::removeTranslation().
    */
   public function removeTranslation($langcode) {
     $this->storage->removeTranslation($langcode);
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::getTranslationStatus().
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslationStatus().
    */
   public function getTranslationStatus() {
     return $this->storage->getTranslationStatus();
   }
 
   /**
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslationStatus().
+   */
+  public function initTranslation($langcode) {
+    $this->storage->initTranslation($langcode);
+  }
+
+  /**
    * Implements \Drupal\Core\TypedData\TypedDataInterface::getType().
    */
   public function getType() {
