diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index 3d0e2cacd..095040c63 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -33,27 +33,30 @@ import ExtraLinkButton from "./BigComponents/ExtraLinkButton";
  * Adds a welcome pane, contorl buttons, ... etc to index.html
  */
 export default class DefaultGUI {
-    private readonly _guiState: DefaultGuiState;
+    private readonly guiState: DefaultGuiState;
     private readonly state: FeaturePipelineState;
 
 
     constructor(state: FeaturePipelineState, guiState: DefaultGuiState) {
         this.state = state;
-        this._guiState = guiState;
+        this.guiState = guiState;
 
-        if (state.layoutToUse.customCss !== undefined) {
-            Utils.LoadCustomCss(state.layoutToUse.customCss);
+        }
+
+    public setup(){
+        if (this.state.layoutToUse.customCss !== undefined) {
+            Utils.LoadCustomCss(this.state.layoutToUse.customCss);
         }
 
         this.SetupUIElements();
         this.SetupMap()
 
 
-        if (state.layoutToUse.customCss !== undefined && window.location.pathname.indexOf("index") >= 0) {
-            Utils.LoadCustomCss(state.layoutToUse.customCss)
+        if (this.state.layoutToUse.customCss !== undefined && window.location.pathname.indexOf("index") >= 0) {
+            Utils.LoadCustomCss(this.state.layoutToUse.customCss)
         }
     }
-
+    
     public setupClickDialogOnMap(filterViewIsOpened: UIEventSource<boolean>, state: FeaturePipelineState) {
 
         const hasPresets = state.layoutToUse.layers.some(layer => layer.presets.length > 0);
@@ -125,7 +128,7 @@ export default class DefaultGUI {
 
     private SetupMap() {
         const state = this.state;
-        const guiState = this._guiState;
+        const guiState = this.guiState;
 
         // Attach the map
         state.mainMapObject.SetClass("w-full h-full")
@@ -155,7 +158,7 @@ export default class DefaultGUI {
 
     private SetupUIElements() {
         const state = this.state;
-        const guiState = this._guiState;
+        const guiState = this.guiState;
 
         const self = this
         new Combine([
@@ -210,8 +213,8 @@ export default class DefaultGUI {
     }
 
     private InitWelcomeMessage(): BaseUIElement {
-        const isOpened = this._guiState.welcomeMessageIsOpened
-        const fullOptions = new FullWelcomePaneWithTabs(isOpened, this._guiState.welcomeMessageOpenedTab, this.state);
+        const isOpened = this.guiState.welcomeMessageIsOpened
+        const fullOptions = new FullWelcomePaneWithTabs(isOpened, this.guiState.welcomeMessageOpenedTab, this.state);
 
         // ?-Button on Desktop, opens panel with close-X.
         const help = new MapControlButton(Svg.help_svg());
diff --git a/index.ts b/index.ts
index ac7502261..355eb5e93 100644
--- a/index.ts
+++ b/index.ts
@@ -36,7 +36,7 @@ class Init {
         // This 'leaks' the global state via the window object, useful for debugging
         // @ts-ignore
         window.mapcomplete_state = State.state;
-        new DefaultGUI(State.state, guiState)
+        new DefaultGUI(State.state, guiState).setup()
     }
 }
 
diff --git a/package-lock.json b/package-lock.json
index 75394936b..34bf3624d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,7 +26,7 @@
         "@types/wikidata-sdk": "^6.1.0",
         "@types/xml2js": "^0.4.9",
         "country-language": "^0.1.7",
-        "doctest-ts-improved": "^0.8.5",
+        "doctest-ts-improved": "^0.8.6",
         "email-validator": "^2.0.4",
         "escape-html": "^1.0.3",
         "geojson2svg": "^1.3.1",
@@ -6024,14 +6024,15 @@
       "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
     },
     "node_modules/doctest-ts-improved": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/doctest-ts-improved/-/doctest-ts-improved-0.8.5.tgz",
-      "integrity": "sha512-4zU8fQV263CU3jAi+K7xohhT9b2ZDGw20M4O7AgzW1IoKklmNkSlHMoKZX6gqN1DAouo08R+MD5aSgACG5ILRw==",
+      "version": "0.8.6",
+      "resolved": "https://registry.npmjs.org/doctest-ts-improved/-/doctest-ts-improved-0.8.6.tgz",
+      "integrity": "sha512-J7fXMJ29ve6DUsUHKEO5bOwGmYjhNZd88L7NMVDKIiLIiUCJ9zkR2k7IZOGjMC0RXw/q788REawcMUgIj+7Muw==",
       "dependencies": {
         "@types/chai": "^4.3.0",
         "chai": "^4.3.6",
         "global": "^4.3.2",
         "mocha": "^9.2.2",
+        "process-yargs-parser": "^2.1.0",
         "typescript": "^4.6.2"
       },
       "bin": {
@@ -12326,6 +12327,11 @@
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
+    "node_modules/process-yargs-parser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/process-yargs-parser/-/process-yargs-parser-2.1.0.tgz",
+      "integrity": "sha512-tzMsZn3lKksICtEhICR/k+Qv1UmQNVtzm0FaL10OiGJtw0ixgw0woNefcREDc6ZjqXOKBSruRagyULuwZ4FK4Q=="
+    },
     "node_modules/prompt-sync": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz",
@@ -21413,14 +21419,15 @@
       "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
     },
     "doctest-ts-improved": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/doctest-ts-improved/-/doctest-ts-improved-0.8.5.tgz",
-      "integrity": "sha512-4zU8fQV263CU3jAi+K7xohhT9b2ZDGw20M4O7AgzW1IoKklmNkSlHMoKZX6gqN1DAouo08R+MD5aSgACG5ILRw==",
+      "version": "0.8.6",
+      "resolved": "https://registry.npmjs.org/doctest-ts-improved/-/doctest-ts-improved-0.8.6.tgz",
+      "integrity": "sha512-J7fXMJ29ve6DUsUHKEO5bOwGmYjhNZd88L7NMVDKIiLIiUCJ9zkR2k7IZOGjMC0RXw/q788REawcMUgIj+7Muw==",
       "requires": {
         "@types/chai": "^4.3.0",
         "chai": "^4.3.6",
         "global": "^4.3.2",
         "mocha": "^9.2.2",
+        "process-yargs-parser": "^2.1.0",
         "typescript": "^4.6.2"
       },
       "dependencies": {
@@ -26306,6 +26313,11 @@
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
+    "process-yargs-parser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/process-yargs-parser/-/process-yargs-parser-2.1.0.tgz",
+      "integrity": "sha512-tzMsZn3lKksICtEhICR/k+Qv1UmQNVtzm0FaL10OiGJtw0ixgw0woNefcREDc6ZjqXOKBSruRagyULuwZ4FK4Q=="
+    },
     "prompt-sync": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz",
diff --git a/package.json b/package.json
index 038b46def..8a84395bc 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
     "strttest": "export NODE_OPTIONS=--max_old_space_size=8364 && parcel serve test.html",
     "watch:css": "tailwindcss -i index.css -o css/index-tailwind-output.css --watch",
     "generate:css": "tailwindcss -i index.css -o css/index-tailwind-output.css",
-    "generate:doctests": "doctest-ts-improved .",
+    "generate:doctests": "doctest-ts-improved . --ignore .*.spec.ts --ignore .*ConfigJson.ts",
     "test:run-only": "mocha --require ts-node/register --require test/testhooks.ts \"./**/*.doctest.ts\" \"test/*\" \"test/**/*.ts\"",
     "test": "(npm run generate:doctests 2>&1 | grep -v \"No doctests found in\") && npm run test:run-only && npm run clean:tests",
     "init": "npm ci && npm run generate && npm run generate:editor-layer-index && npm run generate:layouts && npm run clean",
@@ -72,7 +72,7 @@
     "@types/wikidata-sdk": "^6.1.0",
     "@types/xml2js": "^0.4.9",
     "country-language": "^0.1.7",
-    "doctest-ts-improved": "^0.8.5",
+    "doctest-ts-improved": "^0.8.6",
     "email-validator": "^2.0.4",
     "escape-html": "^1.0.3",
     "geojson2svg": "^1.3.1",
diff --git a/tslint.json b/tslint.json
new file mode 100644
index 000000000..0cd44d383
--- /dev/null
+++ b/tslint.json
@@ -0,0 +1,72 @@
+{
+    "rules": {
+        "class-name": false,
+        "comment-format": [
+            true
+        ],
+        "curly": false,
+        "eofline": false,
+        "forin": false,
+        "indent": [
+            true,
+            "spaces"
+        ],
+        "label-position": true,
+        "max-line-length": false,
+        "member-access": false,
+        "member-ordering": [
+            true,
+            "static-after-instance",
+            "variables-before-functions"
+        ],
+        "no-arg": true,
+        "no-bitwise": false,
+        "no-console": false,
+        "no-construct": true,
+        "no-debugger": true,
+        "no-duplicate-variable": true,
+        "no-empty": false,
+        "no-eval": true,
+        "no-inferrable-types": true,
+        "no-shadowed-variable": true,
+        "no-string-literal": false,
+        "no-switch-case-fall-through": true,
+        "no-trailing-whitespace": true,
+        "no-unused-expression": true,
+        "no-use-before-declare": false,
+        "no-var-keyword": true,
+        "object-literal-sort-keys": false,
+        "one-line": [
+            true,
+            "check-open-brace",
+            "check-catch",
+            "check-else",
+            "check-whitespace"
+        ],
+        "quotemark": false,
+        "radix": true,
+        "semicolon": [
+            "always"
+        ],
+        "triple-equals": [],
+        "typedef-whitespace": [
+            true,
+            {
+                "call-signature": "nospace",
+                "index-signature": "nospace",
+                "parameter": "nospace",
+                "property-declaration": "nospace",
+                "variable-declaration": "nospace"
+            }
+        ],
+        "variable-name": false,
+        "whitespace": [
+            true,
+            "check-branch",
+            "check-decl",
+            "check-operator",
+            "check-separator",
+            "check-type"
+        ]
+    }
+}