diff --git a/src/Element/Tablefield.php b/src/Element/Tablefield.php
index a9b6fb3..303db29 100644
--- a/src/Element/Tablefield.php
+++ b/src/Element/Tablefield.php
@@ -77,14 +77,24 @@ class Tablefield extends FormElement {
     for ($i = 0; $i < $rows; $i++) {
       for ($ii = 0; $ii < $cols; $ii++) {
         if (!empty($element['#locked_cells'][$i][$ii]) && !empty($element['#lock'])) {
+          if (is_array($element['#locked_cells'][$i][$ii]) && isset($element['#locked_cells'][$i][$ii]['value']) && isset($element['#locked_cells'][$i][$ii]['format'])) {
+            $cell_value = $element['#locked_cells'][$i][$ii]['value'];
+            $cell_format = $element['#locked_cells'][$i][$ii]['format'];
+          }
+          else {
+            $cell_value = $element['#locked_cells'][$i][$ii];
+            $cell_format = NULL;
+          }
+          $cell_rendered = !empty($cell_format) ? check_markup($cell_value, $cell_format) : $cell_value;
           $element['tablefield']['table'][$i][$ii] = [
             '#type' => 'item',
-            '#value' => $element['#locked_cells'][$i][$ii],
-            '#title' => $element['#locked_cells'][$i][$ii],
+            '#value' => $cell_rendered,
+            '#title' => $cell_rendered,
           ];
         }
         else {
           $cell_value = isset($value[$i][$ii]) ? $value[$i][$ii] : '';
+          $cell_rendered = is_array($cell_value) && isset($cell_value['value']) ? $cell_value['value'] : $cell_value;
           $element['tablefield']['table'][$i][$ii] = [
             '#type' => $input_type,
             '#maxlength' => 2048,
@@ -93,8 +103,14 @@ class Tablefield extends FormElement {
               'class' => ['tablefield-row-' . $i, 'tablefield-col-' . $ii],
               'style' => 'width:100%',
             ],
-            '#default_value' => $cell_value,
+            '#default_value' => $cell_rendered,
           ];
+          if ($element['#editor']) {
+            $element['tablefield']['table'][$i][$ii] = array_merge($element['tablefield']['table'][$i][$ii], [
+              '#type' => 'text_format',
+              '#format' => is_array($cell_value) && isset($cell_value['format']) ? $cell_value['format'] : NULL,
+            ]);
+          }
         }
       }
     }
@@ -246,7 +262,6 @@ class Tablefield extends FormElement {
     $rebuild = NestedArray::getValue($form, $parents);

     // We don't want to re-send the format/_weight options.
-    unset($rebuild['format']);
     unset($rebuild['_weight']);

     // Set row value to default only if there is Add Row button clicked.
diff --git a/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php b/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php
index 93bdafa..9385b3b 100644
--- a/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php
@@ -148,8 +148,11 @@ class TablefieldFormatter extends FormatterBase implements ContainerFactoryPlugi
         // Run the table through input filters.
         foreach ($tabledata as $row_key => $row) {
           foreach ($row as $col_key => $cell) {
+            $value = is_array($cell) && isset($cell['value']) ? $cell['value'] : $cell;
+            $format = is_array($cell) && isset($cell['format']) ? $cell['format'] : NULL;
+
             $tabledata[$row_key][$col_key] = [
-              'data' => empty($table->format) ? $cell : check_markup($cell, $table->format),
+              'data' => empty($format) ? $value : check_markup($value, $format),
               'class' => ['row_' . $row_key, 'col_' . $col_key],
             ];
           }
diff --git a/src/Plugin/Field/FieldType/TablefieldItem.php b/src/Plugin/Field/FieldType/TablefieldItem.php
index 6252297..fa4dbb1 100644
--- a/src/Plugin/Field/FieldType/TablefieldItem.php
+++ b/src/Plugin/Field/FieldType/TablefieldItem.php
@@ -34,11 +34,6 @@ class TablefieldItem extends FieldItemBase {
           'size' => 'big',
           'serialize' => TRUE,
         ],
-        'format' => [
-          'type' => 'varchar',
-          'length' => 255,
-          'default value' => '',
-        ],
         'caption' => [
           'type' => 'varchar',
           'length' => 255,
@@ -140,9 +135,6 @@ class TablefieldItem extends FieldItemBase {
       ->setLabel(t('Table data'))
       ->setDescription(t('Stores tabular data.'));

-    $properties['format'] = DataDefinition::create('filter_format')
-      ->setLabel(t('Text format'));
-
     $properties['caption'] = DataDefinition::create('string')
       ->setLabel(t('Table Caption'));

diff --git a/src/Plugin/Field/FieldWidget/TablefieldWidget.php b/src/Plugin/Field/FieldWidget/TablefieldWidget.php
index 27a5e13..d33f9f2 100644
--- a/src/Plugin/Field/FieldWidget/TablefieldWidget.php
+++ b/src/Plugin/Field/FieldWidget/TablefieldWidget.php
@@ -171,10 +171,7 @@ class TablefieldWidget extends WidgetBase implements ContainerFactoryPluginInter

     // Allow the user to select input filters.
     if (!empty($field_settings['cell_processing'])) {
-      $element['#base_type'] = $element['#type'];
-      $element['#type'] = 'text_format';
-      $element['#format'] = isset($default_value->format) ? $default_value->format : NULL;
-      $element['#editor'] = FALSE;
+      $element['#editor'] = TRUE;
     }

     return $element;
diff --git a/tablefield.install b/tablefield.install
index d5ea4fb..aace7a6 100644
--- a/tablefield.install
+++ b/tablefield.install
@@ -17,6 +17,13 @@ function tablefield_update_8001() {
   ]);
 }

+/**
+ * Remove "format" column because each cell will use its own format.
+ */
+function tablefield_update_8002() {
+  tablefield_remove_existing_column('format');
+}
+
 /**
  * Helper function to add new columns to the field schema.
  *
@@ -49,3 +56,33 @@ function tablefield_add_new_column($column_name, array $spec) {
     }
   }
 }
+
+/**
+ * Helper function to remove columns from the field schema.
+ *
+ * @param string $column_name
+ *   The name of the column that will be added.
+ */
+function tablefield_remove_existing_column($column_name) {
+  $field_map = \Drupal::service('entity_field.manager')->getFieldMapByFieldType('tablefield');
+  $schema = \Drupal::database()->schema();
+
+  foreach ($field_map as $entity_type_id => $fields) {
+    foreach (array_keys($fields) as $field_name) {
+      $tables = [
+        "{$entity_type_id}__$field_name",
+        "{$entity_type_id}_revision__$field_name",
+      ];
+
+      $existing_column_name = $field_name . '_' . $column_name;
+
+      foreach ($tables as $table) {
+        $table_exists = $schema->tableExists($table);
+        $field_exists = $schema->fieldExists($table, $existing_column_name);
+        if ($table_exists && $field_exists) {
+          $schema->dropField($table, $existing_column_name);
+        }
+      }
+    }
+  }
+}
