diff --git a/password_policy.module b/password_policy.module
index e990fd3..f19d9c2 100644
--- a/password_policy.module
+++ b/password_policy.module
@@ -464,6 +464,18 @@ function password_policy_user_update(&$edit, $account, $category) {
       ->condition('uid', $account->uid)
       ->execute();
   }
+  password_policy_password_save($edit['pass'], $account);
+}
+
+/**
+ * Password save handler.
+ */
+function password_policy_password_save($pass, $account) {
+  // Track the hashed password values which can then be used in the history
+  // constraint.
+  if ($account->uid && !empty($pass)) {
+    _password_policy_store_password($account->uid, $pass);
+  }
 }
 
 /**
@@ -810,6 +822,71 @@ function password_policy_field_extra_fields() {
 }
 
 /****************************************************************************/
+/* Contrib API Hooks                                                        */
+/*****************************************************************************/
+
+/**
+ * Implements hook_features_enable_feature().
+ */
+function password_policy_features_enable_feature($module) {
+  password_policy_features_revert($module);
+}
+
+/**
+ * Implementation of hook_features_revert()
+ */
+function password_policy_features_revert($module) {
+
+  // Retrieving default data.
+  $default_policies = features_get_default('password_policy', $module);
+
+  if (empty($default_policies)) {
+    return;
+  }
+
+  $role_policies = features_get_default('password_policy_role', $module);
+
+  // Retrieving db data.
+  $data_base_policies = db_query("select pid, name from {password_policy}")->fetchAllKeyed(1, 0);
+
+  foreach ($default_policies as $name => $default_policy) {
+
+    $key = array();
+
+    if (isset($data_base_policies[$name])) {
+      $key = 'pid';
+      $default_policy->pid = $data_base_policies[$name];
+    }
+
+    $record = (array)$default_policy;
+    $policy_written = drupal_write_record("password_policy", $record, $key);
+
+    foreach ($role_policies as $policy ) {
+      $role_record = array('pid' => $record["pid"], 'rid' => $policy->rid);
+      try {
+        drupal_write_record("password_policy_role", $role_record);
+      } catch (PDOException $e) {
+        // If it already exists, we can safely fail silently.
+        // The MySQL Error Code for such errors is 1062.
+        if ($e->errorInfo[1] != 1062
+            // We also need to check the message to confidently identify a
+            // duplicate primary key error.
+            || strpos($e->errorInfo[2], "Duplicate entry") !== 0) {
+          // Still throw if it's not a recognized Exception.
+          throw $e;
+        }
+      }
+    }
+
+  }
+
+  if (!empty($role_policies)) {
+    drupal_set_message('Assigned all Password Policy Roles to all Policies by Role ID (rid).');
+  }
+
+}
+
+/****************************************************************************/
 /* FAPI                                                                     */
 /****************************************************************************/
 
@@ -847,14 +924,7 @@ function password_policy_password_validate($form, &$form_state) {
  * Password save submit handler.
  */
 function password_policy_password_submit($form, &$form_state) {
-  $values = $form_state['values'];
-  $account = isset($form['#user']) ? $form['#user'] : (object) array('uid' => 0);
-
-  // Track the hashed password values which can then be used in the history
-  // constraint.
-  if ($account->uid && !empty($values['pass'])) {
-    _password_policy_store_password($account->uid, $values['pass']);
-  }
+  password_policy_password_save($form_state['values']['pass'], $form['#user']);
 }
 
 /****************************************************************************/
