diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 76b8fd2..88ffd81 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -189,10 +189,24 @@ protected function typedDataManager() {
    * {@inheritdoc}
    */
   public function postCreate(EntityStorageInterface $storage) {
+    $this->applyDefaultValues();
     $this->newRevision = TRUE;
   }
 
   /**
+   * @todo
+   *
+   * @param array $field_names
+   */
+  protected function applyDefaultValues(array $field_names = NULL) {
+    foreach ($this as $field_name => $field) {
+      if ((!isset($field_names) || in_array($field_name, $field_names)) && $field->isEmpty()) {
+        $field->applyDefaultValue();
+      }
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function setNewRevision($value = TRUE) {
@@ -640,29 +654,19 @@ public function addTranslation($langcode, array $values = array()) {
       throw new \InvalidArgumentException(String::format($message, array('@langcode' => $langcode)));
     }
 
-    // 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);
-    $entity = $this->entityManager()
-      ->getStorage($this->getEntityTypeId())
-      ->create($default_values);
-
-    foreach ($entity as $name => $field) {
-      if (!isset($values[$name]) && !$field->isEmpty()) {
-        $values[$name] = $field->value;
-      }
-    }
-
     $this->translations[$langcode]['status'] = static::TRANSLATION_CREATED;
     $translation = $this->getTranslation($langcode);
-    $definitions = $translation->getFieldDefinitions();
-
+    $translatable_fields = array_filter($this->getFieldDefinitions(), function ($definition) {
+      return $definition->isTranslatable();
+    });
+    // Assign incoming values, only if the fields are actually translatable.
     foreach ($values as $name => $value) {
-      if (isset($definitions[$name]) && $definitions[$name]->isTranslatable()) {
+      if (isset($translatable_fields[$name])) {
         $translation->$name = $value;
       }
     }
+    // Apply default values for the rest of the translatable fields.
+    $translation->applyDefaultValues(array_keys(array_diff_key($translatable_fields, $values)));
 
     return $translation;
   }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 6415285..050e52d 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -55,18 +55,6 @@ protected function doCreate(array $values) {
       $bundle = $values[$this->bundleKey];
     }
     $entity = new $this->entityClass(array(), $this->entityTypeId, $bundle);
-
-    foreach ($entity as $name => $field) {
-      if (isset($values[$name])) {
-        $entity->$name = $values[$name];
-      }
-      elseif (!array_key_exists($name, $values)) {
-        $entity->get($name)->applyDefaultValue();
-      }
-      unset($values[$name]);
-    }
-
-    // Set any passed values for non-defined fields also.
     foreach ($values as $name => $value) {
       $entity->$name = $value;
     }
