diff --git a/javascript/src/Alert.js b/javascript/src/Alert.js
index 5958d9c6a5ae8d693cc21ab1c881522ca0848c17..57c9077f4978e1877d799e6fc9d2218d76c1ff14 100644
--- a/javascript/src/Alert.js
+++ b/javascript/src/Alert.js
@@ -66,9 +66,6 @@ var QfqNS = QfqNS || {};
 
         this.eventEmitter = new EventEmitter();
 
-        this.userOkButtonHandlers = new n.Helper.FunctionList();
-        this.userCancelButtonHandlers = new n.Helper.FunctionList();
-        this.userSaveButtonHandlers = new n.Helper.FunctionList();
     };
 
     n.Alert.prototype.on = n.EventEmitter.onMixin;
diff --git a/javascript/src/QfqForm.js b/javascript/src/QfqForm.js
index 5898b57d5f96ae543977cec87db6263f91df5342..22f61b8883fc644abcf7b757b7f213894f2d23e9 100644
--- a/javascript/src/QfqForm.js
+++ b/javascript/src/QfqForm.js
@@ -179,8 +179,23 @@ var QfqNS = QfqNS || {};
     /**
      * @private
      */
-    n.QfqForm.prototype.handleNewClick = function () {
+    n.QfqForm.prototype.handleNewClick = function (event) {
+        event.preventDefault();
+        var anchorTarget = event.target.getAttribute("href");
+
         this.lastButtonPress = "new";
+        if (this.form.getFormChanged()) {
+            var alert = new n.Alert("You have unsaved changes. Do you want to close?", "warning", "yesnosave");
+            var that = this;
+            alert.on('alert.save', function () {
+                that.form.submitTo(that.submitTo);
+                window.location = anchorTarget;
+            });
+            alert.on('alert.ok', function () {
+                window.location = anchorTarget;
+            });
+            alert.show();
+        }
         n.Log.debug("new click");
     };
 
@@ -330,7 +345,7 @@ var QfqNS = QfqNS || {};
      * @private
      */
     n.QfqForm.prototype.getNewButton = function () {
-        return $("#new-button");
+        return $("#form-new-button");
     };
 
 
diff --git a/tests/jasmine/SpecRunner.html b/tests/jasmine/SpecRunner.html
index 2b1365c68d32e2e1e49e5bfec9d6aaf7e3af966b..5a57794736da12978b61bebeee103dff7eebffc4 100644
--- a/tests/jasmine/SpecRunner.html
+++ b/tests/jasmine/SpecRunner.html
@@ -6,8 +6,8 @@
 
     <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.4.1/jasmine_favicon.png">
     <link rel="stylesheet" href="lib/jasmine-2.4.1/jasmine.css">
-    <link rel="stylesheet" href="../../packages/bootstrap/css/bootstrap.min.css">
-    <link rel="stylesheet" href="../../packages/bootstrap/css/bootstrap-theme.min.css">
+    <link rel="stylesheet" href="../../css/bootstrap.min.css">
+    <link rel="stylesheet" href="../../css/bootstrap-theme.min.css">
 
     <script src="lib/jasmine-2.4.1/jasmine.js"></script>
     <script src="lib/jasmine-2.4.1/jasmine-html.js"></script>
diff --git a/tests/jasmine/spec/BSTabsSpec.js b/tests/jasmine/spec/BSTabsSpec.js
index 6364535237fa2af077c10fbe4823718796d3cf3a..1193ebb409d7594892194b78b9ea2e10f8fd3b66 100644
--- a/tests/jasmine/spec/BSTabsSpec.js
+++ b/tests/jasmine/spec/BSTabsSpec.js
@@ -61,7 +61,7 @@ describe("Bootstrap Tabs", function () {
 
     it("should call user 'show tab' handlers", function () {
         var showHandlerSpy = jasmine.createSpy('showhandler');
-        bsTabs.addTabShowHandler(showHandlerSpy);
+        bsTabs.on('bootstrap.tab.shown', showHandlerSpy);
 
         bsTabs.activateTab('tab1');
         expect(showHandlerSpy).toHaveBeenCalled();
diff --git a/tests/jasmine/spec/FormSpec.js b/tests/jasmine/spec/FormSpec.js
index 45047ccbbbdfb7afeb571c8cf90c0eaaaf3fd70a..0ed3c93e0c5b9b8a868cdbea9126e5572a06dc75 100644
--- a/tests/jasmine/spec/FormSpec.js
+++ b/tests/jasmine/spec/FormSpec.js
@@ -45,23 +45,28 @@ describe("Form", function () {
     it("should notify upon form change", function () {
         var changeHandler = jasmine.createSpy('ChangeHandler');
 
-        form.addChangeHandler(changeHandler);
+        form.on('form.changed', changeHandler);
 
         $("#name").change();
 
         expect(changeHandler).toHaveBeenCalledTimes(1);
-        expect(changeHandler).toHaveBeenCalledWith(form);
+        var callArgs = changeHandler.calls.argsFor(0)[0];
+
+        expect(callArgs.target).toBeDefined();
+        expect(callArgs.target).toBe(form);
     });
 
     it("should notify upon state reset", function () {
         var resetHandler = jasmine.createSpy('StateResetHandler');
 
-        form.addResetHandler(resetHandler);
+        form.on('form.reset', resetHandler);
 
         form.resetFormChanged();
 
         expect(resetHandler).toHaveBeenCalledTimes(1);
-        expect(resetHandler).toHaveBeenCalledWith(form);
+        var callArgs = resetHandler.calls.argsFor(0)[0];
+        expect(callArgs.target).toBeDefined();
+        expect(callArgs.target).toBe(form);
     });
 
     it("should reset state upon resetFormChanged()", function () {
@@ -79,8 +84,8 @@ describe("Form", function () {
         var successHandler = jasmine.createSpy("success");
         var failureHandler = jasmine.createSpy("failure");
 
-        form.addSubmitSuccessHandler(successHandler);
-        form.addSubmitFailureHandler(failureHandler);
+        form.on('form.submit.successful', successHandler);
+        form.on('form.submit.failed', failureHandler);
         form.submitTo("/test/url");
 
         jasmine.Ajax.requests.mostRecent().respondWith({
@@ -89,7 +94,7 @@ describe("Form", function () {
             "responseText": "{ \"status\": \"success\" }"
         });
 
-        expect(successHandler).toHaveBeenCalledWith(form, {status: "success"}, "success");
+        expect(successHandler).toHaveBeenCalledTimes(1);
         expect(failureHandler).not.toHaveBeenCalled();
 
         jasmine.Ajax.uninstall();
@@ -101,8 +106,8 @@ describe("Form", function () {
         var successHandler = jasmine.createSpy("success");
         var failureHandler = jasmine.createSpy("failure");
 
-        form.addSubmitSuccessHandler(successHandler);
-        form.addSubmitFailureHandler(failureHandler);
+        form.on('form.submit.successful', successHandler);
+        form.on('form.submit.failed', failureHandler);
         form.submitTo("/test/url");
 
         jasmine.Ajax.requests.mostRecent().respondWith({
@@ -114,10 +119,12 @@ describe("Form", function () {
 
         expect(successHandler).not.toHaveBeenCalled();
         expect(failureHandler).toHaveBeenCalled();
-        expect(failureHandler.calls.argsFor(0)[0]).toBe(form);
-        expect(failureHandler.calls.argsFor(0)[1]).toBe("error");
-        // arg 2 is jqXHR, which I don't want to test for, and therefore continue with 3
-        expect(failureHandler.calls.argsFor(0)[3]).toBe("not found");
+
+        var callArgs = failureHandler.calls.argsFor(0)[0];
+
+        expect(callArgs.target).toBe(form);
+        expect(callArgs.textStatus).toBe("error");
+        expect(callArgs.errorThrown).toBe("not found");
 
         jasmine.Ajax.uninstall();
     });