diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 76b8fd2..89c88af 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -790,6 +790,7 @@ public function __set($name, $value) {
    */
   public function __isset($name) {
     if ($this->hasField($name)) {
+      // @todo Now returns array() after $entity->field = NULL.
       return $this->get($name)->getValue() !== NULL;
     }
     else {
diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php
index 56579e4..547ec75 100644
--- a/core/lib/Drupal/Core/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Field/FieldItemList.php
@@ -126,37 +126,12 @@ public function getValue($include_computed = FALSE) {
    * {@inheritdoc}
    */
   public function setValue($values, $notify = TRUE) {
-    if (!isset($values) || $values === array()) {
-      $this->list = $values;
-    }
-    else {
-      // Support passing in only the value of the first item.
-      if (!is_array($values) || !is_numeric(current(array_keys($values)))) {
-        $values = array(0 => $values);
-      }
-
-      // Clear the values of properties for which no value has been passed.
-      if (isset($this->list)) {
-        $this->list = array_intersect_key($this->list, $values);
-      }
-
-      // Set the values.
-      foreach ($values as $delta => $value) {
-        if (!is_numeric($delta)) {
-          throw new \InvalidArgumentException('Unable to set a value with a non-numeric delta in a list.');
-        }
-        elseif (!isset($this->list[$delta])) {
-          $this->list[$delta] = $this->createItem($delta, $value);
-        }
-        else {
-          $this->list[$delta]->setValue($value, FALSE);
-        }
-      }
-    }
-    // Notify the parent of any changes.
-    if ($notify && isset($this->parent)) {
-      $this->parent->onChange($this->name);
+    // Support passing in only the value of the first item, either as a litteral
+    // (value of the first property) or as an array of properties.
+    if (isset($values) && (!is_array($values) || (!empty($values) && !is_numeric(current(array_keys($values)))))) {
+      $values = array(0 => $values);
     }
+    parent::setValue($values, $notify);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php
index cdb7246..513835c 100644
--- a/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php
+++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php
@@ -79,7 +79,7 @@ public function setValue($values, $notify = TRUE) {
           $this->list[$delta] = $this->createItem($delta, $value);
         }
         else {
-          $this->list[$delta]->setValue($value);
+          $this->list[$delta]->setValue($value, FALSE);
         }
       }
     }
diff --git a/core/modules/hal/src/Tests/DenormalizeTest.php b/core/modules/hal/src/Tests/DenormalizeTest.php
index 8b5711c..13b33a6 100644
--- a/core/modules/hal/src/Tests/DenormalizeTest.php
+++ b/core/modules/hal/src/Tests/DenormalizeTest.php
@@ -195,14 +195,14 @@ public function testPatchDenormailzation() {
     $denormalized = $this->serializer->denormalize($data, $this->entityClass, $this->format, array('request_method' => 'patch'));
     // Check that the one field got populated as expected.
     $this->assertEqual($data['field_test_text'], $denormalized->get('field_test_text')->getValue());
-    // Unset that field so that now all fields are NULL.
-    $denormalized->set('field_test_text', NULL);
-    // Assert that all fields are NULL and not set to default values. Example:
-    // the UUID field is NULL and not initialized as usual.
+    // Unset that field so that now all fields are empty.
+    $denormalized->set('field_test_text', array());
+    // Assert that all fields are empty and not set to default values. Example:
+    // the UUID field is empty and not initialized as usual.
     foreach ($denormalized as $field_name => $field) {
       // The 'langcode' field always has a value.
       if ($field_name != 'langcode') {
-        $this->assertFalse(isset($denormalized->$field_name), "$field_name is not set.");
+        $this->assertTrue($denormalized->$field_name->isEmpty(), "$field_name is empty.");
       }
     }
   }
diff --git a/core/modules/quickedit/src/Form/QuickEditFieldForm.php b/core/modules/quickedit/src/Form/QuickEditFieldForm.php
index a1516fe..6d9d2c3 100644
--- a/core/modules/quickedit/src/Form/QuickEditFieldForm.php
+++ b/core/modules/quickedit/src/Form/QuickEditFieldForm.php
@@ -187,7 +187,7 @@ protected function buildEntity(array $form, FormStateInterface $form_state) {
 
     // @todo Refine automated log messages and abstract them to all entity
     //   types: http://drupal.org/node/1678002.
-    if ($entity->getEntityTypeId() == 'node' && $entity->isNewRevision() && !isset($entity->revision_log)) {
+    if ($entity->getEntityTypeId() == 'node' && $entity->isNewRevision() && $entity->revision_log->isEmpty()) {
       $entity->revision_log = t('Updated the %field-name field through in-place editing.', array('%field-name' => $entity->get($field_name)->getFieldDefinition()->getLabel()));
     }
 
diff --git a/core/modules/system/src/Tests/Entity/EntityFieldTest.php b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
index bdd7937..464ad15 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
@@ -93,7 +93,7 @@ protected function createTestEntity($entity_type) {
   public function testReadWrite() {
     // All entity variations have to have the same results.
     foreach (entity_test_entity_types() as $entity_type) {
-      $this->assertReadWrite($entity_type);
+      $this->doassertReadWrite($entity_type);
     }
   }
 
@@ -103,7 +103,7 @@ public function testReadWrite() {
    * @param string $entity_type
    *   The entity type to run the tests with.
    */
-  protected function assertReadWrite($entity_type) {
+  protected function doassertReadWrite($entity_type) {
     $entity = $this->createTestEntity($entity_type);
 
     $langcode = 'en';
@@ -182,7 +182,7 @@ protected function assertReadWrite($entity_type) {
     $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->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.');
@@ -190,7 +190,7 @@ protected function assertReadWrite($entity_type) {
     $entity->name->value = 'a value';
     $this->assertTrue(isset($entity->name->value), format_string('%entity_type: Name is set.', array('%entity_type' => $entity_type)));
     unset($entity->name);
-    $this->assertFalse(isset($entity->name), format_string('%entity_type: Name field is not set.', array('%entity_type' => $entity_type)));
+    $this->assertTrue(isset($entity->name), format_string('%entity_type: Name field is set.', array('%entity_type' => $entity_type)));
     $this->assertFalse(isset($entity->name[0]), format_string('%entity_type: Name field item is not set.', array('%entity_type' => $entity_type)));
     $this->assertFalse(isset($entity->name[0]->value), format_string('%entity_type: Name is not set.', array('%entity_type' => $entity_type)));
     $this->assertFalse(isset($entity->name->value), format_string('%entity_type: Name is not set.', array('%entity_type' => $entity_type)));
@@ -279,7 +279,7 @@ protected function assertReadWrite($entity_type) {
     // Test removing all list items by setting it to NULL.
     $entity->name = NULL;
     $this->assertIdentical(count($entity->name), 0, format_string('%entity_type: Name field contains no items.', array('%entity_type' => $entity_type)));
-    $this->assertNull($entity->name->getValue(), format_string('%entity_type: Name field value is an empty array.', array('%entity_type' => $entity_type)));
+    $this->assertEqual($entity->name->getValue(), array(), format_string('%entity_type: Name field value is an empty array.', array('%entity_type' => $entity_type)));
 
     // Test get and set field values.
     $entity->name = 'foo';
