diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index cee3a43..5be9bf7 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -56,6 +56,18 @@ function hook_entity_info_alter(&$entity_info) {
 }
 
 /**
+ * Act on entity creation.
+ *
+ * @param Drupal\Core\Entity\EntityInterface $entity
+ *   The entity object.
+ */
+function hook_entity_create(Drupal\Core\Entity\EntityInterface $entity) {
+  if (!isset($entity->foo)) {
+    $entity->foo = 'bar';
+  }
+}
+
+/**
  * Act on entities when loaded.
  *
  * This is a generic load hook called for all entity types loaded via the
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index 64f54de..88ee800 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -451,9 +451,9 @@ public function create(array $values) {
       $entity->{$this->uuidKey} = $uuid->generate();
     }
 
-    // Modules might need to add or change the data intially held by the new
+    // Modules might need to add or change the data initially held by the new
     // entity object, for instance to fill-in default values.
-    drupal_alter(array($this->entityType . '_entity', 'entity'), $entity);
+    $this->invokeHook('create', $entity);
 
     return $entity;
   }
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php
index 902dbdd..9ab0c3e 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php
@@ -145,7 +145,13 @@ function postComment($node, $comment, $subject = '', $contact = NULL) {
     }
 
     if (isset($match[1])) {
-      return entity_create('comment', array('id' => $match[1], 'subject' => $subject, 'comment' => $comment));
+      $values = array(
+        'id' => $match[1],
+        'node_type' => 'node_comment_' . $node->bundle(),
+        'subject' => $subject,
+        'comment' => $comment,
+      );
+      return entity_create('comment', $values);
     }
   }
 
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 60de336..9a7bea7 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -388,9 +388,9 @@ function field_data_type_info() {
 }
 
 /**
- * Implements hook_entity_alter().
+ * Implements hook_entity_create().
  */
-function field_entity_alter(EntityInterface $entity) {
+function field_entity_create(EntityInterface $entity) {
   foreach ($entity->getTranslationLanguages() as $langcode => $language) {
     field_populate_default_values($entity, $langcode);
   }
@@ -412,13 +412,15 @@ function field_entity_alter(EntityInterface $entity) {
 function field_populate_default_values(EntityInterface $entity, $langcode = NULL) {
   $entity_type = $entity->entityType();
   $langcode = $langcode ?: $entity->language()->langcode;
-
   foreach (field_info_instances($entity_type, $entity->bundle()) as $field_name => $instance) {
     $field = field_info_field($field_name);
     $field_langcode = field_is_translatable($entity_type, $field) ? $langcode : LANGUAGE_NOT_SPECIFIED;
+    // We need to preserve existing values.
     if (empty($entity->{$field_name}) || !array_key_exists($field_langcode, $entity->{$field_name})) {
       $items = field_get_default_value($entity_type, $entity, $field, $instance, $field_langcode);
-      $entity->{$field_name}[$field_langcode] = $items;
+      if (!empty($items)) {
+        $entity->{$field_name}[$field_langcode] = $items;
+      }
     }
   }
 }
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
index fd434d1..814c608 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
@@ -85,11 +85,6 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f
       $field_name => array(),
     );
 
-    // Populate widgets with default values when creating a new entity.
-    if (empty($items) && ($entity->isNew())) {
-      $items = field_get_default_value($entity_type, $entity, $field, $instance, $langcode);
-    }
-
     // Store field information in $form_state.
     if (!field_form_get_state($parents, $field_name, $langcode, $form_state)) {
       $field_state = array(
