diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index 35ef89d..c486aa8 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -368,7 +368,7 @@ public function __isset($name) {
       return isset($this->values[$name]);
     }
     elseif ($this->getPropertyDefinition($name)) {
-      return (bool) count($this->get($name));
+      return $this->get($name)->valueIsSet();
     }
   }
 
@@ -380,7 +380,7 @@ public function __unset($name) {
       unset($this->values[$name]);
     }
     elseif ($this->getPropertyDefinition($name)) {
-      $this->get($name)->setValue(array());
+      $this->get($name)->unsetValue();
     }
   }
 
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index cc5951c..0e7a982 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -51,6 +51,13 @@ class Field extends TypedData implements IteratorAggregate, FieldInterface {
   protected $list = array();
 
   /**
+   * Flag to indicate if this field has been set.
+   *
+   * @var bool
+   */
+  protected $isset = FALSE;
+
+  /**
    * Implements TypedDataInterface::getValue().
    */
   public function getValue() {
@@ -68,6 +75,7 @@ public function getValue() {
    *   An array of values of the field items.
    */
   public function setValue($values) {
+    $this->isset = TRUE;
     if (isset($values) && $values !== array()) {
       // Support passing in only the value of the first item.
       if (!is_array($values) || !is_numeric(current(array_keys($values)))) {
@@ -101,6 +109,14 @@ public function setValue($values) {
   }
 
   /**
+   * Mark this field as not set.
+   */
+  public function unsetValue() {
+    $this->list = array();
+    $this->isset = FALSE;
+  }
+
+  /**
    * Returns a string representation of the field.
    *
    * @return string
@@ -256,13 +272,14 @@ public function get($property_name) {
    */
   public function __set($property_name, $value) {
     $this->offsetGet(0)->__set($property_name, $value);
+    $this->isset = TRUE;
   }
 
   /**
    * Delegate.
    */
   public function __isset($property_name) {
-    return $this->offsetGet(0)->__isset($property_name);
+    return $this->isset && $this->offsetGet(0)->__isset($property_name);
   }
 
   /**
@@ -285,6 +302,15 @@ public function isEmpty() {
   }
 
   /**
+   * Determines if this field has been set.
+   *
+   * @return bool
+   */
+  public function valueIsSet() {
+    return $this->isset;
+  }
+
+  /**
    * Implements a deep clone.
    */
   public function __clone() {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
index a152bfa..3dd810c 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
@@ -128,6 +128,12 @@ public function testReadWrite() {
     $this->assertFalse(isset($entity->name[0]->value), 'Name is not set.');
     $this->assertFalse(isset($entity->name->value), 'Name is not set.');
 
+    $entity->name = array();
+    $this->assertTrue(isset($entity->name), 'Name field is set.');
+    $this->assertFalse(isset($entity->name[0]), 'Name field item is not set.');
+    $this->assertFalse(isset($entity->name[0]->value), 'First name item value is not set.');
+    $this->assertFalse(isset($entity->name->value), 'Name value is not set.');
+
     $entity->name->value = 'a value';
     $this->assertTrue(isset($entity->name->value), 'Name is set.');
     unset($entity->name);
