diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/ext-bootstrap.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/ext-bootstrap.ts
index ecd323c..e796f3a 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/ext-bootstrap.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/ext-bootstrap.ts
@@ -19,7 +19,7 @@
 
 export class BootstrapUtils {
 
-  static modal(element: Element, data?: any, options?: any) {
+  static modal(element: Element, data?: any, options?: any): void {
     jQuery(element).modal(data, options);
   }
 
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/hello-world.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/hello-world.ts
index 80b355d..b715e81 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/hello-world.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/hello-world.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-export const hello = () => 'Hello world!';
+export const hello = () => "Hello world!";
 
 export function es6test(): any {
   return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].map((n) => n * n);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-calendar.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-calendar.ts
index a3d896a..e072628 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-calendar.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-calendar.ts
@@ -21,7 +21,7 @@
 
 class DateTime {
 
-  static init(element: HTMLElement) {
+  static init(element: HTMLElement): void {
     for (const e of DomUtils.selfOrQuerySelectorAll(element, ".tobago-date:not([readonly]):not([disabled])")) {
       const date: HTMLInputElement = e as HTMLInputElement;
 
@@ -30,18 +30,18 @@
         format: analyzed,
         showTodayButton: date.dataset.tobagoTodayButton === "data-tobago-today-button",
         icons: {
-          time: 'fa fa-clock-o',
-          date: 'fa fa-calendar',
-          up: 'fa fa-chevron-up',
-          down: 'fa fa-chevron-down',
-          previous: 'fa fa-chevron-left',
-          next: 'fa fa-chevron-right',
-          today: 'fa fa-calendar-check-o',
-          clear: 'fa fa-trash',
-          close: 'fa fa-times'
+          time: "fa fa-clock-o",
+          date: "fa fa-calendar",
+          up: "fa fa-chevron-up",
+          down: "fa fa-chevron-down",
+          previous: "fa fa-chevron-left",
+          next: "fa fa-chevron-right",
+          today: "fa fa-calendar-check-o",
+          clear: "fa fa-trash",
+          close: "fa fa-times"
         },
         keyBinds: {
-          left: function ($widget) {
+          left: function ($widget): void {
             const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
             if (widget === undefined) {
               if (date.selectionStart === date.selectionEnd) {
@@ -53,10 +53,10 @@
                 date.selectionEnd = date.selectionStart;
               }
             } else if (DomUtils.isVisible(widget.querySelector(".datepicker"))) {
-              this.date(this.date().clone().subtract(1, 'd'));
+              this.date(this.date().clone().subtract(1, "d"));
             }
           },
-          right: function ($widget) {
+          right: function ($widget): void {
             const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
             if (widget === undefined) {
               if (date.selectionStart === date.selectionEnd) {
@@ -68,10 +68,10 @@
                 date.selectionStart = date.selectionEnd;
               }
             } else if (DomUtils.isVisible(widget.querySelector(".datepicker"))) {
-              this.date(this.date().clone().add(1, 'd'));
+              this.date(this.date().clone().add(1, "d"));
             }
           },
-          enter: function ($widget) {
+          enter: function ($widget): void {
             const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
             if (widget !== undefined && DomUtils.isVisible(widget.querySelector(".datepicker"))) {
               this.hide();
@@ -84,14 +84,14 @@
               }));
             }
           },
-          escape: function ($widget) {
+          escape: function ($widget): void {
             const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
             if (widget !== undefined && DomUtils.isVisible(widget.querySelector(".datepicker"))) {
               this.hide();
               fixKey(27);
             }
           },
-          'delete': function () {
+          "delete": function (): void {
             if (date.selectionStart < date.value.length) {
               const selectionStart = date.selectionStart;
               let selectionEnd = date.selectionEnd;
@@ -107,14 +107,14 @@
             }
           }
         },
-        widgetParent: '.tobago-page-menuStore'
+        widgetParent: ".tobago-page-menuStore"
       };
 
       /**
        * After ESC or ENTER is pressed we need to fire the keyup event manually.
        * see: https://github.com/tempusdominus/bootstrap-4/issues/159
        */
-      function fixKey(keyCode) {
+      function fixKey(keyCode): void {
         let keyupEvent = jQuery.Event("keyup");
         keyupEvent.which = keyCode;
         jQuery(date).trigger(keyupEvent);
@@ -155,7 +155,7 @@
       // in line 1307 of bootstrap-datetimepicker.js
       // the 'stopImmediatePropagation()' stops the change-event
       // execution of line 686 in tobago.js
-      $dateParent.on('dp.change', function (event) {
+      $dateParent.on("dp.change", function (event: Event): void {
         let input: HTMLInputElement = this.querySelector("input");
         let commands = input.dataset.tobagoCommands ? JSON.parse(input.dataset.tobagoCommands) : undefined;
         if (commands && commands.change) {
@@ -177,7 +177,7 @@
       });
 
       // set position
-      $dateParent.on('dp.show', function () {
+      $dateParent.on("dp.show", function (): void {
         let datepicker: HTMLDivElement = document.querySelector(".bootstrap-datetimepicker-widget");
         let div: HTMLDivElement = this;
         let top, left;
@@ -198,12 +198,12 @@
       });
 
       // set css class in update - like changing the month
-      $dateParent.on('dp.update', function () {
+      $dateParent.on("dp.update", function (): void {
         DateTime.addPastClass(date);
       });
 
       // fix for bootstrap-datetimepicker v4.17.45
-      $dateParent.on('dp.show', function () {
+      $dateParent.on("dp.show", function (): void {
         const collapseIn = document.querySelector(".bootstrap-datetimepicker-widget .collapse.in");
         const pickerSwitch = document.querySelector(".bootstrap-datetimepicker-widget .picker-switch a");
 
@@ -212,7 +212,7 @@
         }
         if (pickerSwitch !== null) {
           pickerSwitch.addEventListener(
-              "click", function () {
+              "click", function (): void {
                 // the click is executed before togglePicker() function
                 let datetimepicker: HTMLDivElement = document.querySelector(".bootstrap-datetimepicker-widget");
                 datetimepicker.querySelector(".collapse.in").classList.remove("in");
@@ -223,7 +223,7 @@
     }
   }
 
-  static addPastClass(date: HTMLInputElement) {
+  static addPastClass(date: HTMLInputElement): void {
     let today = date.dataset.tobagoToday;
     if (today.length === 10) {
       const todayArray = today.split("-");
@@ -249,11 +249,14 @@
    and convert it to 'moment.js'.
    Attention: Not every pattern char is supported.
    */
-  static analyzePattern = function (pattern) {
+  static analyzePattern = function (originalPattern: string): string {
 
-    if (!pattern || pattern.length > 100) {
-      console.warn("Pattern not supported: " + pattern);
+    let pattern;
+    if (!originalPattern || originalPattern.length > 100) {
+      console.warn("Pattern not supported: " + originalPattern);
       pattern = "";
+    } else {
+      pattern = originalPattern;
     }
 
     let analyzedPattern = "";
@@ -293,7 +296,9 @@
     return analyzedPattern;
   };
 
-  static analyzePatternPart = function (pattern) {
+  static analyzePatternPart = function (originalPattern: string): string {
+
+    let pattern = originalPattern;
 
     if (pattern.search("G") > -1 || pattern.search("W") > -1 || pattern.search("F") > -1
         || pattern.search("K") > -1 || pattern.search("z") > -1 || pattern.search("X") > -1) {
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-command.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-command.ts
index bef2cfc..68b116a 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-command.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-command.ts
@@ -27,7 +27,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     switch (this.event) {
       case "load": // this is a special case, because the "load" is too late now.
         this.callback();
@@ -40,7 +40,7 @@
     }
   }
 
-  callback(event?: Event) {
+  callback(event?: Event): void {
 
     if (this.collapseAction && this.collapseTarget) {
       const target = this.getRootNode() as ShadowRoot | Document;
@@ -69,7 +69,7 @@
     }
   }
 
-  submit() {
+  submit(): void {
     const actionId = this.action != null ? this.action : this.element.id;
     CommandHelper.submitAction(this, actionId, !this.decoupled, this.target);
   }
@@ -183,8 +183,8 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-behavior', Behavior);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-behavior", Behavior);
 });
 
 export class CommandHelper {
@@ -198,9 +198,9 @@
    * @param target
    */
   public static submitAction = function (
-      source: HTMLElement, actionId: string, decoupled: boolean = true, target?: string) {
+      source: HTMLElement, actionId: string, decoupled: boolean = true, target?: string): void {
 
-    Transport.request(function () {
+    Transport.request(function (): void {
       if (!CommandHelper.isSubmit) {
         CommandHelper.isSubmit = true;
         const form = document.getElementsByTagName("form")[0] as HTMLFormElement;
@@ -211,12 +211,12 @@
         if (target) {
           form.setAttribute("target", target);
         }
-        var listenerOptions = {
+        const listenerOptions = {
           source: source,
           actionId: actionId/*,
           options: commandHelper*/
         };
-        var onSubmitResult = CommandHelper.onSubmit(listenerOptions);
+        const onSubmitResult = CommandHelper.onSubmit(listenerOptions);
         if (onSubmitResult) {
           try {
             form.submit();
@@ -226,7 +226,7 @@
           } catch (e) {
             Overlay.destroy(Page.page().id);
             CommandHelper.isSubmit = false;
-            alert('Submit failed: ' + e); // XXX localization, better error handling
+            alert("Submit failed: " + e); // XXX localization, better error handling
           }
         }
         if (target) {
@@ -247,7 +247,7 @@
     }, true);
   };
 
-  static onSubmit = function (listenerOptions) {
+  static onSubmit = function (listenerOptions: any): boolean {
     Listener.executeBeforeSubmit();
     /*
     XXX check if we need the return false case
@@ -287,16 +287,16 @@
   /**
    * @return true if the request is queued.
    */
-  static request = function (req, submitPage, actionId?) {
-    var index = 0;
+  static request = function (req: () => void, submitPage: boolean, actionId?: string): boolean {
+    let index = 0;
     if (submitPage) {
       Transport.pageSubmitted = true;
       index = Transport.requests.push(req);
       //console.debug('index = ' + index)
     } else if (!Transport.pageSubmitted) { // AJAX case
-      console.debug('Current ActionId = ' + Transport.currentActionId + ' action= ' + actionId);
+      console.debug("Current ActionId = " + Transport.currentActionId + " action= " + actionId);
       if (actionId && Transport.currentActionId === actionId) {
-        console.info('Ignoring request');
+        console.info("Ignoring request");
         // If actionId equals currentActionId assume double request: do nothing
         return false;
       }
@@ -307,27 +307,26 @@
       console.debug("else case");
       return false;
     }
-    console.debug('index = ' + index);
+    console.debug("index = " + index);
     if (index === 1) {
-      console.info('Execute request!');
+      console.info("Execute request!");
       Transport.startTime = new Date();
       Transport.requests[0]();
     } else {
-      console.info('Request queued!');
+      console.info("Request queued!");
     }
     return true;
   };
 
-
 // TBD XXX REMOVE is this called in non AJAX case?
 
-  static requestComplete = function () {
+  static requestComplete = function ():void {
     Transport.requests.shift();
     Transport.currentActionId = null;
-    console.debug('Request complete! Duration: ' + (new Date().getTime() - Transport.startTime.getTime()) + 'ms; '
-        + 'Queue size : ' + Transport.requests.length);
+    console.debug("Request complete! Duration: " + (new Date().getTime() - Transport.startTime.getTime()) + "ms; "
+        + "Queue size : " + Transport.requests.length);
     if (Transport.requests.length > 0) {
-      console.debug('Execute request!');
+      console.debug("Execute request!");
       Transport.startTime = new Date();
       Transport.requests[0]();
     }
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-config.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-config.ts
index ac1fcc4..6f79193 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-config.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-config.ts
@@ -19,7 +19,7 @@
 
   private static map: Map<string, any> = new Map<string, any>();
 
-  static set(key: string, value: any) {
+  static set(key: string, value: any): void {
     this.map.set(key, value);
   }
 
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-core.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-core.ts
index 0322e54..9940a22 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-core.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-core.ts
@@ -21,37 +21,20 @@
 import {CommandHelper} from "./tobago-command";
 import {Page} from "./tobago-page";
 
-/**
- * @deprecated since 5.0.0
- */
-export class Tobago {
-  /**
-   * Backward compatible listener registration. In the case of an AJAX call (phase = Phase.AFTER_UPDATE)
-   * this listener will be called with a jQuery-object, the new one will get an HTMLElement.
-   * @deprecated since 5.0.0
-   */
-  static registerListener(listener, phase, order) {
-
-    Listener.register(function (element: HTMLElement) {
-      listener(jQuery(element));
-    }, phase, order);
-  }
-}
-
 export class Setup {
 
   static transition: boolean;
   static oldTransition: boolean;
 
-  static init = function() {
+  static init = function (): void {
     console.time("[tobago] init");
-    document.querySelector("form").addEventListener('submit', CommandHelper.onSubmit);
-    window.addEventListener('unload', Setup.onUnload);
+    document.querySelector("form").addEventListener("submit", CommandHelper.onSubmit);
+    window.addEventListener("unload", Setup.onUnload);
     Listener.executeDocumentReady(document.documentElement);
     console.timeEnd("[tobago] init");
   };
 
-  static onBeforeUnload = function () {
+  static onBeforeUnload = function (): void {
     if (Setup.transition) {
       new Overlay(Page.page());
     }
@@ -61,8 +44,8 @@
   /**
    * Wrapper function to call application generated onunload function
    */
-  static onUnload = function () {
-    console.info('on onload');
+  static onUnload = function (): void {
+    console.info("on onload");
     if (CommandHelper.isSubmit) {
       if (Setup.transition) {
         new Overlay(Page.page());
@@ -74,6 +57,6 @@
   };
 }
 
-document.addEventListener('DOMContentLoaded', Setup.init);
+document.addEventListener("DOMContentLoaded", Setup.init);
 
 window.addEventListener("load", Listener.executeWindowLoad);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-dropdown.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-dropdown.ts
index e107342..7041506 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-dropdown.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-dropdown.ts
@@ -19,25 +19,24 @@
 
 class Dropdown {
 
-  static init(elements) {
-    elements = elements.jQuery ? elements : jQuery(elements); // fixme jQuery -> ES5
-    var $dropdownMenus = jQuery(":not(.tobago-page-menuStore) > .dropdown-menu");
-    var $tobagoPageMenuStore = jQuery(".tobago-page-menuStore");
+  static init(element: HTMLElement): void {
+    const $dropdownMenus = jQuery(":not(.tobago-page-menuStore) > .dropdown-menu");
+    const $tobagoPageMenuStore = jQuery(".tobago-page-menuStore");
 
-    $dropdownMenus.each(function () {
-      var $dropdownMenu = jQuery(this);
-      var $parent = $dropdownMenu.parent();
+    $dropdownMenus.each(function (): void {
+      const $dropdownMenu = jQuery(this);
+      const $parent = $dropdownMenu.parent();
 
-      if (!$parent.hasClass('tobago-dropdown-submenu')
-          && $parent.closest('.navbar').length === 0) {
+      if (!$parent.hasClass("tobago-dropdown-submenu")
+          && $parent.closest(".navbar").length === 0) {
 
         // remove duplicated dropdown menus from menu store
         // this could happen if the dropdown component is updated by ajax
         removeDuplicates($dropdownMenu);
 
-        $parent.on('shown.bs.dropdown', function (event) {
+        $parent.on("shown.bs.dropdown", function (event: Event): void {
           $tobagoPageMenuStore.append($dropdownMenu.detach());
-        }).on('hidden.bs.dropdown', function (event) {
+        }).on("hidden.bs.dropdown", function (event: Event): void {
           $parent.append($dropdownMenu.detach());
         });
       }
@@ -45,15 +44,17 @@
   }
 }
 
-function removeDuplicates($dropdownMenu) {
-  var $menuStoreDropdowns = jQuery(".tobago-page-menuStore .dropdown-menu");
-  $menuStoreDropdowns.each(function () {
-    var $menuStoreDropdown = jQuery(this);
+function removeDuplicates($dropdownMenu): void {
+  const $menuStoreDropdowns = jQuery(".tobago-page-menuStore .dropdown-menu");
+  // XXX todo: remove ts-ignore
+  // @ts-ignore
+  $menuStoreDropdowns.each(function (): boolean {
+    const $menuStoreDropdown = jQuery(this);
 
-    var dropdownIds = getIds($dropdownMenu);
-    var menuStoreIds = getIds($menuStoreDropdown);
+    const dropdownIds = getIds($dropdownMenu);
+    const menuStoreIds = getIds($menuStoreDropdown);
 
-    for (var i = 0; i < dropdownIds.length; i++) {
+    for (let i = 0; i < dropdownIds.length; i++) {
       if (jQuery.inArray(dropdownIds[i], menuStoreIds) >= 0) {
         $menuStoreDropdown.remove();
         return false;
@@ -62,8 +63,10 @@
   });
 }
 
+// XXX todo: remove tslint
+// tslint:disable-next-line:typedef
 function getIds($dropdownMenu) {
-  return $dropdownMenu.find("[id]").map(function () {
+  return $dropdownMenu.find("[id]").map(function (): string {
     return this.id;
   });
 }
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts
index 03cbdb7..a3a0287 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts
@@ -21,7 +21,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     this.input.form.enctype = "multipart/form-data";
 
     this.input.addEventListener("change", this.select.bind(this));
@@ -35,7 +35,7 @@
     return this.querySelector(".custom-file-label");
   }
 
-  select(event: MouseEvent) {
+  select(event: MouseEvent): void {
     if (this.input.value === "") {
       this.label.classList.add("tobago-file-placeholder");
       this.label.textContent = this.input.placeholder;
@@ -49,7 +49,7 @@
       } else {
         text = this.input.value;
         // remove path, if any. Some old browsers set the path, others like webkit uses the prefix "C:\path\".
-        const pos: number = Math.max(text.lastIndexOf('/'), text.lastIndexOf('\\'));
+        const pos: number = Math.max(text.lastIndexOf("/"), text.lastIndexOf("\\"));
         if (pos >= 0) {
           text = text.substr(pos + 1);
         }
@@ -59,6 +59,6 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-file', File);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-file", File);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-focus.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-focus.ts
index 006a8aa..eba35a2 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-focus.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-focus.ts
@@ -43,12 +43,12 @@
    * - last (the element from the last request with same id gets the focus, not AJAX)
    * - first (the first input element (without tabindex=-1) gets the focus, not AJAX)
    */
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
 
     const activeInputs = Focus.activeInputs(element);
 
     for (const focusable of activeInputs) {
-      focusable.addEventListener("focus", function (event: FocusEvent) {
+      focusable.addEventListener("focus", function (event: FocusEvent): void {
         const target = event.target as HTMLElement;
         if (target.style.visibility !== "hidden" && target.style.display != "none") {
           // remember the last focused element, for later
@@ -60,7 +60,7 @@
     // autofocus in popups doesn't work automatically... so we fix that here
     const modals = document.getElementsByClassName("modal");
     for (let i = 0; i < modals.length; i++) {
-      modals.item(i).addEventListener('shown.bs.modal', Focus.initAutoFocus);
+      modals.item(i).addEventListener("shown.bs.modal", Focus.initAutoFocus);
     }
 
     for (const hasDanger of DomUtils.selfOrElementsByClassName(element, ".has-danger")) {
@@ -97,7 +97,7 @@
     }
   };
 
-  private static activeInputs(element: HTMLElement) {
+  private static activeInputs(element: HTMLElement): Array<HTMLElement> {
     return DomUtils.selfOrQuerySelectorAll(element,
         "input:not([type='hidden']):not([disabled]):not([tabindex='-1'])," +
         "select:not([disabled]):not([tabindex='-1'])," +
@@ -107,7 +107,7 @@
             && element.style.display != "none");
   }
 
-  private static initAutoFocus(event) {
+  private static initAutoFocus(event): void {
     const modal = event.currentTarget as HTMLElement;
     (modal.querySelector("[autofocus]") as HTMLElement).focus();
   }
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-in.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-in.ts
index 446aeaa..81374fc 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-in.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-in.ts
@@ -40,7 +40,7 @@
     this.element.addEventListener("change", this.checkValue.bind(this));
   }
 
-  checkValue(event: TextEvent) {
+  checkValue(event: TextEvent): void {
     console.debug("changed: check if '%s' is okay!", this.regexp.toString());
     if (!this.regexp.test(this.element.value)) {
       this.element.classList.add("border-danger");
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-jsf.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-jsf.ts
index 5629749..34f2588 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-jsf.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-jsf.ts
@@ -30,7 +30,7 @@
 
 class Jsf {
 
-  private static isId = function (id: string) {
+  private static isId = function (id: string): boolean {
     switch (id) {
       case JsfParameter.VIEW_STATE:
       case JsfParameter.CLIENT_WINDOW:
@@ -44,7 +44,7 @@
     }
   };
 
-  private static isBody = function (id) {
+  private static isBody = function (id): boolean {
     switch (id) {
       case JsfParameter.VIEW_ROOT:
       case JsfParameter.VIEW_BODY:
@@ -54,13 +54,13 @@
     }
   };
 
-  static init = function () {
-    jsf.ajax.addOnEvent(function (event) {
+  static init = function (): void {
+    jsf.ajax.addOnEvent(function (event): void {
       console.timeEnd("[tobago-jsf] jsf-ajax");
       console.time("[tobago-jsf] jsf-ajax");
       console.debug("[tobago-jsf] JSF event status: '%s'", event.status);
       if (event.status === "success") {
-        event.responseXML.querySelectorAll("update").forEach(function (update: Element) {
+        event.responseXML.querySelectorAll("update").forEach(function (update: Element): void {
           const result = /<!\[CDATA\[(.*)]]>/gm.exec(update.innerHTML);
           const id = update.id;
           if (result !== null && result.length === 2 && result[1].startsWith("{\"reload\"")) {
@@ -80,7 +80,7 @@
           }
         });
       } else if (event.status === "complete") {
-        event.responseXML.querySelectorAll("update").forEach(function (update: Element) {
+        event.responseXML.querySelectorAll("update").forEach(function (update: Element): void {
           const id = update.id;
           if (Jsf.isId(id)) {
             console.debug("[tobago-jsf] Update after jsf.ajax complete: #" + id);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-listener.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-listener.ts
index 7f7acd1..37f48c5 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-listener.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-listener.ts
@@ -48,11 +48,11 @@
     [Order.LATER, []]
   ]);
 
-  add(listener: (HTMLElement) => void, order: Order) {
+  add(listener: (HTMLElement) => void, order: Order): void {
     this.map.get(order).push(listener);
   }
 
-  execute(element?: HTMLElement) {
+  execute(element?: HTMLElement): void {
 
     this.map.forEach((listeners: Array<(HTMLElement) => void>, order: Order) => {
       listeners.forEach(
@@ -86,7 +86,7 @@
   static register(
       listener: (HTMLElement) => void,
       phase: Phase,
-      order: Order = Order.NORMAL) {
+      order: Order = Order.NORMAL): void {
 
     switch (phase) {
       case Phase.DOCUMENT_READY:
@@ -112,37 +112,37 @@
     }
   }
 
-  static executeDocumentReady(element: HTMLElement) {
+  static executeDocumentReady(element: HTMLElement): void {
     console.time("[tobago] execute documentReady");
     Listener.documentReady.execute(element);
     console.timeEnd("[tobago] execute documentReady");
   }
 
-  static executeWindowLoad() {
+  static executeWindowLoad(): void {
     console.time("[tobago] execute windowLoad");
     Listener.windowLoad.execute();
     console.timeEnd("[tobago] execute windowLoad");
   }
 
-  static executeBeforeSubmit() {
+  static executeBeforeSubmit(): void {
     console.time("[tobago] execute beforeSubmit");
     Listener.beforeSubmit.execute();
     console.timeEnd("[tobago] execute beforeSubmit");
   }
 
-  static executeAfterUpdate(element: HTMLElement) {
+  static executeAfterUpdate(element: HTMLElement): void {
     console.time("[tobago] execute afterUpdate");
     Listener.afterUpdate.execute(element);
     console.timeEnd("[tobago] execute afterUpdate");
   }
 
-  static executeBeforeUnload() {
+  static executeBeforeUnload(): void {
     console.time("[tobago] execute beforeUnload");
     Listener.beforeUnload.execute();
     console.timeEnd("[tobago] execute beforeUnload");
   }
 
-  static executeBeforeExit() {
+  static executeBeforeExit(): void {
     console.time("[tobago] execute beforeExit");
     Listener.beforeExit.execute();
     console.timeEnd("[tobago] execute beforeExit");
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-overlay.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-overlay.ts
index 2be49b0..cdc4f2d 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-overlay.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-overlay.ts
@@ -53,7 +53,7 @@
 
   overlay: HTMLDivElement;
 
-  static destroy(id: string) {
+  static destroy(id: string): void {
     console.debug("----> get overlay " + id);
     const overlay = Overlay.overlayMap.get(id);
     if (overlay) {
@@ -75,7 +75,7 @@
 
     // create the overlay
 
-    this.overlay = document.createElement('div');
+    this.overlay = document.createElement("div");
     this.overlay.classList.add("tobago-page-overlay");
     this.overlay.classList.add(
         this.error ? "tobago-page-overlay-markup-error" : "tobago-page-overlay-markup-wait");
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts
index b7b595a..038e935 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import {Tobago4Utils} from "./tobago-utils";
+import {DomUtils} from "./tobago-utils";
 
 export class Page extends HTMLElement {
 
@@ -38,8 +38,8 @@
     super();
   }
 
-  connectedCallback() {
-    this.addEventListener("keypress", function (event: KeyboardEvent) {
+  connectedCallback(): void {
+    this.addEventListener("keypress", function (event: KeyboardEvent): boolean {
       let code = event.which; // XXX deprecated
       if (code === 0) {
         code = event.keyCode;
@@ -62,7 +62,7 @@
             command.dispatchEvent(new MouseEvent("click"));
             break;
           }
-          id = Tobago4Utils.getNamingContainerId(id);
+          id = DomUtils.getNamingContainerId(id);
         }
         return false;
       }
@@ -70,6 +70,6 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-page', Page);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-page", Page);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-panel.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-panel.ts
index 91620db..5ea5b14 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-panel.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-panel.ts
@@ -18,6 +18,6 @@
 class Panel extends HTMLElement {
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-panel', Panel);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-panel", Panel);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popover.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popover.ts
index 795aea4..6a5c638 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popover.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popover.ts
@@ -19,17 +19,16 @@
 
 class MessagePopover {
 
-  static init = function (elements) {
-    elements = elements.jQuery ? elements : jQuery(elements); // fixme jQuery -> ES5
-    jQuery('[data-toggle="popover"]').popover({
+  static init = function (element: HTMLElement): void {
+    jQuery("[data-toggle=\"popover\"]").popover({
       constraints: [
         {
-          to: 'window',
-          attachment: 'together',
+          to: "window",
+          attachment: "together",
           pin: true
         }
       ],
-      trigger: 'focus'
+      trigger: "focus"
     });
   };
 }
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popup.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popup.ts
index d72f611..ba306cb 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popup.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-popup.ts
@@ -19,7 +19,7 @@
 
 export class Popup extends HTMLElement {
 
-  static close(button: HTMLElement) {
+  static close(button: HTMLElement): void {
     BootstrapUtils.modal(button.closest(".modal"), "hide");
   }
 
@@ -27,7 +27,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     const hidden = Collapse.findHidden(this);
     if (hidden.value === "false") {
       // XXX hack: this is needed for popups open by AJAX.
@@ -43,7 +43,7 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event: Event) {
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
   window.customElements.define("tobago-popup", Popup);
 });
 
@@ -53,7 +53,7 @@
     return document.getElementById(element.id + "::collapse") as HTMLInputElement;
   }
 
-  static execute = function (action: string, target: HTMLElement) {
+  static execute = function (action: string, target: HTMLElement): void {
     const hidden = Collapse.findHidden(target);
     const isPopup = target.tagName === "TOBAGO-POPUP";
     let newCollapsed;
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-reload.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-reload.ts
index ddc65e3..9ab43df 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-reload.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-reload.ts
@@ -37,7 +37,7 @@
     this.timeouts = new Map<string, number>();
   }
 
-  public schedule(id: string, reloadMillis: number) {
+  public schedule(id: string, reloadMillis: number): void {
     if (reloadMillis > 0) {
 
       // may remove old schedule
@@ -49,7 +49,7 @@
       }
 
       // add new schedule
-      let timeout = window.setTimeout(function () {
+      let timeout = window.setTimeout(function (): void {
         console.debug("reloading #'" + id + "'");
         jsf.ajax.request(
             id,
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-scroll.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-scroll.ts
index 9a440f0..9b63452 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-scroll.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-scroll.ts
@@ -20,7 +20,7 @@
 
 class Scroll {
 
-  static initScrollPosition = function (element: HTMLElement) {
+  static initScrollPosition = function (element: HTMLElement): void {
     for (const panel of DomUtils.selfOrQuerySelectorAll(element, "[data-tobago-scroll-panel]")) {
 
       const hidden = panel.querySelector(":scope > [data-tobago-scroll-position]") as HTMLInputElement;
@@ -36,7 +36,7 @@
     }
   };
 
-  static scroll = function (event: Event) {
+  static scroll = function (event: Event): void {
     const panel = event.currentTarget as HTMLDivElement;
     const scrollLeft = panel.scrollLeft;
     const scrollTop = panel.scrollTop;
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-checkbox.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-checkbox.ts
index da659d8..23bf731 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-checkbox.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-checkbox.ts
@@ -20,7 +20,7 @@
 
 class SelectBooleanCheckbox {
 
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
     for (const checkbox of DomUtils.selfOrQuerySelectorAll(element, ".tobago-selectBooleanCheckbox input[readonly]")) {
       checkbox.addEventListener("click", (event: Event) => {
         // in the "readonly" case, prevent the default, which is changing the "checked" state
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-toggle.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-toggle.ts
index 1a6cab2..5da7e1b 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-toggle.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-boolean-toggle.ts
@@ -20,7 +20,7 @@
 
 class SelectBooleanToggle {
 
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
     for (const checkbox of DomUtils.selfOrQuerySelectorAll(element, ".tobago-selectBooleanCheckbox input[readonly]")) {
       checkbox.addEventListener("click", (event: Event) => {
         // in the "readonly" case, prevent the default, which is changing the "checked" state
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-checkbox.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-checkbox.ts
index 57000b6..01a04c0 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-checkbox.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-checkbox.ts
@@ -16,11 +16,11 @@
  */
 
 import {Listener, Phase} from "./tobago-listener";
-import {DomUtils, Tobago4Utils} from "./tobago-utils";
+import {DomUtils} from "./tobago-utils";
 
 class SelectManyCheckbox {
 
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
     for (const checkbox of DomUtils.selfOrQuerySelectorAll(element, ".tobago-selectManyCheckbox input[readonly]")) {
       checkbox.addEventListener("click", (event: Event) => {
         // in the "readonly" case, prevent the default, which is changing the "checked" state
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-shuttle.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-shuttle.ts
index 061c76d..8db3da2 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-shuttle.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-many-shuttle.ts
@@ -20,7 +20,7 @@
 
 class SelectManyShuttle {
 
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
     for (const shuttle of DomUtils.selfOrQuerySelectorAll(
         element, ".tobago-selectManyShuttle:not(.tobago-selectManyShuttle-disabled)")) {
 
@@ -56,17 +56,17 @@
     }
   };
 
-  static moveSelectedItems = function (event: Event, direction: boolean, all: boolean) {
+  static moveSelectedItems = function (event: Event, direction: boolean, all: boolean): void {
     const currentTarget = event.currentTarget as HTMLElement;
     const shuttle = currentTarget.closest(".tobago-selectManyShuttle");
     const unselected = shuttle.querySelector(".tobago-selectManyShuttle-unselected");
     const selected = shuttle.querySelector(".tobago-selectManyShuttle-selected");
-    var oldCount = selected.childElementCount;
+    const oldCount = selected.childElementCount;
     const source = direction ? unselected : selected;
     const target = direction ? selected : unselected;
     const options = source.querySelectorAll(all ? "option:not(:disabled)" : "option:checked");
-    var hidden = shuttle.querySelector(".tobago-selectManyShuttle-hidden");
-    var hiddenOptions = hidden.querySelectorAll("option");
+    const hidden = shuttle.querySelector(".tobago-selectManyShuttle-hidden");
+    const hiddenOptions = hidden.querySelectorAll("option");
     for (const option of options as NodeListOf<HTMLOptionElement>) {
       source.removeChild(option);
       target.appendChild(option);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts
index 8ac9294..2429e13 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts
@@ -16,11 +16,11 @@
  */
 
 import {Listener, Phase} from "./tobago-listener";
-import {DomUtils, Tobago4Utils} from "./tobago-utils";
+import {DomUtils} from "./tobago-utils";
 
 class SelectOneListbox {
 
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
     for (const listbox of DomUtils.selfOrQuerySelectorAll(element, ".tobago-selectOneListbox:not(:required)")) {
       listbox.addEventListener("change", (event: Event) => {
         const target = event.currentTarget as HTMLSelectElement;
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-radio.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-radio.ts
index d0bc7f8..21c6edb 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-radio.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-radio.ts
@@ -16,14 +16,14 @@
  */
 
 import {Listener, Phase} from "./tobago-listener";
-import {DomUtils, Tobago4Utils} from "./tobago-utils";
+import {DomUtils} from "./tobago-utils";
 
 class SelectOneRadio {
 
-  static init = function (element: HTMLElement) {
+  static init = function (element: HTMLElement): void {
     for (const radio of DomUtils.selfOrQuerySelectorAll(element, ".tobago-selectOneRadio")) {
       const id = radio.closest("[id]").id;
-      const quotedId = id.replace(/([:.])/g, '\\$1');
+      const quotedId = id.replace(/([:.])/g, "\\$1");
       const allConnected = document.querySelectorAll("input[name=" + quotedId + "]") as NodeListOf<HTMLInputElement>;
       for (const connectedRadio of allConnected) {
         connectedRadio.dataset["tobagoOldValue"] = String(connectedRadio.checked);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-sheet.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-sheet.ts
index 451b092..d1401f3 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-sheet.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-sheet.ts
@@ -35,7 +35,7 @@
   mousemoveData: any;
   mousedownOnRowData: any;
 
-  static init(element: HTMLElement) {
+  static init(element: HTMLElement): void {
     console.time("[tobago-sheet] init");
     for (const sheetElement of DomUtils.selfOrElementsByClassName(element, "tobago-sheet")) {
       const sheet = new Sheet(sheetElement);
@@ -44,7 +44,7 @@
     console.timeEnd("[tobago-sheet] init");
   }
 
-  private static getScrollBarSize() {
+  private static getScrollBarSize(): number {
     const body = document.getElementsByTagName("body").item(0);
 
     const outer = document.createElement("div");
@@ -63,7 +63,7 @@
     return 100 - widthWithScroll;
   }
 
-  private static isInputElement(element: HTMLElement) {
+  private static isInputElement(element: HTMLElement): boolean {
     return ["INPUT", "TEXTAREA", "SELECT", "A", "BUTTON"].indexOf(element.tagName) > -1;
   }
 
@@ -151,7 +151,7 @@
     // resize column: mouse events -------------------------------------------------------------------------------- //
 
     for (const resizeElement of <NodeListOf<HTMLElement>>element.querySelectorAll(".tobago-sheet-headerResize")) {
-      resizeElement.addEventListener("click", function () {
+      resizeElement.addEventListener("click", function (): boolean {
         return false;
       });
       resizeElement.addEventListener("mousedown", this.mousedown.bind(this));
@@ -182,7 +182,7 @@
         // todo: check if this works correctly
         const sheet = Sheet.SHEETS.get(this.id);
         if (sheet && sheet.dblClickActionId) {
-          row.addEventListener("dblclick", function (event) {
+          row.addEventListener("dblclick", function (event: Event): void {
             // todo: re-implement
             sheet.doDblClick(event);
           });
@@ -213,7 +213,7 @@
       const pagingInput = pagingText.querySelector("input.tobago-sheet-pagingInput");
       pagingInput.addEventListener("blur", this.blurPaging.bind(this));
 
-      pagingInput.addEventListener("keydown", function (event: KeyboardEvent) {
+      pagingInput.addEventListener("keydown", function (event: KeyboardEvent): void {
         if (event.keyCode === 13) {
           event.stopPropagation();
           event.preventDefault();
@@ -233,7 +233,7 @@
     }
   }
 
-  saveColumnWidths(widths: number[]) {
+  saveColumnWidths(widths: number[]): void {
     const hidden = document.getElementById(this.id + DomUtils.SUB_COMPONENT_SEP + "widths");
     if (hidden) {
       hidden.setAttribute("value", JSON.stringify(widths));
@@ -251,14 +251,14 @@
     return JSON.parse(hidden.getAttribute("value"));
   }
 
-  addHeaderFillerWidth() {
+  addHeaderFillerWidth(): void {
     const last = document.getElementById(this.id).querySelector(".tobago-sheet-headerTable col:last-child");
     if (last) {
       last.setAttribute("width", String(Sheet.SCROLL_BAR_SIZE));
     }
   }
 
-  mousedown(event: MouseEvent) {
+  mousedown(event: MouseEvent): void {
 
     Page.page().dataset["SheetMousedownData"] = this.id;
 
@@ -282,7 +282,7 @@
     document.addEventListener("mouseup", mouseupListener);
   }
 
-  mousemove(event: MouseEvent) {
+  mousemove(event: MouseEvent): boolean {
     console.debug("move");
     let delta = event.clientX - this.mousemoveData.originalClientX;
     delta = -Math.min(-delta, this.mousemoveData.originalHeaderColumnWidth - 10);
@@ -295,7 +295,7 @@
     return false;
   }
 
-  mouseup(event: MouseEvent) {
+  mouseup(event: MouseEvent): boolean {
     console.debug("up");
 
     // switch off the mouse move listener
@@ -346,7 +346,7 @@
     return false;
   }
 
-  scroll(event) {
+  scroll(event): void {
     console.debug("scroll");
 
     const sheetBody: HTMLElement = event.currentTarget;
@@ -359,7 +359,7 @@
         JSON.stringify([Math.round(sheetBody.scrollLeft), Math.round(sheetBody.scrollTop)]));
   }
 
-  mousedownOnRow(event: MouseEvent) {
+  mousedownOnRow(event: MouseEvent): void {
     console.debug("mousedownOnRow");
     this.mousedownOnRowData = {
       x: event.clientX,
@@ -367,7 +367,7 @@
     };
   }
 
-  clickOnCheckbox(event: MouseEvent) {
+  clickOnCheckbox(event: MouseEvent): void {
     const checkbox = event.currentTarget as HTMLInputElement;
     if (checkbox.checked) {
       this.selectAll();
@@ -376,7 +376,7 @@
     }
   }
 
-  clickOnRow(event: MouseEvent) {
+  clickOnRow(event: MouseEvent): void {
 
     const row = event.currentTarget as HTMLTableRowElement;
     if (row.classList.contains("tobago-sheet-columnSelector") || !Sheet.isInputElement(row)) {
@@ -445,7 +445,7 @@
     }
   }
 
-  clickOnPaging(event: MouseEvent) {
+  clickOnPaging(event: MouseEvent): void {
     const element = event.currentTarget as HTMLElement;
 
     const output = element.querySelector(".tobago-sheet-pagingOutput") as HTMLElement;
@@ -457,7 +457,7 @@
     input.select();
   }
 
-  blurPaging(event: FocusEvent) {
+  blurPaging(event: FocusEvent): void {
     const input = event.currentTarget as HTMLInputElement;
     const output = input.parentElement.querySelector(".tobago-sheet-pagingOutput") as HTMLElement;
     if (output.innerHTML !== input.value) {
@@ -479,7 +479,7 @@
     }
   }
 
-  syncScrolling() {
+  syncScrolling(): void {
     // sync scrolling of body to header
     const header = this.getHeader();
     if (header) {
@@ -515,11 +515,11 @@
     return document.getElementById(this.id + DomUtils.SUB_COMPONENT_SEP + "selected") as HTMLInputElement;
   }
 
-  getHiddenScrollPosition() {
-    return document.getElementById(this.id + DomUtils.SUB_COMPONENT_SEP + "scrollPosition");
+  getHiddenScrollPosition(): HTMLInputElement {
+    return document.getElementById(this.id + DomUtils.SUB_COMPONENT_SEP + "scrollPosition") as HTMLInputElement;
   }
 
-  doDblClick(event) {
+  doDblClick(event): void {
     const row = event.currentTarget as HTMLTableRowElement;
     const rowIndex = row.sectionRowIndex + this.getFirst();
     if (this.dblClickActionId) {
@@ -560,7 +560,7 @@
     return parseInt(this.getElement().dataset["tobagoFirst"]);
   }
 
-  isRowSelected(row: HTMLTableRowElement) {
+  isRowSelected(row: HTMLTableRowElement): boolean {
     let rowIndex = +row.dataset["tobagoRowIndex"];
     if (!rowIndex) {
       rowIndex = row.sectionRowIndex + this.getFirst();
@@ -568,16 +568,16 @@
     return this.isSelected(rowIndex);
   }
 
-  isSelected(rowIndex: number) {
+  isSelected(rowIndex: number): boolean {
     const value = <number[]>JSON.parse(this.getHiddenSelected().value);
     return value.indexOf(rowIndex) > -1;
   }
 
-  resetSelected() {
+  resetSelected():void {
     this.getHiddenSelected().value = JSON.stringify([]);
   }
 
-  toggleSelection(row: HTMLTableRowElement, checkbox: HTMLInputElement) {
+  toggleSelection(row: HTMLTableRowElement, checkbox: HTMLInputElement): void {
     this.getElement().dataset["tobagoLastClickedRowIndex"] = String(row.sectionRowIndex);
     if (checkbox && !checkbox.disabled) {
       const selected = this.getHiddenSelected();
@@ -590,24 +590,24 @@
     }
   }
 
-  selectAll() {
+  selectAll(): void {
     const rows = this.getRows();
     this.selectRange(rows, 0, rows.length - 1, true, false);
   }
 
-  deselectAll() {
+  deselectAll(): void {
     const rows = this.getRows();
     this.selectRange(rows, 0, rows.length - 1, false, true);
   }
 
-  toggleAll() {
+  toggleAll(): void {
     const rows = this.getRows();
     this.selectRange(rows, 0, rows.length - 1, true, true);
   }
 
   selectRange(
       rows: NodeListOf<HTMLTableRowElement>, first: number, last: number, selectDeselected: boolean,
-      deselectSelected: boolean) {
+      deselectSelected: boolean): void {
     const selected = this.getHiddenSelected();
     const value = new Set<number>(JSON.parse(selected.value));
     for (let i = first; i <= last; i++) {
@@ -640,13 +640,13 @@
    * @param row tr-element: the row.
    * @param checkbox input-element: selector in the row.
    */
-  selectRow(selected: HTMLInputElement, rowIndex: number, row: HTMLTableRowElement, checkbox: HTMLInputElement) {
+  selectRow(selected: HTMLInputElement, rowIndex: number, row: HTMLTableRowElement, checkbox: HTMLInputElement): void {
     const selectedSet = new Set<number>(JSON.parse(selected.value));
     selected.value = JSON.stringify(Array.from(selectedSet.add(rowIndex)));
     row.classList.add("tobago-sheet-row-markup-selected");
     row.classList.add("table-info");
     checkbox.checked = true;
-    setTimeout(function () {
+    setTimeout(function ():void {
       checkbox.checked = true;
     }, 0);
   }
@@ -657,7 +657,8 @@
    * @param row tr-element: the row.
    * @param checkbox input-element: selector in the row.
    */
-  deselectRow(selected: HTMLInputElement, rowIndex: number, row: HTMLTableRowElement, checkbox: HTMLInputElement) {
+  deselectRow(
+      selected: HTMLInputElement, rowIndex: number, row: HTMLTableRowElement, checkbox: HTMLInputElement): void {
     const selectedSet = new Set<number>(JSON.parse(selected.value));
     selectedSet.delete(rowIndex);
     selected.value = JSON.stringify(Array.from(selectedSet));
@@ -665,7 +666,7 @@
     row.classList.remove("table-info");
     checkbox.checked = false;
     // XXX check if this is still needed... Async because of TOBAGO-1312
-    setTimeout(function () {
+    setTimeout(function (): void {
       checkbox.checked = false;
     }, 0);
   }
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-split-layout.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-split-layout.ts
index c3bc661..2da4fcf 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-split-layout.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-split-layout.ts
@@ -57,7 +57,7 @@
     this.setAttribute("orientation", orientation);
   }
 
-  start(event: MouseEvent) {
+  start(event: MouseEvent): void {
     event.preventDefault();
     const splitter = event.target as HTMLElement;
     const previous = DomUtils.previousElementSibling(splitter);
@@ -121,11 +121,11 @@
     return new SplitLayoutMousedown(data);
   }
 
-  static load() {
+  static load(): SplitLayoutMousedown {
     return new SplitLayoutMousedown(Page.page().dataset["SplitLayoutMousedownData"]);
   }
 
-  static remove() {
+  static remove(): void {
     Page.page().dataset["SplitLayoutMousedownData"] = null;
   }
 
@@ -155,6 +155,6 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-split-layout', SplitLayout);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-split-layout", SplitLayout);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-stars.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-stars.ts
index 8d960d6..6b40bff 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-stars.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-stars.ts
@@ -23,7 +23,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     const hiddenInput = this.querySelector("input[type=hidden]") as HTMLInputElement;
     const container = this.querySelector(".tobago-stars-container") as HTMLElement;
     const tooltip = container.querySelector(".tobago-stars-tooltip") as HTMLElement;
@@ -61,23 +61,23 @@
     if (!readonly && !disabled) {
       /* preselectMode is a Workaround for IE11: fires change event instead of input event */
       let preselectMode = false;
-      slider.addEventListener('mousedown', function (event) {
+      slider.addEventListener("mousedown", function (event: Event): void {
         preselectMode = true;
       });
-      slider.addEventListener('mouseup', function (event) {
+      slider.addEventListener("mouseup", function (event: Event): void {
         preselectMode = false;
         selectStars();
       });
 
-      slider.addEventListener('input', function (event) {
+      slider.addEventListener("input", function (event: Event): void {
         preselectStars();
       });
-      slider.addEventListener('touchend', function (event) {
+      slider.addEventListener("touchend", function (event: Event): void {
         /* Workaround for mobile devices. TODO: fire AJAX request for 'touchend' */
         // slider.trigger("change");
         slider.dispatchEvent(new Event("change"));
       });
-      slider.addEventListener('change', function (event) {
+      slider.addEventListener("change", function (event: Event): void {
         if (preselectMode) {
           preselectStars();
         } else {
@@ -85,12 +85,12 @@
         }
       });
 
-      slider.addEventListener('touchstart', touchstart);
-      slider.addEventListener('touchmove', touchstart);
+      slider.addEventListener("touchstart", touchstart);
+      slider.addEventListener("touchmove", touchstart);
     }
 
     // XXX current issue: on ios-Safari select 5 stars and than click on 1 star doesn't work on labeled component.
-    function touchstart(event: TouchEvent) {
+    function touchstart(event: TouchEvent): void {
       /* Workaround for Safari browser on iPhone */
       const target = event.currentTarget as HTMLInputElement;
       const sliderValue = (parseInt(target.max) / target.offsetWidth)
@@ -105,7 +105,7 @@
       preselectStars();
     }
 
-    function preselectStars() {
+    function preselectStars(): void {
       tooltip.classList.add("show");
 
       if (parseInt(slider.value) > 0) {
@@ -127,7 +127,7 @@
       }
     }
 
-    function selectStars() {
+    function selectStars(): void {
       tooltip.classList.remove("show");
       preselected.classList.remove("show");
 
@@ -160,6 +160,6 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-stars', Stars);
+document.addEventListener("DOMContentLoaded", function (event:Event): void {
+  window.customElements.define("tobago-stars", Stars);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-suggest.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-suggest.ts
index 586194c..b83efaf 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-suggest.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-suggest.ts
@@ -23,13 +23,13 @@
 
   hiddenInput: HTMLInputElement;
 
-  static loadFromServer = function (input: HTMLInputElement) {
+  static loadFromServer = function (input: HTMLInputElement): (query, syncResults, asyncResults) => void {
 
     let timeout;
 
-    return function findMatches(query, syncResults, asyncResults) {
+    return function findMatches(query, syncResults, asyncResults): void {
 
-      const root = input.getRootNode() as ShadowRoot|Document;
+      const root = input.getRootNode() as ShadowRoot | Document;
       let suggest = root.getElementById(input.dataset["tobagoSuggestFor"]) as Suggest;
 
       // todo: suggest.hiddenInput.value should contain the last query value
@@ -41,7 +41,7 @@
 
         const delay = suggest.delay;
 
-        timeout = setTimeout(function () {
+        timeout = setTimeout(function (): void {
           suggest.hiddenInput.value = query;
           Suggest.asyncResults = asyncResults;
           delete suggest.dataset["tobagoSuggestData"];
@@ -61,10 +61,10 @@
     };
   };
 
-  static fromClient = function (data) {
-    return function findMatches(query, syncResults) {
-      var result = [];
-      for (var i = 0; i < data.length; i++) {
+  static fromClient = function (data): (query, syncResults) => void {
+    return (query, syncResults): void => {
+      const result = [];
+      for (let i = 0; i < data.length; i++) {
         if (data[i].indexOf(query) >= 0) {
           result.push(data[i]);
         }
@@ -153,8 +153,8 @@
     }
   }
 
-  connectedCallback() {
-    const root = this.getRootNode() as ShadowRoot|Document;
+  connectedCallback(): void {
+    const root = this.getRootNode() as ShadowRoot | Document;
     const input = root.getElementById(this.for) as HTMLInputElement;
     const $input = jQuery(input);
 
@@ -167,12 +167,11 @@
       input.dataset["tobagoSuggestFor"] = this.id;
       input.autocomplete = "off";
 
-      var source;
+      let source;
       if (this.update) {
         source = Suggest.loadFromServer(input);
       } else {
-        var data2 = this.data;
-        source = Suggest.fromClient(data2);
+        source = Suggest.fromClient(this.data);
       }
 
       let suggestPopup = root.getElementById(this.id + "::popup");
@@ -197,7 +196,7 @@
         source: source
       });
       // old with jQuery:
-      $input.on('typeahead:change', function (event: JQuery.Event) {
+      $input.on("typeahead:change", function (event: JQuery.Event): void {
         const input = this;
         input.dispatchEvent(new Event("change"));
       });
@@ -208,7 +207,7 @@
       // });
 
       // old with jQuery:
-      $input.on('typeahead:open', function (event: JQuery.Event) {
+      $input.on("typeahead:open", function (event: JQuery.Event): void {
         const input = this;
         const suggestPopup = root.getElementById(input.dataset["tobagoSuggestFor"] + "::popup");
         suggestPopup.style.top = DomUtils.offset(input).top + input.offsetHeight + "px";
@@ -229,6 +228,6 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
   window.customElements.define("tobago-suggest", Suggest);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tab.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tab.ts
index e99b522..0046888 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tab.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tab.ts
@@ -24,7 +24,7 @@
     this.hiddenInput = this.querySelector(":scope > input[type=hidden]");
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
   }
 
   get switchType(): string {
@@ -55,7 +55,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     let navLink = this.navLink;
     if (!navLink.classList.contains("disabled")) {
       navLink.addEventListener("click", this.select.bind(this));
@@ -74,7 +74,7 @@
     return this.closest("tobago-tab-group") as TabGroup;
   }
 
-  select(event: MouseEvent) {
+  select(event: MouseEvent): void {
     const tabGroup = this.tabGroup;
     const old = tabGroup.getSelectedTab();
     tabGroup.selected = this.index;
@@ -113,7 +113,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
   }
 
   get index(): number {
@@ -121,8 +121,8 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
-  window.customElements.define('tobago-tab', Tab);
-  window.customElements.define('tobago-tab-content', TabContent);
-  window.customElements.define('tobago-tab-group', TabGroup);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-tab", Tab);
+  window.customElements.define("tobago-tab-content", TabContent);
+  window.customElements.define("tobago-tab-group", TabGroup);
 });
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree-listbox.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree-listbox.ts
index 8d0e04a..4c7b458 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree-listbox.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree-listbox.ts
@@ -22,7 +22,7 @@
 
   id: string;
 
-  static init = function (element) {
+  static init = function (element: HTMLElement): void {
     for (const treeListbox of DomUtils.selfOrElementsByClassName(element, "tobago-treeListbox")) {
       new TreeListbox(treeListbox);
     }
@@ -48,7 +48,7 @@
     }
   }
 
-  onChange(event: TextEvent) {
+  onChange(event: TextEvent): void {
     let listbox = event.currentTarget as HTMLSelectElement;
     for (const child of listbox.children) {
       const option = child as HTMLOptionElement;
@@ -89,7 +89,7 @@
     }
   }
 
-  setSelected(option: HTMLOptionElement) {
+  setSelected(option: HTMLOptionElement): void {
     const hidden = document.getElementById(this.id + DomUtils.SUB_COMPONENT_SEP + "selected") as HTMLInputElement;
     if (hidden) {
       let value = <number[]>JSON.parse(hidden.value);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts
index b5056f4..64b1c2f 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts
@@ -23,7 +23,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
   }
 
   get isSheet(): boolean {
@@ -95,7 +95,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     if (this.isExpandable() && this.toggles !== null) {
       this.toggles.forEach(element => element.addEventListener("click", this.toggleNode.bind(this)));
     }
@@ -204,7 +204,7 @@
     }
   }
 
-  showNodes(treeChildNodes: NodeListOf<TreeNode>) {
+  showNodes(treeChildNodes: NodeListOf<TreeNode>): void {
     for (const treeChildNode of treeChildNodes) {
 
       if (treeChildNode.tree.isSheet) {
@@ -224,7 +224,7 @@
     super();
   }
 
-  connectedCallback() {
+  connectedCallback(): void {
     this.input.addEventListener("change", this.select.bind(this));
 
     if (this.tree.selectable === Selectable.multiCascade) {
@@ -276,7 +276,7 @@
   }
 }
 
-document.addEventListener("DOMContentLoaded", function (event) {
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
   window.customElements.define("tobago-tree-select", TreeSelect);
   window.customElements.define("tobago-tree-node", TreeNode);
   window.customElements.define("tobago-tree", Tree);
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-utils.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-utils.ts
index d3dd795..30153a0 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-utils.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-utils.ts
@@ -20,12 +20,12 @@
   /**
    * JSF's component separator constant
    */
-  static readonly COMPONENT_SEP = ':';
+  static readonly COMPONENT_SEP = ":";
 
   /**
-   * Tobago's sub-coponent separator constant
+   * Tobago's sub-component separator constant
    */
-  static readonly SUB_COMPONENT_SEP = '::';
+  static readonly SUB_COMPONENT_SEP = "::";
 
   /**
    * Find all elements (and also self) which have the class "className".
@@ -89,12 +89,12 @@
     return null;
   }
 
-  static outerWidthWithMargin(element: HTMLElement) {
+  static outerWidthWithMargin(element: HTMLElement): number {
     const style = window.getComputedStyle(element);
     return element.offsetWidth + parseInt(style.marginLeft) + parseInt(style.marginRight);
   }
 
-  static outerHeightWithMargin(element: HTMLElement) {
+  static outerHeightWithMargin(element: HTMLElement): number {
     const style = window.getComputedStyle(element);
     return element.offsetHeight + parseInt(style.marginTop) + parseInt(style.marginBottom);
   }
@@ -113,7 +113,7 @@
     return {top: top, left: left};
   }
 
-  static isVisible(element: HTMLElement) {
+  static isVisible(element: HTMLElement): boolean {
     return element.offsetWidth > 0 || element.offsetHeight > 0 || element.getClientRects().length > 0;
   }
 
@@ -123,24 +123,7 @@
    * @return A string which can be used as a jQuery selector.
    */
   static escapeClientId(id: string): string {
-    return '#' + id.replace(/([:\.])/g, '\\$1');
-  }
-
-}
-
-export class Tobago4Utils {
-
-  /**
-   * Helps to select either elements from the whole DOM or only find in sub trees
-   * (in the case of AJAX partial rendering)
-   * @param elements a jQuery object to initialize (ajax) or null for initializing the whole document (full load).
-   * @param selector a jQuery selector.
-   */
-  static selectWithJQuery(elements, selector) {
-    elements = elements.jQuery ? elements : jQuery(elements); // fixme jQuery -> ES5
-    return elements == null
-        ? jQuery(selector)
-        : elements.find(selector).add(elements.filter(selector));
+    return "#" + id.replace(/([:\.])/g, "\\$1");
   }
 
   /**
@@ -151,27 +134,26 @@
    * "a:b::sub-component" -> "a"
    * "a::sub-component:b" -> "a::sub-component" // should currently not happen in Tobago
    *
-   * @param id The clientId of a component.
+   * @param clientId The clientId of a component.
    * @return The clientId of the naming container.
    */
-  static getNamingContainerId(id) {
-    if (id == null) {
+  static getNamingContainerId(clientId: string): string {
+    if (clientId == null || clientId.lastIndexOf(DomUtils.COMPONENT_SEP) === -1) {
       return null;
     }
-    if (id.lastIndexOf(":") == -1) {
-      return null;
-    }
+
+    let id = clientId;
     while (true) {
-      var sub = id.lastIndexOf("::");
+      const sub = id.lastIndexOf(DomUtils.SUB_COMPONENT_SEP);
       if (sub == -1) {
         break;
       }
-      if (sub + 1 == id.lastIndexOf(":")) {
+      if (sub + 1 == id.lastIndexOf(DomUtils.COMPONENT_SEP)) {
         id = id.substring(0, sub);
       } else {
         break;
       }
     }
-    return id.substring(0, id.lastIndexOf(":"));
+    return id.substring(0, id.lastIndexOf(DomUtils.COMPONENT_SEP));
   }
-}
\ No newline at end of file
+}
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/tslint.json b/tobago-theme/tobago-theme-standard/src/main/npm/tslint.json
index 49e3aa9..b644691 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/tslint.json
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/tslint.json
@@ -8,6 +8,12 @@
     ],
     "max-line-length": {
       "options": [120]
-    }
+    },
+    "no-consecutive-blank-lines": true,
+    "no-var-keyword": true,
+    "no-parameter-reassignment": true,
+    "quotemark": [true, "double"],
+    "typedef": [true, "call-signature"],
+    "indent": [true, "spaces", 2]
   }
 }
