diff --git a/resources/static/pages/manage_account.js b/resources/static/pages/manage_account.js
index d8afdd24a0234387ace79492a4b6a02c2a8279a4..7509704480aa163e396130553ea976e3f6bc1544 100644
--- a/resources/static/pages/manage_account.js
+++ b/resources/static/pages/manage_account.js
@@ -8,6 +8,7 @@ BrowserID.manageAccount = (function() {
 
   var bid = BrowserID,
       user = bid.User,
+      network = bid.Network,
       errors = bid.Errors,
       dom = bid.DOM,
       storage = bid.Storage,
@@ -16,7 +17,8 @@ BrowserID.manageAccount = (function() {
       cancelEvent = pageHelpers.cancelEvent,
       confirmAction = confirm,
       doc = document,
-      tooltip = bid.Tooltip;
+      tooltip = bid.Tooltip,
+      authLevel;
 
   function syncAndDisplayEmails(oncomplete) {
     user.syncEmails(function() {
@@ -118,6 +120,19 @@ BrowserID.manageAccount = (function() {
       typeof oncomplete == "function" && oncomplete(status);
     }
 
+    function changePassword() {
+      user.changePassword(oldPassword, newPassword, function(status) {
+        if(status) {
+          dom.removeClass("#edit_password", "edit");
+        }
+        else {
+          tooltip.showTooltip("#tooltipInvalidPassword");
+        }
+
+        complete(status);
+      }, pageHelpers.getFailure(errors.updatePassword, oncomplete));
+    }
+
     if(!oldPassword) {
       tooltip.showTooltip("#tooltipOldRequired");
       complete(false);
@@ -127,24 +142,30 @@ BrowserID.manageAccount = (function() {
       complete(false);
     }
     else if(newPassword.length < 8 || 80 < newPassword.length) {
-      tooltip.showTooltip("tooltipPasswordLength");
+      tooltip.showTooltip("#tooltipPasswordLength");
       complete(false);
     }
-    else {
-      user.changePassword(oldPassword, newPassword, function(status) {
+    else if(authLevel !== "password") {
+      var email = getSecondary();
+      // go striaght to the network level instead of user level so that if
+      // the user gets the password wrong, we don't clear their info.
+      network.authenticate(email, oldPassword, function(status) {
         if(status) {
-          dom.removeClass("#edit_password", "edit");
+          authLevel = "password";
+          changePassword();
         }
         else {
           tooltip.showTooltip("#tooltipInvalidPassword");
+          complete(false);
         }
-
-        complete(status);
-      }, pageHelpers.getFailure(errors.updatePassword, oncomplete));
+      }, pageHelpers.getFailure(errors.authenticate, oncomplete));
+    }
+    else {
+      changePassword();
     }
-
   }
 
+
   function displayHelpTextToNewUser() {
     var newUser = !storage.manage_page.get("has_visited_manage_page");
 
@@ -153,10 +174,19 @@ BrowserID.manageAccount = (function() {
   }
 
   function displayChangePassword(oncomplete) {
-    user.canSetPassword(function(canSetPassword) {
-      dom[canSetPassword ? "addClass" : "removeClass"]("body", "canSetPassword");
-      oncomplete && oncomplete();
-    }, pageHelpers.getFailure(errors.hasSecondary));
+    var canSetPassword = !!getSecondary();
+    dom[canSetPassword ? "addClass" : "removeClass"]("body", "canSetPassword");
+    oncomplete && oncomplete();
+  }
+
+  function getSecondary() {
+    var emails = storage.getEmails();
+
+    for(var key in emails) {
+      if(emails[key].type === "secondary") {
+        return key;
+      }
+    }
   }
 
   function init(options, oncomplete) {
@@ -171,10 +201,14 @@ BrowserID.manageAccount = (function() {
     dom.bindEvent("button.done", "click", cancelEdit);
     dom.bindEvent("#edit_password_form", "submit", cancelEvent(changePassword));
 
-    syncAndDisplayEmails(function() {
-      displayHelpTextToNewUser();
-      displayChangePassword(oncomplete);
-    });
+    user.checkAuthentication(function(auth_level) {
+      authLevel = auth_level;
+
+      syncAndDisplayEmails(function() {
+        displayHelpTextToNewUser();
+        displayChangePassword(oncomplete);
+      });
+    }, pageHelpers.getFailure(errors.checkAuthentication, oncomplete));
   }
 
   // BEGIN TESTING API
diff --git a/resources/static/test/qunit/mocks/xhr.js b/resources/static/test/qunit/mocks/xhr.js
index d9db587ed7192452b290f01fa922c2730693dbf8..2652c8cee6ce2478a1f2051a9513454393e4be94 100644
--- a/resources/static/test/qunit/mocks/xhr.js
+++ b/resources/static/test/qunit/mocks/xhr.js
@@ -35,6 +35,7 @@ BrowserID.Mocks.xhr = (function() {
       "get /wsapi/email_for_token?token=token invalid": { success: false },
       "post /wsapi/authenticate_user valid": { success: true },
       "post /wsapi/authenticate_user invalid": { success: false },
+      "post /wsapi/authenticate_user incorrectPassword": { success: false },
       "post /wsapi/authenticate_user ajaxError": undefined,
       "post /wsapi/auth_with_assertion primary": { success: true },
       "post /wsapi/auth_with_assertion valid": { success: true },
diff --git a/resources/static/test/qunit/pages/manage_account_unit_test.js b/resources/static/test/qunit/pages/manage_account_unit_test.js
index df81a4583344029149a363d2c6c0b0a10dc08cd1..c27ed462712130cda5b789d2b23d3a6a418efc2b 100644
--- a/resources/static/test/qunit/pages/manage_account_unit_test.js
+++ b/resources/static/test/qunit/pages/manage_account_unit_test.js
@@ -21,6 +21,7 @@
     setup: function() {
       testHelpers.setup();
       bid.Renderer.render("#page_head", "site/index", {});
+      xhr.setContextInfo("auth_level", "password");
       mocks.document.location = "";
     },
     teardown: function() {
@@ -157,7 +158,7 @@
 
       bid.manageAccount.changePassword(function(status) {
         equal(status, false, "on missing old password, status is false");
-        equal(tooltip.shown, true, "tooltip is visible");
+        testHelpers.testTooltipVisible();
         start();
       });
     });
@@ -170,7 +171,7 @@
 
       bid.manageAccount.changePassword(function(status) {
         equal(status, false, "on missing new password, status is false");
-        equal(tooltip.shown, true, "tooltip is visible");
+        testHelpers.testTooltipVisible();
         start();
       });
     });
@@ -183,7 +184,7 @@
 
       bid.manageAccount.changePassword(function(status) {
         equal(status, false, "on too short of a password, status is false");
-        equal(tooltip.shown, true, "tooltip is visible");
+        testHelpers.testTooltipVisible();
         start();
       });
     });
@@ -200,7 +201,7 @@
 
       bid.manageAccount.changePassword(function(status) {
         equal(status, false, "on too short of a password, status is false");
-        equal(tooltip.shown, true, "tooltip is visible");
+        testHelpers.testTooltipVisible();
         start();
       });
     });
@@ -216,7 +217,7 @@
 
       bid.manageAccount.changePassword(function(status) {
         equal(status, false, "on incorrect old password, status is false");
-        equal(tooltip.shown, true, "tooltip is visible");
+        testHelpers.testTooltipVisible();
         start();
       });
     });
@@ -236,7 +237,39 @@
     });
   });
 
-  asyncTest("changePassword happy case", function() {
+  asyncTest("changePassword with user authenticated to password level, happy case", function() {
+
+    bid.manageAccount(mocks, function() {
+      $("#old_password").val("oldpassword");
+      $("#new_password").val("newpassword");
+
+      bid.manageAccount.changePassword(function(status) {
+        equal(status, true, "on proper completion, status is true");
+        equal(tooltip.shown, false, "on proper completion, tooltip is not shown");
+        start();
+      });
+    });
+  });
+
+  asyncTest("changePassword with user authenticated to assertion level level, incorrect password - show tooltip", function() {
+    xhr.setContextInfo("auth_level", "assertion");
+
+    bid.manageAccount(mocks, function() {
+      $("#old_password").val("oldpassword");
+      $("#new_password").val("newpassword");
+      xhr.useResult("incorrectPassword");
+
+      bid.manageAccount.changePassword(function(status) {
+        equal(status, false, "bad password, status is false");
+        testHelpers.testTooltipVisible();
+        start();
+      });
+    });
+  });
+
+  asyncTest("changePassword with user authenticated to assertion level level, correct password - log user in, change password", function() {
+    xhr.setContextInfo("auth_level", "assertion");
+
     bid.manageAccount(mocks, function() {
       $("#old_password").val("oldpassword");
       $("#new_password").val("newpassword");