diff --git a/configuration_example/README.txt b/configuration_example/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1c24ec58bc4a4bdc27e87f9beb5c7173f5444ab3
--- /dev/null
+++ b/configuration_example/README.txt
@@ -0,0 +1,13 @@
+Configuration Example
+Part of Examples for developers
+(http://drupal.org/project/examples)
+
+This module demonstrates how to set up configuration for a module.
+
+Note the difference between configuration and content. Content types, Image Styles, Taxonomy vocabularies are configuration. Nodes, Images, and Taxonomy terms are content. This module shows you how to manage configuration, not content, in your module.
+
+Two configuration types are demonstrated:
+
+(1) simple configuration: site-wide configuration variables. Our example uses "Configuration example variable one" and "Configuration example variable two".
+
+(2) complex configuration: variable number of configuration sets. Our example lets you define as many "kittens" as you want, and for each kitten, define a color and size.
\ No newline at end of file
diff --git a/configuration_example/config/configuration_example.complex_config.yml b/configuration_example/config/configuration_example.complex_config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aea0f24dd2f8e709af14325098550115d13b28ee
--- /dev/null
+++ b/configuration_example/config/configuration_example.complex_config.yml
@@ -0,0 +1,8 @@
+white_kitten:
+    kid: white_kitten
+    name: 'White kitten'
+    color: 'White'
+yellow_kitten:
+    kid: yellow_kitten
+    name: 'Yellow kitten'
+    color: 'Yellow'
diff --git a/configuration_example/config/configuration_example.simple_config.yml b/configuration_example/config/configuration_example.simple_config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d54813043b99983a666b8a92e90cbb931d214e52
--- /dev/null
+++ b/configuration_example/config/configuration_example.simple_config.yml
@@ -0,0 +1,2 @@
+configuration_example_one: 'Default value one'
+configuration_example_two: 'Default value two'
diff --git a/configuration_example/configuration_example.info b/configuration_example/configuration_example.info
new file mode 100644
index 0000000000000000000000000000000000000000..2af6808a276ae5c610ae1087e9bc89733428424d
--- /dev/null
+++ b/configuration_example/configuration_example.info
@@ -0,0 +1,6 @@
+name = Configuration example
+description = An example module showing how to set up configurations for your module.
+package = Example modules
+core = 8.x
+files[] = tests/configuration_example.test
+files[] = tests/upgrade.configuration_example.test
\ No newline at end of file
diff --git a/configuration_example/configuration_example.install b/configuration_example/configuration_example.install
new file mode 100644
index 0000000000000000000000000000000000000000..1103c9db826adeb2e0b827ebb2b1c9182f900599
--- /dev/null
+++ b/configuration_example/configuration_example.install
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @file
+ * Install, update and uninstall functions for the configuration_example module.
+ * Contrary to the equivalent module in Drupal 7, all configuration is managed
+ * by the configuration management system in Drupal core, so you don't need to
+ * implement an install or uninstall hook. In fact this file can be omitted
+ * entirely from your module if you are not implementing an upgrade path.
+ */
+
+/**
+ * Implements hook_update_N().
+ *
+ * This function updates configurations from the database and variable
+ * systems used in D7 to the new config system used in Drupal 8
+ * See http://heyrocker.com/how-use-drupal-8-configuration-system.
+ *
+ * To see this in action, please install Drupal 7 with the examples for
+ * developers module, and the patch at http://drupal.org/node/1630762 if
+ * has not yet been committed, then follow the steps in Drupal's UPGRADE.txt
+ * to upgrade to Drupal 8.
+ */
+function configuration_example_update_8000() {
+  // update the simple configuration.
+  $config = config('configuration_example.simple_config');
+  // variable_get() no longer exists in D8, use a direct db query.
+  if ($configuration_example_one = db_query("SELECT value FROM {variable} WHERE name = 'configuration_example_one'")->fetchField()) {
+    $config->set('configuration_example_one', unserialize($configuration_example_one));
+  }
+  if ($configuration_example_two = db_query("SELECT value FROM {variable} WHERE name = 'configuration_example_two'")->fetchField()) {
+    $config->set('configuration_example_two', unserialize($configuration_example_two));
+  }
+  // delete the old variables.
+  db_delete('variable')->condition('name', 'configuration_example_one')->execute();
+  db_delete('variable')->condition('name', 'configuration_example_two')->execute();
+  $config->save();
+
+  // update the more complex configuration from Drupal 7 to Drupal 8
+  // Read all fields from the configuration_example table.
+  $select = db_select('configuration_example', 'example');
+  $select->fields('example');
+
+  // Return the result in object format.
+  $configuration_sets = $select->execute()->fetchAll();
+
+  $config = config('configuration_example.complex_config');
+  foreach ($configuration_sets as $configuration_set) {
+    $config->set($configuration_set->kid, array('kid' => $configuration_set->kid, 'name' => $configuration_set->name, 'color' => $configuration_set->color));
+  }
+  $config->save('configuration_example');
+
+  db_drop_table('configuration_example');
+}
diff --git a/configuration_example/configuration_example.module b/configuration_example/configuration_example.module
new file mode 100644
index 0000000000000000000000000000000000000000..fce6f6b2171bae5b5c1c54688a1f4c4d0fd08f8d
--- /dev/null
+++ b/configuration_example/configuration_example.module
@@ -0,0 +1,409 @@
+<?php
+/**
+ * @file
+ * This is an example outlining how a module can manage simple (variable-based)
+ * and complex configuration and configuration sets in Drupal 8, using
+ * Drupal 8's Configuration management system.
+ *
+ * This module demonstrates how to set up configuration for a module.
+ *
+ * Note the difference between configuration and content. Content types, Image
+ * Styles, Taxonomy vocabularies are configuration. Nodes, Images, and Taxonomy
+ * terms are content. This module shows you how to manage configuration, not
+ * content, in your module.
+ *
+ * Two configuration types are demonstrated:
+ *
+ * (1) simple configuration: site-wide configuration variables. Our example uses
+ * "Configuration example variable one" and "Configuration example variable
+ * two".
+ *
+ * (2) complex configuration: variable number of configuration sets. Our example
+ * lets you define as many "kittens" as you want, and for each kitten, define a
+ * color.
+ *
+ * Reference:
+ * @link http://groups.drupal.org/build-systems-change-management/cmi @endlink.
+ */
+
+/**
+ * Implements hook_help().
+ *
+ * Show some help on each form provided by this module.
+ */
+function configuration_example_help($path) {
+  $output = '';
+  switch ($path) {
+    case 'examples/configuration-simple':
+      $output = t('Demonstrates how to manage simple site-wide configuration options.');
+      break;
+    case 'examples/configuration-complex':
+      $output = t('Demonstrates how to manage complex groups of configuration data for your site.');
+      break;
+    case 'examples/configuration-complex/%/delete':
+      $output = t('Demonstrates how to delete a configuration group.');
+      break;
+    case 'examples/configuration-complex/%/edit':
+      $output = t('Demonstrates how to edit a configuration group.');
+      break;
+    case 'examples/configuration-complex/add':
+      $output = t('Demonstrates how to add a configuration group.');
+      break;
+  }
+  return $output;
+}
+
+/**
+ * Implements hook_menu().
+ *
+ * Set up calls to drupal_get_form() for all our example cases.
+ */
+function configuration_example_menu() {
+  $items = array();
+
+  $items['examples/configuration-simple'] = array(
+    'title' => 'Configuration example - Simple',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('configuration_example_form_simple'),
+    'access callback' => TRUE,
+  );
+  $items['examples/configuration-complex'] = array(
+    'title' => 'Configuration example - Complex',
+    'page callback' => 'configuration_example_complex_list',
+    'access callback' => TRUE,
+  );
+  $items['examples/configuration-complex/list'] = array(
+    'title' => 'Complex configuration list',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['examples/configuration-complex/add'] = array(
+    'title' => 'Add a complex configuration item',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('configuration_example_form_add'),
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['examples/configuration-complex/%/update'] = array(
+    'title' => 'Update (edit) a complex configuration item',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('configuration_example_form_update'),
+    'access callback' => TRUE,
+  );
+  $items['examples/configuration-complex/%/delete'] = array(
+    'title' => 'Delete entry',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('configuration_example_form_delete'),
+    'access callback' => TRUE,
+  );
+
+  return $items;
+}
+
+/**
+ * Insert or update a complex configuration entry into the config system.
+ *
+ * In our example a complex configuration entry is a type of kitten.
+ *
+ * Called by configuration_example_form_add_submit() or
+ * configuration_example_form_add_submit() when the user
+ * visits the complex configuration page and saves a new configuration
+ * set or updates an existing one.
+ * For example, a user might create a new configuration set
+ * "green kitten" with the machine name "green_kitten", and
+ * the values name: "green kitten" color:"green".
+ *
+ * Third-party modules can also call this function if required.
+ *
+ * @param $entry
+ *   An array containing all the fields of the database record:
+ *     - kid (kitten id): the kitten's machine name (if it
+ *       already exist in the database, the record is updated; if it
+ *       does not exist, the record is created).
+ *     - name: the human readable name of the kitten.
+ *     - color: the color of the kitten.
+ */
+function configuration_example_entry_update($entry) {
+  $config = config('configuration_example.complex_config');
+  $config->set($entry['kid'], $entry);
+  $config->save();
+}
+
+/**
+ * Delete a complex configuration entry based on its machine name.
+ *
+ * In our example a complex configuration entry is a type of kitten. Our
+ * machine name is the "kid" (kitten id) in the database.
+ *
+ * Called by configuration_example_form_delete_submit() when the user
+ * has confirmed that the configuration entry for the machine name kid
+ * should be deleted. Third-party modules can also call this function
+ * if required.
+ *
+ * @param $kid
+ *   kid (kitten id) which already exists in the database and should be
+ *   deleted.
+ */
+function configuration_example_entry_delete($kid) {
+  $config = config('configuration_example.complex_config');
+  $config->clear($kid);
+  $config->save();
+}
+
+/**
+ * Display a form to delete an entry from the config file.
+ *
+ * Displays a form when visiting examples/configuration-complex/%/delete.
+ */
+function configuration_example_form_delete($form, &$form_state) {
+  $kid = arg(2);
+  if (!configuration_example_kid_exists($kid)) {
+    drupal_set_message(t('The kitten @kid does not exist and cannot be deleted.', array('@kid' => check_plain($kid))));
+    drupal_goto('examples/configuration-complex/list');
+  }
+
+  $form['kid'] = array(
+    '#type' => 'hidden',
+    '#value' => $kid,
+  );
+
+  return confirm_form(
+    $form,
+    t('Are you sure you want to delete kitten @kid?',
+    array('@kid' => $kid)),
+    'examples/configuration-complex'
+  );
+}
+
+/**
+ * Submit handler for deleting a complex config entry.
+ */
+function configuration_example_form_delete_submit($form, &$form_state) {
+  // Instead of performing the delete operation here, we will call
+  // an API function, passing only the value of kid (kitten ID)
+  // as an argument. This allows third-party modules to call the delete
+  // function without simulating an actual form.
+  configuration_example_entry_delete($form['kid']['#value']);
+
+  // set a success message and go back to the list, otherwise we'll stay on
+  // the same delete path of an item which no longer exists.
+  drupal_set_message(t('The kitten @kid has successfully been deleted.', array('@kid' => check_plain($form['kid']['#value']))));
+  drupal_goto('examples/configuration-complex/list');
+}
+
+/**
+ * Read one or all complex entries from the database.
+ *
+ * @param $kid
+ *   a machine id of a kitten to load. Ignored if the kid is
+ *   invalid or does not exist. If such is the case, all
+ *   entries are returned.
+ *
+ * @return
+ *   An object containing the loaded entries if found.
+ */
+function configuration_example_entry_load($kid = NULL) {
+  // Read all fields from the configuration_example table.
+  $select = db_select('configuration_example', 'example');
+  $select->fields('example');
+  if (!configuration_example_kid_exists($kid)) {
+    $kid = '';
+  }
+
+  $config = config('configuration_example.complex_config');
+  return $config->get($kid);
+}
+
+/**
+ * Render complex configuration list for display on-screen.
+ */
+function configuration_example_complex_list() {
+  $output = '';
+
+  // Get all entries in the configuration_example table.
+  if ($entries = configuration_example_entry_load()) {
+    $rows = array();
+    foreach ($entries as $entry) {
+      // Sanitize the data before handing it off to the theme layer.
+      $entry_rows = array_map('check_plain', (array) $entry);
+      $row = array();
+      $row[] = $entry_rows['kid'];
+      $row[] = $entry_rows['name'];
+      $row[] = $entry_rows['color'];
+      $row[] = l(t('edit'), 'examples/configuration-complex/' . $entry_rows['kid'] . '/update');
+      $row[] = l(t('delete'), 'examples/configuration-complex/' . $entry_rows['kid'] . '/delete');
+      $rows[] = $row;
+    }
+    // Make a table for them.
+    $header = array(t('Machine name'), t('Name'), t('color'), t('edit'), t('delete'));
+    $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  }
+  else {
+    drupal_set_message(t('No kittens are defined.'));
+  }
+  return $output;
+}
+
+/**
+ * Prepare a simple form to add an entry, with all the fields we need.
+ */
+function configuration_example_form_add($form, &$form_state) {
+  $form = array();
+
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Kitten name'),
+    '#required' => TRUE,
+    '#description' => t('User-friendly name.'),
+    '#size' => 40,
+    '#maxlength' => 127,
+    '#default_value' => '',
+  );
+  $form['kid'] = array(
+    '#type' => 'machine_name',
+    '#required' => TRUE,
+    '#title' => t("Machine Name"),
+    '#required' => TRUE,
+    '#description' => t('machine-friendly name.'),
+    '#size' => 15,
+    '#maxlength' => 15,
+    '#default_value' => '',
+    '#machine_name' => array(
+      'exists' => 'configuration_example_kid_exists',
+      'source' => array('name'),
+      'label' => t('Machine nmae'),
+      'replace_pattern' => '[^a-z0-9-]+',
+      'replace' => '-',
+    ),
+  );
+  $form['color'] = array(
+    '#type'  => 'textfield',
+    '#required' => TRUE,
+    '#title' => t('Color'),
+    '#size'  => 15,
+  );
+  $form['submit'] = array(
+    '#type'  => 'submit',
+    '#value' => t('Add'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for 'add entry' form.
+ */
+function configuration_example_form_add_submit($form, &$form_state) {
+  // Save the submitted entry.
+  $entry = array(
+    'kid'    => $form_state['values']['kid'],
+    'name'   => $form_state['values']['name'],
+    'color'  => $form_state['values']['color'],
+  );
+  $return = configuration_example_entry_update($entry);
+  if ($return) {
+    drupal_set_message(t("Created entry @entry", array('@entry' => print_r($entry, TRUE))));
+  }
+  
+  $form_state['redirect'] = 'examples/configuration-complex'; 
+  
+  return $return;
+}
+
+/**
+ * Sample UI to update a record.
+ */
+function configuration_example_form_update($form, &$form_state) {
+  $kid = arg(2);
+  if (!configuration_example_kid_exists($kid)) {
+    drupal_set_message(t('The kitten @kid does not exist and cannot be updated.', array('@kid' => check_plain($kid))));
+    drupal_goto('examples/configuration-complex/list');
+  }
+
+  $entries = configuration_example_entry_load($kid);
+
+  $form['kid'] = array(
+    '#type' => 'hidden',
+    '#value' => $kid,
+  );
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#size' => 15,
+    '#default_value' => $entries['name'],
+  );
+  $form['color'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Color'),
+    '#size' => 15,
+    '#default_value' => $entries['color'],
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update'),
+  );
+  return $form;
+}
+
+/**
+ * Submit handler for 'update entry' form.
+ */
+function configuration_example_form_update_submit($form, &$form_state) {
+  // Save the submitted entry.
+  $entry = array(
+    'kid' => $form_state['values']['kid'],
+    'name' => $form_state['values']['name'],
+    'color' => $form_state['values']['color'],
+  );
+  $count = configuration_example_entry_update($entry);
+  drupal_set_message(t("Updated entry @entry (@count row updated)", array('@count' => $count, '@entry' => print_r($entry, TRUE))));
+  
+  $form_state['redirect'] = 'examples/configuration-complex';
+}
+
+/**
+ * Returns whether a kitten machine name already exists.
+ *
+ * @param @kid
+ *   A kitten ID.
+ */
+function configuration_example_kid_exists($kid) {
+  $config = config('configuration_example.complex_config');
+  return $config->get($kid);
+}
+
+/**
+ * Sample UI to update a simple configuration item.
+ */
+function configuration_example_form_simple($form, &$form_state) {
+  $config = config('configuration_example.simple_config');
+  $form['configuration_example_one'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Configuration example variable one'),
+    '#size' => 15,
+    '#default_value' => $config->get('configuration_example_one'),
+  );
+  $form['configuration_example_two'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Configuration example variable two'),
+    '#size' => 15,
+    '#default_value' => $config->get('configuration_example_two'),
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update'),
+  );
+  
+  return $form;
+}
+
+/**
+ * Submit handler for 'configuration_example_form_update' form.
+ */
+function configuration_example_form_simple_submit($form, &$form_state) {
+  // Let's store the variables in the config system
+  $config = config('configuration_example.simple_config');
+  $config->set('configuration_example_one', $form_state['input']['configuration_example_one']);
+  $config->set('configuration_example_two', $form_state['input']['configuration_example_two']);
+  drupal_set_message(t('Successfully updated the simple configuration variables'));
+  $config->save();
+}
diff --git a/configuration_example/tests/configuration_example.test b/configuration_example/tests/configuration_example.test
new file mode 100644
index 0000000000000000000000000000000000000000..496655f94ac3de571b998f975f286b0cd7ffe5a3
--- /dev/null
+++ b/configuration_example/tests/configuration_example.test
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @file
+ * SimpleTests for configuration_example module.
+ */
+
+/**
+ * Default test case for the configuration_example module.
+ */
+ 
+use Drupal\simpletest\WebTestBase;
+
+class ConfigurationExampleTestCase extends WebTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Configuration example UI tests',
+      'description' => 'Various unit tests on the configuration example module.' ,
+      'group' => 'Examples',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('configuration_example');
+  }
+
+  function testUI() {
+    // simple config
+    $this->drupalGet('examples/configuration-simple');
+    $this->assertRaw('Default value one', '"Default value one", provided by default, is present.');
+    $this->drupalPost(NULL, array('configuration_example_one' => 'Updated value one'), t('Update'));
+    $this->assertNoRaw('Default value one', '"Default value one" has been updated and is no longer present.');
+    $this->assertRaw('Updated value one', '"Updated value one", entered by the user, is present.');
+
+    // complex config
+    $this->drupalGet('examples/configuration-complex');
+    $this->assertText('White kitten', 'The kitten "White kitten", installed by default, is present after installation');
+    $new_name = $this->randomName(8);
+    $new_kid = strtolower($this->randomName(8));
+    $new_color = $this->randomName(8);
+    $edit = array(
+      'name' => $new_name,
+      'kid' => $new_kid,
+      'color' => $new_color,
+    );
+    $this->drupalPost('examples/configuration-complex/add', $edit, t('Add'));
+    $this->assertText($new_name, 'The name of the new kitten is present');
+    $this->assertText($new_kid, 'The machine name of the new kitten is present');
+    $this->assertText($new_color, 'The color of the new kitten is present');
+
+    $new_color = $this->randomName(8);
+    $this->drupalPost('examples/configuration-complex/white_kitten/update', array('color' => $new_color), t('Update'));
+    $this->assertText($new_color, 'Color has been updated');
+
+    $this->drupalPost('examples/configuration-complex/white_kitten/delete', array(), t('Confirm'));
+    $this->assertNoText('White kitten', 'White kitten has been deleted, is no longer present');
+    $this->assertText('Yellow kitten', 'Deleting "White kitten" has not deleted "Yellow kitten"');
+
+    $this->drupalGet('examples/configuration-complex/machine_name_does_not_exist/delete');
+    $this->assertText(t('The kitten @kid does not exist and cannot be deleted.', array('@kid' => 'machine_name_does_not_exist')), 'trying to delete a non-existant machien name fails gracefully');
+    $this->drupalGet('examples/configuration-complex/machine_name_does_not_exist/update');
+    $this->assertText(t('The kitten @kid does not exist and cannot be updated.', array('@kid' => 'machine_name_does_not_exist')), 'trying to update a non-existant machien name fails gracefully');
+  }
+}
diff --git a/configuration_example/tests/drupal-7.configuration_example.database.php.gz b/configuration_example/tests/drupal-7.configuration_example.database.php.gz
new file mode 100644
index 0000000000000000000000000000000000000000..f01a8501f9d0d167d5004f86c8ca94a6b6b72493
GIT binary patch
literal 979
zcmV;^11$U>iwFP!000001HD$=Z`(EyfA?Q;(2MNBaXyyJtGs3yl0Fm#+M;OR1{kz-
zvItY8MpAaXApiT0q-0BuvIRrYmxQ`I-u>?DNB{PFRaB$V`8jZDP+KsnMA$OT*-D^+
zTxqZcg5hN)5K<*`z6NHTa1X4ikZHQ=ZJd|;Ib^G4s*zb-TIXXlB0+FIj$6m^<m@)*
zC^9o<TC@Fl1Q1JBVmx)HEfcjnP9~$XTmSLQ4&L5E9N^TNS+3*~AD9EVRI=yBSyFV)
z1pgby@m=>0kS#R#AlIs-1mem64QzMn)q%<O#lZN0X>D;lS@_P}`D*$SXN+pf41FBi
zlPc%r;j}lVP_@Y1{bQHz=e`@=_Kb&fiKlSPJ9NtDa}WZM=MB%mSSGW8B-(ImQ3B7R
z8NAP7uWGtL!()}^a_wi!7Vd<?;I#E3_y%ExEG=NggfLTovE=K*LP`SnsiD%mWO@%C
z46If>n|TK@fr#M*8;R|{YMMnumljON(^e%=u5IC!S2s5Yu~ZghEreHm{qpVIL6f0L
zHLqNOg3Hehm=Cy5;G5)s)d)@U@9$w;QZAe(%MHwA)&!n}f6WyAV89<dxIbg#F`Yt6
zl~DS$zuz5F&T3)3;^H+xJ*Xa1|0iw-VT1b)WIqPMfXj?F=-IrsSwg4wjjZFnR9P+l
zZOg-k{|6O#?pk!2Z`f>z23;b@82%JczC=rY0UVTUzNGV!|BfJumP29TlkE9ywRi5T
zQNAw9f$WB&d~KCOQG#-a=^Vx7N(i-cB*A5_hyWyU1LSDa0yEfh)+a(@zmf<jan}tB
zOfCEr2-WP3#S(S}>adA#UueR@-PN@Owr12W>mD&BQw+Ql1_HPNmRi2WS?@s$K?eJn
zbJ~$Z3y&wiRQ{xP62nTx#G<w~;k;7H8mn2=s3`H0Ew`wR+Y&F^p<~Cm8TVYh*tG))
z--3{fIj1^U%~$751-#&SVTPr%W<y@N20a$(UJc26ajyhka(P+_FTEHnNLSU=r7QB~
z@dB2-NghpdokR|Hv@prlWfJwD<p#J@UXrpyPhNEWYZCo&uxe+6o?1V!^bf3}F|<%u
z(5r|OTCxcbWoNLauu`^Ye_xH;A4q3zxU&hp!ZJI&@Z;LJFzh(}p%jyu12<2iilrO2
z4(M-^=v@z{abik7RoYwpoJ8~4gFBI_n-el%$z}4$lM7dyU!3XC09Z6OT0BvVD_5Zk
ziEm}f!~Kio@yTOp+7m54hFJ7Fvx#*xyP93Q^P40(bU0eLuulWT@DH;Ha>1ht006<X
B=6nDE

literal 0
HcmV?d00001

diff --git a/configuration_example/tests/upgrade.configuration_example.test b/configuration_example/tests/upgrade.configuration_example.test
new file mode 100644
index 0000000000000000000000000000000000000000..0d050f3a693b81a51720ebbec0dc9cb66d1b90b3
--- /dev/null
+++ b/configuration_example/tests/upgrade.configuration_example.test
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Test the upgrade path from D7 => D8.
+ */
+
+use Drupal\system\Tests\Upgrade\UpgradePathTestBase;
+
+/**
+ * Performs major version release upgrade tests on a bare database.
+ *
+ * Loads an installation of Drupal 7.x and runs the upgrade process on it.
+ *
+ * The install contains the minimal profile modules (without any generated
+ * content) so that an upgrade from of a site under this profile may be tested.
+ */
+class ConfigurationExampleUpgradePathTest extends UpgradePathTestBase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Configuration example upgrade path tests',
+      'description' => 'Test upgrading the configuration example module from D7 to D8.',
+      'group' => 'Examples',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'system') . '/tests/upgrade/drupal-7.bare.minimal.database.php.gz',
+      drupal_get_path('module', 'configuration_example') . '/tests/drupal-7.configuration_example.database.php.gz',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests a successful major version release upgrade.
+   */
+  public function testBasicMinimalUpgrade() {
+    // perform the basic upgrade first
+    $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));
+    // now enable our module and perform its upgrade
+    module_enable(array('configuration_example'));
+    $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));
+
+    $this->drupalGet('examples/configuration-simple');
+    $this->assertRaw('configuration_example_one', 'Value present from D7');
+    $this->assertRaw('configuration_example_two', 'Value present from D7');
+
+    $this->drupalGet('examples/configuration-complex');
+    $this->assertRaw('d7_kid_one', 'Value present from D7');
+    $this->assertRaw('D7 Kitten One', 'Value present from D7');
+    $this->assertRaw('D7 Color One', 'Value present from D7');
+    $this->assertRaw('d7_kid_two', 'Value present from D7');
+    $this->assertRaw('D7 Kitten Two', 'Value present from D7');
+    $this->assertRaw('D7 Color Two', 'Value present from D7');
+    
+    $this->assertFalse(db_table_exists('configuration_example'), 'the old configuration_example has been deleted from the db');
+  }
+}
