diff --git a/resources/static/common/js/modules/interaction_data.js b/resources/static/common/js/modules/interaction_data.js
index 11379e4df87faddcb1909f8e6bab23b66614c06e..fef84018e484fd4d7efb34f11a480925cec57b9a 100644
--- a/resources/static/common/js/modules/interaction_data.js
+++ b/resources/static/common/js/modules/interaction_data.js
@@ -79,7 +79,11 @@ BrowserID.Modules.InteractionData = (function() {
     user_confirmed: "user.user_confirmed",
     email_staged: "user.email_staged",
     email_confirmed: "user.email_confrimed",
-    notme: "user.logout"
+    notme: "user.logout",
+    enter_password: "authenticate.enter_password",
+    password_submit: "authenticate.password_submitted",
+    authentication_success: "authenticate.password_success",
+    authentication_fail: "authenticate.password_fail"
   };
 
   function getKPIName(msg, data) {
@@ -204,7 +208,7 @@ BrowserID.Modules.InteractionData = (function() {
     self.initialEventStream = null;
 
     self.samplesBeingStored = true;
-    
+
   }
 
   function indexOfEvent(eventStream, eventName) {
diff --git a/resources/static/dialog/js/misc/helpers.js b/resources/static/dialog/js/misc/helpers.js
index ea2157153159bbc700989f3e730b1c07ab0c21e9..4c3f150a0706a3d028c443aeec2e664465a875dd 100644
--- a/resources/static/dialog/js/misc/helpers.js
+++ b/resources/static/dialog/js/misc/helpers.js
@@ -62,9 +62,14 @@
 
   function authenticateUser(email, pass, callback) {
     var self=this;
+    self.publish("password_submit");
     user.authenticate(email, pass,
       function (authenticated) {
-        if (!authenticated) {
+        if (authenticated) {
+          self.publish("authentication_success");
+        }
+        else {
+          self.publish("authentication_fail");
           tooltip.showTooltip("#cannot_authenticate");
         }
         complete(callback, authenticated);
diff --git a/resources/static/test/cases/dialog/js/misc/helpers.js b/resources/static/test/cases/dialog/js/misc/helpers.js
index edc1fa98a8a5417630559085b2218cc2ee9a66fc..5e1a5638d7276f88beca53442d84c81072622457 100644
--- a/resources/static/test/cases/dialog/js/misc/helpers.js
+++ b/resources/static/test/cases/dialog/js/misc/helpers.js
@@ -18,6 +18,8 @@
       mediator = bid.Mediator,
       errorCB,
       expectedError = testHelpers.expectedXHRFailure,
+      expectedMessage = testHelpers.expectedMessage,
+      unexpectedMessage = testHelpers.unexpectedMessage,
       badError = testHelpers.unexpectedXHRFailure;
 
   var controllerMock = {
@@ -29,22 +31,7 @@
     }
   };
 
-  function expectedMessage(message, expectedFields) {
-    mediator.subscribe(message, function(m, info) {
-      equal(m, message, "correct message: " + message);
-
-      testHelpers.testObjectValuesEqual(info, expectedFields);
-    });
-  }
-
-
-  function unexpectedMessage(message) {
-    mediator.subscribe(message, function(m, info) {
-      ok(false, "close should have never been called");
-    });
-  }
-
-  module("resources/helpers", {
+  module("dialog/js/misc/helpers", {
     setup: function() {
       testHelpers.setup();
       errorCB = null;
@@ -78,10 +65,12 @@
 
     xhr.useResult("ajaxError");
     storage.addEmail("registered@testuser.com", {});
-    dialogHelpers.getAssertion.call(controllerMock, "registered@testuser.com", testHelpers.unexpectedSuccess);
+    dialogHelpers.getAssertion.call(controllerMock, "registered@testuser.com", testHelpers.expectedFailure);
   });
 
   asyncTest("authenticateUser happy case", function() {
+    expectedMessage("password_submit");
+    expectedMessage("authentication_success");
     dialogHelpers.authenticateUser.call(controllerMock, "testuser@testuser.com", "password", function(authenticated) {
       equal(authenticated, true, "user is authenticated");
       start();
@@ -90,6 +79,8 @@
 
   asyncTest("authenticateUser invalid credentials", function() {
     xhr.useResult("invalid");
+    expectedMessage("password_submit");
+    expectedMessage("authentication_fail");
     dialogHelpers.authenticateUser.call(controllerMock, "testuser@testuser.com", "password", function(authenticated) {
       equal(authenticated, false, "user is not authenticated");
       start();
@@ -100,6 +91,7 @@
     errorCB = expectedError;
 
     xhr.useResult("ajaxError");
+    expectedMessage("password_submit");
     dialogHelpers.authenticateUser.call(controllerMock, "testuser@testuser.com", "password", testHelpers.unexpectedSuccess);
   });
 
@@ -209,7 +201,7 @@
   });
 
   asyncTest("resetPassword happy case", function() {
-    expectedMessage("password_reset", {
+    expectedMessage("reset_password_staged", {
       email: "registered@testuser.com"
     });
 
diff --git a/resources/static/test/testHelpers/helpers.js b/resources/static/test/testHelpers/helpers.js
index 66868076a8c8cd477b25b2db0e5e1e6023595037..c9f9329442d808d31b1e158ccb23c079519d1bd1 100644
--- a/resources/static/test/testHelpers/helpers.js
+++ b/resources/static/test/testHelpers/helpers.js
@@ -27,7 +27,7 @@ BrowserID.TestHelpers = (function() {
       if(calls[msg]) {
         throw msg + " triggered more than once";
       }
-      calls[msg] = true;
+      calls[msg] = info || true;
 
       cb && cb.apply(null, arguments);
     }));
@@ -112,13 +112,43 @@ BrowserID.TestHelpers = (function() {
 
     register: register,
     isTriggered: function(message) {
-      return calls[message];
+      return message in calls;
     },
 
-    testTriggered: function(message) {
-      equal(calls[message], true, message + " was triggered");
+    testTriggered: function(message, expectedFields) {
+      ok(message in calls, message + " was triggered");
+      if (expectedFields) this.testObjectValuesEqual(calls[message], expectedFields);
     },
 
+    expectedMessage: function(message, expectedFields) {
+    // keep track of the original start function.  When the start function is
+    // called, call the proxy start function and then the original start
+    // function.  This allows proxy start functions to be chained and multiple
+    // expectedMessages to be called.
+    start = function(origStart) {
+      TestHelpers.testTriggered(message, expectedFields);
+      start = origStart;
+      start();
+    }.bind(null, start);
+
+    register(message);
+  },
+
+  unexpectedMessage: function(message) {
+    // keep track of the original start function.  When the start function is
+    // called, call the proxy start function and then the original start
+    // function.  This allows proxy start functions to be chained and multiple
+    // expectedMessages to be called.
+    start = function(origStart) {
+      equal(TestHelpers.isTriggered(message), false, message + " was not triggered");
+      start = origStart;
+      start();
+
+    }.bind(null, start);
+    register(message);
+  },
+
+
     errorVisible: function() {
       return screens.error.visible;
     },