password rules should be centralized
There are three places where users passwords are checked to make sure they follow guidelines, but because the checking is not centralized, they are not consistent.  E.g., the password reset page requires 6 characters while the user creation page requires 8 characters.  The three places are:
- [ ] Forgot password form
- [ ] New user form
- [ ] Change password (on user profile page)

diff --git a/qiita_db/test/test_user.py b/qiita_db/test/test_user.py
index 508f520a..ef7e9e99 100644
--- a/qiita_db/test/test_user.py
+++ b/qiita_db/test/test_user.py
@@ -251,6 +251,7 @@ class UserTest(TestCase):
     def test_change_pass(self):
         self.user._change_pass("newpass")
         self._check_pass("newpass")
+        self.assertIsNone(self.user.info["pass_reset_code"])
 
     def test_change_password(self):
         self.user.change_password("password", "newpass")
diff --git a/qiita_db/user.py b/qiita_db/user.py
index 9ce0942b..b2757fb1 100644
--- a/qiita_db/user.py
+++ b/qiita_db/user.py
@@ -420,7 +420,7 @@ class User(QiitaObject):
         return False
 
     def _change_pass(self, newpass, conn_handler=None):
-        sql = ("UPDATE qiita.{0} SET password = %s WHERE "
+        sql = ("UPDATE qiita.{0} SET password=%s, pass_reset_code=NULL WHERE "
                "email = %s".format(self._table))
         conn_handler = conn_handler if conn_handler else SQLConnectionHandler()
         conn_handler.execute(sql, (hash_password(newpass), self._id))
diff --git a/qiita_pet/handlers/user_handlers.py b/qiita_pet/handlers/user_handlers.py
index e9ffddd4..56fd9609 100644
--- a/qiita_pet/handlers/user_handlers.py
+++ b/qiita_pet/handlers/user_handlers.py
@@ -71,49 +71,70 @@ class UserProfileHandler(BaseHandler):
 class ForgotPasswordHandler(BaseHandler):
     """Displays forgot password page and generates code for lost passwords"""
     def get(self):
-        self.render("lost_pass.html", user=None, error="")
+        self.render("lost_pass.html", user=None, message="", level="")
 
     def post(self):
-        error = ""
+        message = ""
+        level = ""
+        page = "lost_pass.html"
+        user_id = None
+
         try:
             user = User(self.get_argument("email"))
         except QiitaDBUnknownIDError:
-            error = "ERROR: Unknown user."
+            message = "ERROR: Unknown user."
+            level = "danger"
         else:
+            user_id = user.id
             user.generate_reset_code()
             info = user.info
             try:
-                send_email(user, "QIITA: Password Reset", "Please go to the "
-                           "following URL to reset your password: "
+                send_email(user.id, "Qiita: Password Reset", "Please go to "
+                           "the following URL to reset your password: "
                            "http://qiita.colorado.edu/auth/reset/%s" %
                            info["pass_reset_code"])
-                error = "Password reset. Check your email for the reset code."
+                message = ("Check your email for the reset code.")
+                level = "success"
+                page = "index.html"
             except Exception as e:
-                error = "Unable to send email."
+                message = ("Unable to send email. Error has been registered. "
+                           "Your password has not been reset.")
+                level = "danger"
                 LogEntry.create('Runtime', "Unable to send forgot password "
-                                "email" % str(e), info={'User': user.id})
-        self.render("lost_pass.html", user=None, error=error)
+                                "email: %s" % str(e), info={'User': user.id})
+
+        self.render(page, user=user_id, message=message, level=level)
 
 
 class ChangeForgotPasswordHandler(BaseHandler):
     """Displays change password page and handles password reset"""
     def get(self, code):
-            self.render("change_lost_pass.html", user=None, error="",
-                        code=code)
+            self.render("change_lost_pass.html", user=None, message="",
+                        level="", code=code)
 
     def post(self, code):
-        error = ""
+        message = ""
+        level = ""
+        page = "change_lost_pass.html"
+        user = None
+
         try:
             user = User(self.get_argument("email"))
         except QiitaDBUnknownIDError:
-            error = "Unable to reset password"
+            message = "Unable to reset password"
+            level = "danger"
         else:
             newpass = self.get_argument("newpass")
             changed = user.change_forgot_password(code, newpass)
+            user = self.current_user
+
             if changed:
-                error = "Password reset successful. Please log in to continue."
+                message = ("Password reset successful. Please log in to "
+                           "continue.")
+                level = "success"
+                page = "index.html"
             else:
-                error = "Unable to reset password"
+                message = "Unable to reset password"
+                level = "danger"
 
-        self.render("change_lost_pass.html", user=None,
-                    error=error, code=code)
+        self.render(page, user=user, message=message, level=level, code=code)
diff --git a/qiita_pet/templates/change_lost_pass.html b/qiita_pet/templates/change_lost_pass.html
index ca78dc87..c3ff298d 100644
--- a/qiita_pet/templates/change_lost_pass.html
+++ b/qiita_pet/templates/change_lost_pass.html
@@ -5,7 +5,7 @@
 // http://www.9lessons.info/2012/04/bootstrap-registration-form-tutorial.html
 $(document).ready(function()
 {
-  // Popover 
+  // Popover
   $('#lost_pass input').hover(function()
   {
     $(this).popover('show')
@@ -34,25 +34,26 @@ $(document).ready(function()
 </script>
 {%end%}
 
-{%block content%}
-<div style='width: 50%;'>
-<h1>Password Reset</h1>
-<h3>Enter new password below</h3>
-<form role="form" action="/auth/reset/{{code}}" method="post" id="lost_pass" name="lost_pass">
-<div class="form-group">
-    <label for="email" class="col-sm-10 control-label">Email</label>
-      <input type="email" class="form-control" id="email" name="email">
-</div>
-<div class="form-group">
-    <label for="newpass" class="col-sm-10 control-label">New Password</label>
-      <input type="password" class="form-control" id="newpass" name="newpass">
-</div>
-<div class="form-group">
-    <label for="newpass2" class="col-sm-10 control-label">Repeat New Password</label>
-      <input type="password" class="form-control" id="newpass2" name="newpass2">
+{% block content %}
+  {% if not message %}
+    <div style='width: 50%;'>
+    <h1>Password Reset</h1>
+    <h3>Enter new password below</h3>
+    <form role="form" action="/auth/reset/{{code}}" method="post" id="lost_pass" name="lost_pass">
+    <div class="form-group">
+        <label for="email" class="col-sm-10 control-label">Email</label>
+          <input type="email" class="form-control" id="email" name="email">
+    </div>
+    <div class="form-group">
+        <label for="newpass" class="col-sm-10 control-label">New Password</label>
+          <input type="password" class="form-control" id="newpass" name="newpass">
+    </div>
+    <div class="form-group">
+        <label for="newpass2" class="col-sm-10 control-label">Repeat New Password</label>
+          <input type="password" class="form-control" id="newpass2" name="newpass2">
+      </div>
+    <button class="btn btn-danger">Change Password</button>
+    </form>
+  {% end %}
   </div>
-<div style="color:red;">{{error}}</div>
-<button class="btn btn-danger">Change Password</button>
-</form>
-</div>
-{%end%}
+{% end %}
diff --git a/qiita_pet/templates/change_password.html b/qiita_pet/templates/change_password.html
index 6abb8fa4..2a5e9dde 100644
--- a/qiita_pet/templates/change_password.html
+++ b/qiita_pet/templates/change_password.html
@@ -5,7 +5,7 @@
 // http://www.9lessons.info/2012/04/bootstrap-registration-form-tutorial.html
 $(document).ready(function()
 {
-  // Popover 
+  // Popover
   $('#change_password input').hover(function()
   {
     $(this).popover('show')
@@ -14,18 +14,18 @@ $(document).ready(function()
   // Validation
   $("#change_password").validate({
     rules:{
-      oldpass:{required:true,minlength: 6},
-      newpass:{required:true,minlength: 6},
-      newpass2:{required:true,minlength: 6,equalTo: "#newpass"},
+      oldpass:{required:true,minlength: 8},
+      newpass:{required:true,minlength: 8},
+      newpass2:{required:true,minlength: 8,equalTo: "#newpass"},
     },
 
     messages:{
       newpass:{
       required:"Enter your password",
-      minlength:"Password must be at least 6 characters"},
+      minlength:"Password must be at least 8 characters"},
       newpass2:{
       required:"Enter confirm password",
-      minlength:"Password must be at least 6 characters",
+      minlength:"Password must be at least 8 characters",
       equalTo:"Password and Confirm Password must match"}
     },
 
diff --git a/qiita_pet/templates/lost_pass.html b/qiita_pet/templates/lost_pass.html
index b59b1d39..a35e7c25 100644
--- a/qiita_pet/templates/lost_pass.html
+++ b/qiita_pet/templates/lost_pass.html
@@ -5,7 +5,7 @@
 // http://www.9lessons.info/2012/04/bootstrap-registration-form-tutorial.html
 $(document).ready(function()
 {
-// Popover 
+// Popover
 $('#lost_pass input').hover(function()
 {
 $(this).popover('show')
@@ -41,7 +41,6 @@ $(element).parents('.control-group').addClass('success');
 <div style='width: 50%;'>
 <h1>Lost Password</h1>
 <h3>Enter email for account</h3>
-<div style="color:red;">{{error}}</div>
 <form class="form-horizontal" role="form" action="/auth/forgot/" method="post" id="lost_pass" name="lost_pass">
 <div class="form-group">
     <label for="email" class="col-sm-2 control-label">Email</label>
['qiita_db/user.py', 'qiita_pet/templates/change_password.html', 'qiita_pet/templates/change_lost_pass.html', 'qiita_pet/handlers/user_handlers.py', 'qiita_pet/templates/lost_pass.html', 'qiita_db/test/test_user.py']