diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
index 2329c86..ac404a4 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
@@ -100,4 +100,15 @@ public function storageSettingsForm(array &$form, FormStateInterface $form_state
     return $element;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function setValue($values, $notify = TRUE) {
+    if ($values === "") {
+      // Treat empty string as NULL.
+      $values = NULL;
+    }
+    parent::setValue($values,$notify);
+  }
+
 }
diff --git a/core/modules/node/src/Tests/NodeValidationTest.php b/core/modules/node/src/Tests/NodeValidationTest.php
index b38af1c..3a939c9 100644
--- a/core/modules/node/src/Tests/NodeValidationTest.php
+++ b/core/modules/node/src/Tests/NodeValidationTest.php
@@ -55,6 +55,11 @@ public function testValidation() {
     $this->assertEqual($violations[0]->getPropertyPath(), 'title');
     $this->assertEqual($violations[0]->getMessage(), 'This value should not be null.');
 
+    $node->set('title', "");
+    $violations = $node->validate();
+    $this->assertEqual(count($violations), 1, 'Violation found when title is not set.');
+    $this->assertEqual($violations[0]->getPropertyPath(), 'title');
+
     // Make the title valid again.
     $node->set('title', $this->randomString());
     // Save the node so that it gets an ID and a changed date.
