diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
index 1771f50..98d5b60 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
@@ -105,15 +105,13 @@ public function create(array $values) {
     }
     $entity = new $this->entityClass(array(), $this->entityType, $bundle);
 
-    // Set all other given values.
-    foreach ($values as $name => $value) {
-      $entity->$name = $value;
-    }
-
-    // Assign a new UUID if there is none yet.
-    if ($this->uuidKey && !isset($entity->{$this->uuidKey}->value)) {
-      $uuid = new Uuid();
-      $entity->{$this->uuidKey} = $uuid->generate();
+    foreach ($entity as $name => $field) {
+      if (isset($values[$name])) {
+        $entity->$name = $values[$name];
+      }
+      elseif (!array_key_exists($name, $values)) {
+        $entity->get($name)->applyDefaultValue();
+      }
     }
 
     // Modules might need to add or change the data initially held by the new
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index d3b5c41..0f95e21 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -465,6 +465,15 @@ public function validate() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    foreach ($this->getProperties() as $property) {
+      $property->applyDefaultValue(FALSE);
+    }
+  }
+
+  /**
    * Implements \Drupal\Core\TypedData\ComplexDataInterface::onChange().
    */
   public function onChange($property_name) {
diff --git a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
index 9697648..00c4654 100644
--- a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
+++ b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
@@ -523,4 +523,11 @@ public function onChange($property_name) {
   public function isTranslatable() {
     return $this->decorated->isTranslatable();
   }
+
+  /**
+   * Forwards the call to the decorated entity.
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    return $this->decorated->applyDefaultValue($notify);
+  }
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index 9406927..8bd352f 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -9,7 +9,6 @@
 
 use Drupal\Core\Language\Language;
 use Drupal\Core\TypedData\TypedDataInterface;
-use Drupal\Component\Uuid\Uuid;
 use ArrayIterator;
 use InvalidArgumentException;
 
@@ -42,13 +41,10 @@ class EntityNG extends Entity {
    *
    * @todo: Add methods for getting original fields and for determining
    * changes.
-   * @todo: Provide a better way for defining default values.
    *
    * @var array
    */
-  protected $values = array(
-    'langcode' => array(LANGUAGE_DEFAULT => array(0 => array('value' => LANGUAGE_NOT_SPECIFIED))),
-  );
+  protected $values = array();
 
   /**
    * The array of fields, each being an instance of FieldInterface.
@@ -485,8 +481,7 @@ public function createDuplicate() {
 
     // Check if the entity type supports UUIDs and generate a new one if so.
     if (!empty($entity_info['entity_keys']['uuid'])) {
-      $uuid = new Uuid();
-      $duplicate->{$entity_info['entity_keys']['uuid']}->value = $uuid->generate();
+      $duplicate->{$entity_info['entity_keys']['uuid']}->applyDefaultValue();
     }
 
     // Check whether the entity type supports revisions and initialize it if so.
diff --git a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
index 2c3feef..eb94b20 100644
--- a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
@@ -91,6 +91,7 @@ public function set($property_name, $value, $notify = TRUE) {
     // value that needs to be updated.
     if (isset($this->properties[$property_name])) {
       $this->properties[$property_name]->setValue($value, FALSE);
+      unset($this->values[$property_name]);
     }
     // Allow setting plain values for not-defined properties also.
     else {
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
index 5b78a05..f568aec 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
@@ -87,15 +87,19 @@ public function __isset($property_name) {
    * Overrides \Drupal\Core\Entity\Field\FieldItemBase::get().
    */
   public function setValue($values, $notify = TRUE) {
-    // Treat the values as property value of the entity property, if no array is
-    // given.
+    // Treat the values as value of the entity property, if no array is
+    // given as this handles entity IDs and objects.
     if (isset($values) && !is_array($values)) {
-      $values = array('entity' => $values);
+      // Directly update the property instead of invoking the parent, so that
+      // the entity property can take care of updating the ID property.
+      $this->properties['entity']->setValue($values, $notify);
     }
-    // Make sure that the 'entity' property gets set as 'target_id'.
-    if (isset($values['target_id']) && !isset($values['entity'])) {
-      $values['entity'] = $values['target_id'];
+    else {
+      // Make sure that the 'entity' property gets set as 'target_id'.
+      if (isset($values['target_id']) && !isset($values['entity'])) {
+        $values['entity'] = $values['target_id'];
+      }
+      parent::setValue($values, $notify);
     }
-    parent::setValue($values, $notify);
   }
 }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index 5d0a4ff..3f89f97 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -21,6 +21,9 @@
  * contained item the entity field delegates __get() and __set() calls
  * directly to the first item.
  *
+ * Supported settings (below the definition's 'settings' key) are:
+ * - default_value: (optional) If set, the default value to apply to the field.
+ *
  * @see \Drupal\Core\Entity\Field\FieldInterface
  */
 class Field extends ItemList implements FieldInterface {
@@ -201,4 +204,18 @@ public function defaultAccess($operation = 'view', User $account = NULL) {
     // Grant access per default.
     return TRUE;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    if (isset($this->definition['settings']['default_value'])) {
+      $this->setValue($this->definition['settings']['default_value'], $notify);
+    }
+    else {
+      // Create one field item and apply defaults.
+      $this->offsetGet(0)->applyDefaultValue(FALSE);
+    }
+    return $this;
+  }
 }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php b/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php
index 2db12e1..c861f2d 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php
@@ -51,14 +51,28 @@ public function getPropertyDefinitions() {
    */
   public function setValue($values, $notify = TRUE) {
     // Treat the values as property value of the language property, if no array
-    // is given.
+    // is given as this handles language codes and objects.
     if (isset($values) && !is_array($values)) {
-      $values = array('language' => $values);
+      // Directly update the property instead of invoking the parent, so that
+      // the language property can take care of updating the language code
+      // property.
+      $this->properties['language']->setValue($values, $notify);
     }
-    // Make sure that the 'language' property gets set as 'value'.
-    if (isset($values['value']) && !isset($values['language'])) {
-      $values['language'] = $values['value'];
+    else {
+      // Make sure that the 'language' property gets set as 'value'.
+      if (isset($values['value']) && !isset($values['language'])) {
+        $values['language'] = $values['value'];
+      }
+      parent::setValue($values, $notify);
     }
-    parent::setValue($values, $notify);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    // Default to LANGUAGE_NOT_SPECIFIED.
+    $this->setValue(array('value' => LANGUAGE_NOT_SPECIFIED), $notify);
+    return $this;
   }
 }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/UuidItem.php b/core/lib/Drupal/Core/Entity/Field/Type/UuidItem.php
new file mode 100644
index 0000000..2384c5f
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/Field/Type/UuidItem.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Field\Type\UuidItem.
+ */
+
+namespace Drupal\Core\Entity\Field\Type;
+
+use Drupal\Component\Uuid\Uuid;
+
+/**
+ * Defines the 'uuid_field' entity field item.
+ *
+ * The field uses a newly generated UUID as default value.
+ */
+class UuidItem extends StringItem {
+
+  /**
+   * Overrides \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    // Default to one field item with a generated UUID.
+    $uuid = new Uuid();
+    $this->setValue(array('value' => $uuid->generate()), $notify);
+    return $this;
+  }
+}
diff --git a/core/lib/Drupal/Core/TypedData/Type/Map.php b/core/lib/Drupal/Core/TypedData/Type/Map.php
index da20e96..4bb802d 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Map.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Map.php
@@ -230,4 +230,14 @@ public function onChange($property_name) {
       $this->parent->onChange($this->name);
     }
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    // Apply the default value of all properties.
+    foreach ($this->getProperties() as $property) {
+      $property->applyDefaultValue(FALSE);
+    }
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedData.php b/core/lib/Drupal/Core/TypedData/TypedData.php
index e9558f3..073fe17 100644
--- a/core/lib/Drupal/Core/TypedData/TypedData.php
+++ b/core/lib/Drupal/Core/TypedData/TypedData.php
@@ -112,6 +112,15 @@ public function validate() {
   }
 
   /**
+   * Implements \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    // Default to no default value.
+    $this->setValue(NULL, $notify);
+    return $this;
+  }
+
+  /**
    * Implements \Drupal\Core\TypedData\TypedDataInterface::setContext().
    */
   public function setContext($name = NULL, TypedDataInterface $parent = NULL) {
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
index dc313e3..96229b6 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
@@ -79,6 +79,19 @@ public function getConstraints();
   public function validate();
 
   /**
+   * Applies the default value.
+   *
+   * @param bool $notify
+   *   (optional) Whether to notify the parent object of the change. Defaults to
+   *   TRUE. If a property is updated from a parent object, set it to FALSE to
+   *   avoid being notified again.
+   *
+   * @return \Drupal\Core\TypedData\TypedDataInterface
+   *   Returns itself to allow for chaining.
+   */
+  public function applyDefaultValue($notify = TRUE);
+
+  /**
    * Returns the name of a property or item.
    *
    * @return string
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockStorageController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockStorageController.php
index 87ff2d5..df566e1 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockStorageController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockStorageController.php
@@ -85,7 +85,7 @@ public function baseFieldDefinitions() {
     $properties['uuid'] = array(
       'label' => t('UUID'),
       'description' => t('The custom block UUID.'),
-      'type' => 'string_field',
+      'type' => 'uuid_field',
     );
     $properties['revision_id'] = array(
       'label' => t('Revision ID'),
diff --git a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
index c005cb0..7304342 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
@@ -269,7 +269,7 @@ public function baseFieldDefinitions() {
     $properties['uuid'] = array(
       'label' => t('UUID'),
       'description' => t('The comment UUID.'),
-      'type' => 'string_field',
+      'type' => 'uuid_field',
     );
     $properties['pid'] = array(
       'label' => t('Parent ID'),
@@ -298,12 +298,16 @@ public function baseFieldDefinitions() {
       'label' => t('User ID'),
       'description' => t('The user ID of the comment author.'),
       'type' => 'entity_reference_field',
-      'settings' => array('target_type' => 'user'),
+      'settings' => array(
+        'target_type' => 'user',
+        'default_value' => 0,
+      ),
     );
     $properties['name'] = array(
       'label' => t('Name'),
       'description' => t("The comment author's name."),
       'type' => 'string_field',
+      'settings' => array('default_value' => ''),
     );
     $properties['mail'] = array(
       'label' => t('e-mail'),
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php b/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
index e56bbef..681b642 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
@@ -177,19 +177,6 @@ class Comment extends EntityNG implements CommentInterface {
   public $new;
 
   /**
-   * The plain data values of the contained properties.
-   *
-   * Define default values.
-   *
-   * @var array
-   */
-  protected $values = array(
-    'langcode' => array(LANGUAGE_DEFAULT => array(0 => array('value' => LANGUAGE_NOT_SPECIFIED))),
-    'name' => array(LANGUAGE_DEFAULT => array(0 => array('value' => ''))),
-    'uid' => array(LANGUAGE_DEFAULT => array(0 => array('target_id' => 0))),
-  );
-
-  /**
    * Initialize the object. Invoked upon construction and wake up.
    */
   protected function init() {
diff --git a/core/modules/file/lib/Drupal/file/Type/FileItem.php b/core/modules/file/lib/Drupal/file/Type/FileItem.php
index 0b2c74b..4a35e9c 100644
--- a/core/modules/file/lib/Drupal/file/Type/FileItem.php
+++ b/core/modules/file/lib/Drupal/file/Type/FileItem.php
@@ -61,15 +61,19 @@ public function getPropertyDefinitions() {
    * Overrides \Drupal\Core\Entity\Field\FieldItemBase::get().
    */
   public function setValue($values, $notify = TRUE) {
-    // Treat the values as property value of the entity property, if no array is
-    // given.
+    // Treat the values as value of the entity property, if no array is
+    // given as this handles entity IDs and objects.
     if (isset($values) && !is_array($values)) {
-      $values = array('entity' => $values);
+      // Directly update the property instead of invoking the parent, so that
+      // the entity property can take care of updating the ID property.
+      $this->properties['entity']->setValue($values, $notify);
     }
-    // Make sure that the 'entity' property gets set as 'fid'.
-    if (isset($values['fid']) && !isset($values['entity'])) {
-      $values['entity'] = $values['fid'];
+    else {
+      // Make sure that the 'entity' property gets set as 'target_id'.
+      if (isset($values['fid']) && !isset($values['entity'])) {
+        $values['entity'] = $values['fid'];
+      }
+      parent::setValue($values, $notify);
     }
-    parent::setValue($values, $notify);
   }
 }
diff --git a/core/modules/image/lib/Drupal/image/Type/ImageItem.php b/core/modules/image/lib/Drupal/image/Type/ImageItem.php
index f6cedf2..868b4fb 100644
--- a/core/modules/image/lib/Drupal/image/Type/ImageItem.php
+++ b/core/modules/image/lib/Drupal/image/Type/ImageItem.php
@@ -68,15 +68,19 @@ public function getPropertyDefinitions() {
    * Overrides \Drupal\Core\Entity\Field\FieldItemBase::get().
    */
   public function setValue($values, $notify = TRUE) {
-    // Treat the values as property value of the entity property, if no array is
-    // given.
+    // Treat the values as value of the entity property, if no array is
+    // given as this handles entity IDs and objects.
     if (isset($values) && !is_array($values)) {
-      $values = array('entity' => $values);
+      // Directly update the property instead of invoking the parent, so that
+      // the entity property can take care of updating the ID property.
+      $this->properties['entity']->setValue($values, $notify);
     }
-    // Make sure that the 'entity' property gets set as 'fid'.
-    if (isset($values['fid']) && !isset($values['entity'])) {
-      $values['entity'] = $values['fid'];
+    else {
+      // Make sure that the 'entity' property gets set as 'target_id'.
+      if (isset($values['fid']) && !isset($values['entity'])) {
+        $values['entity'] = $values['fid'];
+      }
+      parent::setValue($values, $notify);
     }
-    parent::setValue($values, $notify);
   }
 }
diff --git a/core/modules/node/lib/Drupal/node/NodeStorageController.php b/core/modules/node/lib/Drupal/node/NodeStorageController.php
index c9e832e..f1f8031 100644
--- a/core/modules/node/lib/Drupal/node/NodeStorageController.php
+++ b/core/modules/node/lib/Drupal/node/NodeStorageController.php
@@ -217,7 +217,7 @@ public function baseFieldDefinitions() {
     $properties['uuid'] = array(
       'label' => t('UUID'),
       'description' => t('The node UUID.'),
-      'type' => 'string_field',
+      'type' => 'uuid_field',
       'read-only' => TRUE,
     );
     $properties['vid'] = array(
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldDefaultValueTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldDefaultValueTest.php
new file mode 100644
index 0000000..74bbd96
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldDefaultValueTest.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Entity\EntityFieldDefaultValueTest.
+ */
+
+namespace Drupal\system\Tests\Entity;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\Field\FieldInterface;
+use Drupal\Core\Entity\Field\FieldItemInterface;
+use Drupal\Core\TypedData\TypedDataInterface;
+use Drupal\Component\Uuid\Uuid;
+
+
+/**
+ * Tests Entity API default field value functionality.
+ */
+class EntityFieldDefaultValueTest extends EntityUnitTestBase  {
+
+  /**
+   * The UUID object to be used for generating UUIDs.
+   *
+   * @var Drupal\Component\Uuid\UuidInterface
+   */
+  protected $uuid;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity Field Default Value',
+      'description' => 'Tests default values for entity fields.',
+      'group' => 'Entity API',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+    $this->installSchema('entity_test', array(
+      'entity_test_mul',
+      'entity_test_mul_property_data',
+      'entity_test_rev',
+      'entity_test_rev_revision',
+      'entity_test_mulrev',
+      'entity_test_mulrev_property_data',
+      'entity_test_mulrev_property_revision'
+    ));
+    // Initiate the generator object.
+    $this->uuid = new Uuid();
+  }
+
+  /**
+   * Tests.
+   */
+  public function testDefaultValues() {
+    // All entity variations have to have the same results.
+    foreach (entity_test_entity_types() as $entity_type) {
+      $this->assertDefaultValues($entity_type);
+    }
+  }
+
+  /**
+   * Executes a test set for a defined entity type.
+   *
+   * @param string $entity_type
+   *   The entity type to run the tests with.
+   */
+  protected function assertDefaultValues($entity_type) {
+    $entity = entity_create($entity_type, array());
+    $this->assertEqual($entity->langcode->value, LANGUAGE_NOT_SPECIFIED, format_string('%entity_type: Default language', array('%entity_type' => $entity_type)));
+    $this->assertTrue($this->uuid->isValid($entity->uuid->value), format_string('%entity_type: Default UUID', array('%entity_type' => $entity_type)));
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Uuid/UuidUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Uuid/UuidUnitTest.php
index 579ff33..f2dcdcc 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Uuid/UuidUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Uuid/UuidUnitTest.php
@@ -31,7 +31,7 @@ public static function getInfo() {
   }
 
   public function setUp() {
-    // Initiate the generator. This will lazy-load uuid.inc.
+    // Initiate the generator object.
     $this->uuid = new Uuid();
     parent::setUp();
   }
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index db4ae16..e22c227 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2375,6 +2375,12 @@ function system_data_type_info() {
       'class' => '\Drupal\Core\Entity\Field\Type\UriItem',
       'list class' => '\Drupal\Core\Entity\Field\Type\Field',
     ),
+    'uuid_field' => array(
+      'label' => t('UUID field item'),
+      'description' => t('An entity field containing a UUID.'),
+      'class' => '\Drupal\Core\Entity\Field\Type\UuidItem',
+      'list class' => '\Drupal\Core\Entity\Field\Type\Field',
+    ),
   );
 }
 
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
index 8c5e23f..7767c94 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
@@ -40,7 +40,7 @@ public function baseFieldDefinitions() {
     $fields['uuid'] = array(
       'label' => t('UUID'),
       'description' => t('The UUID of the test entity.'),
-      'type' => 'string_field',
+      'type' => 'uuid_field',
     );
     $fields['langcode'] = array(
       'label' => t('Language code'),
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
index 3aad4a7..af50b25 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
@@ -116,16 +116,6 @@ class Term extends EntityNG implements TermInterface {
   public $parent;
 
   /**
-   * Default values for the term.
-   *
-   * @var array
-   */
-  protected $values = array(
-    'langcode' => array(LANGUAGE_DEFAULT => array(0 => array('value' => LANGUAGE_NOT_SPECIFIED))),
-    'weight' => array(LANGUAGE_DEFAULT => array(0 => array('value' => 0))),
-  );
-
-  /**
    * Implements Drupal\Core\Entity\EntityInterface::id().
    */
   public function id() {
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php
index bea7976..58f6f55 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php
@@ -158,11 +158,14 @@ public function baseFieldDefinitions() {
       'label' => t('Weight'),
       'description' => t('The weight of this term in relation to other terms.'),
       'type' => 'integer_field',
+      'settings' => array('default_value' => 0),
     );
     $properties['parent'] = array(
       'label' => t('Term Parents'),
       'description' => t('The parents of this term.'),
       'type' => 'integer_field',
+      // Save new terms with no parents by default.
+      'settings' => array('default_value' => 0),
       'computed' => TRUE,
     );
     return $properties;
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
index b558d97..94bb022 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
@@ -53,15 +53,19 @@ public function getPropertyDefinitions() {
    * Overrides \Drupal\Core\Entity\Field\FieldItemBase::get().
    */
   public function setValue($values, $notify = TRUE) {
-    // Treat the values as property value of the entity property, if no array is
-    // given.
+    // Treat the values as value of the entity property, if no array is
+    // given as this handles entity IDs and objects.
     if (isset($values) && !is_array($values)) {
-      $values = array('entity' => $values);
+      // Directly update the property instead of invoking the parent, so that
+      // the entity property can take care of updating the ID property.
+      $this->properties['entity']->setValue($values, $notify);
     }
-    // Make sure that the 'entity' property gets set as 'tid'.
-    if (isset($values['tid']) && !isset($values['entity'])) {
-      $values['entity'] = $values['tid'];
+    else {
+      // Make sure that the 'entity' property gets set as 'target_id'.
+      if (isset($values['tid']) && !isset($values['entity'])) {
+        $values['entity'] = $values['tid'];
+      }
+      parent::setValue($values, $notify);
     }
-    parent::setValue($values, $notify);
   }
 }
diff --git a/core/modules/text/lib/Drupal/text/TextProcessed.php b/core/modules/text/lib/Drupal/text/TextProcessed.php
index 3a44722..6e8cb83 100644
--- a/core/modules/text/lib/Drupal/text/TextProcessed.php
+++ b/core/modules/text/lib/Drupal/text/TextProcessed.php
@@ -86,11 +86,4 @@ public function setValue($value, $notify = TRUE) {
       throw new ReadOnlyException('Unable to set a computed property.');
     }
   }
-
-  /**
-   * Implements \Drupal\Core\TypedData\TypedDataInterface::validate().
-   */
-  public function validate() {
-    // @todo: Implement.
-  }
 }
diff --git a/core/modules/text/lib/Drupal/text/Type/TextItem.php b/core/modules/text/lib/Drupal/text/Type/TextItem.php
index d7aefc7..848f5ec 100644
--- a/core/modules/text/lib/Drupal/text/Type/TextItem.php
+++ b/core/modules/text/lib/Drupal/text/Type/TextItem.php
@@ -50,4 +50,22 @@ public function getPropertyDefinitions() {
     }
     return static::$propertyDefinitions;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyDefaultValue($notify = TRUE) {
+    // Default to a simple check_plain().
+    // @todo: Add in the filter default format here.
+    $this->setValue(array('format' => NULL), $notify);
+    return $this;
+  }
+
+  /**
+   * Overrides \Drupal\Core\Entity\Field\FieldItemBase::isEmpty().
+   */
+  public function isEmpty() {
+    $value = $this->get('value')->getValue();
+    return $value === NULL || $value === '';
+  }
 }
diff --git a/core/modules/text/lib/Drupal/text/Type/TextSummaryItem.php b/core/modules/text/lib/Drupal/text/Type/TextSummaryItem.php
index 90dc8b9..32a7444 100644
--- a/core/modules/text/lib/Drupal/text/Type/TextSummaryItem.php
+++ b/core/modules/text/lib/Drupal/text/Type/TextSummaryItem.php
@@ -47,4 +47,12 @@ public function getPropertyDefinitions() {
     }
     return static::$propertyDefinitions;
   }
+
+  /**
+   * Overrides \Drupal\text\Type\TextItem::isEmpty().
+   */
+  public function isEmpty() {
+    $value = $this->get('summary')->getValue();
+    return parent::isEmpty() && ($value === NULL || $value === '');
+  }
 }
