diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
index e8998f8..1cd4de0 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
@@ -99,15 +99,13 @@ public function create(array $values) {
     $bundle = $this->bundleKey ? $values[$this->bundleKey] : FALSE;
     $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}->value = $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/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index 8763f6d..808df16 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -10,7 +10,6 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\TypedData\ContextAwareInterface;
 use Drupal\Core\TypedData\TypedDataInterface;
-use Drupal\Component\Uuid\Uuid;
 use ArrayIterator;
 use InvalidArgumentException;
 
@@ -43,13 +42,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.
@@ -480,8 +476,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();
     }
     return $duplicate;
   }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index 5e4f116..73c0260 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -21,6 +21,10 @@
  * 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 first
+ *   item of the field.
+ *
  * @see \Drupal\Core\Entity\Field\FieldInterface
  */
 class Field extends ItemList implements FieldInterface {
@@ -151,4 +155,19 @@ public function __unset($property_name) {
   public function access($operation = 'view', User $account = NULL) {
     // TODO: Implement access() method. Use item access.
   }
+
+  /**
+   * Overrides \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue() {
+    if (isset($this->definition['settings']['default_value'])) {
+      $value = $this->definition['settings']['default_value'];
+      // Create one field item with the value provided.
+      $this->setValue(array(0 => $value));
+    }
+    else {
+      $this->setValue(NULL);
+    }
+    return $this;
+  }
 }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/LanguageField.php b/core/lib/Drupal/Core/Entity/Field/Type/LanguageField.php
new file mode 100644
index 0000000..485995f
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/Field/Type/LanguageField.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Field\Type\LanguageField.
+ */
+
+namespace Drupal\Core\Entity\Field\Type;
+
+/**
+ * Defines a field class for the 'language_field' entity field.
+ *
+ * Supported settings (below the definition's 'settings' key) are:
+ * - default_value: (optional) If set, the default value to apply to the first
+ *   item of the field. Else, the field defaults to LANGUAGE_NOT_SPECIFIED.
+ */
+class LanguageField extends Field {
+
+  /**
+   * Overrides Field::applyDefaultValue().
+   */
+  public function applyDefaultValue() {
+    // Default to one field item with the value of LANGUAGE_NOT_SPECIFIED.
+    $value = array('value' => LANGUAGE_NOT_SPECIFIED);
+    if (isset($this->definition['settings']['default_value'])) {
+      $value = $this->definition['settings']['default_value'];
+    }
+    $this->setValue(array(0 => $value));
+    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 b3765b1..36e3157 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php
@@ -73,4 +73,13 @@ public function setValue($values) {
       throw new InvalidArgumentException('Property ' . key($values) . ' is unknown.');
     }
   }
+
+  /**
+   * Overrides \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue() {
+    // Default to no default value.
+    $this->setValue(NULL);
+    return $this;
+  }
 }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/UUIDField.php b/core/lib/Drupal/Core/Entity/Field/Type/UUIDField.php
new file mode 100644
index 0000000..0bc447a
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/Field/Type/UUIDField.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Field\Type\UUIDField.
+ */
+
+namespace Drupal\Core\Entity\Field\Type;
+
+use Drupal\Component\Uuid\Uuid;
+
+/**
+ * Defines a field class for the 'uuid_field' entity field.
+ *
+ * The field uses a newly generated UUID as default value.
+ */
+class UUIDField extends Field {
+
+  /**
+   * Overrides \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue() {
+    // Default to one field item with a generated UUID.
+    $uuid = new Uuid();
+    $this->setValue(array(0 => array('value' => $uuid->generate())));
+    return $this;
+  }
+}
diff --git a/core/lib/Drupal/Core/TypedData/ItemList.php b/core/lib/Drupal/Core/TypedData/ItemList.php
index 3c6d01a..fb798b6 100644
--- a/core/lib/Drupal/Core/TypedData/ItemList.php
+++ b/core/lib/Drupal/Core/TypedData/ItemList.php
@@ -129,7 +129,14 @@ public function offsetGet($offset) {
    * @return \Drupal\Core\TypedData\TypedDataInterface
    */
   protected function createItem($offset = 0, $value = NULL) {
-    return typed_data()->getPropertyInstance($this, $offset, $value);
+    $item = typed_data()->getPropertyInstance($this, $offset);
+    if (isset($value)) {
+      $item->setValue($value);
+    }
+    else {
+      $item->applyDefaultValue();
+    }
+    return $item;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/TypedData/TypedData.php b/core/lib/Drupal/Core/TypedData/TypedData.php
index d6ad4be..d64d26c 100644
--- a/core/lib/Drupal/Core/TypedData/TypedData.php
+++ b/core/lib/Drupal/Core/TypedData/TypedData.php
@@ -84,4 +84,13 @@ public function validate() {
     // @todo: Add the typed data manager as proper dependency.
     return typed_data()->getValidator()->validate($this);
   }
+
+  /**
+   * Implements \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue() {
+    // Default to no default value.
+    $this->setValue(NULL);
+    return $this;
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
index 0fcf36f..e3f0ae3 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
@@ -73,4 +73,12 @@ public function getConstraints();
    *   succeeded.
    */
   public function validate();
+
+  /**
+   * Applies the default value.
+   *
+   * @return \Drupal\Core\TypedData\TypedDataInterface
+   *   Returns itself to allow for chaining.
+   */
+  public function applyDefaultValue();
 }
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 274b37b..06f7501 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 d80a844..61d7ab1 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
@@ -171,19 +171,6 @@ class Comment extends EntityNG implements ContentEntityInterface {
   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/system/system.module b/core/modules/system/system.module
index 2c51ae0..2559656 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2279,7 +2279,7 @@ function system_data_type_info() {
       'label' => t('Language field item'),
       'description' => t('An entity field referencing a language.'),
       'class' => '\Drupal\Core\Entity\Field\Type\LanguageItem',
-      'list class' => '\Drupal\Core\Entity\Field\Type\Field',
+      'list class' => '\Drupal\Core\Entity\Field\Type\LanguageField',
     ),
     'entity_reference_field' => array(
       'label' => t('Entity reference field item'),
@@ -2293,6 +2293,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\StringItem',
+      'list class' => '\Drupal\Core\Entity\Field\Type\UUIDField',
+    ),
   );
 }
 
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 500a41c..e5c42b1 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
@@ -30,7 +30,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/text/lib/Drupal/text/TextProcessed.php b/core/modules/text/lib/Drupal/text/TextProcessed.php
index c73af6f..f671791 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) {
       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..4017a9d 100644
--- a/core/modules/text/lib/Drupal/text/Type/TextItem.php
+++ b/core/modules/text/lib/Drupal/text/Type/TextItem.php
@@ -50,4 +50,29 @@ public function getPropertyDefinitions() {
     }
     return static::$propertyDefinitions;
   }
+
+  /**
+   * Overrides \Drupal\Core\TypedData\TypedDataInterface::applyDefaultValue().
+   */
+  public function applyDefaultValue() {
+    $format = NULL;
+    if ($this->parent) {
+      $field = $this->parent;
+      $entity = $field->getParent();
+      $instance = field_info_instance($entity->entityType(), $field->getName(), $entity->bundle());
+      if ($instance['settings']['text_processing']) {
+        $format = filter_default_format();
+      }
+    }
+    $this->setValue(array('format' => $format));
+    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 === '');
+  }
 }
