diff --git a/core/includes/config.inc b/core/includes/config.inc
index 20e6bb4..6d636b4 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -255,24 +255,31 @@ function config_import_invoke_owner(array $config_changes, StorageInterface $sou
   // handle dependencies correctly.
   foreach (array('delete', 'create', 'change') as $op) {
     foreach ($config_changes[$op] as $key => $name) {
-      // Call to the configuration entity's storage controller to handle the
-      // configuration change.
       $handled_by_module = FALSE;
+
       // Validate the configuration object name before importing it.
       Config::validateName($name);
-      if ($entity_type = config_get_entity_type_by_name($name)) {
-        $old_config = new Config($name, $target_storage);
-        $old_config->load();
 
-        $data = $source_storage->read($name);
-        $new_config = new Config($name, $target_storage);
-        if ($data !== FALSE) {
-          $new_config->setData($data);
-        }
+      $old_config = new Config($name, $target_storage);
+      $old_config->load();
+      $data = $source_storage->read($name);
+      $new_config = new Config($name, $target_storage);
+      if ($data !== FALSE) {
+        $new_config->setData($data);
+      }
 
+      // If this is a config entity then call to the entity's storage
+      // controller to handle the configuration change. Otherwise, Check
+      // whether the module implements hook_config_import() and ask it to
+      // handle the configuration change.
+      if ($entity_type = config_get_entity_type_by_name($name)) {
         $method = 'import' . ucfirst($op);
         $handled_by_module = entity_get_controller($entity_type)->$method($name, $new_config, $old_config);
       }
+      elseif (module_exists($module) && module_hook($module, 'config_import_' . $op)) {
+        $handled_by_module = module_invoke($module, 'config_import_' . $op, $name, $new_config, $old_config);
+      }
+
       if (!empty($handled_by_module)) {
         unset($config_changes[$op][$key]);
       }
diff --git a/core/modules/config/config.api.php b/core/modules/config/config.api.php
index 7b06336..5f46e87 100644
--- a/core/modules/config/config.api.php
+++ b/core/modules/config/config.api.php
@@ -11,3 +11,110 @@
  * @todo Overall description of the configuration system.
  * @}
  */
+
+
+/**
+ * Create configuration upon synchronizing configuration changes.
+ *
+ * This callback is invoked when configuration is synchronized between storages
+ * and allows a module to take over the synchronization of configuration data.
+ *
+ * Modules should implement this callback if they manage configuration data
+ * (such as image styles, node types, or fields) which needs to be
+ * prepared and passed through module API functions to properly handle a
+ * configuration change.
+ *
+ * @param string $name
+ *   The name of the configuration object.
+ * @param Drupal\Core\Config\Config $new_config
+ *   A configuration object containing the new configuration data.
+ * @param Drupal\Core\Config\Config $old_config
+ *   A configuration object containing the old configuration data.
+ */
+function hook_config_import_create($name, $new_config, $old_config) {
+  if (strpos($name, 'config_test.dynamic.') !== 0) {
+    return FALSE;
+  }
+  $config_test = entity_create('config_test', $new_config->get());
+  $config_test->save();
+  return TRUE;
+}
+
+/**
+ * Update configuration upon synchronizing configuration changes.
+ *
+ * This callback is invoked when configuration is synchronized between storages
+ * and allows a module to take over the synchronization of configuration data.
+ *
+ * Modules should implement this callback if they manage configuration data
+ * (such as image styles, node types, or fields) which needs to be
+ * prepared and passed through module API functions to properly handle a
+ * configuration change.
+ *
+ * @param string $name
+ *   The name of the configuration object.
+ * @param Drupal\Core\Config\Config $new_config
+ *   A configuration object containing the new configuration data.
+ * @param Drupal\Core\Config\Config $old_config
+ *   A configuration object containing the old configuration data.
+ */
+function hook_config_import_change($name, $new_config, $old_config) {
+  if (strpos($name, 'config_test.dynamic.') !== 0) {
+    return FALSE;
+  }
+
+  // @todo Make this less ugly.
+  list($entity_type) = explode('.', $name);
+  $entity_info = entity_get_info($entity_type);
+  $id = substr($name, strlen($entity_info['config_prefix']) + 1);
+  $config_test = entity_load('config_test', $id);
+
+  // Store the original config, and iterate through each property to store it.
+  $config_test->original = clone $config_test;
+  foreach ($old_config->get() as $property => $value) {
+    $config_test->original->$property = $value;
+  }
+
+  // Iterate through each property of the new config, copying it to the test
+  // object.
+  foreach ($new_config->get() as $property => $value) {
+    $config_test->$property = $value;
+  }
+
+  $config_test->save();
+  return TRUE;
+}
+
+/**
+ * Delete configuration upon synchronizing configuration changes.
+ *
+ * This callback is invoked when configuration is synchronized between storages
+ * and allows a module to take over the synchronization of configuration data.
+ *
+ * Modules should implement this callback if they manage configuration data
+ * (such as image styles, node types, or fields) which needs to be
+ * prepared and passed through module API functions to properly handle a
+ * configuration change.
+ *
+ * @param string $name
+ *   The name of the configuration object.
+ * @param Drupal\Core\Config\Config $new_config
+ *   A configuration object containing the new configuration data.
+ * @param Drupal\Core\Config\Config $old_config
+ *   A configuration object containing the old configuration data.
+ */
+function hook_config_import_delete($name, $new_config, $old_config) {
+  if (strpos($name, 'config_test.dynamic.') !== 0) {
+    return FALSE;
+  }
+  // @todo image_style_delete() supports the notion of a "replacement style"
+  //   to be used by other modules instead of the deleted style. Essential!
+  //   But that is impossible currently, since the config system only knows
+  //   about deleted and added changes. Introduce an 'old_ID' key within
+  //   config objects as a standard?
+  list($entity_type) = explode('.', $name);
+  $entity_info = entity_get_info($entity_type);
+  $id = substr($name, strlen($entity_info['config_prefix']) + 1);
+  config_test_delete($id);
+  return TRUE;
+}
