diff --git a/role_export.install b/role_export.install
index 8169bcb..ca4a8bd 100644
--- a/role_export.install
+++ b/role_export.install
@@ -38,7 +38,7 @@ function role_export_install() {
   $roles = db_query("SELECT rid, name FROM {role} WHERE rid != 1 AND rid != 2");
   while ($role = db_fetch_object($roles)) {
     $rid = $role->rid;
-    $machine_name = 'role-' . str_replace(' ', '_', strtolower($role->name));
+    $machine_name = str_replace(' ', '_', strtolower($role->name));
     db_query("UPDATE {role} SET machine_name = '%s' WHERE rid = %d", $machine_name, $rid);
   }
 }
diff --git a/role_export.module b/role_export.module
index cfd3bb3..81ec678 100644
--- a/role_export.module
+++ b/role_export.module
@@ -13,7 +13,7 @@
  * Implementation of hook_init().
  */
 function role_export_init() {
-  role_export_roles();
+  role_export_roles(true);
 }
 
 /**
@@ -40,7 +40,7 @@ function role_export_form_alter(&$form, &$form_state, $form_id) {
         '#title' => t('Machine Name'),
         '#type' => 'textfield',
         '#maxlength' => 255,
-        '#default_value' => str_replace('role-', '', $roles[$form['rid']['#value']]->machine_name),
+        '#default_value' => $roles[$form['rid']['#value']]->machine_name,
         // Role machine names can not be edited.
         '#disabled' => TRUE,
         '#weight' => -1,
@@ -56,7 +56,7 @@ function role_export_form_alter(&$form, &$form_state, $form_id) {
  */
 function role_export_role_name_exists($form, &$form_state) {
   $roles = role_export_roles();
-  $value = 'role-' . $form_state['values']['machine_name'];
+  $value = $form_state['values']['machine_name'];
   foreach ($roles as $role) {
     if ($role->machine_name == $value) {
       form_set_error('machine_name', t('The machine_name you\'ve currently entered is already taken and must be unique. Please enter in a new machine_name.'));
@@ -75,7 +75,7 @@ function role_export_submit($form, &$form_state) {
   $op = $form_state['values']['op'];
   if ($op == 'Add role') {
     $role = (object) $form_state['values'];
-    $mname = 'role-' . $role->machine_name;
+    $mname = $role->machine_name;
     $query = db_fetch_object(db_query("SELECT rid FROM {role} WHERE name = '%s'", $role->name));
     $rid = role_export_generate_id($mname);
     db_query("UPDATE {role} SET rid = %d, machine_name = '%s' WHERE rid = %d", $rid, $mname, $query->rid);
@@ -100,11 +100,11 @@ function role_export_theme() {
  * from the 'role_export' table. Then store the data into cache. This helps to
  * improve performance by removing several queries.
  */
-function role_export_roles() {
+function role_export_roles($reset = false) {
   static $roles;
-  if (!isset($roles)) {
+  if (!isset($roles) || $reset) {
     $cache = cache_get('role_export_roles');
-    if ($cache) {
+    if ($cache && !$reset) {
       $roles = $cache->data;
     }
     else {
@@ -112,16 +112,16 @@ function role_export_roles() {
       // Select all roles that are not 'anonymous' or 'authenticated'
       $query = db_query("SELECT rid, name, machine_name FROM {role} WHERE rid != 1 AND rid != 2");
       while($value = db_fetch_object($query)) {
-        // Check for a machine_name value
-        if ($value->machine_name == '') {
-          // Generate machine_name and unique rid.
-          $mname = 'role-' . role_export_machine_name_gen($value->name);
-          $rid = role_export_generate_id($mname);
+        // Ensure the rid is the machine_name's hash
+        if ($value->rid != role_export_generate_id($value->machine_name)) {
+          if (empty($value->machine_name)) {
+            $value->machine_name = role_export_machine_name_gen($value->name);
+          }
+          $new_rid = role_export_generate_id($value->machine_name);
           // Update the current role with the new data.
-          db_query("UPDATE {role} SET rid = %d, machine_name = '%s' WHERE rid = %d", $rid, $mname, $value->rid);
-          // Assign the new values to the object.
-          $value->rid = $rid;
-          $value->machine_name = $mname;
+          db_query("UPDATE {role} SET rid = %d, machine_name = '%s' WHERE rid = %d", $new_rid, $value->machine_name, $value->rid);
+          // Update our cached object's rid.
+          $value->rid = $new_rid;
         }
         $roles[$value->rid] = $value;
       }
@@ -161,4 +161,107 @@ function role_export_generate_id($mname) {
  $shorter = substr($hash, -8);
  $number = hexdec($shorter);
  return (int) $number;
-}
\ No newline at end of file
+}
+
+/**
+ * Implement hook_drush_exit().
+ */
+function role_export_drush_exit() {
+  role_export_roles(true);
+}
+
+/**
+ * Implementation of hook_features_api().
+ */
+function role_export_features_api() {
+  return array(
+    'role_export' => array(
+      'name' => t('Role Export'),
+      'feature_source' => TRUE,
+      'default_hook' => 'role_export_defaults',
+      'default_file' => FEATURES_DEFAULTS_INCLUDED,
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_features_export().
+ */
+function role_export_features_export($data, &$export, $module_name = '') {
+  $export['dependencies']['features'] = 'features';
+  $map = features_get_default_map('role_export', 'name');
+  foreach ($data as $role) {
+    // Role is provided by another module. Add dependency.
+    if (isset($map[$role]) && $map[$role] != $module_name) {
+      $export['dependencies'][$map[$role]] = $map[$role];
+    }
+    // Export.
+    else {
+      $export['features']['role_export'][$role] = $role;
+    }
+  }
+  return array();
+}
+
+/**
+ * Implementation of hook_features_export_options().
+ */
+function role_export_features_export_options() {
+  $roles = role_export_roles();
+  $options = array();
+  foreach ($roles as $rid => $role) {
+    $options[$role->machine_name] = $role->name;
+  }
+  asort($options);
+  return $options;
+}
+
+/**
+ * Implementation of hook_features_export_render().
+ */
+function role_export_features_export_render($module, $data) {
+  $code = array();
+  $code[] = '  $roles = array();';
+  $code[] = '';
+
+  $roles = role_export_roles();
+  $rolesByMachineName = array();
+  foreach ($roles as $rid => $role) {
+    $rolesByMachineName[$role->machine_name] = $role;
+  }
+
+  foreach ($data as $machine_name) {
+    if (isset($rolesByMachineName[$machine_name])) {
+      $role_identifier = features_var_export($machine_name);
+      $role_export = features_var_export($rolesByMachineName[$machine_name], '  ');
+      $code[] = "  \$roles[{$role_identifier}] = {$role_export};";
+      $code[] = "";
+    }
+  }
+
+  $code[] = '  return $roles;';
+  $code = implode("\n", $code);
+
+  return array('role_export_defaults' => $code);
+}
+
+/**
+ * Implementation of hook_features_revert().
+ */
+function role_export_features_revert($module) {
+  role_export_features_rebuild($module);
+}
+
+/**
+ * Implementation of hook_features_rebuild().
+ */
+function role_export_features_rebuild($module) {
+  if ($defaults = features_get_default('role_export', $module)) {
+    $normals = role_export_roles();
+    foreach ($defaults as $machine_name => $role) {
+      db_query("DELETE FROM {role} WHERE rid = %d OR name = '%s' OR machine_name = '%s'", $role['rid'], $role['name'], $role['machine_name']);
+      drupal_write_record('role', $role);
+    }
+    role_export_roles(true);
+  }
+}
