diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
index 56603c7..453c18d 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
@@ -10,7 +10,6 @@
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\ConfigException;
-use Drupal\Core\Config\Schema\SchemaIncompleteException;
 use Drupal\Core\Entity\Entity;
 use Drupal\Core\Config\ConfigDuplicateUUIDException;
 use Drupal\Core\Entity\EntityStorageInterface;
@@ -275,15 +274,7 @@ public function toArray() {
     /** @var \Drupal\Core\Config\Entity\ConfigEntityTypeInterface $entity_type */
     $entity_type = $this->getEntityType();
 
-    $properties_to_export = $entity_type->getPropertiesToExport();
-    if (empty($properties_to_export)) {
-      $config_name = $entity_type->getConfigPrefix() . '.' . $this->id();
-      $definition = $this->getTypedConfig()->getDefinition($config_name);
-      if (!isset($definition['mapping'])) {
-        throw new SchemaIncompleteException(SafeMarkup::format('Incomplete or missing schema for @config_name', array('@config_name' => $config_name)));
-      }
-      $properties_to_export = array_combine(array_keys($definition['mapping']), array_keys($definition['mapping']));
-    }
+    $properties_to_export = $entity_type->getPropertiesToExport($this->id());
 
     $id_key = $entity_type->getKey('id');
     foreach ($properties_to_export as $property_name => $export_name) {
@@ -304,15 +295,6 @@ public function toArray() {
   }
 
   /**
-   * Gets the typed config manager.
-   *
-   * @return \Drupal\Core\Config\TypedConfigManagerInterface
-   */
-  protected function getTypedConfig() {
-    return \Drupal::service('config.typed');
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function preSave(EntityStorageInterface $storage) {
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
index f15eef5..e0c1881 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Config\Entity;
 
 use Drupal\Core\Config\Entity\Exception\ConfigEntityStorageClassException;
+use Drupal\Core\Config\Schema\SchemaIncompleteException;
 use Drupal\Core\Entity\EntityType;
 use Drupal\Core\Config\ConfigPrefixLengthException;
 use Drupal\Component\Utility\SafeMarkup;
@@ -166,8 +167,8 @@ protected function checkStorageClass($class) {
    * {@inheritdoc}
    */
   public function getPropertiesToExport() {
-    if (!empty($this->config_export)) {
-      if (empty($this->mergedConfigExport)) {
+    if (empty($this->mergedConfigExport)) {
+      if (!empty($this->config_export)) {
         // Always add default properties to be exported.
         $this->mergedConfigExport = [
           'uuid' => 'uuid',
@@ -185,9 +186,25 @@ public function getPropertiesToExport() {
           }
         }
       }
-      return $this->mergedConfigExport;
+      else {
+        $config_name = $this->getConfigPrefix() . '.*';
+        $definition = $this->getTypedConfig()->getDefinition($config_name);
+        if (!isset($definition['mapping'])) {
+          throw new SchemaIncompleteException(SafeMarkup::format('Incomplete or missing schema for @config_name', ['@config_name' => $config_name]));
+        }
+        $this->mergedConfigExport = array_combine(array_keys($definition['mapping']), array_keys($definition['mapping']));
+      }
     }
-    return NULL;
+    return $this->mergedConfigExport;
+  }
+
+  /**
+   * Gets the typed config manager.
+   *
+   * @return \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected function getTypedConfig() {
+    return \Drupal::service('config.typed');
   }
 
 }
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php
index 0f26ae0..586465a 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php
@@ -64,9 +64,8 @@ public function getConfigPrefix();
   /**
    * Gets the config entity properties to export if declared on the annotation.
    *
-   * @return array|NULL
-   *   The properties to export or NULL if they can not be determine from the
-   *   config entity type annotation.
+   * @return array
+   *   The properties to export or an empty array if they can not be determined.
    */
   public function getPropertiesToExport();
 
diff --git a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php
index b654077..f120c68 100644
--- a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php
@@ -82,13 +82,6 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
   protected $cacheTagsInvalidator;
 
   /**
-   * The mocked typed config manager.
-   *
-   * @var \Drupal\Core\Config\TypedConfigManagerInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $typedConfigManager;
-
-  /**
    * {@inheritdoc}
    */
   protected function setUp() {
@@ -124,14 +117,11 @@ protected function setUp() {
 
     $this->cacheTagsInvalidator = $this->getMock('Drupal\Core\Cache\CacheTagsInvalidatorInterface');
 
-    $this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
-
     $container = new ContainerBuilder();
     $container->set('entity.manager', $this->entityManager);
     $container->set('uuid', $this->uuid);
     $container->set('language_manager', $this->languageManager);
     $container->set('cache_tags.invalidator', $this->cacheTagsInvalidator);
-    $container->set('config.typed', $this->typedConfigManager);
     \Drupal::setContainer($container);
 
     $this->entity = $this->getMockForAbstractClass('\Drupal\Core\Config\Entity\ConfigEntityBase', array($values, $this->entityTypeId));
@@ -463,8 +453,6 @@ public function testSort() {
    * @covers ::toArray
    */
   public function testToArray() {
-    $this->typedConfigManager->expects($this->never())
-      ->method('getDefinition');
     $this->entityType->expects($this->any())
       ->method('getPropertiesToExport')
       ->willReturn(['id' => 'configId', 'dependencies' => 'dependencies']);
@@ -485,8 +473,6 @@ public function testToArrayIdKey() {
       ->method('get')
       ->with('dependencies')
       ->willReturn([]);
-    $this->typedConfigManager->expects($this->never())
-      ->method('getDefinition');
     $this->entityType->expects($this->any())
       ->method('getPropertiesToExport')
       ->willReturn(['id' => 'configId', 'dependencies' => 'dependencies']);
@@ -500,33 +486,6 @@ public function testToArrayIdKey() {
   }
 
   /**
-   * @covers ::toArray
-   */
-  public function testToArraySchemaFallback() {
-    $this->typedConfigManager->expects($this->once())
-      ->method('getDefinition')
-      ->will($this->returnValue(array('mapping' => array('id' => '', 'dependencies' => ''))));
-    $this->entityType->expects($this->any())
-      ->method('getPropertiesToExport')
-      ->willReturn([]);
-    $properties = $this->entity->toArray();
-    $this->assertInternalType('array', $properties);
-    $this->assertEquals(array('id' => $this->entity->id(), 'dependencies' => array()), $properties);
-  }
-
-  /**
-   * @covers ::toArray
-   *
-   * @expectedException \Drupal\Core\Config\Schema\SchemaIncompleteException
-   */
-  public function testToArrayFallback() {
-    $this->entityType->expects($this->any())
-      ->method('getPropertiesToExport')
-      ->willReturn([]);
-    $this->entity->toArray();
-  }
-
-  /**
    * @covers ::getThirdPartySetting
    * @covers ::setThirdPartySetting
    * @covers ::getThirdPartySettings
diff --git a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityTypeTest.php b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityTypeTest.php
index 524fea0..5bf1c70 100644
--- a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityTypeTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityTypeTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Tests\Core\Config\Entity;
 
+use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Tests\UnitTestCase;
 use Drupal\Core\Config\Entity\ConfigEntityType;
 use Drupal\Component\Utility\SafeMarkup;
@@ -149,11 +150,6 @@ public function testGetPropertiesToExport($definition, $expected) {
   public function providerGetPropertiesToExport() {
     $data = [];
     $data[] = [
-      [],
-      NULL,
-    ];
-
-    $data[] = [
       [
         'config_export' => [
           'id',
@@ -187,4 +183,62 @@ public function providerGetPropertiesToExport() {
     return $data;
   }
 
+  /**
+   * @covers ::getPropertiesToExport
+   */
+  public function testGetPropertiesToExportFromSchema() {
+    $definition = [
+      'id' => 'my_config_entity_type',
+      'provider' => 'my_module',
+    ];
+
+    $typed_config_manager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
+    $typed_config_manager->expects($this->once())
+      ->method('getDefinition')
+      ->with($definition['provider'] . '.' . $definition['id'] . '.*')
+      ->willReturn(['mapping' => ['id' => '', 'dependencies' => '']]);
+    $container = new ContainerBuilder();
+    $container->set('config.typed', $typed_config_manager);
+    \Drupal::setContainer($container);
+
+    $expected = [
+      'id' => 'id',
+      'dependencies' => 'dependencies',
+    ];
+    $entity_type = $this->setUpConfigEntityType($definition);
+
+    $properties_to_export = $entity_type->getPropertiesToExport();
+    $this->assertSame($expected, $properties_to_export);
+
+    // Ensure the method is idempotent.
+    $properties_to_export = $entity_type->getPropertiesToExport();
+    $this->assertSame($expected, $properties_to_export);
+  }
+
+  /**
+   * @covers ::getPropertiesToExport
+   *
+   * @expectedException \Drupal\Core\Config\Schema\SchemaIncompleteException
+   * @expectedExceptionMessage Incomplete or missing schema for my_module.example_config_entity_type.*
+   */
+  public function testGetPropertiesToExportFromMissingSchema() {
+    $typed_config_manager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
+    $typed_config_manager->expects($this->once())
+      ->method('getDefinition')
+      ->willReturn([]);
+    $container = new ContainerBuilder();
+    $container->set('config.typed', $typed_config_manager);
+    \Drupal::setContainer($container);
+
+    $definition = ['provider' => 'my_module'];
+    $expected = [];
+    $entity_type = $this->setUpConfigEntityType($definition);
+    $properties_to_export = $entity_type->getPropertiesToExport();
+    $this->assertSame($expected, $properties_to_export);
+
+    // Ensure the method is idempotent.
+    $properties_to_export = $entity_type->getPropertiesToExport();
+    $this->assertSame($expected, $properties_to_export);
+  }
+
 }
