diff --git a/css/skinr-ui-admin.css b/css/skinr-ui-admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..98899b3ee074f8d156274696332b7148d5136c3a
--- /dev/null
+++ b/css/skinr-ui-admin.css
@@ -0,0 +1,7 @@
+tr.skinr-ui-disabled td {
+  color: #999;
+}
+
+td.skinr-ui-storage {
+  color: #999;
+}
diff --git a/skinr.api.php b/skinr.api.php
index ef3a599d136de8021bf2e502543bfb0f391b1ed3..8fb2a00353a02b7deef0d025e42ef36d0af4cef8 100644
--- a/skinr.api.php
+++ b/skinr.api.php
@@ -76,7 +76,7 @@ function hook_skinr_theme_hooks_alter(&$theme_hooks, $module, $element) {
 /**
  * Return an array of element ids.
  *
- * @todo Needs a better description.
+ * An element is a block, node, region, etc.
  *
  * @param $variables
  *   The variables array from skinr_preprocess().
@@ -441,5 +441,88 @@ function hook_skinr_group_info_alter(&$groups) {
 }
 
 /**
+ * Perform alterations on skin configuration objects before they are applied.
+ *
+ * @param $skins
+ *   An array of skin configuration objects.
+ * @param $context
+ *   An array containing the current context. It has the following keys:
+ *   - hook: The name of the theme hook.
+ *   - variables: The variables array from hook_preprocess() (modify in place).
+ *   - theme: The current theme.
+ *   - module: The module implementing the elements.
+ *   - elements: An array of element IDs.
+ */
+function hook_skinr_preprocess_alter(&$skins, $context) {
+  if ($context['theme'] == 'bartik') {
+    foreach ($skins as $key => $skin) {
+      if ($skin->module == 'block' && $skin->element == 'system_navigation') {
+        unset($skins[$key]);
+      }
+    }
+  }
+}
+
+/**
+ * Alter the registry of modules implementing a skinr hook.
+ *
+ * @param $implementations
+ *   An array keyed by the module's name. The value of each item corresponds
+ *   to a $group, which is usually FALSE, unless the implementation is in a file
+ *   named $module.$group.inc.
+ * @param $hook
+ *   The name of the module hook being implemented.
+ */
+function hook_skinr_implements_alter(&$implementations, $hook) {
+  if ($hook == 'skinr_elements') {
+    // Move my_module_skinr_elements() to the end of the list. skinr_implements()
+    // iterates through $implementations with a foreach loop which PHP iterates
+    // in the order that the items were added, so to move an item to the end of
+    // the array, we remove it and then add it.
+    $group = $implementations['my_module'];
+    unset($implementations['my_module']);
+    $implementations['my_module'] = $group;
+  }
+}
+
+/**
+ * Alter the default skin configuration objects.
+ *
+ * @param $default_skins
+ *   An array of skin configuration objects from code.
+ */
+function hook_skinr_skin_defaults_alter(&$default_skins) {
+  // Exclude a specific skin fromt he site.
+  unset($default_skins['501ff0e3-dc03-0944-9910-3a788f38097b']);
+
+  // Disable another.
+  $default_skins['7cb51cbf-436d-b1d4-3105-f3cd4db28955']['status'] = 0;
+}
+
+/**
+ * Alter the skin configuration object before it is imported from code.
+ *
+ * @param $skin
+ *   A skin configuration object.
+ */
+function hook_skinr_skin_import_alter(&$skin) {
+  // Add in custom variable.
+  $skin->custom = 'Something special';
+}
+
+/**
+ * Alter the skin configuration object before it is output as exported code.
+ *
+ * @param $skin
+ *   A skin configuration object.
+ * @param $prefix
+ *   A string to prefix the code with, used to indent the resulting code.
+ */
+function hook_skinr_skin_export_alter(&$skin, &$prefix) {
+  // Remove custom variable.
+  unset($skin->custom);
+}
+
+/**
  * @}
  */
diff --git a/skinr.features.inc b/skinr.features.inc
new file mode 100644
index 0000000000000000000000000000000000000000..dfa7e2a789b9d91e5c6cabda970baa0900d3c72d
--- /dev/null
+++ b/skinr.features.inc
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Implements features integration for Skinr.
+ */
+
+/**
+ * Implements hook_features_api().
+ */
+function skinr_features_api() {
+  return array(
+    'skinr_skin' => array(
+      'name' => t('Skinr skins'),
+      'default_hook' => 'skinr_skin_defaults',
+      'default_file' => FEATURES_DEFAULTS_CUSTOM,
+      'default_filename' => 'skinr_default',
+      'feature_source' => TRUE,
+      'api' => 'skin',
+      'file' => drupal_get_path('module', 'skinr') .'/skinr.features.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_features_export().
+ */
+function skinr_skin_features_export($data, &$export, $module_name) {
+  $export['dependencies']['skinr_skin'] = 'skinr';
+
+  foreach ($data as $uuid) {
+    $export['features']['skinr_skin'][$uuid] = $uuid;
+  }
+  return array();
+}
+
+/**
+ * Implements hook_features_export_options().
+ */
+function skinr_skin_features_export_options() {
+  $skin_info = skinr_get_skin_info();
+  $themes = list_themes();
+
+  $options = array();
+  foreach (skinr_skin_load_multiple(FALSE) as $skin) {
+    $title = reset(skinr_invoke_all('skinr_ui_element_title', $skin->module, $skin->element, $skin->theme));
+    $name = $skin->skin == '_additional' ? t('Additional classes') : (isset($skin_info[$skin->skin]) ? $skin_info[$skin->skin]['title'] : $skin->skin);
+
+    $options[$skin->uuid] = t('@theme: @type: @element: @name', array(
+      '@type' => $skin->module,
+      '@element' => $title ? strip_tags($title) : $skin->element,
+      '@name' => $name,
+      '@theme' => isset($themes[$skin->theme]) ? $themes[$skin->theme]->info['name'] : $skin->theme,
+    ));
+  }
+  asort($options);
+
+  return $options;
+}
+
+/**
+ * Implements hook_features_export_render().
+ */
+function skinr_skin_features_export_render($module_name, $data, $export = NULL) {
+  $code = array();
+  // $code[] = '  $skins = array();';
+  // $code[] = '';
+  foreach ($data as $uuid) {
+    if ($skin = skinr_skin_load_by_uuid($uuid)) {
+      $code[] = skinr_skin_export($skin, '  ');
+    }
+  }
+  $code[] = '';
+  $code[] = '  return $skins;';
+  $code = implode("\n", $code);
+
+  return array('skinr_skin_defaults' => $code);
+}
+
+/**
+ * Implements hook_features_rebuild().
+ */
+function skinr_skin_features_rebuild($module_name) {
+  skinr_skin_defaults_import($module_name, TRUE);
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function skinr_skin_features_revert($module_name) {
+  skinr_skin_defaults_import($module_name, TRUE);
+}
diff --git a/skinr.install b/skinr.install
index 6f1bedea0f3c9338c329107b1fe7c220b2bfd2bb..4c93404099eab705644429ba833380bd55645c10 100644
--- a/skinr.install
+++ b/skinr.install
@@ -13,11 +13,17 @@ function skinr_schema() {
     'description' => 'Stores skinr data.',
     'fields' => array(
       'sid' => array(
-        'description' => 'The primary identifier for a skin configuration.',
+        'description' => 'The primary identifier for this skin configuration.',
         'type' => 'serial',
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
+      'uuid' => array(
+        'description' => 'Unique Key: Universally unique identifier for this skin configuration.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => FALSE,
+      ),
       'theme' => array(
         'description' => 'The theme this configuration applies to.',
         'type' => 'varchar',
@@ -62,6 +68,9 @@ function skinr_schema() {
       ),
     ),
     'primary key' => array('sid'),
+    'unique keys' => array(
+      'uuid' => array('uuid'),
+    ),
     'indexes' => array(
       'theme' => array('theme'),
       'module' => array('theme', 'module'),
@@ -462,3 +471,38 @@ function _skinr_element_name($module, $element) {
 
   return $element;
 }
+
+/**
+ * Add UUIDs.
+ */
+function skinr_update_7201() {
+  $spec = array(
+    'description' => 'Unique Key: Universally unique identifier for this skin configuration.',
+    'type' => 'varchar',
+    'length' => 128,
+    'not null' => FALSE,
+  );
+  $keys = array(
+    'unique keys' => array(
+      'uuid' => array('uuid'),
+    ),
+  );
+  db_add_field('skinr_skins', 'uuid', $spec, $keys);
+
+  // Include UUID functionality.
+  if (!module_exists('uuid')) {
+    module_load_include('inc', 'skinr', 'skinr.uuid');
+  }
+
+  // Add a UUID to all existing skins.
+  $result = db_query("SELECT sid FROM {skinr_skins}");
+  foreach ($result as $skin) {
+    db_update('skinr_skins')
+      ->fields(array(
+        'uuid' => uuid_generate(),
+      ))
+      ->condition('sid', $skin->sid)
+      ->isNull('uuid')
+      ->execute();
+  }
+}
diff --git a/skinr.module b/skinr.module
index af55142a127974894acafc193bef6e221e856840..32dafb974895ee1556712be4ff130c50d33b8e4e 100644
--- a/skinr.module
+++ b/skinr.module
@@ -11,6 +11,13 @@
 define('SKINR_VERSION', 2);
 
 /**
+ * A flag used to let us know if an object is in the database.
+ */
+define('SKINR_STORAGE_IN_DATABASE', 0);
+define('SKINR_STORAGE_IN_CODE', 1);
+define('SKINR_STORAGE_IN_CODE_OVERRIDDEN', 2);
+
+/**
  * Implements hook_help().
  */
 function skinr_help($path, $arg) {
@@ -43,6 +50,10 @@ function skinr_hook_info() {
   $hooks = array_fill_keys($hooks, array(
     'group' => 'skinr',
   ));
+
+  $hooks['skinr_skin_defaults'] = array(
+    'group' => 'skinr_default',
+  );
   return $hooks;
 }
 
@@ -609,6 +620,14 @@ function skinr_skin_save(&$skin) {
     module_invoke_all('skinr_skin_update', $skin);
   }
   else {
+    // Assign it a UUID if none is set.
+    if (empty($skin->uuid)) {
+      if (!module_exists('uuid')) {
+        module_load_include('inc', 'skinr', 'skinr.uuid');
+      }
+      $skin->uuid = uuid_generate();
+    }
+
     // Insert a new record.
     $status = drupal_write_record('skinr_skins', $skin);
     module_invoke_all('skinr_skin_insert', $skin);
@@ -682,6 +701,56 @@ function skinr_skin_load($sid = NULL) {
 }
 
 /**
+ * Get skin configuration IDs.
+ */
+function skinr_skin_uuid_to_sid($uuid) {
+  $sids = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($sids[$uuid])) {
+    $sids[$uuid] = db_query("SELECT sid FROM {skinr_skins} WHERE uuid = :uuid", array(
+      ':uuid' => $uuid,
+    ))->fetchField();
+  }
+
+  return $sids[$uuid];
+}
+
+/**
+ * Get skin configuration IDs.
+ */
+function skinr_skin_sid_to_uuid($sid) {
+  $uuids = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($uuids[$sid])) {
+    $uuids[$sid] = db_query("SELECT uuid FROM {skinr_skins} WHERE sid = :sid", array(
+      ':sid' => $sid,
+    ))->fetchField();
+  }
+
+  return $uuids[$sid];
+}
+
+/**
+ * Load a skin configuration object from the database using UUID.
+ *
+ * @param $uuid
+ *   The UUID of the skin configuration to load.
+ *
+ * @return
+ *   A fully-populated skin configuration object.
+ */
+function skinr_skin_load_by_uuid($uuid) {
+  if (!$sid = skinr_skin_uuid_to_sid($uuid)) {
+    return FALSE;
+  }
+
+  // Run this through skinr_skin_load_multiple() to preserve caching.
+  $skin = skinr_skin_load_multiple(array($sid));
+
+  return $skin ? reset($skin) : FALSE;
+}
+
+/**
  * Load skin configuration objects from the database.
  *
  * This function should be used whenever you need to load more than one skin
@@ -718,7 +787,8 @@ function skinr_skin_load_multiple($sids = array()) {
   if ($sids === FALSE || $sids) {
     // Build the query.
     $query = db_select('skinr_skins', 's')
-      ->fields('s');
+      // Specify order to ensure consistent import/export.
+      ->fields('s', array('sid', 'uuid', 'theme', 'module', 'element', 'skin', 'options', 'status'));
     if ($sids !== FALSE) {
       $query->condition('sid', $sids);
     }
@@ -762,8 +832,9 @@ function skinr_skin_load_multiple($sids = array()) {
  *   A fully-populated skin configuration object.
  */
 function skinr_skin_load_unchanged($sid) {
-  // Load an uncached version of the skin configuration object.
-  $skin = db_query("SELECT * FROM {skinr_skins} WHERE sid = :sid", array(
+  // Load an uncached version of the skin configuration object. Specify order to
+  // ensure consistent import/export.
+  $skin = db_query("SELECT sid, uuid, theme, module, element, skin, options, status FROM {skinr_skins} WHERE sid = :sid", array(
     ':sid' => $sid,
   ))
   ->fetchObject();
@@ -778,6 +849,298 @@ function skinr_skin_load_unchanged($sid) {
 }
 
 /**
+ * Returns all default skin configuration objects.
+ */
+function _skinr_skin_get_defaults() {
+  $default_skins = &drupal_static(__FUNCTION__);
+
+  if (!isset($default_skins)) {
+    if ($cached = cache_get('skinr_skin_defaults')) {
+      $default_skins = $cached->data;
+      return $default_skins;
+    }
+
+    // Don't use module_invoke_all() to prevent oddly merged defaults.
+    $default_skins = array();
+    foreach (module_implements('skinr_skin_defaults') as $module) {
+      $function = $module . '_skinr_skin_defaults';
+      if (function_exists($function)) {
+        $result = call_user_func_array($function, array());
+        if (isset($result) && is_array($result)) {
+          $default_skins = array_merge($default_skins, $result);
+        }
+        elseif (isset($result)) {
+          $default_skins[] = $result;
+        }
+      }
+    }
+
+    // Let modules modify the skin configuration.
+    drupal_alter('skinr_skin_defaults', $default_skins);
+
+    cache_set('skinr_skin_defaults', $default_skins);
+  }
+
+  return $default_skins;
+}
+
+/**
+ * Imports default skin confiuration objects from code into database.
+ *
+ * @param $module_name
+ *   Limit importing of defaults to a single module.
+ * @param $force
+ *   If FALSE (default) the default skin will only be imported if the skin
+ *   configuration doesn't exist, or if storage is default in code. If TRUE, the
+ *   skin configuration in code will always be overwritten.
+ *
+ * @return
+ *  If an import failed, returns FALSE. If all imports succeeded, returns TRUE.
+ */
+function skinr_skin_defaults_import($module_name = NULL, $force = FALSE) {
+  if (isset($module_name)) {
+    if (!$default_skins = module_invoke($module_name, 'skinr_skin_defaults')) {
+      $default_skins = array();
+    }
+    drupal_alter('skinr_skin_defaults', $default_skins);
+  }
+  else {
+    $default_skins = _skinr_skin_get_defaults();
+  }
+
+  $status = TRUE;
+  foreach ($default_skins as $skin) {
+    $status = skinr_skin_import($skin, $force) && $status;
+  }
+
+  return $status;
+}
+
+/**
+ * Revert a skin configuration object that's stored in code to its default state.
+ *
+ * @param $sid
+ *   A skin configuration ID.
+ *
+ * @return
+ *  If revert failed, returns FALSE. If it succeeded, returns TRUE.
+ */
+function skinr_skin_revert($sid) {
+  if (!$uuid = skinr_skin_sid_to_uuid($sid)) {
+    return FALSE;
+  }
+
+  $default_skins = _skinr_skin_get_defaults();
+  if (!isset($default_skins[$uuid])) {
+    return FALSE;
+  }
+
+  if ($status = skinr_skin_import($default_skins[$uuid], TRUE)) {
+    drupal_static_reset('skinr_skin_uuid_to_sid');
+    drupal_static_reset('skinr_skin_sid_to_uuid');
+  }
+
+  return $status;
+}
+
+/**
+ * Import a skin configuration object as defined in skinr_skin_defaults().
+ *
+ * @param $default_skin
+ *   A skin configuration object.
+ * @param $force
+ *   If FALSE (default) the default skin will only be imported if the skin
+ *   configuration doesn't exist, or if storage is default in code. If TRUE, the
+ *   skin configuration in code will always be overwritten.
+ *
+ * @return
+ *  If import failed, returns FALSE. If it succeeded, returns TRUE.
+ */
+function skinr_skin_import($default_skin, $force = FALSE) {
+  // Make sure we don't modify the cached default skin array.
+  $skin = clone($default_skin);
+
+  // Functionality is abstracted for use in skinr_skin_storage().
+  _skinr_skin_import($skin);
+
+  if (!$force && !empty($skin->sid)) {
+    // Load existing skin configuration from DB.
+    $db_skin = skinr_skin_load_unchanged($skin->sid);
+
+    // Sync status.
+    $skin->status = $db_skin->status;
+
+    if ($skin != $db_skin) {
+      // Skin exists and is overridden, so cancel import.
+      watchdog('skinr', 'Canceled import of skin with UUID %uuid and SID %sid. It is overridden.', array('%uuid' => $skin->uuid, '%sid' => $skin->sid), WATCHDOG_WARNING);
+      return FALSE;
+    }
+  }
+
+  if ($status = skinr_skin_save($skin)) {
+    drupal_static_reset('skinr_skin_uuid_to_sid');
+    drupal_static_reset('skinr_skin_sid_to_uuid');
+
+    watchdog('skinr', 'Imported skin with UUID %uuid and SID %sid.', array('%uuid' => $skin->uuid, '%sid' => $skin->sid), WATCHDOG_NOTICE);
+  }
+  else {
+    watchdog('skinr', 'Failed to import skin with UUID %uuid and SID %sid.', array('%uuid' => $skin->uuid, '%sid' => isset($skin->sid) ? $skin->sid : t('unknown')), WATCHDOG_WARNING);
+  }
+  return $status;
+}
+
+function _skinr_skin_import(&$skin) {
+  if ($sid = skinr_skin_uuid_to_sid($skin->uuid)) {
+    $skin->sid = $sid;
+  }
+
+  // Let modules modify the skin configuration.
+  drupal_alter('skinr_skin_import', $skin);
+}
+
+/**
+ * Export var function.
+ *
+ * @see features_var_export()
+ */
+function skinr_var_export($var, $prefix = '', $init = TRUE) {
+  if (is_object($var)) {
+    $output = method_exists($var, 'export') ? $var->export() : skinr_var_export((array) $var, '', FALSE);
+  }
+  else if (is_array($var)) {
+    if (empty($var)) {
+      $output = 'array()';
+    }
+    else {
+      $output = "array(\n";
+      foreach ($var as $key => $value) {
+        // Using normal var_export on the key to ensure correct quoting.
+        $output .= "  " . var_export($key, TRUE) . " => " . skinr_var_export($value, '  ', FALSE) . ",\n";
+      }
+      $output .= ')';
+    }
+  }
+  else if (is_bool($var)) {
+    $output = $var ? 'TRUE' : 'FALSE';
+  }
+  else if (is_int($var)) {
+    $output = intval($var);
+  }
+  else if (is_numeric($var)) {
+    $output = floatval($var);
+  }
+  else if (is_string($var) && strpos($var, "\n") !== FALSE) {
+    // Replace line breaks in strings with a token for replacement
+    // at the very end. This protects whitespace in strings from
+    // unintentional indentation.
+    $var = str_replace("\n", "***BREAK***", $var);
+    $output = var_export($var, TRUE);
+  }
+  else {
+    $output = var_export($var, TRUE);
+  }
+
+  if ($prefix) {
+    $output = str_replace("\n", "\n$prefix", $output);
+  }
+
+  if ($init) {
+    $output = str_replace("***BREAK***", "\n", $output);
+  }
+
+  return $output;
+}
+
+/**
+ * Export object function.
+ *
+ * @see ctools_object_export()
+ */
+function skinr_object_export($object, $identifier, $prefix = '') {
+  $output  = $prefix . '$' . $identifier . ' = new ' . get_class($object) . "();\n";
+  $output .= $prefix . '$' . $identifier . '->status = ';
+  if ($object->status) {
+    $output .= 'TRUE; /* Edit this to false to make a default ' . $identifier . ' disabled initially */' . "\n";
+  }
+  else {
+    $output .= 'FALSE; /* Edit this to true to make a default ' . $identifier . ' enabled initially */' . "\n";
+  }
+  $output .= $prefix . '$' . $identifier . '->api_version = ' . SKINR_VERSION . ";\n";
+
+  foreach ($object as $field => $value) {
+    if ($field == 'status') {
+      continue;
+    }
+    $output .= $prefix . '$' . $identifier . '->' . $field . ' = ' . skinr_var_export($value, $prefix) . ";\n";
+  }
+
+  return $output;
+}
+
+/**
+ * Output a skin configuration object as code suitable for skinr_skin_defaults().
+ *
+ * @param $skin
+ *   A skin configuration object.
+ * @param $prefix
+ *   A string to prefix the code with, used to indent the resulting code.
+ *
+ * @return
+ *   A string.
+ */
+function skinr_skin_export($skin, $prefix = '') {
+  // Make sure we don't modify the cached skin object.
+  $skin = clone($skin);
+
+  // Let modules modify the skin configuration.
+  drupal_alter('skinr_skin_export', $skin, $prefix);
+
+  // Remove site specific $sid.
+  unset($skin->sid);
+
+  $output = skinr_object_export($skin, 'skin', $prefix);
+  $output .= $prefix . "\$skins['{$skin->uuid}'] = \$skin;\n";
+
+  return $output;
+}
+
+/**
+ * Returns a skin configuration object's storage method.
+ *
+ * @param $skin
+ *   A skin configuration object.
+ *
+ * @return
+ *   SKINR_STORAGE_IN_DATABASE if stored in the database,
+ *   SKINR_STORAGE_IN_CODE if stored in code,
+ *   SKINR_STORAGE_IN_CODE_OVERRIDDEN if stored in code and overridden in db.
+ */
+function skinr_skin_storage($skin) {
+  $default_skins = _skinr_skin_get_defaults();
+
+  $storage = SKINR_STORAGE_IN_DATABASE;
+  if (isset($default_skins[$skin->uuid])) {
+    $default_skin = clone($default_skins[$skin->uuid]);
+
+    // Make sure skin has same processing as import.
+    _skinr_skin_import($default_skin);
+
+    // API version is only used for export.
+    unset($default_skin->api_version);
+
+    // Status shouldn't influence overridden.
+    $default_skin->status = $skin->status;
+
+    $storage = SKINR_STORAGE_IN_CODE;
+    if ($default_skin != $skin) {
+      // Default was overridden.
+      $storage = SKINR_STORAGE_IN_CODE_OVERRIDDEN;
+    }
+  }
+  return $storage;
+}
+
+/**
  * Get skin configuration IDs.
  *
  * @param $filter_by
@@ -1228,8 +1591,11 @@ function skinr_theme_hooks($module, $element) {
 /**
  * Implements hook_modules_enabled().
  */
-function skinr_modules_enabled() {
+function skinr_modules_enabled($modules) {
   skinr_cache_reset();
+  foreach ($modules as $module) {
+    skinr_skin_defaults_import($module);
+  }
 }
 
 /**
diff --git a/skinr.uuid.inc b/skinr.uuid.inc
new file mode 100644
index 0000000000000000000000000000000000000000..1ad97fe98f44f18b0f1719692f88236318ce9c92
--- /dev/null
+++ b/skinr.uuid.inc
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @file
+ * Handling of universally unique identifiers. Duplicate of uuid.inc from UUID module.
+ */
+
+if (!function_exists('uuid_generate')) {
+
+/**
+ * Generates an universally unique identifier.
+ *
+ * This function first checks for the PECL alternative for generating
+ * universally unique identifiers. If that doesn't exist, then it falls back on
+ * PHP for generating that.
+ *
+ * @return
+ *   An UUID, made up of 32 hex digits and 4 hyphens.
+ */
+function uuid_generate() {
+  $callback = drupal_static(__FUNCTION__);
+
+  if (empty($callback)) {
+    if (function_exists('uuid_create') && !function_exists('uuid_make')) {
+      $callback = '_uuid_generate_pecl';
+    }
+    elseif (function_exists('com_create_guid')) {
+      $callback = '_uuid_generate_com';
+    }
+    else {
+      $callback = '_uuid_generate_php';
+    }
+  }
+  return $callback();
+}
+
+/**
+ * Generate all missing UUIDs.
+ */
+function uuid_sync_all() {
+  module_invoke_all('uuid_sync');
+}
+
+/**
+ * Check that a string appears to be in the format of a UUID.
+ *
+ * @param $uuid
+ *  The string to test.
+ *
+ * @return
+ *   TRUE if the string is well formed.
+ */
+function uuid_is_valid($uuid) {
+  return preg_match("/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/", $uuid);
+}
+
+/**
+ * Generates a UUID using the Windows internal GUID generator.
+ *
+ * @see http://php.net/com_create_guid
+ */
+function _uuid_generate_com() {
+  // Remove {} wrapper and make lower case to keep result consistent.
+  return drupal_strtolower(trim(com_create_guid(), '{}'));
+}
+
+/**
+ * Generates an universally unique identifier using the PECL extension.
+ */
+function _uuid_generate_pecl() {
+  return uuid_create(UUID_TYPE_DEFAULT);
+}
+
+/**
+ * Generates a UUID v4 using PHP code.
+ *
+ * @see http://php.net/uniqid#65879
+ */
+function _uuid_generate_php() {
+  // The field names refer to RFC 4122 section 4.1.2.
+  return sprintf('%04x%04x-%04x-%03x4-%04x-%04x%04x%04x',
+    // 32 bits for "time_low".
+    mt_rand(0, 65535), mt_rand(0, 65535),
+    // 16 bits for "time_mid".
+    mt_rand(0, 65535),
+    // 12 bits before the 0100 of (version) 4 for "time_hi_and_version".
+    mt_rand(0, 4095),
+    bindec(substr_replace(sprintf('%016b', mt_rand(0, 65535)), '01', 6, 2)),
+    // 8 bits, the last two of which (positions 6 and 7) are 01, for "clk_seq_hi_res"
+    // (hence, the 2nd hex digit after the 3rd hyphen can only be 1, 5, 9 or d)
+    // 8 bits for "clk_seq_low" 48 bits for "node".
+    mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)
+  );
+}
+
+}
diff --git a/skinr_context/skinr_context.api.php b/skinr_context/skinr_context.api.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4795e056361f6e5e793ce4a4bd7cd1f6f4e2a4e
--- /dev/null
+++ b/skinr_context/skinr_context.api.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * @file
+ * This file contains no working PHP code; it exists to provide additional documentation
+ * for doxygen as well as to document hooks in the standard Drupal manner.
+ */
+
+/**
+ * @mainpage Skinr Context API Manual
+ *
+ * Topics:
+ * - @ref skinr_context_hooks
+ */
+
+/**
+ * @defgroup skinr_context_hooks Skinr Context's hooks
+ * @{
+ * Hooks that can be implemented by other modules in order to implement the
+ * Skinr Context API.
+ */
+
+/**
+ * Alter the default skin settings group objects.
+ *
+ * @param $default_groups
+ *   An array of skin settings group objects from code.
+ */
+function hook_skinr_context_group_defaults_alter(&$default_groups) {
+  // Rename a group.
+  $default_groups['block:system__navigation:standard']['title'] = t('Fancy title');
+}
+
+/**
+ * Alter the skin settings group object before it is imported from code.
+ *
+ * @param $group
+ *   A skin settings group object.
+ */
+function hook_skinr_context_group_import_alter(&$group) {
+  // Add in custom variable.
+  $group->custom = 'Something special';
+}
+
+/**
+ * Alter the skin settings group object before it is output as exported code.
+ *
+ * @param $group
+ *   A skin settings group object.
+ * @param $prefix
+ *   A string to prefix the code with, used to indent the resulting code.
+ */
+function hook_skinr_context_group_export_alter(&$group, &$prefix) {
+  // Remove custom variable.
+  unset($skin->custom);
+}
+
+/**
+ * @}
+ */
diff --git a/skinr_context/skinr_context.features.inc b/skinr_context/skinr_context.features.inc
new file mode 100644
index 0000000000000000000000000000000000000000..eb1d217734bd48bad313243cef9ce0e534dbffbd
--- /dev/null
+++ b/skinr_context/skinr_context.features.inc
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * @file
+ * Implements features integration for Skinr Context.
+ */
+
+/**
+ * Implements hook_features_api().
+ */
+function skinr_context_features_api() {
+  return array(
+    'skinr_group' => array(
+      'name' => t('Skinr groups'),
+      'default_hook' => 'skinr_context_group_defaults',
+      'default_file' => FEATURES_DEFAULTS_CUSTOM,
+      'default_filename' => 'skinr_default',
+      'feature_source' => TRUE,
+      'api' => 'skin',
+      'file' => drupal_get_path('module', 'skinr_context') .'/skinr_context.features.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_features_export().
+ */
+function skinr_group_features_export($data, &$export, $module_name) {
+  $export['dependencies']['skinr_group'] = 'skinr_context';
+
+  foreach ($data as $gid) {
+    $export['features']['skinr_group'][$gid] = $gid;
+  }
+  return array();
+}
+
+/**
+ * Implements hook_features_pipe_COMPONENT_alter().
+ */
+function skinr_context_features_pipe_skinr_skin_alter(&$pipe, $data, $export) {
+  // Skin configuration objects should always include the Skin settings groups
+  // they depend on.
+  foreach ($data as $uuid) {
+    if (($skin = skinr_skin_load_by_uuid($uuid)) && !empty($skin->gid)) {
+      if ($group = skinr_context_group_load($skin->gid)) {
+        $pipe['skinr_group'][] = $group->gid;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_features_export_options().
+ */
+function skinr_group_features_export_options() {
+  // Some title callbacks require a theme; for lack of better data use the
+  // default theme.
+  $theme = skinr_current_theme(TRUE);
+
+  $options = array();
+  foreach (skinr_context_group_load_multiple(FALSE) as $group) {
+    $title = reset(skinr_invoke_all('skinr_ui_element_title', $group->module, $group->element, $theme));
+    $options[$group->gid] = t('@type: @element: @group (@gid)', array(
+      '@type' => $group->module,
+      '@element' => $title ? strip_tags($title) : $group->element,
+      '@group' => $group->title,
+      '@gid' => $group->gid,
+    ));
+  }
+  asort($options);
+
+  return $options;
+}
+
+/**
+ * Implements hook_features_export_render().
+ */
+function skinr_group_features_export_render($module_name, $data, $export = NULL) {
+  $code = array();
+  // $code[] = '  $groups = array();';
+  // $code[] = '';
+  foreach ($data as $gid) {
+    if ($group = skinr_context_group_load($gid)) {
+      $code[] = skinr_context_group_export($group, '  ');
+    }
+  }
+  $code[] = '';
+  $code[] = '  return $groups;';
+  $code = implode("\n", $code);
+
+  return array('skinr_context_group_defaults' => $code);
+}
+
+/**
+ * Implements hook_features_rebuild().
+ */
+function skinr_group_features_rebuild($module_name) {
+  skinr_context_group_defaults_import($module_name, TRUE);
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function skinr_group_features_revert($module_name) {
+  skinr_context_group_defaults_import($module_name, TRUE);
+}
diff --git a/skinr_context/skinr_context.install b/skinr_context/skinr_context.install
index 14798aeff46a5246d130e36026a344c8b30b5294..7b8e0446d9311a5b754b5da2ab260b7d72265a0a 100644
--- a/skinr_context/skinr_context.install
+++ b/skinr_context/skinr_context.install
@@ -13,9 +13,9 @@ function skinr_context_schema() {
     'description' => 'Stores skin configuration group data for Skinr.',
     'fields' => array(
       'gid' => array(
-        'description' => 'The primary identifier for a skin configuration group.',
-        'type' => 'serial',
-        'unsigned' => TRUE,
+        'description' => 'Primary Key: Unique machine readable name for this skin configuration group.',
+        'type' => 'varchar',
+        'length' => 96,
         'not null' => TRUE,
       ),
       'module' => array(
@@ -82,8 +82,8 @@ function skinr_context_schema() {
     'fields' => array(
       'gid' => array(
         'description' => 'The skin configuration group ID.',
-        'type' => 'int',
-        'unsigned' => TRUE,
+        'type' => 'varchar',
+        'length' => 96,
         'not null' => TRUE,
       ),
       'sid' => array(
@@ -134,11 +134,12 @@ function skinr_context_enable() {
       $gid = reset($gids);
       if (!$gid) {
         // Create a group.
+        $title = $t('Default');
         $group = (object) array(
-          'gid' => NULL,
+          'gid' => $skin->module . ':' . $skin->element . ':' . strtolower($title),
           'module' => $skin->module,
           'element' => $skin->element,
-          'title' => $t('Default'),
+          'title' => $title,
           'description' => '',
           'conditions' => array('sitewide' => array('values' => array(1 => 1))),
           'condition_mode' => CONTEXT_CONDITION_MODE_OR,
@@ -164,3 +165,54 @@ function skinr_context_enable() {
     }
   }
 }
+
+/**
+ * Add machine names to Skinr Configuration Groups.
+ */
+function skinr_context_update_7200() {
+  db_change_field('skinr_groups', 'gid', 'gid', array(
+    'type' => 'varchar',
+    'length' => 96,
+    'not null' => TRUE,
+    'description' => 'Primary Key: Unique machine readable name for this skin configuration group.',
+  ));
+
+  db_drop_index('skinr_group_skins', 'gid');
+  db_change_field('skinr_group_skins', 'gid', 'gid', array(
+    'type' => 'varchar',
+    'length' => 96,
+    'not null' => TRUE,
+    'description' => 'The skin configuration group ID.',
+  ));
+  db_add_index('skinr_group_skins', 'gid', array('gid'));
+
+
+  // Generate a machine name for all existing groups.
+  $machine_names = array();
+
+  $result = db_query("SELECT * FROM {skinr_groups}");
+  foreach ($result as $group) {
+    $suggested_machine_name = $group->module . ':' . $group->element . ':' . strtolower($group->title);
+    $machine_name = $suggested_machine_name;
+    while(isset($machine_names[$machine_name])) {
+      $machine_name = $suggested_machine_name . '_' . $i++;
+    }
+    $machine_names[$machine_name] = $group->gid;
+  }
+
+  foreach ($machine_names as $machine_name => $gid) {
+    db_update('skinr_groups')
+      ->fields(array(
+        'gid' => $machine_name,
+      ))
+      ->condition('gid', $gid)
+      ->execute();
+
+    db_update('skinr_group_skins')
+      ->fields(array(
+        'gid' => $machine_name,
+      ))
+      ->condition('gid', $gid)
+      ->execute();
+  }
+}
diff --git a/skinr_context/skinr_context.module b/skinr_context/skinr_context.module
index df856eb1d514731c0c1b9d1778c78aa2c7403358..9fe778700507dcb9602d2e1b1cfab7564712bf8d 100644
--- a/skinr_context/skinr_context.module
+++ b/skinr_context/skinr_context.module
@@ -1,11 +1,58 @@
 <?php
 
 /**
+ * Implements hook_hook_info().
+ */
+function skinr_context_hook_info() {
+  $hooks['skinr_context_group_defaults'] = array(
+    'group' => 'skinr_default',
+  );
+  return $hooks;
+}
+
+/**
+ * Implements hook_module_implements_alter().
+ */
+function skinr_context_module_implements_alter(&$implementations, $hook) {
+  if ($hook == 'modules_enabled') {
+    // Make our version of hook_modules_enabled() happen before that of
+    // skinr core. This way skin settings groups are imported before skin
+    // configurations.
+    $group = $implementations['skinr_context'];
+    unset($implementations['skinr_context']);
+
+    $implementations = array_reverse($implementations, TRUE);
+    $implementations['skinr_context'] = $group;
+    $implementations = array_reverse($implementations, TRUE);
+  }
+}
+
+/**
  * @file
  * Provides Skinr integration with Context.
  */
 
 /**
+ * Validate a skin group object.
+ *
+ * @param $group
+ *   A skin group object.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ */
+function skinr_context_group_validate(&$group) {
+  if (empty($group->gid) || empty($group->module) || empty($group->element) || empty($group->title)) {
+    return FALSE;
+  }
+  if (!isset($group->conditions) || !is_array($group->conditions)) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
  * Save a skin group object.
  *
  * @param $group
@@ -15,18 +62,23 @@
  *   TRUE on success, FALSE on failure.
  */
 function skinr_context_group_save(&$group) {
+  // Make sure we're getting valid data.
+  if (!skinr_context_group_validate($group)) {
+    return FALSE;
+  }
+
   // Load the stored skin settings group object, if any.
-  if (!empty($group->gid)) {
-    if (!isset($group->original)) {
-      // Load an uncached version of the skin settings object.
-      $group->original = skinr_context_group_load_unchanged($group->gid);
+  if (!isset($group->original)) {
+    // Load an uncached version of the skin settings object.
+    if (!$group->original = skinr_context_group_load_unchanged($group->gid)) {
+      unset($group->original);
     }
   }
 
   // Let modules modify the node before it is saved to the database.
   module_invoke_all('skinr_context_group_presave', $group);
 
-  if (!empty($group->gid)) {
+  if (!empty($group->original)) {
     // Record exists, so let's update.
     $status = drupal_write_record('skinr_groups', $group, 'gid');
 
@@ -35,10 +87,12 @@ function skinr_context_group_save(&$group) {
       $params = array(
         'gid' => $group->gid,
       );
+      // @todo Update status of linked skin configurations.
+      /*
       $sids = skinr_context_group_get_sids($params);
       foreach ($sids as $sid) {
       }
-      // @todo
+      */
     }
 
     module_invoke_all('skinr_context_group_update', $group);
@@ -164,7 +218,8 @@ function skinr_context_group_load_multiple($gids = array()) {
   if ($gids === FALSE || $gids) {
     // Build the query.
     $query = db_select('skinr_groups', 'g')
-      ->fields('g');
+      // Specify order to ensure consistent import/export.
+      ->fields('g', array('gid', 'module', 'element', 'title', 'description', 'conditions', 'condition_mode', 'weight', 'status'));
     if ($gids !== FALSE) {
       $query->condition('gid', $gids);
     }
@@ -208,22 +263,216 @@ function skinr_context_group_load_multiple($gids = array()) {
  *   A fully-populated skin settings group object.
  */
 function skinr_context_group_load_unchanged($gid) {
-  // Load an uncached version of the skin settings object.
-  $group = db_query("SELECT * FROM {skinr_groups} WHERE gid = :gid", array(
+  // Load an uncached version of the skin settings object. Specify order to
+  // ensure consistent import/export.
+  $group = db_query("SELECT gid, module, element, title, description, conditions, condition_mode, weight, status FROM {skinr_groups} WHERE gid = :gid", array(
     ':gid' => $gid,
   ))
   ->fetchObject();
 
   // Unserialize options array.
-  $group->conditions = unserialize($group->conditions);
+  if ($group) {
+    $group->conditions = unserialize($group->conditions);
 
-  // Let modules modify the skin settings group.
-  module_invoke_all('skinr_context_group_load', $group);
+    // Let modules modify the skin settings group.
+    module_invoke_all('skinr_context_group_load', $group);
+  }
 
   return $group;
 }
 
 /**
+ * Returns all default skin settings group objects.
+ */
+function _skinr_context_group_get_defaults() {
+  $default_groups = &drupal_static(__FUNCTION__);
+
+  if (!isset($default_groups)) {
+    if ($cached = cache_get('skinr_context_group_defaults')) {
+      $default_skins = $cached->data;
+      return $default_skins;
+    }
+
+    // Don't use module_invoke_all() to prevent oddly merged defaults.
+    $default_groups = array();
+    foreach (module_implements('skinr_context_group_defaults') as $module) {
+      $function = $module . '_skinr_context_group_defaults';
+      if (function_exists($function)) {
+        $result = call_user_func_array($function, array());
+        if (isset($result) && is_array($result)) {
+          $default_groups = array_merge($default_groups, $result);
+        }
+        elseif (isset($result)) {
+          $default_groups[] = $result;
+        }
+      }
+    }
+
+    // Let modules modify the skin settings group.
+    drupal_alter('skinr_context_group_defaults', $default_groups);
+
+    cache_set('skinr_context_group_defaults', $default_groups);
+  }
+
+  return $default_groups;
+}
+
+/**
+ * Imports default skin settings group objects from code into database.
+ *
+ * @param $module_name
+ *   Limit importing of defaults to a single module.
+ * @param $force
+ *   If FALSE (default) the default skin settings group will only be imported if
+ *   it doesn't exist, or if storage is default in code. If TRUE, the skin
+ *   settings group in code will always be overwritten.
+ *
+ * @return
+ *  If an import failed, returns FALSE. If all imports succeeded, returns TRUE.
+ */
+function skinr_context_group_defaults_import($module_name = NULL, $force = FALSE) {
+  if (isset($module_name)) {
+    if (!$default_groups = module_invoke($module_name, 'skinr_context_group_defaults')) {
+      $default_groups = array();
+    }
+    drupal_alter('skinr_context_group_defaults', $default_groups);
+  }
+  else {
+    $default_groups = _skinr_context_group_get_defaults();
+  }
+
+  $status = TRUE;
+  foreach ($default_groups as $group) {
+    $status = skinr_context_group_import($group, $force) && $status;
+  }
+
+  return $status;
+}
+
+/**
+ * Revert a skin settings group object that's stored in code to its default state.
+ *
+ * @param $gid
+ *   The skin settings group ID.
+ */
+function skinr_context_group_revert($gid) {
+  $default_groups = _skinr_context_group_get_defaults();
+  if (!isset($default_groups[$gid])) {
+    return FALSE;
+  }
+
+  return skinr_context_group_import($default_groups[$gid], TRUE);
+}
+
+/**
+ * Import a skin settigns group object as defined in skinr_context_group_defaults().
+ *
+ * @param $default_group
+ *   A skin settings group object.
+ * @param $force
+ *   If FALSE (default) the default skin settings group will only be imported if
+ *   it doesn't exist, or if storage is default in code. If TRUE, the skin
+ *   settings group in code will always be overwritten.
+ *
+ * @return
+ *  If import failed, returns FALSE. If it succeeded, returns TRUE.
+ */
+function skinr_context_group_import($default_group, $force = FALSE) {
+  // Make sure we don't modify the cached default group array.
+  $group = clone($default_group);
+
+  // Functionality is abstracted for use in skinr_context_group_storage().
+  _skinr_context_group_import($group);
+
+  if (!$force) {
+    // Load existing skin configuration from DB.
+    if ($db_group = skinr_context_group_load_unchanged($group->gid)) {
+      // Sync status.
+      $group->status = $db_group->status;
+
+      if ($group != $db_group) {
+        // Group exists and is overridden, so cancel import.
+        watchdog('skinr', 'Canceled import of group with ID %gid. It is overridden.', array('%gid' => $group->gid), WATCHDOG_WARNING);
+        return FALSE;
+      }
+    }
+  }
+
+  if ($status = skinr_context_group_save($group)) {
+    watchdog('skinr', 'Imported group with ID %gid.', array('%gid' => $group->gid), WATCHDOG_NOTICE);
+  }
+  else {
+    watchdog('skinr', 'Failed to import group with ID %gid.', array('%gid' => $group->gid), WATCHDOG_WARNING);
+  }
+  return $status;
+}
+
+function _skinr_context_group_import(&$group) {
+  // Let modules modify the skin settings group.
+  drupal_alter('skinr_context_group_import', $group);
+}
+
+/**
+ * Output a settings group object as code suitable for skinr_context_group_defaults().
+ *
+ * @param $group
+ *   A skin settings group object.
+ * @param $prefix
+ *   A string to prefix the code with, used to indent the resulting code.
+ *
+ * @return
+ *   A string.
+ */
+function skinr_context_group_export($group, $prefix = '') {
+  // Make sure we don't modify the cached group object.
+  $group = clone($group);
+
+  // Let modules modify the skin settings group.
+  drupal_alter('skinr_context_group_export', $group, $prefix);
+
+  $output = skinr_object_export($group, 'group', $prefix);
+  $output .= $prefix . "\$groups['{$group->gid}'] = \$group;\n";
+
+  return $output;
+}
+
+/**
+ * Returns a skin settings group's storage method.
+ *
+ * @param $skin
+ *   A skin settings group.
+ *
+ * @return
+ *   SKINR_STORAGE_IN_DATABASE if stored in the database,
+ *   SKINR_STORAGE_IN_CODE if stored in code,
+ *   SKINR_STORAGE_IN_CODE_OVERRIDDEN if stored in code and overridden in db.
+ */
+function skinr_context_group_storage($group) {
+  $default_groups = _skinr_context_group_get_defaults();
+
+  $storage = SKINR_STORAGE_IN_DATABASE;
+  if (isset($default_groups[$group->gid])) {
+    $default_group = clone($default_groups[$group->gid]);
+
+    // Make sure group has same processing as import.
+    _skinr_context_group_import($default_group);
+
+    // API version is only used for export.
+    unset($default_group->api_version);
+
+    // Status shouldn't influence overridden.
+    $default_group->status = $group->status;
+
+    $storage = SKINR_STORAGE_IN_CODE;
+    if ($default_group != $group) {
+      // Default was overridden.
+      $storage = SKINR_STORAGE_IN_CODE_OVERRIDDEN;
+    }
+  }
+  return $storage;
+}
+
+/**
  * Get skin settings group IDs.
  *
  * @param $filter_by
@@ -422,3 +671,12 @@ function skinr_context_skinr_preprocess_alter(&$skins, $context) {
   // Reorder by weight.
   uasort($skins, 'skinr_context_sort_weight');
 }
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function skinr_context_modules_enabled($modules) {
+  foreach ($modules as $module) {
+    skinr_context_group_defaults_import($module);
+  }
+}
diff --git a/skinr_context/skinr_context_ui.info b/skinr_context/skinr_context_ui.info
index ab520aae390fbed1b0878839b69175743adc14f0..50ef1d155c5a8ed09b650e5925b1ed43c056ff47 100644
--- a/skinr_context/skinr_context_ui.info
+++ b/skinr_context/skinr_context_ui.info
@@ -3,6 +3,7 @@ description = Administrative interface for Skinr Context. Without this module, y
 package = Skinr
 core = 7.x
 dependencies[] = context_ui
+dependencies[] = skinr_context
 dependencies[] = skinr_ui
 
 files[] = tests/skinr_context_ui.test
diff --git a/skinr_context/skinr_context_ui.module b/skinr_context/skinr_context_ui.module
index da5819e5d70abbbe1fcf4f4e6b40e5e2d876244e..0f5c7920bf0bacd29b71f346d5037bdd1fce3962 100644
--- a/skinr_context/skinr_context_ui.module
+++ b/skinr_context/skinr_context_ui.module
@@ -135,6 +135,18 @@ function skinr_context_ui_group_add_form($form, $form_state, $module, $element)
     '#required' => TRUE,
     '#description' => t('Descriptive title for this skin settings group.'),
   );
+  $form['gid'] = array(
+    '#type' => 'machine_name',
+    '#title' => t('Group name'),
+    // '#maxlength' => MENU_MAX_MENU_NAME_LENGTH_UI,
+    '#description' => t('A unique name to identify this group. It must only contain lowercase letters, numbers, hyphens and underscores.'),
+    '#field_prefix' => $module . ':' . $element . ':',
+    '#machine_name' => array(
+      'exists' => 'skinr_context_ui_group_name_exists',
+      'source' => array('title'),
+      'replace_pattern' => '[^a-z0-9-_]+',
+    ),
+  );
   $form['description'] = array(
     '#type' => 'textfield',
     '#title' => t('Description'),
@@ -158,7 +170,7 @@ function skinr_context_ui_group_add_form($form, $form_state, $module, $element)
  */
 function skinr_context_ui_group_add_form_submit($form, $form_state) {
   $group = (object) array(
-    'gid' => NULL,
+    'gid' => $form_state['values']['module'] . ':' . $form_state['values']['element'] . ':' . $form_state['values']['gid'],
     'module' => $form_state['values']['module'],
     'element' => $form_state['values']['element'],
     'title' => $form_state['values']['title'],
@@ -377,7 +389,7 @@ function skinr_context_ui_group_delete_confirm($form, &$form_state, $group) {
 function skinr_context_ui_group_delete_confirm_submit($form, &$form_state) {
   if ($form_state['values']['confirm']) {
     skinr_context_group_delete($form_state['values']['gid']);
-    watchdog('content', 'Deleted a skin settings group.');
+    watchdog('skinr', 'Deleted a skin settings group.');
     drupal_set_message(t('A skin settings group has been deleted.'));
   }
 
@@ -411,8 +423,8 @@ function skinr_context_ui_edit($module, $element, $group) {
       'element' => $element,
       'gid' => $group->gid,
     );
-    // Don't nest the call to skinr_skin_get_sids() in skinr_skin_load_multiple().
-    // If the prior functions returns no results, the second function will load
+    // Don't nest the call to skinr_context_group_get_sids() in skinr_skin_load_multiple().
+    // If the prior function returns no results, the second function will load
     // ALL skins.
     if ($sids = skinr_context_group_get_sids($params)) {
       $skins = skinr_skin_load_multiple($sids);
@@ -427,6 +439,18 @@ function skinr_context_ui_edit($module, $element, $group) {
 /**
  * Implements hook_form_FORM_ID_alter().
  */
+function skinr_context_ui_form_ctools_export_ui_list_form_alter(&$form, &$form_state) {
+  // Removed Skinr contexts from context UI to prevent confusion.
+  foreach ($form_state['object']->items as $key => $item) {
+    if (isset($item->export_module) && $item->export_module == 'skinr_context') {
+      unset($form_state['object']->items[$key]);
+    }
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
 function skinr_context_ui_form_ctools_export_ui_edit_item_form_alter(&$form, &$form_state) {
   if ($form['info']['tag']['#default_value'] == 'Skinr') {
     // Prevent changing of required elements. For some reason if we disable the
@@ -442,6 +466,10 @@ function skinr_context_ui_form_ctools_export_ui_edit_item_form_alter(&$form, &$f
   }
 }
 
+function skinr_context_ui_group_name_exists($value, $element, $form_state) {
+  return db_query_range('SELECT 1 FROM {skinr_groups} WHERE gid = :gid', 0, 1, array(':gid' => $element['#field_prefix'] . $value))->fetchField();
+}
+
 /**
  * Implements hook_form_alter().
  */
@@ -467,12 +495,14 @@ function skinr_context_ui_form_alter(&$form, $form_state, $form_id) {
     '#type' => 'hidden',
     '#value' => $group->gid,
   );
+
   $form['skinr_group'] = array(
     '#tree' => TRUE,
     '#type' => 'container',
     // Move group settings to top.
     '#weight' => -1,
   );
+
   $form['skinr_group']['title'] = array(
     '#type' => 'textfield',
     '#title' => t('Group title'),
@@ -480,9 +510,29 @@ function skinr_context_ui_form_alter(&$form, $form_state, $form_id) {
     '#default_value' => $group->title,
     '#description' => t('Descriptive title for this skin settings group.'),
   );
+
+  $machine_name_prefix = $group->module . ':' . $group->element . ':';
+
+  $form['skinr_group']['gid'] = array(
+    '#type' => 'machine_name',
+    '#title' => t('Group name'),
+    '#default_value' => strpos($group->gid, $machine_name_prefix) === 0 ? substr($group->gid, strlen($machine_name_prefix)) : $group->gid,
+    // '#maxlength' => MENU_MAX_MENU_NAME_LENGTH_UI,
+    '#description' => t('A unique name to identify this group. It must only contain lowercase letters, numbers, hyphens and underscores.'),
+    '#field_prefix' => $machine_name_prefix,
+    '#machine_name' => array(
+      'exists' => 'skinr_context_ui_group_name_exists',
+      'source' => array('skinr_group', 'title'),
+      'replace_pattern' => '[^a-z0-9-_]+',
+    ),
+    // A group's machine name cannot be changed.
+    '#disabled' => TRUE,
+  );
+
   $form['skinr_group']['description'] = array(
     '#type' => 'textfield',
     '#title' => t('Description'),
+    '#default_value' => $group->description,
     '#description' => t('A description for this group.'),
   );
 
@@ -555,7 +605,7 @@ function skinr_context_ui_form_submit($form, &$form_state) {
   // Let's save some time in skinr_context_group_save() by setting $group->original here.
   $group->original = clone($group);
 
-  // Update status and weight.
+  // Update title and description.
   $group->title = $form_state['values']['skinr_group']['title'];
   $group->description = $form_state['values']['skinr_group']['description'];
 
@@ -607,8 +657,8 @@ function skinr_context_ui_form_submit($form, &$form_state) {
             'theme' => $theme_name,
             'module' => $module,
             'element' => $element,
-            'gid' => $gid,
             'skin' => $skin_name,
+            'gid' => $gid,
           );
           $sids = skinr_context_group_get_sids($params);
 
@@ -632,8 +682,8 @@ function skinr_context_ui_form_submit($form, &$form_state) {
             $skin->theme = $theme_name;
             $skin->module = $module;
             $skin->element = $element;
-            $skin->gid = $gid;
             $skin->skin = $skin_name;
+            $skin->gid = $gid;
           }
           $skin->options = $options;
           $skin->status = 1;
@@ -747,7 +797,8 @@ function skinr_context_ui_skin_list_subform() {
     'group' => array('data' => t('Group'), 'field' => 'gs.gid'),
     'element' => array('data' => t('Element'), 'field' => 's.element'),
     'skin' => array('data' => t('Skin'), 'field' => 's.skin'),
-    'status' => array('data' => t('Status'), 'field' => 's.status'),
+    'status' => array('data' => t('Status'), 'field' => 's.status', 'sort' => 'desc'),
+    'storage' => array('data' => t('Storage')),
     'operations' => array('data' => t('Operations')),
   );
 
@@ -768,25 +819,34 @@ function skinr_context_ui_skin_list_subform() {
   $destination = drupal_get_destination();
   $options = array();
   foreach ($skins as $skin) {
-    $operations = array(
-      'edit' => array(
-        'title' => t('edit'),
-        'href' => 'admin/structure/skinr/edit/' . $skin->module . '/' . $skin->element . '/' . $skin->gid,
-        'query' => $destination,
-      ),
-      'status' => array(
-        'title' => $skin->status ? t('disable') : t('enable'),
-        'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable'),
-        'query' => $destination + array(
-          'token' => drupal_get_token('admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable')),
-        ),
+    $operations = array();
+    $operations['edit'] = array(
+      'title' => t('edit'),
+      'href' => 'admin/structure/skinr/edit/' . $skin->module . '/' . $skin->element . '/' . $skin->gid,
+      'query' => $destination,
+    );
+    $operations['status'] = array(
+      'title' => $skin->status ? t('disable') : t('enable'),
+      'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable'),
+      'query' => $destination + array(
+        'token' => drupal_get_token('admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable')),
       ),
-      'delete' => array(
+    );
+    $storage = skinr_ui_skin_storage($skin);
+    if ($storage == t('Overridden')) {
+      $operations['revert'] = array(
+        'title' => t('revert'),
+        'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/revert',
+        'query' => $destination,
+      );
+    }
+    if ($storage == t('Normal')) {
+      $operations['delete'] = array(
         'title' => t('delete'),
         'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/delete',
         'query' => $destination,
-      ),
-    );
+      );
+    }
 
     $group = skinr_context_group_load($skin->gid);
     $title = reset(skinr_invoke_all('skinr_ui_element_title', $skin->module, $skin->element, $skin->theme));
@@ -797,6 +857,7 @@ function skinr_context_ui_skin_list_subform() {
       'element' => $title ? $title : $skin->element,
       'skin' => $skin->skin == '_additional' ? '<em>' . t('Additional classes') . '</em>' : (isset($skin_info[$skin->skin]) ? $skin_info[$skin->skin]['title'] : '<em>' . $skin->skin . '</em>'),
       'status' => $skin->status ? t('enabled') : t('disabled'),
+      'storage' => array('data' => $storage, 'class' => array('skinr-ui-storage')),
       'operations' => array(
         'data' => array(
           '#theme' => 'links__skinr_ui_operations',
@@ -805,8 +866,16 @@ function skinr_context_ui_skin_list_subform() {
         ),
       ),
     );
+
+    if (!$skin->status) {
+      $options[$skin->sid]['#attributes'] = array('class' => array('skinr-ui-disabled'));
+    }
   }
 
+  // Hide status row. Only used for sorting.
+  unset($header['status']);
+
+  drupal_add_css(drupal_get_path('module', 'skinr_ui') . '/css/skinr-ui-admin.css');
   $form['skins'] = array(
     '#type' => 'tableselect',
     '#header' => $header,
@@ -835,3 +904,96 @@ function theme_skinr_context_ui_group_summary($variables) {
   }
   return '<div class="skin-group-summary">' . $info . '</div>';
 }
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function skinr_context_ui_form_skinr_ui_import_form_alter(&$form, &$form_state) {
+  $form['skinr_groups'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Skin configuration groups'),
+    '#description' => t('Paste skin configuration groups here.'),
+    '#rows' => 16,
+    '#weight' => -1,
+  );
+
+  array_unshift($form['#validate'], 'skinr_context_ui_import_form_validate');
+  array_unshift($form['#submit'], 'skinr_context_ui_import_form_submit');
+}
+
+/**
+ * Form validation handler for skinr_ui_import_form().
+ */
+function skinr_context_ui_import_form_validate(&$form, &$form_state) {
+  $error_message = t('These are not valid skin configuration groups.');
+  if (empty($form_state['values']['skinr_groups'])) {
+    // Error.
+    form_error($form['skinr_groups'], $error_message);
+    return;
+  }
+
+  $groups = '';
+  ob_start();
+  eval($form_state['values']['skinr_groups']);
+  ob_end_clean();
+
+  foreach ($groups as $key => $group) {
+    if (!is_object($group) || !skinr_context_group_validate($groups[$key])) {
+      form_error($form['skinr_groups'], $error_message);
+      return;
+    }
+  }
+
+  $form_state['groups'] = &$groups;
+}
+
+/**
+ * Form submission handler for skinr_ui_import_form().
+ */
+function skinr_context_ui_import_form_submit(&$form, &$form_state) {
+  $status = TRUE;
+  foreach ($form_state['groups'] as $group) {
+    $status = skinr_context_group_import($group, TRUE) && $status;
+  }
+
+  drupal_set_message(t('The skin configuration groups have been saved.'));
+  if (!$status) {
+    drupal_set_message(t('Not all skin configuration groups could be saved!'), 'error', FALSE);
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function skinr_context_ui_form_skinr_ui_export_form_alter(&$form, &$form_state) {
+  if (!empty($form_state['build_info']['args'][0])) {
+    $code = array();
+
+    // Export groups for exported skins.
+    $gids = array();
+    foreach ($form['#skins'] as $skin) {
+      if (!empty($skin->gid)) {
+        $gids[$skin->gid] = $skin->gid;
+      }
+    }
+
+    // Convert classes to arrays.
+    $groups = array();
+    if ($gids && ($groups = skinr_context_group_load_multiple($gids))) {
+      foreach ($groups as $group) {
+        $code[] = skinr_context_group_export($group);
+      }
+    }
+    $code = implode("\n", $code);
+
+    $lines = substr_count($code, "\n") + 1;
+
+    $form['skinr_groups'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Skin configuration groups'),
+      '#default_value' => $code,
+      '#rows' => min($lines, 80),
+      '#weight' => 8,
+    );
+  }
+}
diff --git a/skinr_context/tests/skinr_context.test b/skinr_context/tests/skinr_context.test
index 2662753fa6bd4406a4816cf9c0ff2216c60e069e..2d4114f088e5cb9d629baa706f34981512fd68ef 100644
--- a/skinr_context/tests/skinr_context.test
+++ b/skinr_context/tests/skinr_context.test
@@ -13,7 +13,7 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
 
   public static function getInfo() {
     return array(
-      'name' => 'Context',
+      'name' => 'Context - API',
       'description' => 'Tests Skinr Context API functionality.',
       'dependencies' => array('ctools', 'context'),
       'group' => 'Skinr',
@@ -25,6 +25,52 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
   }
 
   /**
+   * Test hook invocations for CRUD operations on skin settings groups.
+   */
+  public function testSkinrContextGroupHooks() {
+    $group = (object) array(
+      'gid' => 'block:system__user-menu:default',
+      'module' => 'block',
+      'element' => 'system__user-menu',
+      'title' => 'Default',
+      'description' => '',
+      'conditions' => array('sitewide' => array('values' => array(1 => 1))),
+      'condition_mode' => CONTEXT_CONDITION_MODE_OR,
+      'weight' => 0,
+      'status' => 1,
+    );
+    $_SESSION['skinr_test'] = array();
+    skinr_context_group_save($group);
+    $this->verbose(highlight_string('<?php ' . var_export($group, TRUE), TRUE));
+    $this->verbose(highlight_string('<?php ' . var_export($_SESSION['skinr_test'], TRUE), TRUE));
+
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_presave called');
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_insert called');
+
+    $_SESSION['skinr_test'] = array();
+    $group = skinr_context_group_load($group->gid);
+
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_load called');
+
+    $_SESSION['skinr_test'] = array();
+    $group = skinr_context_group_load_unchanged($group->gid);
+
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_load called');
+
+    $_SESSION['skinr_test'] = array();
+    $group->status = 0;
+    skinr_context_group_save($group);
+
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_presave called');
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_update called');
+
+    $_SESSION['skinr_test'] = array();
+    skinr_context_group_delete($group->gid);
+
+    $this->assertHookMessage('skinr_context_test_skinr_context_group_delete called');
+  }
+
+  /**
    * Test skinr_skin_save() against invalid entries.
    */
   public function testSkinrContextGroupLoadSave() {
@@ -32,6 +78,7 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
 
     // Only save valid groups.
     $group = (object) array(
+      'gid' => 'block:system__user-menu:default',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'Default',
@@ -42,16 +89,17 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
       'status' => 1,
     );
     $this->assertTrue(skinr_context_group_save($group), 'Skin settings group object saved.');
-    $this->assertTrue(isset($group->gid), 'Gid was added to skin settings group object.');
+    $this->assertTrue(isset($group->gid), 'Gid added to skin settings group object.');
 
     // Test loading a group.
     $loaded_group = skinr_context_group_load($group->gid);
     $this->assertTrue(is_array($loaded_group->conditions), 'Conditions for skin settings group object unserialized.');
 
-    $this->assertTrue($loaded_group->module == $group->module && $loaded_group->element == $group->element && $loaded_group->title == $group->title && $loaded_group->description == $group->description && $loaded_group->condition_mode == $group->condition_mode && $loaded_group->weight == $group->weight && $loaded_group->status == $group->status && isset($loaded_group->conditions['sitewide']) && isset($loaded_group->conditions['sitewide']['values']) && $loaded_group->conditions['sitewide']['values'][1] == $group->conditions['sitewide']['values'][1], 'Skin settings group object loaded properly.');
+    $this->assertTrue($loaded_group->gid == $group->gid && $loaded_group->module == $group->module && $loaded_group->element == $group->element && $loaded_group->title == $group->title && $loaded_group->description == $group->description && $loaded_group->condition_mode == $group->condition_mode && $loaded_group->weight == $group->weight && $loaded_group->status == $group->status && isset($loaded_group->conditions['sitewide']) && isset($loaded_group->conditions['sitewide']['values']) && $loaded_group->conditions['sitewide']['values'][1] == $group->conditions['sitewide']['values'][1], 'Skin settings group object loaded properly.');
 
     // Save a second group.
     $second_group = (object) array(
+      'gid' => 'block:system__main-menu:default',
       'module' => 'block',
       'element' => 'system__main-menu',
       'title' => 'Default',
@@ -67,13 +115,14 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
     $groups = skinr_context_group_load_multiple(array($group->gid, $second_group->gid));
     $this->assertTrue(count($groups) == 2 && isset($groups[$group->gid]->gid) && isset($groups[$second_group->gid]->gid), 'Successfully loaded multiple skin settings groups.');
 
-    // Test loading all skin settings.
+    // Test loading all skin settings groups.
     drupal_static_reset('skinr_context_group_load_multiple');
     $groups = skinr_context_group_load_multiple(FALSE);
     $this->assertTrue(count($groups) == 2 && isset($groups[$group->gid]->gid) && isset($groups[$second_group->gid]->gid), 'Successfully loaded all skin settings groups.');
 
     // Test deleting groups.
     $third_group = (object) array(
+      'gid' => 'block:system__main-menu:alternate',
       'module' => 'block',
       'element' => 'system__main-menu',
       'title' => 'Alternate',
@@ -97,48 +146,115 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
   }
 
   /**
-   * Test hook invocations for CRUD operations on skin settings groups.
+   * Test default skin configurations (in code) with duplicates.
    */
-  public function testSkinrContextGroupHooks() {
-    $group = (object) array(
-      'module' => 'block',
-      'element' => 'system__user-menu',
-      'title' => 'Default',
-      'description' => '',
-      'conditions' => array('sitewide' => array('values' => array(1 => 1))),
-      'condition_mode' => CONTEXT_CONDITION_MODE_OR,
-      'weight' => 0,
-      'status' => 1,
-    );
-    $_SESSION['skinr_test'] = array();
-    skinr_context_group_save($group);
-    $this->verbose(highlight_string('<?php ' . var_export($group, TRUE), TRUE));
-    $this->verbose(highlight_string('<?php ' . var_export($_SESSION['skinr_test'], TRUE), TRUE));
+  public function testSkinrContextGroupDefaultsDuplicates() {
+    $gid = 'block:system__user-menu:default';
 
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_presave called');
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_insert called');
+    module_enable(array('skinr_context_test_default'));
+    $default_groups = _skinr_context_group_get_defaults();
+    $this->verbose(highlight_string('<?php ' . print_r($default_groups, TRUE), TRUE));
 
-    $_SESSION['skinr_test'] = array();
-    $group = skinr_context_group_load($group->gid);
+    // Clear caches.
+    drupal_static_reset('_skinr_context_group_get_defaults');
 
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_load called');
+    module_enable(array('skinr_context_test_default_duplicate'));
+    $default_groups = _skinr_context_group_get_defaults();
+    $this->verbose(highlight_string('<?php ' . print_r($default_groups, TRUE), TRUE));
 
-    $_SESSION['skinr_test'] = array();
-    $group = skinr_context_group_load_unchanged($group->gid);
+    $this->assertFalse(is_array($default_groups[$gid]), 'Default skin configuration group replaced its duplicate.');
 
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_load called');
+    // Clean up.
+    module_disable(array('skinr_context_test_default_duplicate'));
+    drupal_static_reset('_skinr_context_group_get_defaults');
+  }
 
-    $_SESSION['skinr_test'] = array();
+  /**
+   * Test default skin settings groups (in code).
+   */
+  public function testSkinrContextGroupDefaults() {
+    $gid = 'block:system__user-menu:default';
+    $uuid = '501ff0c3-db03-0944-9910-3a788f38097a';
+
+    // Default skin configuration object should not exist yet.
+    $this->assertFalse(skinr_context_group_load($gid), 'Default skin settings group does not exist.');
+
+    module_enable(array('skinr_context_test_default'));
+
+    // Test loading raw defaults.
+    $default_groups = _skinr_context_group_get_defaults();
+
+    // Skin configuration object provided via hook_skinr_context_group_defaults()
+    // in skinr_context_test_default.skinr_default.inc.
+    $this->assertTrue(isset($default_groups[$gid]), 'Skin settings group in skinr_context_test_default.skinr_default.inc found.');
+    unset($default_groups[$gid]);
+
+    // After asserting all expected, the list of default skins should be empty.
+    $this->assertTrue(empty($default_groups), t('No unexpected settings groups found: <pre>@data</pre>', array(
+      '@data' => var_export($default_groups, TRUE),
+    )));
+
+    // Load a default skin settings group object.
+    $group = skinr_context_group_load($gid);
+    $this->assertTrue($group && $group->gid == $gid, 'Successfully loaded default skin settings group.');
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_context_group_storage($group) == SKINR_STORAGE_IN_CODE, 'Storage indicator indicates stored in code.');
+
+    // Test that skin configuration has valid gid. If load order is wrong, it
+    // will be missing.
+    $default_skin = skinr_skin_load_by_uuid('501ff0c3-db03-0944-9910-3a788f38097a');
+    $this->verbose(highlight_string(print_r($default_skin, TRUE), TRUE));
+    $this->assertTrue($default_skin->gid == $group->gid, 'Valid GID found for default skin configuration.');
+
+    // Overridden status should not change storage indicator.
     $group->status = 0;
     skinr_context_group_save($group);
+    $this->assertTrue(skinr_context_group_storage($group) == SKINR_STORAGE_IN_CODE, 'Storage indicator indicates stored in code.');
 
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_presave called');
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_update called');
+    // Override a default skin configuration object.
+    $group->status = 1;
+    $group->conditions['sitewide']['values'] = array(0 => 0);
+    skinr_context_group_save($group);
 
-    $_SESSION['skinr_test'] = array();
-    skinr_context_group_delete($group->gid);
+    // Test storage indicator.
+    $this->assertTrue(skinr_context_group_storage($group) == SKINR_STORAGE_IN_CODE_OVERRIDDEN, 'Storage indicator indicates stored in code, but overridden in database.');
 
-    $this->assertHookMessage('skinr_context_test_skinr_context_group_delete called');
+    // Revert a default skin settings group object.
+    $this->assertTrue(skinr_context_group_revert($group->gid), 'Successfully reverted skin settings group to default.');
+    // Refresh skin settings group data.
+    $group = skinr_context_group_load($gid);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_context_group_storage($group) == SKINR_STORAGE_IN_CODE, 'Storage indicator indicates stored in code.');
+
+    // Test re-enabling module containing defaults; re-importing an existing
+    // skin configuration.
+
+    // Override default skin settings group.
+    $group->conditions['sitewide']['values'] = array(0 => 0);
+    skinr_context_group_save($group);
+
+    // Disable, then re-enable module containing defaults.
+    module_disable(array('skinr_context_test_default'));
+    module_enable(array('skinr_context_test_default'));
+
+    // Refresh skin settings group data.
+    $group = skinr_context_group_load($gid);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_context_group_storage($group) == SKINR_STORAGE_IN_CODE_OVERRIDDEN, 'After enabling module containing already existing default skin configuration, storage indicator indicates stored in code, but overridden in database.');
+
+    // Now test forced import.
+    $default_groups = _skinr_context_group_get_defaults();
+    $default_group = $default_groups[$gid];
+    $this->assertTrue(skinr_context_group_import($default_group, TRUE), 'Successfully forced import of existing skin settings group.');
+
+    // Refresh skin settings group data.
+    $group = skinr_context_group_load($gid);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_context_group_storage($group) == SKINR_STORAGE_IN_CODE, 'After forcing import of existing default skin settings group, storage indicator indicates stored in code again.');
   }
 }
 
@@ -152,7 +268,7 @@ class SkinrContextDisplayTestCase extends SkinrWebTestCase {
 
   public static function getInfo() {
     return array(
-      'name' => 'Context Display',
+      'name' => 'Context - Display',
       'description' => 'Tests if applied skins appear on the front-end.',
       'dependencies' => array('ctools', 'context'),
       'group' => 'Skinr',
@@ -203,6 +319,7 @@ class SkinrContextDisplayTestCase extends SkinrWebTestCase {
   public function testSkinrContextDisplayed() {
     // Save a group.
     $group = (object) array(
+      'gid' => 'block:system__main:default',
       'module' => 'block',
       'element' => 'system__main',
       'title' => 'Default',
diff --git a/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.info b/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.info
new file mode 100644
index 0000000000000000000000000000000000000000..2babcb5bc08f512cb703559b3aa9e911e6051eb6
--- /dev/null
+++ b/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.info
@@ -0,0 +1,6 @@
+name = Skinr Context Default Testing
+description = A test module used for testing skin configuration defined in code for Skinr Context.
+package = Testing
+core = 7.x
+hidden = TRUE
+dependencies[] = skinr_context
diff --git a/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.module b/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.module
new file mode 100644
index 0000000000000000000000000000000000000000..958bcdc8f7b5a4c717cd62704c4ea8a59abafc04
--- /dev/null
+++ b/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.module
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @file
+ * Skinr Context default testing module.
+ *
+ * Empty file is required.
+ */
diff --git a/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.skinr_default.inc b/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.skinr_default.inc
new file mode 100644
index 0000000000000000000000000000000000000000..c84ec38ec9948342a6cda82667341de8b6c58ade
--- /dev/null
+++ b/skinr_context/tests/skinr_context_test_default/skinr_context_test_default.skinr_default.inc
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @file
+ * skinr_context_test_default.skinr.inc
+ */
+
+/**
+ * Implements hook_skinr_context_group_defaults().
+ */
+function skinr_context_test_default_skinr_context_group_defaults() {
+  $group = new stdClass();
+  $group->status = TRUE; /* Edit this to false to make a default group disabled initially */
+  $group->api_version = 2;
+  $group->gid = 'block:system__user-menu:default';
+  $group->module = 'block';
+  $group->element = 'system__user-menu';
+  $group->title = 'Default';
+  $group->description = 'A short desciption of this group.';
+  $group->conditions = array(
+    'sitewide' => array(
+      'values' => array(
+        1 => 1,
+      ),
+    ),
+  );
+  $group->condition_mode = 0;
+  $group->weight = 0;
+  $groups['block:system__user-menu:default'] = $group;
+
+  return $groups;
+}
+
+/**
+ * Implements hook_skinr_skin_defaults().
+ */
+function skinr_context_test_default_skinr_skin_defaults() {
+  $skin = new stdClass();
+  $skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+  $skin->api_version = 2;
+  $skin->uuid = '501ff0c3-db03-0944-9910-3a788f38097a';
+  $skin->theme = 'skinr_test_subtheme';
+  $skin->module = 'block';
+  $skin->element = 'system__user-menu';
+  $skin->skin = 'skinr_test_subtheme';
+  $skin->options = array(
+    'option1' => 'option1',
+    'option2' => 'option2',
+  );
+  $skin->gid = 'block:system__user-menu:default';
+  $skins['501ff0c3-db03-0944-9910-3a788f38097a'] = $skin;
+
+  return $skins;
+}
diff --git a/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.info b/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.info
new file mode 100644
index 0000000000000000000000000000000000000000..81ce8b5a9ec66c5dae7013ed01144dcab943a9ca
--- /dev/null
+++ b/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.info
@@ -0,0 +1,6 @@
+name = Skinr Context Default Duplicate Testing
+description = A test module used for testing skin configuration defined in code for Skinr Context where duplicates cause a bug.
+package = Testing
+core = 7.x
+hidden = TRUE
+dependencies[] = skinr_context
diff --git a/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.module b/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.module
new file mode 100644
index 0000000000000000000000000000000000000000..958bcdc8f7b5a4c717cd62704c4ea8a59abafc04
--- /dev/null
+++ b/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.module
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @file
+ * Skinr Context default testing module.
+ *
+ * Empty file is required.
+ */
diff --git a/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.skinr_default.inc b/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.skinr_default.inc
new file mode 100644
index 0000000000000000000000000000000000000000..e46af199c4be2723b57686be4d723dc76b568c5b
--- /dev/null
+++ b/skinr_context/tests/skinr_context_test_default_duplicate/skinr_context_test_default_duplicate.skinr_default.inc
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @file
+ * skinr_context_test_default_duplicate.skinr.inc
+ */
+
+/**
+ * Implements hook_skinr_context_group_defaults().
+ */
+function skinr_context_test_default_duplicate_skinr_context_group_defaults() {
+  $group = new stdClass();
+  $group->status = TRUE; /* Edit this to false to make a default group disabled initially */
+  $group->api_version = 2;
+  $group->gid = 'block:system__user-menu:default';
+  $group->module = 'block';
+  $group->element = 'system__user-menu';
+  $group->title = 'Default';
+  $group->description = 'A short desciption of this group.';
+  $group->conditions = array();
+  $group->condition_mode = 0;
+  $group->weight = 0;
+  $groups['block:system__user-menu:default'] = $group;
+
+  return $groups;
+}
diff --git a/skinr_context/tests/skinr_context_ui.test b/skinr_context/tests/skinr_context_ui.test
index 09fbbbfd2ea93383935029caab4d0b1cc5a98ed7..23cbb99322e2717b4a6043cf299292f85bc39cc2 100644
--- a/skinr_context/tests/skinr_context_ui.test
+++ b/skinr_context/tests/skinr_context_ui.test
@@ -6,13 +6,17 @@
  */
 
 /**
- * Base class for Skinr UI tests.
+ * Base class for Skinr Context UI tests.
  */
 class SkinrContextUITestCase extends SkinrUITestCase {
   protected $profile = 'testing';
 
   function setUp() {
-    parent::setUp(array('skinr_context', 'skinr_context_ui'));
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    parent::setUp(array_merge(array('skinr_context', 'skinr_context_ui'), $modules));
   }
 }
 
@@ -23,18 +27,23 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
   public static function getInfo() {
     return array(
       'name' => 'Context UI',
-      'description' => 'Tests basic Skinr Context UI functionality.',
+      'description' => 'Tests administrative Skinr Context UI functionality.',
       'dependencies' => array('ctools', 'context', 'context_ui'),
       'group' => 'Skinr',
     );
   }
 
+  function setUp() {
+    parent::setUp(array('skinr_test', 'skinr_context_test_default'));
+  }
+
   /**
    * Tests basic configuration and applying of a skin.
    */
   function testGroupList() {
     // Add a group.
     $group = (object) array(
+      'gid' => 'block:system__user-menu:default',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'Default',
@@ -64,7 +73,7 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
     // skin settings page.
     $this->clickLink(t('edit'), 0);
     // Verify that we end up on the expected URL to configure skins for our group.
-    $this->assertUrl('admin/structure/skinr/edit/block/system__user-menu/1', array(
+    $this->assertUrl('admin/structure/skinr/edit/block/system__user-menu/' . $group->gid, array(
       'query' => array('destination' => 'admin/structure/skinr/edit/block/system__user-menu/configure?destination=' . $front),
     ));
 
@@ -127,6 +136,7 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
     // Post the form.
     $edit = array(
       'title' => 'SkinrContextGroupTest',
+      'gid' => 'skinrcontextgrouptest',
     );
     $this->drupalPost(NULL, $edit, t('Add group'));
 
@@ -138,12 +148,31 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
     // Verify that the new group is added.
     $this->assertText('SkinrContextGroupTest', 'Successfully added a skin settings group.');
   }
+}
+
+/**
+ * Tests UI functionality.
+ */
+class SkinrContextUIAdminTestCase extends SkinrContextUITestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Context UI - Administration',
+      'description' => 'Tests administrative Skinr Context UI functionality.',
+      'dependencies' => array('ctools', 'context', 'context_ui'),
+      'group' => 'Skinr',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('skinr_test', 'skinr_context_test_default'));
+  }
 
   /**
    * Tests skin configuration listing functionality.
    */
   function testSkinListingWithGroups() {
     $group = (object) array(
+      'gid' => 'block:system__user-menu:skinlistingwithgroup',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'SkinListingWithGroup',
@@ -168,8 +197,136 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
 
     // Verify that the skin configuration appears on the skin configurations overview page.
     $this->drupalGet('admin/structure/skinr');
-    $this->assertLinkByHref('admin/structure/skinr/edit/' . $skin->module . '/' . $skin->element . '/' . $skin->gid, 0, 'Skin configuration was found on overview page.');
+    $this->assertLinkByHref(drupal_encode_path('admin/structure/skinr/edit/' . $skin->module . '/' . $skin->element . '/' . $skin->gid), 0, 'Skin configuration was found on overview page.');
+
+    // Test that revert link doesn't appear for default skin configurations.
+    $default_skin = skinr_skin_load_by_uuid('501ff0c3-db03-0944-9910-3a788f38097a');
+    $this->verbose(highlight_string(print_r($default_skin, TRUE), TRUE));
+    $this->assertNoLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/revert', 0, 'No revert operation is available for default skin configuration.');
+
+    // Test that delete link does not appear for default skin configurations.
+    $this->assertNoLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/delete', 0, 'No delete operation is available for default skin configuration.');
+
+    // Test that revert link appears for skin configurations in code that are
+    // overridden in databse.
+    $default_skin->options = array('options3');
+    skinr_skin_save($default_skin);
+    $this->drupalGet('admin/structure/skinr');
+    $this->assertLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/revert', 0, 'Revert operation is available for overridden skin configuration.');
+
+    // Test that delete link does not appear for overridden skin configurations.
+    $this->assertNoLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/delete', 0, 'No delete operation is available for overridden skin configuration.');
+
+    // Test reverting overridden skin.
+    $this->clickLink(t('revert'), 0);
+    $edit = array(
+      'skinr_settings[bartik][groups][_additional][_additional]' => 'additional',
+    );
+    $this->drupalPost(NULL, array(), t('Revert'));
+
+    // Load an uncached version of the skin configuration object.
+    $default_skin = skinr_skin_load_unchanged($default_skin->sid);
+    $this->assertTrue(skinr_skin_storage($default_skin) == SKINR_STORAGE_IN_CODE, 'Overridden skin configuration was reverted to default.');
 
     // @todo Should we check the filtering and update options functionality?
   }
+
+  /**
+   * Tests skin configuration and group import and export forms.
+   */
+  function testGroupSkinImportExport() {
+    $this->drupalGet('admin/structure/skinr/import');
+
+    $gid1 = 'node:page:default';
+    $gid2 = 'block:user__online:default';
+    $uuid1 = '16daa322-5ac0-49e4-cda2-809a13bb965b';
+    $uuid2 = '7384adb8-50a8-67d4-2dcd-5acda9b5c76e';
+
+    $edit = array(
+      'skinr_groups' => "\$group = new stdClass();
+\$group->status = TRUE; /* Edit this to false to make a default group disabled initially */
+\$group->api_version = " . SKINR_VERSION . ";
+\$group->gid = '" . $gid1 . "';
+\$group->module = 'block';
+\$group->element = 'system__main';
+\$group->title = 'Default';
+\$group->description = '';
+\$group->conditions = array(
+  'sitewide' => array(
+    'values' => array(
+      1 => 1,
+    ),
+  ),
+);
+\$group->condition_mode = 0;
+\$group->weight = 0;
+\$groups['" . $gid1 . "'] = \$group;
+
+\$group = new stdClass();
+\$group->status = TRUE; /* Edit this to false to make a default group disabled initially */
+\$group->api_version = " . SKINR_VERSION . ";
+\$group->gid = '" . $gid2 . "';
+\$group->module = 'block';
+\$group->element = 'system__user-menu';
+\$group->title = 'Default';
+\$group->description = 'Default export description.';
+\$group->conditions = array(
+  'sitewide' => array(
+    'values' => array(
+      1 => 1,
+    ),
+  ),
+);
+\$group->condition_mode = 0;
+\$group->weight = 0;
+\$groups['" . $gid2 . "'] = \$group;
+",
+      'skinr_skins' => "\$skin = new stdClass();
+\$skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+\$skin->api_version = " . SKINR_VERSION . ";
+\$skin->uuid = '" . $uuid1 . "';
+\$skin->theme = 'bartik';
+\$skin->module = 'block';
+\$skin->element = 'system__main';
+\$skin->skin = 'skinr_test_example';
+\$skin->options = array(
+  'option1' => 'option1',
+);
+\$skin->gid = '" . $gid1 . "';
+\$skins['" . $uuid1 . "'] = \$skin;
+
+\$skin = new stdClass();
+\$skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+\$skin->api_version = " . SKINR_VERSION . ";
+\$skin->uuid = '" . $uuid2 . "';
+\$skin->theme = 'bartik';
+\$skin->module = 'block';
+\$skin->element = 'system__user-menu';
+\$skin->skin = 'skinr_test_subtheme';
+\$skin->options = array(
+  'option1' => 'option1',
+  'option2' => 'option2',
+);
+\$skin->gid = '" . $gid2 . "';
+\$skins['" . $uuid2 . "'] = \$skin;
+",
+    );
+    $this->drupalPost(NULL, $edit, t('Import'));
+
+    // Now check if the imported skin configuration groups exist.
+    $group1 = skinr_context_group_load($gid1);
+    $group2 = skinr_context_group_load($gid2);
+    $this->assertTrue(isset($group1->gid) && $group1->gid == $gid1 && isset($group2->gid) && $group2->gid == $gid2, 'Successfully imported skin configuration groups.');
+
+    // Now check if the imported skin configurations exist.
+    $skin1 = skinr_skin_load_by_uuid($uuid1);
+    $skin2 = skinr_skin_load_by_uuid($uuid2);
+    $this->assertTrue(isset($skin1->uuid) && $skin1->uuid == $uuid1 && $skin1->gid == $gid1 && isset($skin2->uuid) && $skin2->uuid == $uuid2 && $skin2->gid == $gid2, 'Successfully imported skin configurations with linked groups.');
+
+    // Test export.
+    $this->drupalGet('admin/structure/skinr/export');
+    $this->drupalPost(NULL, array('theme' => 'bartik'), t('Export'));
+    $this->assertFieldByName('skinr_groups', $edit['skinr_groups'], 'Skin configuration group export value is correct.');
+    $this->assertFieldByName('skinr_skins', $edit['skinr_skins'], 'Skin configuration export value is correct.');
+  }
 }
diff --git a/skinr_ui.admin.inc b/skinr_ui.admin.inc
index 902ecc4e7b4ee3a66c7fb2478c65807af0082bd8..8f3ad35250a30589f4433042e0c9b748f1166e86 100644
--- a/skinr_ui.admin.inc
+++ b/skinr_ui.admin.inc
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Admin page callbacks for the Skinr module.
+ * Admin page callbacks for the Skinr UI module.
  */
 
 /**
@@ -367,6 +367,15 @@ function skinr_ui_list($form, &$form_state) {
   return $form;
 }
 
+function skinr_ui_skin_storage($skin) {
+  $options = array(
+    SKINR_STORAGE_IN_DATABASE => t('Normal'),
+    SKINR_STORAGE_IN_CODE => t('Default'),
+    SKINR_STORAGE_IN_CODE_OVERRIDDEN => t('Overridden'),
+  );
+  return $options[skinr_skin_storage($skin)];
+}
+
 /**
  * Form builder: Builds the skin configuration administration overview.
  *
@@ -402,7 +411,8 @@ function skinr_ui_admin_skins() {
     'type' => array('data' => t('Type'), 'field' => 's.module'),
     'element' => array('data' => t('Element'), 'field' => 's.element'),
     'skin' => array('data' => t('Skin'), 'field' => 's.skin'),
-    'status' => array('data' => t('Status'), 'field' => 's.status'),
+    'status' => array('data' => t('Status'), 'field' => 's.status', 'sort' => 'desc'),
+    'storage' => array('data' => t('Storage')),
     'operations' => array('data' => t('Operations')),
   );
 
@@ -422,25 +432,34 @@ function skinr_ui_admin_skins() {
   $destination = drupal_get_destination();
   $options = array();
   foreach ($skins as $skin) {
-    $operations = array(
-      'edit' => array(
-        'title' => t('edit'),
-        'href' => 'admin/structure/skinr/edit/' . $skin->module . '/' . $skin->element,
-        'query' => $destination,
-      ),
-      'status' => array(
-        'title' => $skin->status ? t('disable') : t('enable'),
-        'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable'),
-        'query' => $destination + array(
-          'token' => drupal_get_token('admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable')),
-        ),
+    $operations = array();
+    $operations['edit'] = array(
+      'title' => t('edit'),
+      'href' => 'admin/structure/skinr/edit/' . $skin->module . '/' . $skin->element,
+      'query' => $destination,
+    );
+    $operations['status'] = array(
+      'title' => $skin->status ? t('disable') : t('enable'),
+      'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable'),
+      'query' => $destination + array(
+        'token' => drupal_get_token('admin/structure/skinr/skin/' . $skin->sid . '/' . ($skin->status ? 'disable' : 'enable')),
       ),
-      'delete' => array(
+    );
+    $storage = skinr_ui_skin_storage($skin);
+    if ($storage == t('Overridden')) {
+      $operations['revert'] = array(
+        'title' => t('revert'),
+        'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/revert',
+        'query' => $destination,
+      );
+    }
+    if ($storage == t('Normal')) {
+      $operations['delete'] = array(
         'title' => t('delete'),
         'href' => 'admin/structure/skinr/skin/' . $skin->sid . '/delete',
         'query' => $destination,
-      ),
-    );
+      );
+    }
 
     $title = reset(skinr_invoke_all('skinr_ui_element_title', $skin->module, $skin->element, $skin->theme));
     $options[$skin->sid] = array(
@@ -449,6 +468,7 @@ function skinr_ui_admin_skins() {
       'element' => $title ? $title : $skin->element,
       'skin' => $skin->skin == '_additional' ? '<em>' . t('Additional classes') . '</em>' : (isset($skin_info[$skin->skin]) ? $skin_info[$skin->skin]['title'] : '<em>' . $skin->skin . '</em>'),
       'status' => $skin->status ? t('enabled') : t('disabled'),
+      'storage' => array('data' => $storage, 'class' => array('skinr-ui-storage')),
       'operations' => array(
         'data' => array(
           '#theme' => 'links__skinr_ui_operations',
@@ -457,8 +477,16 @@ function skinr_ui_admin_skins() {
         ),
       ),
     );
+
+    if (!$skin->status) {
+      $options[$skin->sid]['#attributes'] = array('class' => array('skinr-ui-disabled'));
+    }
   }
 
+  // Hide status row. Only used for sorting.
+  unset($header['status']);
+
+  drupal_add_css(drupal_get_path('module', 'skinr_ui') . '/css/skinr-ui-admin.css');
   $form['skins'] = array(
     '#type' => 'tableselect',
     '#header' => $header,
@@ -553,7 +581,7 @@ function skinr_ui_multiple_delete_confirm_submit($form, &$form_state) {
     skinr_skin_delete_multiple(array_keys($form_state['values']['skins']));
     $count = count($form_state['values']['skins']);
     if ($count == 1) {
-      watchdog('content', 'Deleted 1 skin configuration.');
+      watchdog('skinr', 'Deleted 1 skin configuration.');
     }
     else {
       watchdog('content', 'Deleted @count skin configurations.', array('@count' => $count));
@@ -919,14 +947,14 @@ function skinr_ui_export_form($form, &$form_state, $theme = NULL) {
       'theme' => $theme,
     );
     $skins = skinr_skin_load_multiple(skinr_skin_get_sids($params));
+    $form['#skins'] = $skins;
 
     // Convert classes to arrays.
-    $code = '';
+    $code = array();
     foreach ($skins as $skin) {
-      unset($skin->sid);
-      unset($skin->rdf_mapping);
-      $code .= '$skins[] = '. var_export((array) $skin, TRUE) .";\n";
+      $code[] = skinr_skin_export($skin);
     }
+    $code = implode("\n", $code);
 
     $lines = substr_count($code, "\n") + 1;
 
@@ -935,13 +963,15 @@ function skinr_ui_export_form($form, &$form_state, $theme = NULL) {
       '#title' => t('Theme'),
       '#value' => $themes[$theme]->info['name'],
       '#disabled' => TRUE,
+      '#weight' => 0,
     );
 
-    $form['skinr_settings'] = array(
+    $form['skinr_skins'] = array(
       '#type' => 'textarea',
-      '#title' => t('Skinr settings'),
+      '#title' => t('Skin configurations'),
       '#default_value' => $code,
-      '#rows' => min($lines, 150),
+      '#rows' => min($lines, 80),
+      '#weight' => 10,
     );
   }
   else {
@@ -1008,10 +1038,10 @@ function skinr_ui_export_form_submit(&$form, &$form_state) {
  * @ingroup forms
  */
 function skinr_ui_import_form($form, &$form_state) {
-  $form['skin_configurations'] = array(
+  $form['skinr_skins'] = array(
     '#type' => 'textarea',
     '#title' => t('Skin configurations'),
-    '#description' => t('Paste skin coonfigurations here.'),
+    '#description' => t('Paste skin configurations here.'),
     '#rows' => 16,
   );
   $form['submit'] = array(
@@ -1026,25 +1056,21 @@ function skinr_ui_import_form($form, &$form_state) {
  * Form validation handler for skinr_ui_import_form().
  */
 function skinr_ui_import_form_validate(&$form, &$form_state) {
-  if (empty($form_state['values']['skin_configurations'])) {
+  if (empty($form_state['values']['skinr_skins'])) {
     // Error.
-    form_error($form['skin_configurations'], t('These are not valid skin configurations.'));
+    form_error($form['skinr_skins'], t('These are not valid skin configurations.'));
     return;
   }
 
   $skins = '';
   ob_start();
-  eval($form_state['values']['skin_configurations']);
+  eval($form_state['values']['skinr_skins']);
   ob_end_clean();
 
   foreach ($skins as $key => $skin) {
-    if (!is_array($skin)) {
-      form_error($form['skin_configurations'], t('These are not valid skin configurations.'));
-      break;
-    }
-    $skins[$key] = (object) $skin;
-    if (!skinr_skin_validate($skins[$key])) {
-      form_error($form['skin_configurations'], t('These are not valid skin configurations.'));
+    if (!is_object($skin) || !skinr_skin_validate($skins[$key])) {
+      form_error($form['skinr_skins'], t('These are not valid skin configurations.'));
+      return;
     }
   }
 
@@ -1055,26 +1081,15 @@ function skinr_ui_import_form_validate(&$form, &$form_state) {
  * Form submission handler for skinr_ui_import_form().
  */
 function skinr_ui_import_form_submit(&$form, &$form_state) {
+  $status = TRUE;
   foreach ($form_state['skins'] as $skin) {
-    // Find existing skin configuration and grab its sid.
-    $params = array(
-      'theme' => $skin->theme,
-      'module' => $skin->module,
-      'element' => $skin->element,
-      'skin' => $skin->skin,
-    );
-    $sids = skinr_skin_get_sids($params);
-    if (!empty($sids)) {
-      $skin->sid = reset($sids);
-    }
-
-    // Save skin configuration.
-    if (!skinr_skin_save($skin)) {
-      drupal_set_message(t('Not all skin configurations could be saved!'), 'error', FALSE);
-    }
+    $status = skinr_skin_import($skin, TRUE) && $status;
   }
 
   drupal_set_message(t('The skin configurations have been saved.'));
+  if (!$status) {
+    drupal_set_message(t('Not all skin configurations could be saved!'), 'error', FALSE);
+  }
   drupal_goto('admin/structure/skinr');
 }
 
@@ -1178,6 +1193,46 @@ function skinr_ui_add_submit($form, &$form_state) {
 }
 
 /**
+ * Form builder for the skinr settings revert confirmation form.
+ *
+ * @param $skin
+ *   Tje skin configuration object to delete.
+ *
+ * @ingroup forms
+ */
+function skinr_ui_revert_confirm($form, &$form_state, $skin) {
+  $form['#skin'] = $skin;
+  // Always provide skin configuration sid in the same form key as in the skin
+  // configuration edit form.
+  $form['sid'] = array(
+    '#type' => 'value',
+    '#value' => $skin->sid,
+  );
+
+  $themes = list_themes();
+  return confirm_form($form,
+    t('Are you sure you want to permanently remove any customizations made to this skin configuration?'),
+    isset($_GET['destination']) ? $_GET['destination'] : 'admin/structure/skinr',
+    t('This action cannot be undone.<br />Theme: %theme<br />Module: %module<br />Element: %element<br />Skin: %skin', array('%theme' => $themes[$skin->theme]->info['name'], '%module' => $skin->module, '%element' => $skin->element, '%skin' => $skin->skin)),
+    t('Revert'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Form submission handler for skinr_ui_revert_confirm().
+ */
+function skinr_ui_revert_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    skinr_skin_revert($form_state['values']['sid']);
+    watchdog('skinr', 'Reverted a skin configuration.');
+    drupal_set_message(t('A skin configuration has been reverted.'));
+  }
+
+  $form_state['redirect'] = 'admin/structure/skinr';
+}
+
+/**
  * Form builder for the skinr settings delete confirmation form.
  *
  * @param $theme
@@ -1214,7 +1269,7 @@ function skinr_ui_delete_confirm($form, &$form_state, $skin) {
 function skinr_ui_delete_confirm_submit($form, &$form_state) {
   if ($form_state['values']['confirm']) {
     skinr_skin_delete($form_state['values']['sid']);
-    watchdog('content', 'Deleted a skin configuration.');
+    watchdog('skinr', 'Deleted a skin configuration.');
     drupal_set_message(t('A skin configuration has been deleted.'));
   }
 
diff --git a/skinr_ui.api.php b/skinr_ui.api.php
index 3eac6f18b6829ced00058729fb0e64ddbb3e00db..2d9ffe9909e1f9d8e51e3f751ce56820d6b69fe8 100644
--- a/skinr_ui.api.php
+++ b/skinr_ui.api.php
@@ -68,5 +68,33 @@ function hook_skinr_ui_element_title($module, $element, $theme_name) {
 }
 
 /**
+ * Alter the list of theme_hooks that are compatible with active skins.
+ *
+ * @param $skinable_hooks
+ *   An array where keys are identical to their value. The value is a theme hook.
+ */
+function hook_skinr_skinable_hooks_alter(&$skinable_hooks) {
+  $skinable_hooks['block__custom'] = 'block__custom';
+}
+
+/**
+ * Alter skinr administration filters that can be applied to skin configuration objects.
+ *
+ * @param $filters
+ *   An associative array of filters.
+ */
+function hook_skinr_ui_filters_alter(&$filters) {
+  // Status filter.
+  $filters['status'] = array(
+    'title' => t('status'),
+    'options' => array(
+      '[any]' => t('any'),
+      '1' => t('enabled'),
+      '0' => t('disabled'),
+    ),
+  );
+}
+
+/**
  * @}
  */
diff --git a/skinr_ui.module b/skinr_ui.module
index c8217ecaa1334aa7862ec1161350e31076edcc4a..f1a94fc5eb56858997b1ecdddf9774902d729d34 100755
--- a/skinr_ui.module
+++ b/skinr_ui.module
@@ -165,6 +165,16 @@ function skinr_ui_menu() {
     'file' => 'skinr_ui.admin.inc',
   );
 
+  // Revert a skin configuration.
+  $items['admin/structure/skinr/skin/%skinr_skin/revert'] = array(
+    'title' => 'Revert skin',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('skinr_ui_revert_confirm', 4),
+    'type' => MENU_CALLBACK,
+    'access arguments' => array('administer skinr'),
+    'file' => 'skinr_ui.admin.inc',
+  );
+
   // Delete a skin configuration.
   $items['admin/structure/skinr/skin/%skinr_skin/delete'] = array(
     'title' => 'Delete skin',
diff --git a/tests/skinr.test b/tests/skinr.test
index 0ab26707fe11276bcfc72f49c9e7809c889c052a..ad80b5eb1278fd872844c325a3b09ebe929e4b31 100644
--- a/tests/skinr.test
+++ b/tests/skinr.test
@@ -74,7 +74,7 @@ class SkinrInstallationTestCase extends DrupalWebTestCase {
 
   public static function getInfo() {
     return array(
-      'name' => 'Installation',
+      'name' => 'Core - Installation',
       'description' => 'Tests basic module installation.',
       'group' => 'Skinr',
     );
@@ -144,15 +144,13 @@ class SkinrInstallationTestCase extends DrupalWebTestCase {
 
 /**
  * Tests API functionality.
- *
- * @link http://drupal.org/node/953336#comment-3738456 Make sure this patch is applied to drupal core @endlink
  */
 class SkinrApiTestCase extends SkinrWebTestCase {
   protected $profile = 'testing';
 
   public static function getInfo() {
     return array(
-      'name' => 'API',
+      'name' => 'Core - API',
       'description' => 'Tests Skinr API functionality.',
       'group' => 'Skinr',
     );
@@ -533,42 +531,49 @@ class SkinrApiTestCase extends SkinrWebTestCase {
       'options' => array('option1', 'option2'),
       'status' => 1,
     );
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->theme was empty.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object not saved when $skin->theme is empty.');
 
     $skin->theme = 'skinr_test_subtheme';
     $skin->module = '';
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->module was empty.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object not saved when $skin->module is empty.');
 
     $skin->module = 'block';
     $skin->element = '';
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->element was empty.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object not saved when $skin->element is empty.');
 
     $skin->element = 'system-user-menu';
     $skin->skin = '';
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->skin was empty.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object not saved when $skin->skin is empty.');
 
     $skin->skin = 'skinr_test_subtheme';
     $skin->options = '';
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->options was not an array.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object not saved when $skin->options is not array.');
 
     $skin->options = array();
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->options was an empty array.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object saved when $skin->options is empty array.');
 
     $skin->options = array('option1' => 0, 'option2' => 0);
-    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object was not saved when $skin->options was a complex empty array.');
+    $this->assertFalse(skinr_skin_save($skin), 'Skin configuration object not saved when $skin->options is complex empty array.');
 
     $skin->options = array('option1', 'option2');
     $this->assertTrue(skinr_skin_save($skin), 'Skin configuration object was saved.');
-    $this->assertTrue(isset($skin->sid), 'The sid was added to the skin configuration object.');
+    $this->assertTrue(isset($skin->sid), 'SID added to skin configuration object.');
+    $this->assertTrue(isset($skin->uuid), 'UUID added to skin configuration object.');
+    $this->assertTrue(uuid_is_valid($skin->uuid), 'UUID for skin configuration object is valid.');
 
     // Test loading a skin configuration.
     $loaded_skin = skinr_skin_load($skin->sid);
-    $this->assertTrue(is_array($loaded_skin->options), 'Options for the skin configuration object were unserialized.');
+    $this->assertTrue(is_array($loaded_skin->options), 'Options for skin configuration object are unserialized.');
+
+    $this->assertTrue($loaded_skin->theme == $skin->theme && $loaded_skin->module == $skin->module && $loaded_skin->element == $skin->element && $loaded_skin->status == $skin->status && $loaded_skin->options[0] == $skin->options[0] && $loaded_skin->options[1] == $skin->options[1], 'Skin configuration object loaded.');
 
-    $this->assertTrue($loaded_skin->theme == $skin->theme && $loaded_skin->module == $skin->module && $loaded_skin->element == $skin->element && $loaded_skin->status == $skin->status && $loaded_skin->options[0] == $skin->options[0] && $loaded_skin->options[1] == $skin->options[1], 'Skin configuration object was loaded properly.');
+    // Test storage indicator.
+    $this->assertTrue(skinr_skin_storage($loaded_skin) == SKINR_STORAGE_IN_DATABASE, 'Storage indicator indicates stored in database.');
 
     // Save a second skin.
+    module_load_include('inc', 'skinr', 'skinr.uuid');
     $second_skin = (object) array(
+      'uuid' => uuid_generate(),
       'theme' => 'skinr_test_subtheme',
       'module' => 'block',
       'element' => 'system__main',
@@ -586,6 +591,127 @@ class SkinrApiTestCase extends SkinrWebTestCase {
     drupal_static_reset('skinr_skin_load_multiple');
     $skins = skinr_skin_load_multiple(FALSE);
     $this->assertTrue(count($skins) == 2 && isset($skins[$skin->sid]->sid) && isset($skins[$second_skin->sid]->sid), 'Successfully loaded all skins.');
+
+    // Test $skin->uuid not overwritten when given.
+    $this->assertTrue($skins[$second_skin->sid]->uuid == $second_skin->uuid, 'UUID for skin configuration not overwritten when manually set.');
+
+    // Test skinr_skin_uuid_to_sid().
+    $this->assertTrue(skinr_skin_uuid_to_sid($second_skin->uuid) == $second_skin->sid, 'Successfully got SID based on UUID for skin configuration object.');
+
+    // Test skinr_skin_sid_to_uuid().
+    $this->assertTrue(skinr_skin_sid_to_uuid($second_skin->sid) == $second_skin->uuid, 'Successfully got UUID based on SID for skin configuration object.');
+
+    // Test skinr_skin_load_by_uuid().
+    $loaded_skin = skinr_skin_load_by_uuid($second_skin->uuid);
+    $this->assertTrue($loaded_skin->sid == $second_skin->sid, 'Skin configuration object loaded using UUID.');
+
+    // Test skinr_skin_load_by_uuid() when bad UUID given.
+    $this->assertFalse(skinr_skin_load_by_uuid(uuid_generate()), 'Skin configuration object not loaded when using non-existing UUID.');
+  }
+
+  /**
+   * Test default skin configurations (in code) with duplicates.
+   */
+  public function testSkinrSkinDefaultsDuplicates() {
+    $uuid = '501ff0c3-db03-0944-9910-3a788f38097a';
+
+    module_enable(array('skinr_test_default'));
+    $default_skins = _skinr_skin_get_defaults();
+    $this->verbose(highlight_string('<?php ' . print_r($default_skins, TRUE), TRUE));
+
+    // Clear caches.
+    drupal_static_reset('_skinr_skin_get_defaults');
+
+    module_enable(array('skinr_test_default_duplicate'));
+    $default_skins = _skinr_skin_get_defaults();
+    $this->verbose(highlight_string('<?php ' . print_r($default_skins, TRUE), TRUE));
+
+    $this->assertFalse(is_array($default_skins[$uuid]), 'Default skin configuration replaced its duplicate.');
+
+    // Clean up.
+    module_disable(array('skinr_test_default_duplicate'));
+    drupal_static_reset('_skinr_skin_get_defaults');
+  }
+
+  /**
+   * Test default skin configurations (in code).
+   */
+  public function testSkinrSkinDefaults() {
+    $uuid = '501ff0c3-db03-0944-9910-3a788f38097a';
+
+    // Default skin configuration object should not exist yet.
+    $this->assertFalse(skinr_skin_uuid_to_sid($uuid), 'Default skin configuration does not exist.');
+
+    module_enable(array('skinr_test_default'));
+
+    // Test loading raw defaults.
+    $default_skins = _skinr_skin_get_defaults();
+
+    // Skin configuration object provided via hook_skinr_skin_defaults() in
+    // skinr_test.skinr_default.inc.
+    $this->assertTrue(isset($default_skins[$uuid]), 'Skin configuration in skinr_test.skinr_default.inc found.');
+    unset($default_skins[$uuid]);
+
+    // After asserting all expected, the list of default skins should be empty.
+    $this->assertTrue(empty($default_skins), t('No unexpected skin configurations found: <pre>@data</pre>', array(
+      '@data' => var_export($default_skins, TRUE),
+    )));
+
+    // Load a default skin configuration object.
+    $skin = skinr_skin_load_by_uuid($uuid);
+    $this->assertTrue($skin && $skin->uuid == $uuid, 'Successfully loaded default skin configuration.');
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_skin_storage($skin) == SKINR_STORAGE_IN_CODE, 'Storage indicator indicates stored in code.');
+
+    // Overridden status should not change storage indicator.
+    $skin->status = 0;
+    skinr_skin_save($skin);
+    $this->assertTrue(skinr_skin_storage($skin) == SKINR_STORAGE_IN_CODE, 'Storage indicator indicates stored in code.');
+
+    // Override a default skin configuration object.
+    $skin->status = 1;
+    $skin->options = array('option3');
+    skinr_skin_save($skin);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_skin_storage($skin) == SKINR_STORAGE_IN_CODE_OVERRIDDEN, 'Storage indicator indicates stored in code, but overridden in database.');
+
+    // Revert a default skin configuration object.
+    $this->assertTrue(skinr_skin_revert($skin->sid), 'Successfully reverted skin configuration to default.');
+    // Refresh skin configuration data.
+    $skin = skinr_skin_load_by_uuid($uuid);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_skin_storage($skin) == SKINR_STORAGE_IN_CODE, 'Storage indicator indicates stored in code.');
+
+    // Test re-enabling module containing defaults; re-importing an existing
+    // skin configuration.
+
+    // Override default skin configuration.
+    $skin->options = array('option3');
+    skinr_skin_save($skin);
+
+    // Disable, then re-enable module containing defaults.
+    module_disable(array('skinr_test_default'));
+    module_enable(array('skinr_test_default'));
+
+    // Refresh skin configuration data.
+    $skin = skinr_skin_load_by_uuid($uuid);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_skin_storage($skin) == SKINR_STORAGE_IN_CODE_OVERRIDDEN, 'After enabling module containing already existing default skin configuration, storage indicator indicates stored in code, but overridden in database.');
+
+    // Now test forced import.
+    $default_skins = _skinr_skin_get_defaults();
+    $default_skin = $default_skins[$uuid];
+    $this->assertTrue(skinr_skin_import($default_skin, TRUE), 'Successfully forced import of existing skin configuration.');
+
+    // Refresh skin configuration data.
+    $skin = skinr_skin_load_by_uuid($uuid);
+
+    // Test storage indicator.
+    $this->assertTrue(skinr_skin_storage($skin) == SKINR_STORAGE_IN_CODE, 'After forcing import of existing default skin configuration, storage indicator indicates stored in code again.');
   }
 }
 
@@ -600,7 +726,7 @@ class SkinrDisplayTestCase extends SkinrWebTestCase {
 
   public static function getInfo() {
     return array(
-      'name' => 'Display',
+      'name' => 'Core - Display',
       'description' => 'Tests if applied skins appear on the front-end.',
       'group' => 'Skinr',
     );
diff --git a/tests/skinr_test_default/skinr_test_default.info b/tests/skinr_test_default/skinr_test_default.info
new file mode 100644
index 0000000000000000000000000000000000000000..3cfafa853cf937bfd58d15e31a7f834c065abbb7
--- /dev/null
+++ b/tests/skinr_test_default/skinr_test_default.info
@@ -0,0 +1,6 @@
+name = Skinr Default Testing
+description = A test module used for testing skin configuration defined in code for Skinr.
+package = Testing
+core = 7.x
+hidden = TRUE
+dependencies[] = skinr_test
diff --git a/tests/skinr_test_default/skinr_test_default.module b/tests/skinr_test_default/skinr_test_default.module
new file mode 100644
index 0000000000000000000000000000000000000000..ed2d85b43c5aeb110617d8a7fdce148cca686165
--- /dev/null
+++ b/tests/skinr_test_default/skinr_test_default.module
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @file
+ * Skinr default testing module.
+ *
+ * Empty file is required.
+ */
diff --git a/tests/skinr_test_default/skinr_test_default.skinr_default.inc b/tests/skinr_test_default/skinr_test_default.skinr_default.inc
new file mode 100644
index 0000000000000000000000000000000000000000..52990fad40c757e753baba4adaa730b673c52224
--- /dev/null
+++ b/tests/skinr_test_default/skinr_test_default.skinr_default.inc
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @file
+ * skinr_test_default.skinr.inc
+ */
+
+/**
+ * Implements hook_skinr_skin_defaults().
+ */
+function skinr_test_default_skinr_skin_defaults() {
+  $skin = new stdClass();
+  $skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+  $skin->api_version = 2;
+  $skin->uuid = '501ff0c3-db03-0944-9910-3a788f38097a';
+  $skin->theme = 'skinr_test_subtheme';
+  $skin->module = 'block';
+  $skin->element = 'system__user-menu';
+  $skin->skin = 'skinr_test_subtheme';
+  $skin->options = array(
+    'option1' => 'option1',
+    'option2' => 'option2',
+  );
+  $skins['501ff0c3-db03-0944-9910-3a788f38097a'] = $skin;
+
+  return $skins;
+}
diff --git a/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.info b/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.info
new file mode 100644
index 0000000000000000000000000000000000000000..49466dd01fbecff09f1ce539a0ac393bba353505
--- /dev/null
+++ b/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.info
@@ -0,0 +1,6 @@
+name = Skinr Default Duplicate Testing
+description = A test module used for testing skin configuration defined in code for Skinr where duplicates cause a bug.
+package = Testing
+core = 7.x
+hidden = TRUE
+dependencies[] = skinr_test
diff --git a/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.module b/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.module
new file mode 100644
index 0000000000000000000000000000000000000000..ed2d85b43c5aeb110617d8a7fdce148cca686165
--- /dev/null
+++ b/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.module
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @file
+ * Skinr default testing module.
+ *
+ * Empty file is required.
+ */
diff --git a/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.skinr_default.inc b/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.skinr_default.inc
new file mode 100644
index 0000000000000000000000000000000000000000..78b387ce12ee7a2dbeb22207c2f35daf107fd13b
--- /dev/null
+++ b/tests/skinr_test_default_duplicate/skinr_test_default_duplicate.skinr_default.inc
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @file
+ * skinr_test_default_duplicate.skinr.inc
+ */
+
+/**
+ * Implements hook_skinr_skin_defaults().
+ */
+function skinr_test_default_duplicate_skinr_skin_defaults() {
+  $skin = new stdClass();
+  $skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+  $skin->api_version = 2;
+  $skin->uuid = '501ff0c3-db03-0944-9910-3a788f38097a';
+  $skin->theme = 'skinr_test_subtheme';
+  $skin->module = 'block';
+  $skin->element = 'system__user-menu';
+  $skin->skin = 'skinr_test_subtheme';
+  $skin->options = array(
+    'option3' => 'option3',
+  );
+  $skins['501ff0c3-db03-0944-9910-3a788f38097a'] = $skin;
+
+  return $skins;
+}
diff --git a/tests/skinr_ui.test b/tests/skinr_ui.test
index edc5aab1ab2c1ba1909ee373beb7f182ac8801f7..a9c2b35e62297ca750e7e418c9a8af1fb723cc47 100644
--- a/tests/skinr_ui.test
+++ b/tests/skinr_ui.test
@@ -121,10 +121,6 @@ class SkinrUIBasicTestCase extends SkinrUITestCase {
   /**
    * Tests basic configuration and applying of a skin.
    *
-   * @todo For some reason, contextual links are not visible in the debug output
-   *   when running tests; likely a core bug in contextual.js. However, the
-   *   links are contained in the output. Keep this in mind when manually
-   *   reviewing the debug output after running tests!
    * @todo Remove the overly verbose inline comments after the Skinr development
    *   team has figured out how to write tests.
    */
@@ -268,10 +264,7 @@ class SkinrUIBasicTestCase extends SkinrUITestCase {
 }
 
 /**
- * Tests UI functionality for Block plugin.
- */
-/**
- * Tests UI functionality for Block plugin.
+ * Tests whether or not elements are skinable in Skinr UI.
  */
 class SkinrUISkinableTestCase extends DrupalWebTestCase {
   public static function getInfo() {
@@ -329,14 +322,14 @@ class SkinrUISkinableTestCase extends DrupalWebTestCase {
 class SkinrUIAdminTestCase extends SkinrUITestCase {
   public static function getInfo() {
     return array(
-      'name' => 'Administration',
+      'name' => 'UI - Administration',
       'description' => 'Tests administrative Skinr UI functionality.',
       'group' => 'Skinr',
     );
   }
 
   function setUp() {
-    parent::setUp(array('skinr_test'));
+    parent::setUp(array('skinr_test', 'skinr_test_default'));
 
     $this->admin_user = $this->drupalCreateUser(array(
       'administer skinr',
@@ -387,7 +380,7 @@ class SkinrUIAdminTestCase extends SkinrUITestCase {
     // Override the default skin.
     $skin->element = 'system-main';
     $this->drupalGet('admin/structure/skinr');
-    $this->clickLink(t('disable'), 0);
+    $this->clickLink(t('disable'), 1);
     // Unaltered skin configuration object should have been saved with only the status updated.
     // Load an uncached version of the skin configuration object.
     $skin = skinr_skin_load_unchanged($skin->sid);
@@ -430,12 +423,89 @@ class SkinrUIAdminTestCase extends SkinrUITestCase {
     );
     skinr_skin_save($skin);
 
-    // Verify that the skin configuration appears on the skin configurations overview page.
+    // Verify that the skin configuration appears on the skin configurations
+    // overview page.
     $this->drupalGet('admin/structure/skinr');
     $this->assertLinkByHref('admin/structure/skinr/skin/' . $skin->sid . '/delete', 0, 'Skin configuration was found on overview page.');
 
+    // Test that revert link doesn't appear for default skin configurations.
+    $default_skin = skinr_skin_load_by_uuid('501ff0c3-db03-0944-9910-3a788f38097a');
+    $this->assertNoLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/revert', 0, 'No revert operation is available for default skin configuration.');
+
+    // Test that delete link does not appear for default skin configurations.
+    $this->assertNoLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/delete', 0, 'No delete operation is available for default skin configuration.');
+
+    // Test that revert link appears for skin configurations in code that are
+    // overridden in databse.
+    $default_skin->options = array('options3');
+    skinr_skin_save($default_skin);
+    $this->drupalGet('admin/structure/skinr');
+    $this->assertLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/revert', 0, 'Revert operation is available for overridden skin configuration.');
+
+    // Test that delete link does not appear for overridden skin configurations.
+    $this->assertNoLinkByHref('admin/structure/skinr/skin/' . $default_skin->sid . '/delete', 0, 'No delete operation is available for overridden skin configuration.');
+
+    // Test reverting overridden skin.
+    $this->clickLink(t('revert'), 0);
+    $this->drupalPost(NULL, array(), t('Revert'));
+
+    // Load an uncached version of the skin configuration object.
+    $default_skin = skinr_skin_load_unchanged($default_skin->sid);
+    $this->assertTrue(skinr_skin_storage($default_skin) == SKINR_STORAGE_IN_CODE, 'Overridden skin configuration was reverted to default.');
+
     // @todo Should we check the filtering and update options functionality?
   }
+
+  /**
+   * Tests skin configuration import and export forms.
+   */
+  function testSkinImportExport() {
+    $this->drupalGet('admin/structure/skinr/import');
+
+    $uuid1 = '16daa322-5ac0-49e4-cda2-809a13bb965b';
+    $uuid2 = '7384adb8-50a8-67d4-2dcd-5acda9b5c76e';
+
+    $edit = array(
+      'skinr_skins' => "\$skin = new stdClass();
+\$skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+\$skin->api_version = " . SKINR_VERSION . ";
+\$skin->uuid = '" . $uuid1 . "';
+\$skin->theme = 'bartik';
+\$skin->module = 'block';
+\$skin->element = 'system__main';
+\$skin->skin = 'skinr_test_example';
+\$skin->options = array(
+  'option1' => 'option1',
+);
+\$skins['" . $uuid1 . "'] = \$skin;
+
+\$skin = new stdClass();
+\$skin->status = TRUE; /* Edit this to false to make a default skin disabled initially */
+\$skin->api_version = " . SKINR_VERSION . ";
+\$skin->uuid = '" . $uuid2 . "';
+\$skin->theme = 'bartik';
+\$skin->module = 'block';
+\$skin->element = 'system__user-menu';
+\$skin->skin = 'skinr_test_subtheme';
+\$skin->options = array(
+  'option1' => 'option1',
+  'option2' => 'option2',
+);
+\$skins['" . $uuid2 . "'] = \$skin;
+",
+    );
+    $this->drupalPost(NULL, $edit, t('Import'));
+
+    // Now check if the imported skin configurations exist.
+    $skin1 = skinr_skin_load_by_uuid($uuid1);
+    $skin2 = skinr_skin_load_by_uuid($uuid2);
+    $this->assertTrue(isset($skin1->uuid) && $skin1->uuid == $uuid1 && isset($skin2->uuid) && $skin2->uuid == $uuid2, 'Successfully imported skin configurations.');
+
+    // Test export.
+    $this->drupalGet('admin/structure/skinr/export');
+    $this->drupalPost(NULL, array('theme' => 'bartik'), t('Export'));
+    $this->assertFieldByName('skinr_skins', $edit['skinr_skins'], 'Export value is correct.');
+  }
 }
 
 /**
