diff --git a/password_policy.test b/password_policy.test
index 7e6e4c1..b118246 100644
--- a/password_policy.test
+++ b/password_policy.test
@@ -306,7 +306,18 @@ class PasswordPolicyTestUICase extends DrupalWebTestCase {
     $password_policy->api_version = 1;
     $password_policy->name = 'strong';
     $password_policy->export_type = NULL;
-    $password_policy->config = 'a:9:{s:11:"alpha_count";a:1:{s:11:"alpha_count";s:1:"1";}s:10:"char_count";a:1:{s:10:"char_count";s:1:"8";}s:11:"consecutive";a:1:{s:22:"consecutive_char_count";s:0:"";}s:9:"int_count";a:1:{s:9:"int_count";s:1:"1";}s:14:"past_passwords";a:1:{s:14:"past_passwords";s:1:"2";}s:12:"symbol_count";a:2:{s:12:"symbol_count";s:1:"0";s:20:"symbol_count_symbols";s:30:"!@#$%^&*()_+=-|}{"?:><,./;\'\\[]";}s:8:"username";a:1:{s:7:"enabled";b:1;}s:4:"role";a:1:{s:5:"roles";a:2:{i:2;i:0;i:3;i:0;}}s:6:"expire";a:4:{s:12:"expire_limit";s:1:"0";s:25:"expire_warning_email_sent";s:8:"-14 days";s:28:"expire_warning_email_message";s:0:"";s:28:"expire_warning_email_subject";s:92:"[user:name] you password on [site:name] shall expire in [password_expiration_date:interval] ";}}';
+    $password_policy->config = 'a:9:{s:11:"alpha_count";a:1:{s:11:"alpha_count";s:1:"1";}s:10:"char_count";a:1:{s:10:"char_count";s:1:"8";}s:11:"consecutive";a:1:{s:22:"consecutive_char_count";s:0:"";}s:9:"int_count";a:1:{s:9:"int_count";s:1:"1";}s:14:"past_passwords";a:1:{s:14:"past_passwords";s:1:"2";}s:12:"symbol_count";a:2:{s:12:"symbol_count";s:1:"0";s:20:"symbol_count_symbols";s:30:"!@#$%^&*()_+=-|}{"?:><,./;\'\\[]";}s:8:"username";a:1:{s:7:"enabled";b:1;}s:4:"role";a:1:{s:5:"roles";a:2:{i:2;i:0;i:3;i:0;}}s:6:"expire";a:4:{s:12:"expire_limit";s:1:"0";s:25:"expire_warning_email_sent";s:0:"";s:28:"expire_warning_email_message";s:0:"";s:28:"expire_warning_email_subject";s:92:"[user:name] you password on [site:name] shall expire in [password_expiration_date:interval] ";}}';
+    ctools_export_crud_save('password_policy', $password_policy);
+  }
+
+  protected function createExpirePolicy() {
+    // Setup expire policy.
+    $password_policy = new stdClass();
+    $password_policy->disabled = FALSE;
+    $password_policy->api_version = 1;
+    $password_policy->name = 'expire';
+    $password_policy->export_type = NULL;
+    $password_policy->config = 'a:9:{s:11:"alpha_count";a:1:{s:11:"alpha_count";s:0:"";}s:10:"char_count";a:1:{s:10:"char_count";s:0:"";}s:11:"consecutive";a:1:{s:22:"consecutive_char_count";s:0:"";}s:9:"int_count";a:1:{s:9:"int_count";s:0:"";}s:14:"past_passwords";a:1:{s:14:"past_passwords";s:0:"";}s:12:"symbol_count";a:2:{s:12:"symbol_count";s:1:"0";s:20:"symbol_count_symbols";s:30:"!@#$%^&*()_+=-|}{"?:><,./;\'\\[]";}s:8:"username";a:1:{s:7:"enabled";b:1;}s:4:"role";a:1:{s:5:"roles";a:2:{i:2;i:0;i:3;i:0;}}s:6:"expire";a:4:{s:12:"expire_limit";s:8:"1 second";s:25:"expire_warning_email_sent";s:0:"";s:28:"expire_warning_email_message";s:0:"";s:28:"expire_warning_email_subject";s:92:"[user:name] you password on [site:name] shall expire in [password_expiration_date:interval] ";}}';
     ctools_export_crud_save('password_policy', $password_policy);
   }
 
@@ -333,4 +344,109 @@ class PasswordPolicyTestUICase extends DrupalWebTestCase {
     $this->assertText('Password must have at least 1 digit(s).');
     $this->assertText('Password must have at least 8 character(s).');
   }
+
+  /**
+   * Tests setting passwords.
+   */
+  public function testPasswordSet() {
+    // Use password_policy_test module form_alter to prevent extraneous policy
+    // text on user edit page. @todo figure out another way to do this.
+    variable_set('password_policy_test_no_description', TRUE);
+
+    // Setup strong policy.
+    $this->createStrongPolicy();
+
+    $user = $this->drupalCreateUser();
+    $this->drupalLogin($user);
+
+    // Hold onto first password.
+    $password0 = $user->pass_raw;
+    // Try weak password.
+    $edit = array();
+    $edit['current_pass'] = $password0;
+    $edit['pass[pass1]'] = 'pass';
+    $edit['pass[pass2]'] = 'pass';
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertText('Password must have at least 1 digit(s).');
+    $this->assertText('Password must have at least 8 character(s).');
+
+    // Try username.
+    $edit = array();
+    $edit['current_pass'] = $password0;
+    $edit['pass[pass1]'] = $user->name;
+    $edit['pass[pass2]'] = $user->name;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertText('Password must not contain their username');
+
+    // Change password twice.
+    $password1 = 'Password1';
+    $edit = array();
+    $edit['current_pass'] = $password0;
+    $edit['pass[pass1]'] = $password1;
+    $edit['pass[pass2]'] = $password1;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $password2 = 'Password2';
+    $edit = array();
+    $edit['current_pass'] = $password1;
+    $edit['pass[pass1]'] = $password2;
+    $edit['pass[pass2]'] = $password2;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertText('The changes have been saved.');
+
+    // Try to save old $password1;
+    $edit = array();
+    $edit['current_pass'] = $password2;
+    $edit['pass[pass1]'] = $password1;
+    $edit['pass[pass2]'] = $password1;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertNoText('The changes have been saved.');
+    $this->assertText('Password cannot match 2 past passwords.');
+
+    // Save a new random password.
+    $password3 = 'Password3';
+    $edit = array();
+    $edit['current_pass'] = $password2;
+    $edit['pass[pass1]'] = $password3;
+    $edit['pass[pass2]'] = $password3;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertText('The changes have been saved.');
+
+    // Try and save $password1.
+    $edit = array();
+    $edit['current_pass'] = $password3;
+    $edit['pass[pass1]'] = $password1;
+    $edit['pass[pass2]'] = $password1;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertText('The changes have been saved.');
+  }
+
+  /**
+   * Test expire functionality.
+   */
+  public function testExpire() {
+    // Use password_policy_test module form_alter to prevent extraneous policy
+    // text on user edit page. @todo figure out another way to do this.
+    variable_set('password_policy_test_no_description', TRUE);
+
+    $user = $this->drupalCreateUser();
+    $this->drupalLogin($user);
+
+    // Setup expire policy.
+    $this->createExpirePolicy();
+
+    sleep(2); // Sleep to force simpletest to exceed 1 second expire.
+    $this->drupalGet('filter/tips');
+    $this->assertText('Your Password has expired please change it now');
+    $this->assertFieldByName('pass[pass1]', '', 'Password entry field appears.');
+
+    // Change password.
+    $password1 = $this->randomName() . '9';
+    $edit = array();
+    $edit['current_pass'] = $user->pass_raw;
+    $edit['pass[pass1]'] = $password1;
+    $edit['pass[pass2]'] = $password1;
+    $this->drupalPost("user/$user->uid/edit", $edit, t('Save'));
+    $this->assertText('The changes have been saved.');
+
+  }
 }
diff --git a/password_policy_test/password_policy_test.module b/password_policy_test/password_policy_test.module
index 23c903c..d2691bd 100644
--- a/password_policy_test/password_policy_test.module
+++ b/password_policy_test/password_policy_test.module
@@ -25,3 +25,9 @@ function password_policy_test_default_password_policy() {
   return $policies;
 }
 
+function password_policy_test_form_user_profile_form_alter(&$form, $form_state) {
+  // Remove description so assertText()s can match errors.
+  if (variable_get('password_policy_test_no_description', FALSE)) {
+    $form['account']['pass']['#description'] = '';
+  }
+}
