diff --git a/skinr.features.inc b/skinr.features.inc
new file mode 100644
index 0000000..86d7a24
--- /dev/null
+++ b/skinr.features.inc
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Implementation of hook_features_export_options().
+ */
+function skinr_rules_features_export_options() {
+  $rules = array();
+  foreach (skinr_rule_load_multiple() as $rule) {
+    $rules[$rule->machine_name] = $rule->title;
+  }
+  return $rules;
+}
+
+/**
+ * Implementation of hook_features_export().
+ *
+ * @todo Test adding existing dependencies.
+ */
+function skinr_rules_features_export($data, &$export, $module_name = '') {
+  $pipe = array();
+
+  $export['dependencies']['features'] = 'features';
+  $export['dependencies']['skinr'] = 'skinr';
+  foreach ($data as $rule) {
+    $export['features']['skinr_rules'][$rule] = $rule;
+  }
+
+  return $pipe;
+}
+
+/**
+ * Implementation of hook_features_export_render().
+ */
+function skinr_rules_features_export_render($module, $data) {
+  $rules = skinr_rule_load_multiple();
+  $code = array();
+  foreach ($data as $machine_name) {
+    foreach ($rules as $rule) {
+      if ($rule->machine_name == $machine_name) {
+        unset($rule->rid);
+        $code[$machine_name] = $rule;
+      }
+    }
+  }
+  $code = "  return ". features_var_export($code, '  ') .";";
+  return array('skinr_default_rules' => $code);
+}
+
+/**
+ * Implementation of hook_features_revert().
+ */
+function skinr_rules_features_revert($module) {
+  skinr_rules_features_rebuild($module);
+}
+
+/**
+ * Implementation of hook_features_rebuild().
+ *
+ * Rebuilds Skinr rules from code defaults.
+ */
+function skinr_rules_features_rebuild($module) {
+  if ($rules = features_get_default('skinr_rules', $module)) {
+    $existing = skinr_rule_load_multiple();
+    foreach ($rules as $rule) {
+      $rule = (object) $rule;
+      foreach ($existing as $existing_rule) {
+        if ($existing_rule->machine_name === $rule->machine_name) {
+          $rule->rid = $existing_rule->rid;
+        }
+      }
+      // Need to cast visibility as an int because is exported out as string.
+      $rule->visibility = (int) $rule->visibility;
+      skinr_rule_save($rule);
+    }
+  }
+}
+
diff --git a/skinr.install b/skinr.install
index 8a2577a..698373d 100644
--- a/skinr.install
+++ b/skinr.install
@@ -81,6 +81,13 @@ function skinr_schema() {
         'not null' => TRUE,
         'description' => 'Primary Key: Unique skinr rule ID.',
       ),
+      'machine_name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The rule machine name.',
+      ),
       'title' => array(
         'description' => 'The administrative title for this rule.',
         'type' => 'varchar',
diff --git a/skinr.module b/skinr.module
index 7b7be81..acad88d 100644
--- a/skinr.module
+++ b/skinr.module
@@ -1337,3 +1337,17 @@ function skinr_themes_enabled() {
 function skinr_themes_disabled() {
   skinr_cache_reset();
 }
+
+/**
+ * Implements hook_features_api().
+ */
+function skinr_features_api() {
+  return array(
+    'skinr_rules' => array(
+      'name' => t('Skinr Rules'),
+      'feature_source' => TRUE,
+      'default_hook' => 'skinr_default_rules',
+      'default_file' => FEATURES_DEFAULTS_INCLUDED,
+    ),
+  );
+}
diff --git a/skinr_ui.rules.inc b/skinr_ui.rules.inc
index 2a217e7..33b8bfc 100644
--- a/skinr_ui.rules.inc
+++ b/skinr_ui.rules.inc
@@ -67,6 +67,16 @@ function skinr_rule_add($form, &$form_state) {
     '#description' => t('Descriptive title for this rule; used by administrators.'),
     '#required' => TRUE,
   );
+  $form['rule']['machine_name'] = array(
+    '#type' => 'machine_name',
+    '#default_value' => !empty($form_state['values']['rule']['machine_name']) ? $form_state['values']['rule']['machine_name'] : '',
+    '#maxlength' => 255,
+    '#machine_name' => array(
+      'exists' => 'skinr_rule_machine_name_load',
+      'source' => array('rule', 'title'),
+    ),
+  );
+  
   $options = array('page' => t('Page'));
    foreach (list_themes() as $theme_name => $theme) {
      if (empty($theme->status)) {
@@ -104,6 +114,7 @@ function skinr_rule_add($form, &$form_state) {
 function skinr_rule_add_submit($form, &$form_state) {
   $rule = new stdClass();
   $rule->rid = NULL;
+  $rule->machine_name = $form_state['values']['rule']['machine_name'];
   $rule->title = $form_state['values']['rule']['title'];
   $rule->rule_type = $form_state['values']['rule']['rule_type'];
   $rule->node_types = array();
