diff --git a/core/modules/text/src/Normalizer/TextItemBaseNormalizer.php b/core/modules/text/src/Normalizer/TextItemBaseNormalizer.php
new file mode 100644
index 0000000..3b0b8ae
--- /dev/null
+++ b/core/modules/text/src/Normalizer/TextItemBaseNormalizer.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Drupal\text\Normalizer;
+
+use Drupal\serialization\Normalizer\ComplexDataNormalizer;
+use Drupal\text\Plugin\Field\FieldType\TextItemBase;
+
+/**
+ * Adds processed markup from text fields to normalizer data.
+ */
+class TextItemBaseNormalizer extends ComplexDataNormalizer {
+
+  /**
+   * The interface or class that this Normalizer supports.
+   *
+   * @var string
+   */
+  protected $supportedInterfaceOrClass = TextItemBase::class;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function normalize($object, $format = NULL, array $context = []) {
+    $attributes = parent::normalize($object, $format, $context);
+    $attributes['processed'] = $this->serializer->normalize($object, $format, $context);
+    return $attributes;
+  }
+
+}
diff --git a/core/modules/text/src/TextServiceProvider.php b/core/modules/text/src/TextServiceProvider.php
new file mode 100644
index 0000000..92020fd
--- /dev/null
+++ b/core/modules/text/src/TextServiceProvider.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\text;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderBase;
+use Drupal\text\Normalizer\TextItemBaseNormalizer;
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Service provider for text module.
+ */
+class TextServiceProvider extends ServiceProviderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alter(ContainerBuilder $container) {
+    $modules = $container->getParameter('container.modules');
+    if (isset($modules['serialization'])) {
+      $service_definition = new Definition(TextItemBaseNormalizer::class, []);
+      $service_definition->addTag('normalizer', ['priority' => 20]);
+      $container->setDefinition('serializer.normalizer.text_item_base', $service_definition);
+    }
+  }
+
+}
diff --git a/core/modules/text/tests/src/Kernel/Normalizer/TextItemBaseNormalizerTest.php b/core/modules/text/tests/src/Kernel/Normalizer/TextItemBaseNormalizerTest.php
new file mode 100644
index 0000000..fa4be63
--- /dev/null
+++ b/core/modules/text/tests/src/Kernel/Normalizer/TextItemBaseNormalizerTest.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Drupal\Tests\text\Kernel;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @coversDefaultClass \Drupal\text\Normalizer\TextItemBaseNormalizer
+ * @group text
+ */
+class TextItemBaseNormalizerTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['entity_test', 'serialization', 'text', 'field', 'user', 'filter'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('user');
+    $this->installConfig('filter');
+
+    $field_storage_config = FieldStorageConfig::create([
+      'entity_type' => 'entity_test',
+      'field_name' => 'field_text',
+      'type' => 'text'
+    ]);
+    $field_storage_config->save();
+
+    $field_config = FieldConfig::create([
+      'entity_type' => 'entity_test',
+      'field_name' => 'field_text',
+      'bundle' => 'entity_test',
+     ]);
+    $field_config->save();
+  }
+
+  /**
+   * @covers ::normalize
+   */
+  public function testNormalize() {
+    /** @var \Symfony\Component\Serializer\Serializer $serializer */
+    $serializer = \Drupal::service('serializer');
+
+    $entity = EntityTest::create([
+      'field_text' => 'text item',
+    ]);
+    $entity->save();
+
+    $data = $serializer->normalize($entity);
+    $this->assertEquals([
+      'value' => 'text item',
+      'processed' => "<p>text item</p>\n",
+    ], $data['field_text'][0]);
+  }
+
+}
