diff --git a/skinr.features.inc b/skinr.features.inc
new file mode 100644
index 0000000000000000000000000000000000000000..27b81561da7efaec0391acf2fcf7cf11c1d96c43
--- /dev/null
+++ b/skinr.features.inc
@@ -0,0 +1,128 @@
+<?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',
+      '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)) {
+      // Account for Skinr Context module.
+      // @todo See if this can be abstracted to skinr_context.features.inc.
+      if (module_exists('skinr_context')) {
+        if (!empty($skin->gid) && ($group = skinr_context_group_load($skin->gid))) {
+          $skin->group = $group->machine_name;
+        }
+        // Remove site specific $gid.
+        unset($skin->gid);
+      }
+
+      // Remove site specific $sid.
+      unset($skin->sid);
+
+      $code[] = "  \$skins['{$uuid}'] = " . features_var_export($skin, '  ') . ';';
+    }
+  }
+  $code[] = '';
+  $code[] = '  return $skins;';
+  $code = implode("\n", $code);
+
+  // Clear caches to prevent skins without sid or gid.
+  drupal_static_reset('skinr_skin_load_multiple');
+
+  return array('skinr_skin_defaults' => $code);
+}
+
+/**
+ * Implements hook_features_rebuild().
+ */
+function skinr_skin_features_rebuild($module_name) {
+  $skins = module_invoke($module_name, 'skinr_skin_defaults');
+  if (!empty($skins)) {
+    foreach ($skins as $uuid => $skin) {
+      $skin = (object) $skin;
+      if ($sid = skinr_skin_uuid_to_sid($uuid)) {
+        $skin->sid = $sid;
+      }
+
+      // Account for Skinr Context module.
+      // @todo See if this can be abstracted to skinr_context.features.inc.
+      if (module_exists('skinr_context')) {
+        if (!empty($skin->group) && ($group = skinr_context_group_load_by_machine_name($skin->group))) {
+          $skin->gid = $group->gid;
+        }
+        // Remove site specific $gid.
+        unset($skin->group);
+      }
+
+      skinr_skin_save($skin);
+    }
+  }
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function skinr_skin_features_revert($module_name) {
+  return skinr_skin_features_rebuild($module_name);
+}
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..617903d79f895e5ccf7c0325273b27637186594f 100644
--- a/skinr.module
+++ b/skinr.module
@@ -609,6 +609,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 +690,41 @@ 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];
+}
+
+/**
+ * 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 +761,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 +806,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();
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.features.inc b/skinr_context/skinr_context.features.inc
new file mode 100644
index 0000000000000000000000000000000000000000..84d5901de8ddf5d3e441da9e690b569b386260a1
--- /dev/null
+++ b/skinr_context/skinr_context.features.inc
@@ -0,0 +1,121 @@
+<?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',
+      '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 $machine_name) {
+    $export['features']['skinr_group'][$machine_name] = $machine_name;
+  }
+  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->machine_name;
+      }
+    }
+  }
+}
+
+/**
+ * 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->machine_name] = t('@type: @element: @group (@machine_name)', array(
+      '@type' => $group->module,
+      '@element' => $title ? strip_tags($title) : $group->element,
+      '@group' => $group->title,
+      '@machine_name' => $group->machine_name,
+    ));
+  }
+  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 $machine_name) {
+    if ($group = skinr_context_group_load_by_machine_name($machine_name)) {
+      // Remove site specific $gid.
+      unset($group->gid);
+
+      $code[] = "  \$groups['{$machine_name}'] = " . features_var_export($group, '  ') . ';';
+    }
+  }
+  $code[] = '';
+  $code[] = '  return $groups;';
+  $code = implode("\n", $code);
+
+  // Clear caches to prevent groups without gid.
+  drupal_static_reset('skinr_context_group_load_multiple');
+
+  return array('skinr_context_group_defaults' => $code);
+}
+
+/**
+ * Implements hook_features_rebuild().
+ */
+function skinr_group_features_rebuild($module_name) {
+  $groups = module_invoke($module_name, 'skinr_context_group_defaults');
+  if (!empty($groups)) {
+    foreach ($groups as $machine_name => $group) {
+      $group = (object) $group;
+      if ($gid = skinr_context_group_machine_name_to_gid($machine_name)) {
+        $group->gid = $gid;
+      }
+      skinr_context_group_save($group);
+    }
+  }
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function skinr_group_features_revert($module_name) {
+  return skinr_group_features_rebuild($module_name);
+}
diff --git a/skinr_context/skinr_context.install b/skinr_context/skinr_context.install
index 14798aeff46a5246d130e36026a344c8b30b5294..5d2e91d04696ef0d97b1cfc434d0fb921e88d323 100644
--- a/skinr_context/skinr_context.install
+++ b/skinr_context/skinr_context.install
@@ -18,6 +18,12 @@ function skinr_context_schema() {
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
+      'machine_name' => array(
+        'description' => 'Unique Key: The machine readable name for this Skinr Configuration Group.',
+        'type' => 'varchar',
+        'length' => 96,
+        'not null' => TRUE,
+      ),
       'module' => array(
         'description' => 'The module this group applies to.',
         'type' => 'varchar',
@@ -164,3 +170,42 @@ function skinr_context_enable() {
     }
   }
 }
+
+/**
+ * Add machine names to Skinr Configuration Groups.
+ */
+function skinr_context_update_7200() {
+  $spec = array(
+    'description' => 'Unique Key: The machine readable name for this Skinr Configuration Group.',
+    'type' => 'varchar',
+    'length' => 96,
+    'not null' => FALSE,
+  );
+  $keys = array(
+    'unique keys' => array(
+      'machine_name' => array('machine_name'),
+    ),
+  );
+  db_add_field('skinr_groups', 'machine_name', $spec, $keys);
+
+  // 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] = $machine_name;
+
+    db_update('skinr_groups')
+      ->fields(array(
+        'machine_name' => $machine_name,
+      ))
+      ->condition('gid', $group->gid)
+      ->isNull('machine_name')
+      ->execute();
+  }
+}
diff --git a/skinr_context/skinr_context.module b/skinr_context/skinr_context.module
index df856eb1d514731c0c1b9d1778c78aa2c7403358..301a9085745de9511ca538b016c408d311a6b58e 100644
--- a/skinr_context/skinr_context.module
+++ b/skinr_context/skinr_context.module
@@ -128,6 +128,41 @@ function skinr_context_group_load($gid = NULL) {
 }
 
 /**
+ * Get skin configuration IDs.
+ */
+function skinr_context_group_machine_name_to_gid($machine_name) {
+  $machine_names = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($machine_names[$machine_name])) {
+    $machine_names[$machine_name] = db_query("SELECT gid FROM {skinr_groups} WHERE machine_name = :machine_name", array(
+      ':machine_name' => $machine_name,
+    ))->fetchField();
+  }
+
+  return $machine_names[$machine_name];
+}
+
+/**
+ * Load a skin settings group object from the database using its machine name.
+ *
+ * @param $machine_name
+ *   The machine name of the skin settings group to load.
+ *
+ * @return
+ *   A fully-populated skin settings group object.
+ */
+function skinr_context_group_load_by_machine_name($machine_name) {
+  if (!$gid = skinr_context_group_machine_name_to_gid($machine_name)) {
+    return FALSE;
+  }
+
+  // Run this through skinr_context_group_load_multiple() to preserve caching.
+  $group = skinr_context_group_load_multiple(array($gid));
+
+  return $group ? reset($group) : FALSE;
+}
+
+/**
  * Load skin settings group objects from the database.
  *
  * This function should be used whenever you need to load more than one skin
@@ -164,7 +199,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', 'machine_name', 'module', 'element', 'title', 'description', 'conditions', 'condition_mode', 'weight', 'status'));
     if ($gids !== FALSE) {
       $query->condition('gid', $gids);
     }
@@ -208,8 +244,9 @@ 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, machine_name, module, element, title, description, conditions, condition_mode, weight, status FROM {skinr_groups} WHERE gid = :gid", array(
     ':gid' => $gid,
   ))
   ->fetchObject();
diff --git a/skinr_context/skinr_context_ui.module b/skinr_context/skinr_context_ui.module
index da5819e5d70abbbe1fcf4f4e6b40e5e2d876244e..0fbc87988c4a52031a6f9776910b5e046c7634cd 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['machine_name'] = 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'),
@@ -159,6 +171,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,
+    'machine_name' => $form_state['values']['machine_name'],
     'module' => $form_state['values']['module'],
     'element' => $form_state['values']['element'],
     'title' => $form_state['values']['title'],
@@ -411,8 +424,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);
@@ -442,6 +455,14 @@ function skinr_context_ui_form_ctools_export_ui_edit_item_form_alter(&$form, &$f
   }
 }
 
+function skinr_context_ui_group_name_exists($value) {
+  return 0;
+
+  // 'menu-' is added to the menu name to avoid name-space conflicts.
+  // $value = 'menu-' . $value;
+  return db_query_range('SELECT 1 FROM {skinr_groups} WHERE machine_name = :machine_name', 0, 1, array(':machine_name' => $value))->fetchField();
+}
+
 /**
  * Implements hook_form_alter().
  */
@@ -467,12 +488,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,6 +503,26 @@ 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']['machine_name'] = array(
+    '#type' => 'machine_name',
+    '#title' => t('Group name'),
+    '#default_value' => strpos($group->machine_name, $machine_name_prefix) === 0 ? substr($group->machine_name, strlen($machine_name_prefix)) : $group->machine_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' => $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' => !empty($menu['old_name']),
+  );
+
   $form['skinr_group']['description'] = array(
     '#type' => 'textfield',
     '#title' => t('Description'),
@@ -555,8 +598,9 @@ 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, machine_name and description.
   $group->title = $form_state['values']['skinr_group']['title'];
+  $group->machine_name = $module . ':' . $element . ':' . $form_state['values']['skinr_group']['machine_name'];
   $group->description = $form_state['values']['skinr_group']['description'];
 
   // Update context.
diff --git a/skinr_context/tests/skinr_context.test b/skinr_context/tests/skinr_context.test
index 2662753fa6bd4406a4816cf9c0ff2216c60e069e..a1dc0c276c2569202223ad01e2f9121a07ea110a 100644
--- a/skinr_context/tests/skinr_context.test
+++ b/skinr_context/tests/skinr_context.test
@@ -32,6 +32,7 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
 
     // Only save valid groups.
     $group = (object) array(
+      'machine_name' => 'block:system__user-menu:default',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'Default',
@@ -48,10 +49,11 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
     $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->machine_name == $group->machine_name && $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(
+      'machine_name' => 'block:system__main-menu:default',
       'module' => 'block',
       'element' => 'system__main-menu',
       'title' => 'Default',
@@ -67,13 +69,24 @@ 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 skinr_context_group_machine_name_to_gid().
+    $this->assertTrue(skinr_context_group_machine_name_to_gid($second_group->machine_name) == $second_group->gid, 'Successfully got GID based on machine name for skin settings group.');
+
+    // Test skinr_context_group_load_by_machine_name().
+    $loaded_group = skinr_context_group_load_by_machine_name($second_group->machine_name);
+    $this->assertTrue($loaded_group->gid == $second_group->gid, 'Successfully loaded skin settings group using machine name.');
+
+    // Test skinr_context_group_load_by_machine_name() when bad machine_name given.
+    $this->assertFalse(skinr_context_group_load_by_machine_name('random:machine:name'), 'Skin settings group not loaded when using non-existing machine name.');
+
     // Test deleting groups.
     $third_group = (object) array(
+      'machine_name' => 'block:system__main-menu:alternate',
       'module' => 'block',
       'element' => 'system__main-menu',
       'title' => 'Alternate',
@@ -101,6 +114,7 @@ class SkinrContextApiTestCase extends SkinrWebTestCase {
    */
   public function testSkinrContextGroupHooks() {
     $group = (object) array(
+      'machine_name' => 'block:system__user-menu:default',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'Default',
@@ -203,6 +217,7 @@ class SkinrContextDisplayTestCase extends SkinrWebTestCase {
   public function testSkinrContextDisplayed() {
     // Save a group.
     $group = (object) array(
+      'machine_name' => 'block:system__main:default',
       'module' => 'block',
       'element' => 'system__main',
       'title' => 'Default',
diff --git a/skinr_context/tests/skinr_context_ui.test b/skinr_context/tests/skinr_context_ui.test
index 09fbbbfd2ea93383935029caab4d0b1cc5a98ed7..141ae187d06dc1bea36280ebbe8363fa07799a57 100644
--- a/skinr_context/tests/skinr_context_ui.test
+++ b/skinr_context/tests/skinr_context_ui.test
@@ -35,6 +35,7 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
   function testGroupList() {
     // Add a group.
     $group = (object) array(
+      'machine_name' => 'block:system__user-menu:default',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'Default',
@@ -127,6 +128,7 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
     // Post the form.
     $edit = array(
       'title' => 'SkinrContextGroupTest',
+      'machine_name' => 'skinrcontextgrouptest',
     );
     $this->drupalPost(NULL, $edit, t('Add group'));
 
@@ -144,6 +146,7 @@ class SkinrContextUIBasicTestCase extends SkinrContextUITestCase {
    */
   function testSkinListingWithGroups() {
     $group = (object) array(
+      'machine_name' => 'block:system__user-menu:skinlistingwithgroup',
       'module' => 'block',
       'element' => 'system__user-menu',
       'title' => 'SkinListingWithGroup',
diff --git a/tests/skinr.test b/tests/skinr.test
index 0ab26707fe11276bcfc72f49c9e7809c889c052a..e7d88896466e4a69ddbb1864ee5212aba3772fa0 100644
--- a/tests/skinr.test
+++ b/tests/skinr.test
@@ -560,6 +560,8 @@ class SkinrApiTestCase extends SkinrWebTestCase {
     $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->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);
@@ -568,7 +570,9 @@ class SkinrApiTestCase extends SkinrWebTestCase {
     $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.');
 
     // 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 +590,19 @@ 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_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.');
   }
 }
 
