diff --git a/javascript/src/Form.js b/javascript/src/Form.js
index 67651ae28c51f26529d8354e019e5506fe482bbf..16bc10b17bf34fb70b665bb9dc1d6fc27ce08c41 100644
--- a/javascript/src/Form.js
+++ b/javascript/src/Form.js
@@ -109,4 +109,25 @@ var QfqNS = QfqNS || {};
         return document.forms[this.formId].checkValidity();
     };
 
+    /**
+     * @public
+     */
+    n.Form.prototype.getFirstNonValidElement = function () {
+        var index;
+        var elementNumber = document.forms[this.formId].length;
+
+        for (index = 0; index < elementNumber; index++) {
+            var element = document.forms[this.formId][index];
+            if (!element.willValidate) {
+                continue;
+            }
+
+            if (!element.checkValidity()) {
+                return element;
+            }
+        }
+
+        return null;
+    };
+
 })(QfqNS);
diff --git a/javascript/src/QfqForm.js b/javascript/src/QfqForm.js
index 975f4eef64e6aeb5fac1a99c611638c810296f91..96ea6e862c73b888b38662a867c9d7ff25883309 100644
--- a/javascript/src/QfqForm.js
+++ b/javascript/src/QfqForm.js
@@ -309,6 +309,15 @@ var QfqNS = QfqNS || {};
         if (this.form.validate() !== true) {
 
             this.form.$form.validator('validate');
+
+            var element = this.form.getFirstNonValidElement();
+            if (element.hasAttribute('name')) {
+                var tabId = this.bsTabs.getContainingTabIdForFormControl(element.getAttribute('name'));
+                if (tabId) {
+                    this.bsTabs.activateTab(tabId);
+                }
+            }
+
             var alert = new n.Alert("Form is incomplete.", "warning");
             alert.show();
             return;