diff --git a/src/Plugin/Field/FieldType/TablefieldItem.php b/src/Plugin/Field/FieldType/TablefieldItem.php
index 82b903d03f2117bfe1df33363fa330abebc542a5..9598b1b40d47c6ed18c266743e1ad3103e592248 100644
--- a/src/Plugin/Field/FieldType/TablefieldItem.php
+++ b/src/Plugin/Field/FieldType/TablefieldItem.php
@@ -171,8 +171,8 @@ class TablefieldItem extends FieldItemBase {
       unset($values['value']['tablefield']['rebuild']);
     }
     // In case this is being loaded from storage recalculate rows/cols.
-    elseif (empty($values['rebuild'])) {
-      if (array_key_exists('value', $values) && array_key_exists('caption', $values['value'])) {
+    elseif (is_array($values['value']) && empty($values['rebuild'])) {
+      if (array_key_exists('caption', $values['value'])) {
         unset($values['value']['caption']);
       }
       $values['rebuild']['rows'] = isset($values['value']) ? count($values['value']) : 0;
@@ -183,7 +183,7 @@ class TablefieldItem extends FieldItemBase {
       }
     }
 
-    if (isset($values['caption'])) {
+    if (is_array($values['value']) && isset($values['caption'])) {
       $values['value']['caption'] = $values['caption'];
     }
 
diff --git a/tests/src/Functional/TablefieldDeleteFieldTest.php b/tests/src/Functional/TablefieldDeleteFieldTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0dd29bc40708897cc3c92d8b0586b1c546b28c35
--- /dev/null
+++ b/tests/src/Functional/TablefieldDeleteFieldTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Drupal\Tests\tablefield\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Simple test to ensure that a field can be created.
+ *
+ * @group tablefield
+ */
+class TablefieldDeleteFieldTest extends BrowserTestBase {
+
+  use TablefieldCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['node', 'tablefield', 'field_ui'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->drupalLogin($this->rootUser);
+
+    $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+    $this->createTableField('field_table', 'article');
+  }
+
+  /**
+   * Create a node with a tablefield, and ensure it's displayed correctly.
+   */
+  public function testTableField() {
+    $this->drupalGet('node/add/article');
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['field_table[0][caption]'] = 'Table caption';
+    $edit['field_table[0][tablefield][table][0][0]'] = 'Header 1';
+    $edit['field_table[0][tablefield][table][0][1]'] = 'Header 2';
+    $edit['field_table[0][tablefield][table][0][2]'] = 'Header 3';
+    $edit['field_table[0][tablefield][table][1][0]'] = 'Row 1-1';
+    $edit['field_table[0][tablefield][table][1][1]'] = 'Row 1-2';
+    $edit['field_table[0][tablefield][table][1][2]'] = 'Row 1-3';
+    $edit['field_table[0][tablefield][table][2][0]'] = 'Row 2-1';
+    $edit['field_table[0][tablefield][table][2][1]'] = 'Row 2-2';
+    $edit['field_table[0][tablefield][table][2][2]'] = 'Row 2-3';
+
+    $this->submitForm($edit, 'Save');
+    $assert_session = $this->assertSession();
+    $this->drupalGet('admin/structure/types/manage/article/fields');
+    $assert_session->pageTextContains('field_table');
+    $this->drupalGet('admin/structure/types/manage/article/fields/node.article.field_table');
+    $assert_session->elementExists('css', '#edit-delete');
+    $this->click('#edit-delete');
+    $assert_session->elementExists('css', '#edit-submit');
+    $this->click('#edit-submit');
+    $assert_session->pageTextContains('The field field_table has been deleted from the Article content type.');
+  }
+
+}