diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
index b472b8f..2dd7ace 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
@@ -244,6 +244,10 @@ public function create(array $values) {
       $entity->{$this->uuidKey} = $uuid->generate();
     }
 
+    // Modules might need to add or change the data initially held by the new
+    // entity object, for instance to fill-in default values.
+    $this->invokeHook('create', $entity);
+
     return $entity;
   }
 
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
index efcbf0e..e93b79f 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
@@ -175,6 +175,11 @@ function testCRUD() {
       $this->assertIdentical($config_test->id(), $new_id);
       $this->assertIdentical($config_test->getOriginalID(), $new_id);
     }
+
+    // Test config entity prepopulation.
+    state()->set('config_test.prepopulate', TRUE);
+    $config_test = entity_create('config_test', array('foo' => 'bar'));
+    $this->assertEqual($config_test->get('foo'), 'baz', 'Initial value correctly populated');
   }
 
   /**
diff --git a/core/modules/config/tests/config_test/config_test.module b/core/modules/config/tests/config_test/config_test.module
index 5dbcb92..7340bc8 100644
--- a/core/modules/config/tests/config_test/config_test.module
+++ b/core/modules/config/tests/config_test/config_test.module
@@ -136,3 +136,12 @@ function config_test_cache_flush() {
 
   return array();
 }
+
+/**
+ * Implements hook_ENTITY_TYPE_create().
+ */
+function config_test_config_test_create(ConfigTest $config_test) {
+  if (state()->get('config_test.prepopulate')) {
+    $config_test->set('foo', 'baz');
+  }
+}
