 .../ConfigurableLanguageResourceTestBase.php       | 18 ++++++
 .../src/Normalizer/ConfigEntityNormalizer.php      |  2 +-
 .../Unit/Normalizer/ConfigEntityNormalizerTest.php | 67 +++++++++++++++++++++-
 3 files changed, 84 insertions(+), 3 deletions(-)

diff --git a/core/modules/rest/tests/src/Functional/EntityResource/ConfigurableLanguage/ConfigurableLanguageResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/ConfigurableLanguage/ConfigurableLanguageResourceTestBase.php
index 301beb2..cf5be74 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/ConfigurableLanguage/ConfigurableLanguageResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/ConfigurableLanguage/ConfigurableLanguageResourceTestBase.php
@@ -3,6 +3,7 @@
 namespace Drupal\Tests\rest\Functional\EntityResource\ConfigurableLanguage;
 
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Url;
 use Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase;
 use Drupal\language\Entity\ConfigurableLanguage;
 
@@ -74,4 +75,21 @@ protected function getNormalizedPostEntity() {
     // @todo Update in https://www.drupal.org/node/2300677.
   }
 
+  /**
+   * Test a GET request for a default config entity, which has a _core key.
+   *
+   * @see https://www.drupal.org/node/2915414
+   */
+  public function testGetDefaultConfig() {
+    $this->initAuthentication();
+    $url = Url::fromUri('base:/entity/configurable_language/en')->setOption('query', ['_format' => static::$format]);;
+    $request_options = $this->getAuthenticationRequestOptions('GET');
+    $this->provisionEntityResource();
+    $this->setUpAuthorization('GET');
+    $response = $this->request('GET', $url, $request_options);
+
+    $normalization = $this->serializer->decode((string) $response->getBody(), static::$format);
+    $this->assertArrayNotHasKey('_core', $normalization);
+  }
+
 }
diff --git a/core/modules/serialization/src/Normalizer/ConfigEntityNormalizer.php b/core/modules/serialization/src/Normalizer/ConfigEntityNormalizer.php
index 344bcc3..dd766ce 100644
--- a/core/modules/serialization/src/Normalizer/ConfigEntityNormalizer.php
+++ b/core/modules/serialization/src/Normalizer/ConfigEntityNormalizer.php
@@ -18,7 +18,7 @@ class ConfigEntityNormalizer extends EntityNormalizer {
    * {@inheritdoc}
    */
   public function normalize($object, $format = NULL, array $context = []) {
-    return $object->toArray();
+    return array_diff_key($object->toArray(), ['_core' => TRUE]);
   }
 
 }
diff --git a/core/modules/serialization/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php b/core/modules/serialization/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php
index 371450a..0a27c80 100644
--- a/core/modules/serialization/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php
+++ b/core/modules/serialization/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\serialization\Unit\Normalizer;
 
+use Drupal\Core\Config\Entity\ConfigEntityTypeInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\serialization\Normalizer\ConfigEntityNormalizer;
 use Drupal\Tests\UnitTestCase;
 
@@ -17,7 +20,13 @@ class ConfigEntityNormalizerTest extends UnitTestCase {
    * @covers ::normalize
    */
   public function testNormalize() {
-    $test_export_properties = ['test' => 'test'];
+    $test_export_properties = [
+      'test' => 'test',
+      '_core' => [
+        'default_config_hash' => $this->randomMachineName(),
+        $this->randomMachineName() => 'some random key',
+      ],
+    ];
 
     $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
     $normalizer = new ConfigEntityNormalizer($entity_manager);
@@ -27,7 +36,61 @@ public function testNormalize() {
       ->method('toArray')
       ->will($this->returnValue($test_export_properties));
 
-    $this->assertSame($test_export_properties, $normalizer->normalize($config_entity));
+    $this->assertSame(['test' => 'test'], $normalizer->normalize($config_entity));
+  }
+
+  /**
+   * @covers ::denormalize
+   */
+  public function testDenormalize() {
+    $test_value = $this->randomMachineName();
+    $data = [
+      'test' => $test_value,
+      '_core' => [
+        'default_config_hash' => $this->randomMachineName(),
+        $this->randomMachineName() => 'some random key',
+      ],
+    ];
+
+    $expected_storage_data = [
+      'test' => $test_value,
+    ];
+
+    // Mock of the entity storage, to test our expectation that the '_core' key
+    // never makes it to that point, thanks to the denormalizer omitting it.
+    $entity_storage = $this->prophesize(EntityStorageInterface::class);
+    $entity_storage->create($expected_storage_data)
+      ->shouldBeCalled()
+      ->will(function ($args) {
+        $entity = new \stdClass();
+        $entity->received_data = $args[0];
+        return $entity;
+      });
+
+    // Stubs for the denormalizer going from entity manager to entity storage.
+    $entity_type_id = $this->randomMachineName();
+    $entity_type_class = $this->randomMachineName();
+    $entity_manager = $this->prophesize(EntityManagerInterface::class);
+    $entity_manager->getEntityTypeFromClass($entity_type_class)
+      ->willReturn($entity_type_id);
+    $entity_manager->getDefinition($entity_type_id, FALSE)
+      ->willReturn($this->prophesize(ConfigEntityTypeInterface::class)->reveal());
+    $entity_manager->getStorage($entity_type_id)
+      ->willReturn($entity_storage->reveal());
+    $normalizer = new ConfigEntityNormalizer($entity_manager->reveal());
+
+    // Verify the denormalizer still works correctly: the mock above creates an
+    // artificial entity object containing exactly the data it received. It also
+    // should still set _restSubmittedFields correctly.
+    $expected_denormalization = (object) [
+      '_restSubmittedFields' => [
+        'test',
+      ],
+      'received_data' => [
+        'test' => $test_value,
+      ],
+    ];
+    $this->assertEquals($expected_denormalization, $normalizer->denormalize($data, $entity_type_class, 'json'));
   }
 
 }
