diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index c486aa8..d7b8f8d 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -349,6 +349,9 @@ public function __set($name, $value) {
     if ($this->compatibilityMode) {
       $this->values[$name] = $value;
     }
+    elseif ($value === NULL) {
+      unset($this->fields[$name]);
+    }
     elseif (isset($this->fields[$name][LANGUAGE_DEFAULT])) {
       $this->fields[$name][LANGUAGE_DEFAULT]->setValue($value);
     }
@@ -368,7 +371,7 @@ public function __isset($name) {
       return isset($this->values[$name]);
     }
     elseif ($this->getPropertyDefinition($name)) {
-      return $this->get($name)->valueIsSet();
+      return isset($this->fields[$name]);
     }
   }
 
@@ -380,7 +383,7 @@ public function __unset($name) {
       unset($this->values[$name]);
     }
     elseif ($this->getPropertyDefinition($name)) {
-      $this->get($name)->unsetValue();
+      unset($this->fields[$name]);
     }
   }
 
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index 0e7a982..cc5951c 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -51,13 +51,6 @@ 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() {
@@ -75,7 +68,6 @@ 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)))) {
@@ -109,14 +101,6 @@ 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
@@ -272,14 +256,13 @@ 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->isset && $this->offsetGet(0)->__isset($property_name);
+    return $this->offsetGet(0)->__isset($property_name);
   }
 
   /**
@@ -302,15 +285,6 @@ 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 3dd810c..c0c28af 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
@@ -134,6 +134,12 @@ public function testReadWrite() {
     $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 = NULL;
+    $this->assertFalse(isset($entity->name), 'Name field is not 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);
