fix: jasmine tests
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js
index a16f422..aaa1a91 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js
@@ -22,7 +22,7 @@
   let number1Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum1 input");
   let number2Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum2 input");
   let submitAddFn = querySelectorFn("#page\\:mainForm\\:submitAdd");
-  let outputFn = querySelectorFn("#page\\:mainForm\\:resultOutput span");
+  let outputFn = querySelectorFn("#page\\:mainForm\\:resultOutput tobago-out");
 
   const test = new JasmineTestTool(done);
   test.do(() => number1Fn().item(0).checked = false);
@@ -40,7 +40,7 @@
   let number1Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum1 input");
   let number2Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum2 input");
   let submitSubFn = querySelectorFn("#page\\:mainForm\\:submitSub");
-  let outputFn = querySelectorFn("#page\\:mainForm\\:resultOutput span");
+  let outputFn = querySelectorFn("#page\\:mainForm\\:resultOutput tobago-out");
 
   const test = new JasmineTestTool(done);
   test.do(() => number1Fn().item(0).checked = false);
@@ -57,7 +57,7 @@
   const earthFn = elementByIdFn("page:mainForm:selectPlanet::0");
   const marsFn = elementByIdFn("page:mainForm:selectPlanet::1");
   const jupiterFn = elementByIdFn("page:mainForm:selectPlanet::2");
-  const moonsFn = querySelectorAllFn("#page\\:mainForm\\:moonradio .custom-control-label");
+  const moonsFn = querySelectorAllFn("#page\\:mainForm\\:moonradio .form-check-label");
 
   const test = new JasmineTestTool(done);
   test.do(() => earthFn().checked = false);
@@ -73,7 +73,7 @@
   const earthFn = elementByIdFn("page:mainForm:selectPlanet::0");
   const marsFn = elementByIdFn("page:mainForm:selectPlanet::1");
   const jupiterFn = elementByIdFn("page:mainForm:selectPlanet::2");
-  const moonsFn = querySelectorAllFn("#page\\:mainForm\\:moonradio .custom-control-label");
+  const moonsFn = querySelectorAllFn("#page\\:mainForm\\:moonradio .form-check-label");
 
   const test = new JasmineTestTool(done);
   test.do(() => earthFn().checked = false);
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/10-sort/Sheet_Sorting.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/10-sort/Sheet_Sorting.test.js
index 7afdb69..921b36a 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/10-sort/Sheet_Sorting.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/10-sort/Sheet_Sorting.test.js
@@ -28,7 +28,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Earth",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Earth",
       () => {
         leftPagingFn().value = "22";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -69,7 +69,7 @@
       () => colPeriodFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colPeriodFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Rosalind",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Rosalind",
       () => {
         leftPagingFn().value = "29";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -110,7 +110,7 @@
       () => colYearFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colYearFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Amalthea",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Amalthea",
       () => {
         leftPagingFn().value = "22";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -119,17 +119,17 @@
   test.do(() => expect(colYearFn().classList.contains("tobago-sheet-header-markup-ascending")).toBe(true));
   test.do(() => expect(colYearFn().classList.contains("tobago-sheet-header-markup-descending")).not.toBe(true));
   test.event("click", colYearFn,
-      () => rowsFn() && rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent === "1999");
-  test.do(() => expect(rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent).toBe("1999"));
-  test.do(() => expect(rowsFn()[1].querySelectorAll(".tobago-out")[2].textContent).toBe("1999"));
-  test.do(() => expect(rowsFn()[2].querySelectorAll(".tobago-out")[2].textContent).toBe("1997"));
-  test.do(() => expect(rowsFn()[3].querySelectorAll(".tobago-out")[2].textContent).toBe("1997"));
+      () => rowsFn() && rowsFn()[0].querySelectorAll("tobago-out")[2].textContent === "1999");
+  test.do(() => expect(rowsFn()[0].querySelectorAll("tobago-out")[2].textContent).toBe("1999"));
+  test.do(() => expect(rowsFn()[1].querySelectorAll("tobago-out")[2].textContent).toBe("1999"));
+  test.do(() => expect(rowsFn()[2].querySelectorAll("tobago-out")[2].textContent).toBe("1997"));
+  test.do(() => expect(rowsFn()[3].querySelectorAll("tobago-out")[2].textContent).toBe("1997"));
   test.event("click", colYearFn,
-      () => rowsFn() && rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent === "1892");
-  test.do(() => expect(rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent).toBe("1892"));
-  test.do(() => expect(rowsFn()[1].querySelectorAll(".tobago-out")[2].textContent).toBe("1898"));
-  test.do(() => expect(rowsFn()[2].querySelectorAll(".tobago-out")[2].textContent).toBe("1904"));
-  test.do(() => expect(rowsFn()[3].querySelectorAll(".tobago-out")[2].textContent).toBe("1905"));
+      () => rowsFn() && rowsFn()[0].querySelectorAll("tobago-out")[2].textContent === "1892");
+  test.do(() => expect(rowsFn()[0].querySelectorAll("tobago-out")[2].textContent).toBe("1892"));
+  test.do(() => expect(rowsFn()[1].querySelectorAll("tobago-out")[2].textContent).toBe("1898"));
+  test.do(() => expect(rowsFn()[2].querySelectorAll("tobago-out")[2].textContent).toBe("1904"));
+  test.do(() => expect(rowsFn()[3].querySelectorAll("tobago-out")[2].textContent).toBe("1905"));
   test.start();
 });
 
@@ -147,7 +147,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "1986U10",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "1986U10",
       () => {
         leftPagingFn().value = "1";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -198,7 +198,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "1986U10",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "1986U10",
       () => {
         leftPagingFn().value = "1";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -261,7 +261,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Earth",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Earth",
       () => {
         leftPagingFn().value = "22";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -333,7 +333,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Earth",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Earth",
       () => {
         leftPagingFn().value = "22";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -374,7 +374,7 @@
       () => colPeriodFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colPeriodFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Mimas",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Mimas",
       () => {
         leftPagingFn().value = "29";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -415,7 +415,7 @@
       () => colYearFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colYearFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent === "1789",
+      () => rowsFn()[0].querySelectorAll("tobago-out")[2].textContent === "1789",
       () => {
         leftPagingFn().value = "22";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -424,17 +424,17 @@
   test.do(() => expect(colYearFn().classList.contains("tobago-sheet-header-markup-ascending")).toBe(true));
   test.do(() => expect(colYearFn().classList.contains("tobago-sheet-header-markup-descending")).not.toBe(true));
   test.event("click", colYearFn,
-      () => rowsFn() && rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent === "1989");
-  test.do(() => expect(rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent).toBe("1989"));
-  test.do(() => expect(rowsFn()[1].querySelectorAll(".tobago-out")[2].textContent).toBe("1989"));
-  test.do(() => expect(rowsFn()[2].querySelectorAll(".tobago-out")[2].textContent).toBe("1989"));
-  test.do(() => expect(rowsFn()[3].querySelectorAll(".tobago-out")[2].textContent).toBe("1986"));
+      () => rowsFn() && rowsFn()[0].querySelectorAll("tobago-out")[2].textContent === "1989");
+  test.do(() => expect(rowsFn()[0].querySelectorAll("tobago-out")[2].textContent).toBe("1989"));
+  test.do(() => expect(rowsFn()[1].querySelectorAll("tobago-out")[2].textContent).toBe("1989"));
+  test.do(() => expect(rowsFn()[2].querySelectorAll("tobago-out")[2].textContent).toBe("1989"));
+  test.do(() => expect(rowsFn()[3].querySelectorAll("tobago-out")[2].textContent).toBe("1986"));
   test.event("click", colYearFn,
-      () => rowsFn() && rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent === "1789");
-  test.do(() => expect(rowsFn()[0].querySelectorAll(".tobago-out")[2].textContent).toBe("1789"));
-  test.do(() => expect(rowsFn()[1].querySelectorAll(".tobago-out")[2].textContent).toBe("1846"));
-  test.do(() => expect(rowsFn()[2].querySelectorAll(".tobago-out")[2].textContent).toBe("1846"));
-  test.do(() => expect(rowsFn()[3].querySelectorAll(".tobago-out")[2].textContent).toBe("1848"));
+      () => rowsFn() && rowsFn()[0].querySelectorAll("tobago-out")[2].textContent === "1789");
+  test.do(() => expect(rowsFn()[0].querySelectorAll("tobago-out")[2].textContent).toBe("1789"));
+  test.do(() => expect(rowsFn()[1].querySelectorAll("tobago-out")[2].textContent).toBe("1846"));
+  test.do(() => expect(rowsFn()[2].querySelectorAll("tobago-out")[2].textContent).toBe("1846"));
+  test.do(() => expect(rowsFn()[3].querySelectorAll("tobago-out")[2].textContent).toBe("1848"));
   test.start();
 });
 
@@ -452,7 +452,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "1986U10",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "1986U10",
       () => {
         leftPagingFn().value = "1";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -503,7 +503,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "1986U10",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "1986U10",
       () => {
         leftPagingFn().value = "1";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
@@ -566,7 +566,7 @@
       () => colNameFn().classList.contains("tobago-sheet-header-markup-ascending"),
       () => colNameFn().dispatchEvent(new Event("click", {bubbles: true})));
   test.setup(
-      () => rowsFn()[0].querySelector(".tobago-out").textContent === "Earth",
+      () => rowsFn()[0].querySelector("tobago-out").textContent === "Earth",
       () => {
         leftPagingFn().value = "22";
         leftPagingFn().dispatchEvent(new Event("blur", {bubbles: true}));
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/04-listbox/Tree_Listbox.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/04-listbox/Tree_Listbox.test.js
index e507905..f318fbd 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/04-listbox/Tree_Listbox.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/04-listbox/Tree_Listbox.test.js
@@ -21,7 +21,7 @@
 it("Select 2,2,0 and submit", function (done) {
   const hiddenInput = elementByIdFn("page:mainForm:listbox::selected");
   const submit = elementByIdFn("page:mainForm:submit");
-  const output = querySelectorFn("#page\\:mainForm\\:output span");
+  const output = querySelectorFn("#page\\:mainForm\\:output tobago-out");
   const node1 = elementByIdFn("page:mainForm:listbox:1:node");
   const node3 = elementByIdFn("page:mainForm:listbox:3:node"); // 2
   const node6 = elementByIdFn("page:mainForm:listbox:6:node"); // 2,2
@@ -90,7 +90,7 @@
 it("Select 3 and submit", function (done) {
   const hiddenInput = elementByIdFn("page:mainForm:listbox::selected");
   const submit = elementByIdFn("page:mainForm:submit");
-  const output = querySelectorFn("#page\\:mainForm\\:output span");
+  const output = querySelectorFn("#page\\:mainForm\\:output tobago-out");
   const node1 = elementByIdFn("page:mainForm:listbox:1:node");
   const node9 = elementByIdFn("page:mainForm:listbox:9:node"); // 3
 
@@ -127,7 +127,7 @@
 it("Select 4,2,1,1 and submit", function (done) {
   const hiddenInput = elementByIdFn("page:mainForm:listbox::selected");
   const submit = elementByIdFn("page:mainForm:submit");
-  const output = querySelectorFn("#page\\:mainForm\\:output span");
+  const output = querySelectorFn("#page\\:mainForm\\:output tobago-out");
   const node1 = elementByIdFn("page:mainForm:listbox:1:node");
   const node10 = elementByIdFn("page:mainForm:listbox:10:node"); // 4
   const node15 = elementByIdFn("page:mainForm:listbox:15:node"); // 4,2
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/06-validation/30-messages/Messages.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/06-validation/30-messages/Messages.test.js
index 613453d..603e24d 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/06-validation/30-messages/Messages.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/06-validation/30-messages/Messages.test.js
@@ -21,7 +21,7 @@
 it("Press '7 Messages' Button and close the first, the last and the fourth", function (done) {
   const tab = querySelectorFn("#page\\:mainForm\\:woAttr > .nav-link");
   const alerts = querySelectorAllFn("#page\\:mainForm\\:woAttr\\:woAttrMessage .alert");
-  const closeButtons = querySelectorAllFn("#page\\:mainForm\\:woAttr\\:woAttrMessage .alert .close");
+  const closeButtons = querySelectorAllFn("#page\\:mainForm\\:woAttr\\:woAttrMessage .alert .btn-close");
   const alertLabels = querySelectorAllFn("#page\\:mainForm\\:woAttr\\:woAttrMessage .alert label");
   const messagesButton = elementByIdFn("page:mainForm:add7messages");
 
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/10-required/Required.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/10-required/Required.test.js
index 6f80716..8843562 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/10-required/Required.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/10-required/Required.test.js
@@ -19,150 +19,210 @@
 import {JasmineTestTool} from "/tobago/test/tobago-test-tool.js";
 
 it("submit inner form 1 without violations", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:in1\\:\\:field");
-  let form1SubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:submit1");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:out1 span");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:out1 tobago-out");
+  let form1SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:submit1");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Alice");
-  test.do(() => form1SubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Alice");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Alice"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe("Alice"));
+  test.setup(() => form1OutputFn().textContent !== "Alice",
+      () => {
+        form1InputFn().value = "Bob";
+        form1SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+      });
+  test.do(() => form1InputFn().value = "Alice");
+  test.event("click", form1SubmitFn, () => form1OutputFn().textContent === "Alice")
+  test.do(() => expect(form1InputFn().value).toBe("Alice"));
+  test.do(() => expect(form1OutputFn().textContent).toBe("Alice"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
 
 it("submit inner form 2, violate required field", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
-  let form2SubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:submit2");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 span");
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 tobago-out");
+  let form2SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:submit2");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
+  let form2OutputValue = form2OutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => form2SubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "");
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
+  test.setup(() => form2AlertFn() === null,
+      () => {
+        form2InputFn().value = "Bob";
+        form2SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form2OutputValue = "Bob";
+      });
+  test.do(() => form2InputFn().value = "");
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.event("click", form2SubmitFn, () => form2AlertFn() !== null)
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit inner form 2 without violations", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
-  let form2SubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:submit2");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 span");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 tobago-out");
+  let form2SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:submit2");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "Bob");
-  test.do(() => expect(form2InputFieldFn().value).toBe("Bob"));
-  test.do(() => form2SubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "Bob");
-  test.do(() => expect(form2InputFieldFn().value).toBe("Bob"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe("Bob"));
+  test.setup(() => form2OutputFn().textContent !== "Bob",
+      () => {
+        form2InputFn().value = "Charlie";
+        form2SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+      });
+  test.do(() => form2InputFn().value = "Bob");
+  test.event("click", form2SubmitFn, () => form2OutputFn().textContent === "Bob");
+  test.do(() => expect(form2InputFn().value).toBe("Bob"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe("Bob"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
 
 it("submit outer form, violate both required fields", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormSubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 span");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => outerFormInputFieldFn().value = "");
-  test.do(() => outerFormSubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "");
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe(""));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form2AlertFn() === null && outerFormAlertFn() === null,
+      () => {
+        form2InputFn().value = "Charlie";
+        outerFormInputFn().value = "Dave";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form2OutputValue = "Charlie";
+        outerFormOutputValue = "Dave"
+      });
+  test.do(() => form2InputFn().value = "");
+  test.do(() => outerFormInputFn().value = "");
+  test.event("click", outerFormSubmitFn, () => form2AlertFn() !== null && outerFormAlertFn() !== null);
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe(""));
+  test.do(() => expect(outerFormAlertFn()).not.toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(2));
   test.start();
 });
 
 it("submit outer form, violate required field in form 2", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormSubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 span");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 tobago-out");
+  let form2SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:submit2");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => outerFormInputFieldFn().value = "Charlie");
-  test.do(() => outerFormSubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "");
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe("Charlie"));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form2AlertFn() === null,
+      () => {
+        form2InputFn().value = "Dave";
+        form2SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form2OutputValue = "Dave";
+      });
+  test.do(() => form2InputFn().value = "");
+  test.do(() => outerFormInputFn().value = "Eve");
+  test.event("click", outerFormSubmitFn, () => form2AlertFn() !== null && outerFormAlertFn() === null);
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe("Eve"));
+  test.do(() => expect(outerFormAlertFn()).toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit outer form, violate required field in outer form", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormSubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 span");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "Dave");
-  test.do(() => outerFormInputFieldFn().value = "");
-  test.do(() => outerFormSubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "Dave");
-  test.do(() => expect(form2InputFieldFn().value).toBe("Dave"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe(""));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => outerFormAlertFn() === null,
+      () => {
+        form2InputFn().value = "Frank"
+        outerFormInputFn().value = "Eve";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}))
+        form2OutputValue = "Frank"
+        outerFormOutputValue = "Eve";
+      });
+  test.do(() => form2InputFn().value = "Frank");
+  test.do(() => outerFormInputFn().value = "");
+  test.event("click", outerFormSubmitFn, () => outerFormAlertFn() !== null);
+  test.do(() => expect(form2InputFn().value).toBe("Frank"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe(""));
+  test.do(() => expect(outerFormAlertFn()).not.toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit outer form without violations", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:in1\\:\\:field");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormSubmitButtonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:out1 span");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 span");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:innerForm2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Eve");
-  test.do(() => form2InputFieldFn().value = "Frank");
-  test.do(() => outerFormInputFieldFn().value = "Grace");
-  test.do(() => outerFormSubmitButtonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Eve");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Eve"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe("Eve"));
-  test.do(() => expect(form2InputFieldFn().value).toBe("Frank"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe("Frank"));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe("Grace"));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe("Grace"));
+  test.setup(() => form1OutputFn().textContent !== "Frank"
+      && form2OutputFn().textContent !== "Eve"
+      && outerFormOutputFn().textContent !== "Grace",
+      () => {
+        form1InputFn().value = "Alice";
+        form2InputFn().value = "Bob";
+        outerFormInputFn().value = "Charlie";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}))
+      });
+  test.do(() => form1InputFn().value = "Frank");
+  test.do(() => form2InputFn().value = "Eve");
+  test.do(() => outerFormInputFn().value = "Grace");
+  test.event("click", outerFormSubmitFn,
+      () => form1OutputFn().textContent === "Frank"
+          && form2OutputFn().textContent === "Eve"
+          && outerFormOutputFn().textContent === "Grace")
+  test.do(() => expect(form1InputFn().value).toBe("Frank"));
+  test.do(() => expect(form1OutputFn().textContent).toBe("Frank"));
+  test.do(() => expect(form2InputFn().value).toBe("Eve"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe("Eve"));
+  test.do(() => expect(outerFormInputFn().value).toBe("Grace"));
+  test.do(() => expect(outerFormAlertFn()).toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe("Grace"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.test.js
index 2f619b9..6851ce1 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.test.js
@@ -19,284 +19,402 @@
 import {JasmineTestTool} from "/tobago/test/tobago-test-tool.js";
 
 it("submit inner form 1 without violations", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:submit1");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form1SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:submit1");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Alice");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Alice");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Alice"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe("Alice"));
+  test.setup(() => form1OutputFn().textContent !== "Alice",
+      () => {
+        form1InputFn().value = "Bob";
+        form1SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+      });
+  test.do(() => form1InputFn().value = "Alice");
+  test.event("click", form1SubmitFn, () => form1OutputFn().textContent === "Alice");
+  test.do(() => expect(form1InputFn().value).toBe("Alice"));
+  test.do(() => expect(form1OutputFn().textContent).toBe("Alice"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
 
 it("submit inner form 2, violate required field", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:submit2");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let form2SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:submit2");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "");
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
+  test.setup(() => form2AlertFn() === null,
+      () => {
+        form2InputFn().value = "Bob";
+        form2SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form2OutputValue = "Bob";
+      });
+  test.do(() => form2InputFn().value = "");
+  test.event("click", form2SubmitFn, () => form2AlertFn() !== null);
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit inner form 2 without violations", function (done) {
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:submit2");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let form2SubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:submit2");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
   let test = new JasmineTestTool(done);
-  test.do(() => form2InputFieldFn().value = "Bob");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form2InputFieldFn() && form2InputFieldFn().value === "Bob");
-  test.do(() => expect(form2InputFieldFn().value).toBe("Bob"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe("Bob"));
+  test.setup(() => form2OutputFn().textContent !== "Bob",
+      () => {
+        form2InputFn().value = "Alice";
+        form2SubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+      });
+  test.do(() => form2InputFn().value = "Bob");
+  test.event("click", form2SubmitFn, () => form2OutputFn().textContent === "Bob");
+  test.do(() => expect(form2InputFn().value).toBe("Bob"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe("Bob"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
 
 it("submit outer form, violate both required fields", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form1OutputFieldValue = form1OutputFieldFn().textContent;
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form1OutputValue = form1OutputFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Charlie");
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => outerFormInputFieldFn().value = "");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Charlie");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Charlie"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe(form1OutputFieldValue));
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe(""));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form1OutputFn().textContent !== "Dave"
+      && form2AlertFn() === null && outerFormAlertFn() === null,
+      () => {
+        form1InputFn().value = "Alice";
+        form2InputFn().value = "Bob";
+        outerFormInputFn().value = "Charlie";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form1OutputValue = "Alice"
+        form2OutputValue = "Bob";
+        outerFormOutputValue = "Charlie"
+      });
+  test.do(() => form1InputFn().value = "Dave");
+  test.do(() => form2InputFn().value = "");
+  test.do(() => outerFormInputFn().value = "");
+  test.event("click", outerFormSubmitFn, () => form2AlertFn() !== null && outerFormAlertFn() !== null);
+  test.do(() => expect(form1InputFn().value).toBe("Dave"));
+  test.do(() => expect(form1OutputFn().textContent).toBe(form1OutputValue));
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe(""));
+  test.do(() => expect(outerFormAlertFn()).not.toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(2));
   test.start();
 });
 
 it("submit outer form, violate required field in form 2", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form1OutputFieldValue = form1OutputFieldFn().textContent;
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form1OutputValue = form1OutputFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Dave");
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => outerFormInputFieldFn().value = "Eve");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Dave");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Dave"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe(form1OutputFieldValue));
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe("Eve"));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form1OutputFn().textContent !== "Charlie" && form2AlertFn() === null,
+      () => {
+        form1InputFn().value = "Alice";
+        form2InputFn().value = "Bob";
+        outerFormInputFn().value = "Charlie";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form1OutputValue = "Alice"
+        form2OutputValue = "Bob";
+        outerFormOutputValue = "Charlie"
+      });
+  test.do(() => form1InputFn().value = "Charlie");
+  test.do(() => form2InputFn().value = "");
+  test.do(() => outerFormInputFn().value = "Dave");
+  test.event("click", outerFormSubmitFn, () => form2AlertFn() !== null);
+  test.do(() => expect(form1InputFn().value).toBe("Charlie"));
+  test.do(() => expect(form1OutputFn().textContent).toBe(form1OutputValue));
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe("Dave"));
+  test.do(() => expect(outerFormAlertFn()).toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit outer form, violate required field in outer form", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form1OutputFieldValue = form1OutputFieldFn().textContent;
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form1OutputValue = form1OutputFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Frank");
-  test.do(() => form2InputFieldFn().value = "Grace");
-  test.do(() => outerFormInputFieldFn().value = "");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Frank");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Frank"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe(form1OutputFieldValue));
-  test.do(() => expect(form2InputFieldFn().value).toBe("Grace"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe(""));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => outerFormAlertFn() === null,
+      () => {
+        form1InputFn().value = "Dave"
+        form2InputFn().value = "Eve"
+        outerFormInputFn().value = "Frank";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}))
+        form1OutputValue = "Dave"
+        form2OutputValue = "Eve"
+        outerFormOutputValue = "Frank";
+      });
+  test.do(() => form1InputFn().value = "Eve");
+  test.do(() => form2InputFn().value = "Frank");
+  test.do(() => outerFormInputFn().value = "");
+  test.event("click", outerFormSubmitFn, () => outerFormAlertFn() !== null);
+  test.do(() => expect(form1InputFn().value).toBe("Eve"));
+  test.do(() => expect(form1OutputFn().textContent).toBe(form1OutputValue));
+  test.do(() => expect(form2InputFn().value).toBe("Frank"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe(""));
+  test.do(() => expect(outerFormAlertFn()).not.toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit outer form without violations", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Hank");
-  test.do(() => form2InputFieldFn().value = "Irene");
-  test.do(() => outerFormInputFieldFn().value = "John");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Hank");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Hank"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe("Hank"));
-  test.do(() => expect(form2InputFieldFn().value).toBe("Irene"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe("Irene"));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe("John"));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe("John"));
+  test.setup(() => form1OutputFn().textContent !== "Hank"
+      && form2OutputFn().textContent !== "Irene"
+      && outerFormOutputFn().textContent !== "John",
+      () => {
+        form1InputFn().value = "Eve";
+        form2InputFn().value = "Frank";
+        outerFormInputFn().value = "Grace";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}))
+      });
+  test.do(() => form1InputFn().value = "Hank");
+  test.do(() => form2InputFn().value = "Irene");
+  test.do(() => outerFormInputFn().value = "John");
+  test.event("click", outerFormSubmitFn, () => form1OutputFn().textContent === "Hank"
+      && form2OutputFn().textContent === "Irene" && outerFormOutputFn().textContent === "John");
+  test.do(() => expect(form1InputFn().value).toBe("Hank"));
+  test.do(() => expect(form1OutputFn().textContent).toBe("Hank"));
+  test.do(() => expect(form2InputFn().value).toBe("Irene"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe("Irene"));
+  test.do(() => expect(outerFormInputFn().value).toBe("John"));
+  test.do(() => expect(outerFormAlertFn()).toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe("John"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
 
 it("submit inner forms, violate required field in form 2", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitInnerForms");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let submitInnerForms = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitInnerForms");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
 
-  let form1OutputFieldValue = form1OutputFieldFn().textContent;
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form1OutputValue = form1OutputFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Kate");
-  test.do(() => form2InputFieldFn().value = "");
-  test.do(() => outerFormInputFieldFn().value = "Leonard");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Kate");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Kate"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe(form1OutputFieldValue));
-  test.do(() => expect(form2InputFieldFn().value).toBe(""));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe("Leonard"));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form1OutputFn().textContent !== "Kate" && form2AlertFn() === null,
+      () => {
+        form1InputFn().value = "Alice";
+        form2InputFn().value = "Bob";
+        outerFormInputFn().value = "Charlie"
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form1OutputValue = "Alice"
+        form2OutputValue = "Bob";
+        outerFormOutputValue = "Charlie";
+      });
+  test.do(() => form1InputFn().value = "Kate");
+  test.do(() => form2InputFn().value = "");
+  test.do(() => outerFormInputFn().value = "Leonard");
+  test.event("click", submitInnerForms, () => form2AlertFn() !== null);
+  test.do(() => expect(form1InputFn().value).toBe("Kate"));
+  test.do(() => expect(form1OutputFn().textContent).toBe(form1OutputValue));
+  test.do(() => expect(form2InputFn().value).toBe(""));
+  test.do(() => expect(form2AlertFn()).not.toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe("Leonard"));
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit inner forms without violations", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitInnerForms");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let submitInnerForms = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitInnerForms");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Mike");
-  test.do(() => form2InputFieldFn().value = "Neil");
-  test.do(() => outerFormInputFieldFn().value = "");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Mike");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Mike"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe("Mike"));
-  test.do(() => expect(form2InputFieldFn().value).toBe("Neil"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe("Neil"));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe(""));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form1OutputFn().textContent !== "Mike"
+      && form2OutputFn().textContent !== "Neil"
+      && outerFormAlertFn() === null,
+      () => {
+        form1InputFn().value = "Kate";
+        form2InputFn().value = "Mike";
+        outerFormInputFn().value = "Leonard";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        outerFormOutputValue = "Leonard";
+      });
+  test.do(() => form1InputFn().value = "Mike");
+  test.do(() => form2InputFn().value = "Neil");
+  test.do(() => outerFormInputFn().value = "");
+  test.event("click", submitInnerForms,
+      () => form1OutputFn().textContent === "Mike" && form2OutputFn().textContent === "Neil");
+  test.do(() => expect(form1InputFn().value).toBe("Mike"));
+  test.do(() => expect(form1OutputFn().textContent).toBe("Mike"));
+  test.do(() => expect(form2InputFn().value).toBe("Neil"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe("Neil"));
+  test.do(() => expect(outerFormInputFn().value).toBe(""));
+  test.do(() => expect(outerFormAlertFn()).toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
 
 it("submit outer value, violate required field", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitOuterValue");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let submitOuterValue = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitOuterValue");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form1OutputFieldValue = form1OutputFieldFn().textContent;
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
-  let outerFormOutputFieldValue = outerFormOutputFieldFn().textContent;
+  let form1OutputValue = form1OutputFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
+  let outerFormOutputValue = outerFormOutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Oscar");
-  test.do(() => form2InputFieldFn().value = "Penny");
-  test.do(() => outerFormInputFieldFn().value = "");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Oscar");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Oscar"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe(form1OutputFieldValue));
-  test.do(() => expect(form2InputFieldFn().value).toBe("Penny"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe(""));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe(outerFormOutputFieldValue));
+  test.setup(() => form2AlertFn() === null && outerFormAlertFn() === null,
+      () => {
+        form1InputFn().value = "Leonard";
+        form2InputFn().value = "Mike";
+        outerFormInputFn().value = "Neil";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form1OutputValue = "Leonard";
+        form2OutputValue = "Mike";
+        outerFormOutputValue = "Neil";
+      });
+  test.do(() => form1InputFn().value = "Oscar");
+  test.do(() => form2InputFn().value = "Penny");
+  test.do(() => outerFormInputFn().value = "");
+  test.event("click", submitOuterValue, () => outerFormAlertFn() !== null);
+  test.do(() => expect(form1InputFn().value).toBe("Oscar"));
+  test.do(() => expect(form1OutputFn().textContent).toBe(form1OutputValue));
+  test.do(() => expect(form2InputFn().value).toBe("Penny"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe(""));
+  test.do(() => expect(outerFormAlertFn()).not.toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe(outerFormOutputValue));
   test.do(() => expect(alertFn().length).toBe(1));
   test.start();
 });
 
 it("submit outer value without violations", function (done) {
-  let form1InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
-  let form1OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 span");
-  let form2InputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
-  let form2OutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 span");
-  let outerFormInputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
-  let outerFormOutputFieldFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out span");
-  let buttonFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitOuterValue");
+  let form1InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:in1\\:\\:field");
+  let form1OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form1\\:out1 tobago-out");
+  let form2InputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2\\:\\:field");
+  let form2AlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:in2 .tobago-messages-container");
+  let form2OutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:form2\\:out2 tobago-out");
+  let outerFormInputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in\\:\\:field");
+  let outerFormAlertFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:in .tobago-messages-container");
+  let outerFormOutputFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:out tobago-out");
+  let outerFormSubmitFn = querySelectorFn("#page\\:mainForm\\:outerForm\\:submit");
+  let submitOuterValue = querySelectorFn("#page\\:mainForm\\:outerForm\\:submitOuterValue");
   let alertFn = querySelectorAllFn("#page\\:messages .alert-danger label");
-
-  let form1OutputFieldValue = form1OutputFieldFn().textContent;
-  let form2OutputFieldValue = form2OutputFieldFn().textContent;
+  let form1OutputValue = form1OutputFn().textContent;
+  let form2OutputValue = form2OutputFn().textContent;
 
   let test = new JasmineTestTool(done);
-  test.do(() => form1InputFieldFn().value = "Quin");
-  test.do(() => form2InputFieldFn().value = "Sue");
-  test.do(() => outerFormInputFieldFn().value = "Ted");
-  test.do(() => buttonFn().dispatchEvent(new Event("click", {bubbles: true})));
-  test.wait(() => form1InputFieldFn() && form1InputFieldFn().value === "Quin");
-  test.do(() => expect(form1InputFieldFn().value).toBe("Quin"));
-  test.do(() => expect(form1OutputFieldFn().textContent).toBe(form1OutputFieldValue));
-  test.do(() => expect(form2InputFieldFn().value).toBe("Sue"));
-  test.do(() => expect(form2OutputFieldFn().textContent).toBe(form2OutputFieldValue));
-  test.do(() => expect(outerFormInputFieldFn().value).toBe("Ted"));
-  test.do(() => expect(outerFormOutputFieldFn().textContent).toBe("Ted"));
+  test.setup(() => form2AlertFn() === null && form1OutputFn().textContent !== "Quin"
+      && form2OutputFn().textContent !== "Sue" && outerFormOutputFn().textContent !== "Ted",
+      () => {
+        form1InputFn().value = "Neil";
+        form2InputFn().value = "Oscar";
+        outerFormInputFn().value = "Penny";
+        outerFormSubmitFn().dispatchEvent(new Event("click", {bubbles: true}));
+        form1OutputValue = "Neil";
+        form2OutputValue = "Oscar";
+      });
+  test.do(() => form1InputFn().value = "Quin");
+  test.do(() => form2InputFn().value = "Sue");
+  test.do(() => outerFormInputFn().value = "Ted");
+  test.event("click", submitOuterValue, () => outerFormOutputFn().textContent === "Ted")
+  test.do(() => expect(form1InputFn().value).toBe("Quin"));
+  test.do(() => expect(form1OutputFn().textContent).toBe(form1OutputValue));
+  test.do(() => expect(form2InputFn().value).toBe("Sue"));
+  test.do(() => expect(form2AlertFn()).toBeNull());
+  test.do(() => expect(form2OutputFn().textContent).toBe(form2OutputValue));
+  test.do(() => expect(outerFormInputFn().value).toBe("Ted"));
+  test.do(() => expect(outerFormAlertFn()).toBeNull());
+  test.do(() => expect(outerFormOutputFn().textContent).toBe("Ted"));
   test.do(() => expect(alertFn().length).toBe(0));
   test.start();
 });
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.xhtml
index fd475fa..29f0034 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/08-form/20-ajax/Ajax.xhtml
@@ -53,7 +53,7 @@
         <tc:in label="Inner Value 1"/>
         <tc:out label="Inner Value 1 in Model"/>
         <tc:button label="Submit">
-          <f:ajax execute="in" render="out :page:messages"/>
+          <f:ajax execute="in" render="in out :page:messages"/>
         </tc:button>
       </tc:form>
     </tc:box>
@@ -65,7 +65,7 @@
     <tc:out label="Outer Value in Model"/>
     <tc:button label="Submit">
       <f:ajax execute="::form1:in ::form2:in in"
-              render="::form1:out ::form2:out out :page:messages"/>
+              render="::form1:in ::form2:in in ::form1:out ::form2:out out :page:messages"/>
     </tc:button>
     ...
   </tc:form>
@@ -78,7 +78,7 @@
             <tc:in id="in1" label="Inner Value 1" value="#{formAjaxController.innerValue1}"/>
             <tc:out id="out1" label="Inner Value 1 in Model" value="#{formAjaxController.innerValue1}"/>
             <tc:button id="submit1" label="Submit">
-              <f:ajax execute="in1" render="out1 :page:messages"/>
+              <f:ajax execute="in1" render="in1 out1 :page:messages"/>
             </tc:button>
           </tc:form>
         </tc:box>
@@ -88,7 +88,7 @@
                    value="#{formAjaxController.innerValue2}"/>
             <tc:out id="out2" label="Inner Value 2 in Model" value="#{formAjaxController.innerValue2}"/>
             <tc:button id="submit2" label="Submit">
-              <f:ajax execute="in2" render="out2 :page:messages"/>
+              <f:ajax execute="in2" render="in2 out2 :page:messages"/>
             </tc:button>
           </tc:form>
         </tc:box>
@@ -97,7 +97,7 @@
         <tc:out id="out" label="Outer Value in Model" value="#{formAjaxController.outerValue}"/>
         <tc:button id="submit" label="Submit">
           <f:ajax execute="::form1:in1 ::form2:in2 in"
-                  render="::form1:out1 ::form2:out2 out :page:messages"/>
+                  render="::form1:in1 ::form2:in2 in ::form1:out1 ::form2:out2 out :page:messages"/>
         </tc:button>
 
         <tc:separator/>
@@ -105,10 +105,10 @@
         <tc:buttons>
           <tc:button id="submitInnerForms" label="Inner Forms">
             <f:ajax execute="::form1:in1 ::form2:in2"
-                    render="::form1:out1 ::form2:out2 :page:messages"/>
+                    render="::form1:in1 ::form2:in2 ::form1:out1 ::form2:out2 :page:messages"/>
           </tc:button>
           <tc:button id="submitOuterValue" label="Outer Value">
-            <f:ajax execute="in" render="out :page:messages"/>
+            <f:ajax execute="in" render="in out :page:messages"/>
           </tc:button>
         </tc:buttons>
       </tc:form>
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/error/error.test.js b/tobago-example/tobago-example-demo/src/main/webapp/error/error.test.js
index 772fe1d..9e4fea7 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/error/error.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/error/error.test.js
@@ -19,17 +19,19 @@
 import {JasmineTestTool} from "/tobago/test/tobago-test-tool.js";
 
 it("has no exception", function (done) {
-  const error = querySelectorFn("#page\\:mainForm\\:errorSection .tobago-section-header span");
+  let errorFn = querySelectorFn("#page\\:mainForm\\:errorSection .tobago-header span");
 
   const test = new JasmineTestTool(done);
-  test.do(() => expect(error.textContent).not.toEqual("An error has occurred!"));
+  test.do(() => expect(errorFn() === null
+      || errorFn().textContent).not.toEqual("An error has occurred!"));
   test.start();
 });
 
 it("has no 404", function (done) {
-  const error404 = querySelectorFn("#page\\:mainForm\\:pageNotFoundMessage span");
+  let error404Fn = querySelectorFn("#page\\:mainForm\\:pageNotFoundMessage tobago-out");
 
   const test = new JasmineTestTool(done);
-  test.do(() => expect(error404.textContent).not.toEqual("The page was not found!"));
+  test.do(() => expect(error404Fn() === null
+      || error404Fn().textContent.indexOf("The page was not found!") === -1).toBeTrue());
   test.start();
 });