diff --git a/skinr.features.inc b/skinr.features.inc
new file mode 100644
index 0000000000000000000000000000000000000000..c12dc5ede7b18373ad81ed082d5254a3010f5778
--- /dev/null
+++ b/skinr.features.inc
@@ -0,0 +1,104 @@
+<?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_skins'] = 'skinr';
+
+  // The following is the simplest implementation of a straight object export
+  // with no further export processors called.
+  foreach ($data as $component) {
+    $export['features']['skinr_skin'][$component] = $component;
+  }
+  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)) {
+      // Remove site specific $sid.
+      unset($skin->sid);
+      $code[] = "  \$skins['{$uuid}'] = " . features_var_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) {
+  $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;
+      }
+      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..6f47a3d7e7194005dda33c5b4a323d7fd3df2f0c 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,39 @@ function skinr_skin_load($sid = NULL) {
 }
 
 /**
+ * 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) {
+  $sid = skinr_skin_uuid_to_sid($uuid);
+
+  // Run this through skinr_skin_load_multiple() to preserve caching.
+  $skin = skinr_skin_load_multiple(array($sid));
+
+  return $skin ? reset($skin) : FALSE;
+}
+
+/**
+ * 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 skin configuration objects from the database.
  *
  * This function should be used whenever you need to load more than one skin
@@ -718,7 +759,8 @@ function skinr_skin_load_multiple($sids = array()) {
   if ($sids === FALSE || $sids) {
     // Build the query.
     $query = db_select('skinr_skins', 's')
-      ->fields('s');
+      // Enter specific order to ensure consistent import/export.
+      ->fields('s', array('sid', 'uuid', 'theme', 'module', 'element', 'skin', 'options', 'status'));
     if ($sids !== FALSE) {
       $query->condition('sid', $sids);
     }
diff --git a/skinr.uuid.inc b/skinr.uuid.inc
new file mode 100644
index 0000000000000000000000000000000000000000..45c9d5911ed18ddc5ee76628ce5dc5ea041fc665
--- /dev/null
+++ b/skinr.uuid.inc
@@ -0,0 +1,97 @@
+<?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__);
+  dpm('skinr version');
+
+  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)
+  );
+}
+
+}
