diff --git a/core/modules/link/link.services.yml b/core/modules/link/link.services.yml
new file mode 100644
index 0000000..4e18b0d
--- /dev/null
+++ b/core/modules/link/link.services.yml
@@ -0,0 +1,6 @@
+services:
+  serializer.normalizer.link:
+      class: Drupal\link\Normalizer\LinkItemNormalizer
+      tags:
+        - { name: normalizer , priority: 20 }
+      arguments: ['@entity.manager']
diff --git a/core/modules/link/src/Normalizer/LinkItemNormalizer.php b/core/modules/link/src/Normalizer/LinkItemNormalizer.php
new file mode 100644
index 0000000..ecebc83
--- /dev/null
+++ b/core/modules/link/src/Normalizer/LinkItemNormalizer.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Drupal\link\Normalizer;
+
+use Drupal\serialization\Normalizer\NormalizerBase;
+
+/**
+ * Null normalizer.
+ */
+class LinkItemNormalizer extends NormalizerBase {
+
+  /**
+   * The interface or class that this Normalizer supports.
+   *
+   * @var string
+   */
+  protected $supportedInterfaceOrClass = 'Drupal\link\Plugin\Field\FieldType\LinkItem';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function normalize($field_item, $format = NULL, array $context = array()) {
+    $values = [];
+    foreach ($field_item as $property_name => $property) {
+      if ($property_name == 'options') {
+        $options_values = [];
+        foreach ($property->getValue() as $key => $val) {
+          $options_values[$key] = $this->serializer->normalize($val, $format, $context);
+        }
+        $values['options'] = $options_values;
+      }
+      else {
+        $values[$property_name] = $this->serializer->normalize($property, $format, $context);
+      }
+    }
+    if (isset($context['langcode'])) {
+      $values['lang'] = $context['langcode'];
+    }
+    $field = $field_item->getParent();
+    return [
+      $field->getName() => [$values],
+    ];
+  }
+
+}
diff --git a/core/modules/link/tests/src/Kernel/LinkItemSerializationTest.php b/core/modules/link/tests/src/Kernel/LinkItemSerializationTest.php
new file mode 100644
index 0000000..29bb0a2
--- /dev/null
+++ b/core/modules/link/tests/src/Kernel/LinkItemSerializationTest.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Drupal\Tests\link\Kernel;
+
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\link\LinkItemInterface;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\Component\Utility\UrlHelper;
+
+/**
+ * Tests the menu link content serialization.
+ *
+ * @group link
+ */
+class LinkItemSerializationTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system', 'link', 'serialization', 'field', 'entity_test', 'user'];
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+
+    // Create a generic, external, and internal link fields for validation.
+    FieldStorageConfig::create([
+      'entity_type' => 'entity_test',
+      'field_name' => 'field_test',
+      'type' => 'link',
+    ])->save();
+
+    FieldConfig::create([
+      'entity_type' => 'entity_test',
+      'field_name' => 'field_test',
+      'bundle' => 'entity_test',
+      'settings' => ['link_type' => LinkItemInterface::LINK_GENERIC],
+    ])->save();
+  }
+
+  /**
+   * Tests the serialization.
+   */
+  public function testSerialization() {
+    // Create entity.
+    $entity = EntityTest::create();
+    $url = 'https://www.drupal.org?test_param=test_value';
+    $parsed_url = UrlHelper::parse($url);
+    $title = $this->randomMachineName();
+    $class = $this->randomMachineName();
+    $entity->field_test->uri = $parsed_url['path'];
+    $entity->field_test->title = $title;
+    $entity->field_test->first()->get('options')->set('query', $parsed_url['query']);
+    $entity->field_test->first()->get('options')->set('attributes', ['class' => $class]);
+
+    // Serialization
+    $serializer = \Drupal::service('serializer');
+    $serialized = $serializer->serialize($entity, 'json');
+    $deserialized = $serializer->deserialize($serialized, EntityTest::class, 'json');
+    $this->assertEqual($entity->field_test->options, $deserialized->field_test->options);
+  }
+}
