diff --git a/.gitignore b/.gitignore
index 43a8d1508996bab2a79fd3dd26f21cbc919a37d3..530db921a751c03ed4845be0de44338fd51a3ba4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,9 @@
 aws.xml
 workspace.xml
+.gitlab-ci-local
+Wiki/.idea
+
+ExerciseChecker/src/config/Version.ts
 
 ############################ MacOS
 # General
diff --git a/ExerciseChecker/.env.vault b/ExerciseChecker/.env.vault
index 191e70d5b3df7008634ca6ccb25494aaa513b4ab..805a49510414790d46a647460afab00ef34e66f8 100644
--- a/ExerciseChecker/.env.vault
+++ b/ExerciseChecker/.env.vault
@@ -4,8 +4,8 @@
 #/--------------------------------------------------/
 
 # development
-DOTENV_VAULT_DEVELOPMENT="Ir7CPeMh8qd9jAgmy8RaSTlY3OA4Kw6xHB+j7AJjfM07H2koRKpOUP5Fsa+XBYp1rjTCl5p2063/H3ed2VmhUwIHxa+CUwHOagy+kKLYHBVzEdSrE6EK96+ihyGwjkrFRdRRWar74TxaCsxoNpLUz0HtK1fbJZMFUhgJOklBcw8BdH6mrq3RI8+tkSx5nOTJTGo0OhilsAZTeAbOdcZQNIcIfbZVMLD1X3YocqitLyAURzfyEegp3XOHfpOr+45/Be4HaakylijLggn73sS/fDr/yo2IRHTz7il/Y8IO3kUMJnSXoqQM1EPzqiYEtIFsDW2aVjLnbDdM2BxlNe+Cv50yglPINfkOMJ3ZBsELjkDBI9N5wLW9qyoF5zxaw4jfnGTPuVsM1FhozEGTBg64GtJ82WI0ftDjt06E1jkMB9hWbYS5pKBWHq/w2A+TfatZjn9QmgEuiO5Q8RW6srojTsuuMjJwVC9YCzjzvxC0YJulfMCBYuPW1cVagp6CkA5soo7iaEfJmt++GhWkYGBMq9EeezTl5GEarpUBYdLYlwfICsgP1E+9lF5dud+zWnrGzBVeePBmcVO86C/SZici/3HkORY68NoqbswV5AXJyACFT6Qf+z3k8CLkrCvfti6xvAAf4ivorbnihB0RX4znE4e70qCU2w3QjS+cwuHuC8sEp4SpqxR+kP2+ktfA5pw08yoFg4zrSTwuvJN8OnLyryo0VODCWA1V6Bom/imtCLn2nRuYQhO0AYiAtvyWOTbeduQ7rixeYc98j80sVHU7PY4hFbF7NVnWUY+nhzJ3rbK1y9q7iLLkpivsRmeosIIhVtoSR+Lur/hYZ2ReFyA6OHofxdcIqKiphG4HLZl9lCq6a+UlRAOqN98XABGmJ1KhCTsFxTTuGahMU1r556O/4NJFnubPU1DH80n71AB4HdD2qCxs4Tm4fDVs3cDv7fak"
+DOTENV_VAULT_DEVELOPMENT="+tvA0uHhVW7Czj260K5arwAA4mmVBQC/83i6YXPo7fEEoiBvXZCPSovZ23phpqYx5LmqgtTQALb5gisUqSJfrjwDYABKk0tfrkCvrFayUxv5NuFSd2RVliE1JJ5nZgVeAdcy01igGgQOdFzS5Ze/Gy5iEP+C7Nq8HflazeQrlAXlIGNlPe77v+bSIce1Itf9dj8/sB5xz6wwRY5TSF+CM1OI8dTTrKOruxKXVQP0ztpUsGHUjQvowYR7JHeXQOivn8phUTWjR4vZskTBGGe/s0DiIQ5qQq+HR2LFxVEmzOI0eHY5vSEkZ9pAYmUX9GB0uJcAwdInSiLWkgC12t+7FuMfHM7JtE6pI0NECQwZIWm1DZSurYr8wIiYCg4Ds8xsHFPE+CmJma3jfZzx9aE/RN2AM7fbvKWVLakPB3OQK9SrPaM6jWVRfkaEqUDqggX4gJy98SAHznYhGamsQBxWa7wXRrlXC844SDCoZVsql22UNy/hRnXjGKonHhlm6MQE4y07btcfRkPF696Mvjue8Y/loTS0GGLZXFr+3LcRLcJTTwDT88tdNbQd5QiaFTTMY7pDAFeDke5M7VqYlFcrAtb8+9TGtZOXBgnYXmSpF+KKw4JwY6v7rw9wAGE3W++xI70stmCZU+M5/TDLO5SoWzcqlWJEe2VMI6QZmegzPGymc5g47ujdwvWKg1JZlLcrXjDMBi2/2Mv4H95PYpt6rEpY+ZHtNaO/kI6hRbqUvIZ8frL1dM5DihtoIaHpADnSQ0YfWlk01LA6Jm1BFBJr7RUHLw/S+avzMlbHnjAvxL36dUagvwynDQFapwhFrqLiq9vTmM+8tPQeOuGeutJlJgvDgGxd6hmiHDImrknZtNQiZ0hkVCoVgwopRe/bxlfGAqbpZUvs6eu9CFT6poWOVUvq2lilRlUQXESs7CP599cpLYgu3zViQB7wG659bAK+CNWsJlDoYN4dfT5Bw+P/6pTta/9hegT6f0/ui8p4oRK2bsJMCv8+502M52beU4GjBIjNTepFauCi9LcxIMzXclscedj0qlE="
 
 # production
-DOTENV_VAULT_PRODUCTION="NEaGKlOKDlL652EG43Iid/7P4ybOxkmc3t+6xgKS11Kevzs7zocA8cjJqfkjBAFdMu1oZbiLO+dzXgqEVHmu+66Qr8CDMufQsNXgpO6viLUx/FlDpeY1IYJVma/W1GwEP+5AW2BhrT7MJnBidzx5wHomjy+CAYlMoV3c4Q/obJQcomq65jn5KSgaiFcyLqitbUESJhxAS5adRXvtkdbqaXR5yCRtXF2OS50HW544/9qf9e9hqwELHrd1fYOJqYuE/zbZV3ZGgwgK7Ui0tv8MU4uN6LzpTTZVWdK4cdMuQTtX23rTWg9J9WcAj5M8jpo309VFPPxN3SfzoQHVb9+RlL+XEH92EwRFFevtKdE07Wz5ZbUbtiKAqkqaKiusjSALasoT+mW5LFWjFdFCDJKof98w00kR7c6PoTDBw50Zh5/z+UPn4uXT8ZOKV7ooxGQLATrBP+4k7pyBx2bYCo/o0tbgSJ4uTv+Wo2eVwUXrptxwmp6Tow50NAdcvKJCQmDe43e6PMsyX+9GO6CbRywvS/2aLffXRly+txqkr0B9/suMwuQwyEv8LOVR9Q2z3MC6leQ3VAaGxNGLKEdtJFgn+31JnciGy6HQABDZ6Agc/Tux4PBOOWy0yq0mGQztIk/0dj+WMro="
+DOTENV_VAULT_PRODUCTION="bhLJF6f7KLRNI6witxN4RNPaylwg/Z+3VB52htArsNhYUck4OhUMaKZRCAdAo90JCd+ap3xyvipfqdGsbwXBq79VVcKDNzW9pSkYGBZvNpTPk2xnGAfZmAhgZmz4AX1Jbmb6rjpTRDemL8ocsEqVlb0KsxhcPjALjVvHeDxbWUiFc4MsnNo7L26PRNFpV1aVQ6F1u90WymMsEBE6lGnArXbnyREMM3tqq7fBxczg2um8dt50MRTYCWpG+7/Hdp7TnusoRSYU5Qs6Y0kI3UQxLUXuP+QN9ktI7+6RJ1aki31XojTggtKPXskVvhzZeU5k5ZGYJSn46BTQNFqx7KpLPKo9cTNNZiIV7wVmNyUGmOQfCAdyN14TN8/0LDs3QnglQd4XUkYHlTPFQFbUFlGIvh8ErtOcgH3cu7sfO0z2diZFvHI5fAjuUJdjTSGtP07aI1pXUMHU4YHUX7W8ycf4wP9k91tynd0YLLeXagEuSnfXx5ev/iguvh9BZV4jy328igHB4Cxh0yY24hClzIKc2fqghvLMkafBUID/JMjG/N/AdHxaw/UiXsvK4oJUHpYKLC83UeGugMonfppZdIzPpTrji487SI04zIVCJGxf1bXMGJWHNycff5Ehi5MNHqiDDkwY6OzsGPUyzrTC4/KHGyQwMbdBmrmLEWqlzDoLprm9j0CuAavAHj3eaFnuiOKhs1B8Qb3LosCDPJuErJavI/g2gj59YkiIDLjnUQ=="
 
diff --git a/ExerciseChecker/package-lock.json b/ExerciseChecker/package-lock.json
index d23a2e213bdbd4d41e61a63691411928a7b7f6ea..bc17bf89d7aa6a08a36c4cd8087e8708930a1366 100644
--- a/ExerciseChecker/package-lock.json
+++ b/ExerciseChecker/package-lock.json
@@ -1,12 +1,13 @@
 {
     "name": "dojo_exercise_checker",
-    "version": "2.1.0",
+    "version": "2.2.0",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
             "name": "dojo_exercise_checker",
-            "version": "2.1.0",
+            "version": "2.2.0",
+            "license": "AGPLv3",
             "dependencies": {
                 "ajv": "^8.12.0",
                 "axios": "^1.4.0",
@@ -31,6 +32,7 @@
                 "@types/node": "^18.17.1",
                 "@types/tar-stream": "^2.2.2",
                 "dotenv-vault": "^1.25.0",
+                "genversion": "^3.1.1",
                 "pkg": "^5.8.1",
                 "tiny-typed-emitter": "^2.1.0",
                 "ts-node": "^10.9.1",
@@ -61,9 +63,9 @@
             }
         },
         "node_modules/@babel/helper-validator-identifier": {
-            "version": "7.22.15",
-            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
-            "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
+            "version": "7.22.20",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+            "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
@@ -299,9 +301,9 @@
             "dev": true
         },
         "node_modules/@oclif/plugin-help": {
-            "version": "5.2.19",
-            "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.19.tgz",
-            "integrity": "sha512-gf6/dFtzMJ8RA4ovlBCBGJsZsd4jPXhYWJho+Gh6KmA+Ev9LupoExbE0qT+a2uHJyHEvIg4uX/MBW3qdERD/8g==",
+            "version": "5.2.20",
+            "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.20.tgz",
+            "integrity": "sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==",
             "dev": true,
             "dependencies": {
                 "@oclif/core": "^2.15.0"
@@ -365,9 +367,9 @@
             }
         },
         "node_modules/@oclif/plugin-not-found": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.4.1.tgz",
-            "integrity": "sha512-LqW7qpw5Q8ploRiup2jEIMQJXcxHP1tpwj45GApKQMe7GRdGdRdjBT9Tu+U2tdEgMqgMplAIhOsYCx2nc2nMSw==",
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.4.3.tgz",
+            "integrity": "sha512-nIyaR4y692frwh7wIHZ3fb+2L6XEecQwRDIb4zbEam0TvaVmBQWZoColQyWA84ljFBPZ8XWiQyTz+ixSwdRkqg==",
             "dev": true,
             "dependencies": {
                 "@oclif/core": "^2.15.0",
@@ -433,9 +435,9 @@
             }
         },
         "node_modules/@oclif/plugin-update": {
-            "version": "3.2.3",
-            "resolved": "https://registry.npmjs.org/@oclif/plugin-update/-/plugin-update-3.2.3.tgz",
-            "integrity": "sha512-JVKwp4ysG9GU4RmG59MZYMunz8onRI+wEQzJThyYkUFd0VfZviYt2FHsyoNtxi30l0tInC8APgKp1pCCO4e+FQ==",
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/@oclif/plugin-update/-/plugin-update-3.2.4.tgz",
+            "integrity": "sha512-41G7NTKND+yTpb8LHlvlMIcNoaEUIIJuEwju9igL+ME/pN/53opeXgFV2IjjeFiexXj50OfesY9OQ6lqOZHw+g==",
             "dev": true,
             "dependencies": {
                 "@oclif/core": "^2.11.8",
@@ -553,9 +555,9 @@
             }
         },
         "node_modules/@oclif/plugin-warn-if-update-available": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.1.0.tgz",
-            "integrity": "sha512-liTWd/qSIqALsikr88CAB9o2xGFt0LdT5REbhxtrx16/trRmkxQ+0RHK1FieGZAzEENx/4D3YcC/Y67a0uyO0g==",
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.1.1.tgz",
+            "integrity": "sha512-y7eSzT6R5bmTIJbiMMXgOlbBpcWXGlVhNeQJBLBCCy1+90Wbjyqf6uvY0i2WcO4sh/THTJ20qCW80j3XUlgDTA==",
             "dev": true,
             "dependencies": {
                 "@oclif/core": "^2.15.0",
@@ -624,9 +626,9 @@
             }
         },
         "node_modules/@oclif/screen": {
-            "version": "3.0.6",
-            "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.6.tgz",
-            "integrity": "sha512-nEv7dFPxCrWrvK6dQ8zya0/Kb54EXVcwIKV9capjSa89ZDoOo+qH0YSo4/eQVECXgW3eUvgKLDIcIt62YBk0HA==",
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.7.tgz",
+            "integrity": "sha512-jQBPHcMh5rcIPKdqA6xlzioLOmkaVnjg2MVyjMzBKV8hDhLWNSiZqx7NAWXpP70v2LFvGdVoV8BSbK9iID3eHg==",
             "dev": true,
             "engines": {
                 "node": ">=12.0.0"
@@ -657,18 +659,18 @@
             "dev": true
         },
         "node_modules/@types/cli-progress": {
-            "version": "3.11.2",
-            "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.2.tgz",
-            "integrity": "sha512-Yt/8rEJalfa9ve2SbfQnwFHrc9QF52JIZYHW3FDaTMpkCvnns26ueKiPHDxyJ0CS//IqjMINTx7R5Xa7k7uFHQ==",
+            "version": "3.11.3",
+            "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.3.tgz",
+            "integrity": "sha512-/+C9xAdVtc+g5yHHkGBThgAA8rYpi5B+2ve3wLtybYj0JHEBs57ivR4x/zGfSsplRnV+psE91Nfin1soNKqz5Q==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
             }
         },
         "node_modules/@types/docker-modem": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.3.tgz",
-            "integrity": "sha512-i1A2Etnav7uHizZ87vUf4EqwJehY3JOcTfBS0pGBlO+HQ0jg2lUMCaJRg9VQM8ldZkpYdIfsenxcTOCpwxPXEg==",
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.4.tgz",
+            "integrity": "sha512-INK4TOrJ9hbgaSqHA1HaEOCcYVftJRH0v03gCg6R57JGKgltkDvdFYBtoN4lHrJ3h8aF1upvEPN2eWVLIvKStQ==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*",
@@ -676,9 +678,9 @@
             }
         },
         "node_modules/@types/dockerode": {
-            "version": "3.3.19",
-            "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.19.tgz",
-            "integrity": "sha512-7CC5yIpQi+bHXwDK43b/deYXteP3Lem9gdocVVHJPSRJJLMfbiOchQV3rDmAPkMw+n3GIVj7m1six3JW+VcwwA==",
+            "version": "3.3.20",
+            "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.20.tgz",
+            "integrity": "sha512-Q+1e3z6SPWXR/Sk+WIyJFVsSDg78S7MDaGcwAh1WKlveO1tVO8TF1rOzJir5GLnqzEdUbclFKlw/4rhwESxwPw==",
             "dev": true,
             "dependencies": {
                 "@types/docker-modem": "*",
@@ -686,9 +688,9 @@
             }
         },
         "node_modules/@types/fs-extra": {
-            "version": "11.0.1",
-            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz",
-            "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==",
+            "version": "11.0.2",
+            "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz",
+            "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==",
             "dev": true,
             "dependencies": {
                 "@types/jsonfile": "*",
@@ -696,30 +698,30 @@
             }
         },
         "node_modules/@types/js-yaml": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz",
-            "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.6.tgz",
+            "integrity": "sha512-ACTuifTSIIbyksx2HTon3aFtCKWcID7/h3XEmRpDYdMCXxPbl+m9GteOJeaAkiAta/NJaSFuA7ahZ0NkwajDSw==",
             "dev": true
         },
         "node_modules/@types/jsonfile": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz",
-            "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==",
+            "version": "6.1.2",
+            "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.2.tgz",
+            "integrity": "sha512-8t92P+oeW4d/CRQfJaSqEwXujrhH4OEeHRjGU3v1Q8mUS8GPF3yiX26sw4svv6faL2HfBtGTe2xWIoVgN3dy9w==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
             }
         },
         "node_modules/@types/node": {
-            "version": "18.17.15",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz",
-            "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==",
+            "version": "18.18.3",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.3.tgz",
+            "integrity": "sha512-0OVfGupTl3NBFr8+iXpfZ8NR7jfFO+P1Q+IO/q0wbo02wYkP5gy36phojeYWpLQ6WAMjl+VfmqUk2YbUfp0irA==",
             "dev": true
         },
         "node_modules/@types/ssh2": {
-            "version": "1.11.13",
-            "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.11.13.tgz",
-            "integrity": "sha512-08WbG68HvQ2YVi74n2iSUnYHYpUdFc/s2IsI0BHBdJwaqYJpWlVv9elL0tYShTv60yr0ObdxJR5NrCRiGJ/0CQ==",
+            "version": "1.11.14",
+            "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.11.14.tgz",
+            "integrity": "sha512-O/U38mvV4jVVrdtZz8KpmitkmeD/PUDeDNNueQhm34166dmaqb1iZ3sfarSxBArM2/iX4PZVJY3EOta0Zks9hw==",
             "dev": true,
             "dependencies": {
                 "@types/node": "^18.11.18"
@@ -911,9 +913,9 @@
             }
         },
         "node_modules/axios": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz",
-            "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==",
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+            "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
             "dependencies": {
                 "follow-redirects": "^1.15.0",
                 "form-data": "^4.0.0",
@@ -1152,9 +1154,9 @@
             }
         },
         "node_modules/cli-spinners": {
-            "version": "2.9.0",
-            "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz",
-            "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==",
+            "version": "2.9.1",
+            "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz",
+            "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==",
             "engines": {
                 "node": ">=6"
             },
@@ -1257,6 +1259,15 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/commander": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+            "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+            "dev": true,
+            "engines": {
+                "node": ">= 10"
+            }
+        },
         "node_modules/concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -1513,12 +1524,6 @@
                 "is-arrayish": "^0.2.1"
             }
         },
-        "node_modules/error-ex/node_modules/is-arrayish": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-            "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-            "dev": true
-        },
         "node_modules/escalade": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -1709,15 +1714,24 @@
                 "node": ">=8"
             }
         },
+        "node_modules/find-package": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz",
+            "integrity": "sha512-yVn71XCCaNgxz58ERTl8nA/8YYtIQDY9mHSrgFBfiFtdNNfY0h183Vh8BRkKxD8x9TUw3ec290uJKhDVxqGZBw==",
+            "dev": true,
+            "dependencies": {
+                "parents": "^1.0.1"
+            }
+        },
         "node_modules/fn.name": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
             "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
         },
         "node_modules/follow-redirects": {
-            "version": "1.15.2",
-            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
-            "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+            "version": "1.15.3",
+            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
+            "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
             "funding": [
                 {
                     "type": "individual",
@@ -1804,11 +1818,21 @@
                 "node": ">=14.14"
             }
         },
-        "node_modules/function-bind": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-            "dev": true
+        "node_modules/genversion": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz",
+            "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==",
+            "dev": true,
+            "dependencies": {
+                "commander": "^7.2.0",
+                "find-package": "^1.0.0"
+            },
+            "bin": {
+                "genversion": "bin/genversion.js"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
         },
         "node_modules/get-caller-file": {
             "version": "2.0.5",
@@ -1872,13 +1896,10 @@
             "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
         },
         "node_modules/has": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
+            "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
             "dev": true,
-            "dependencies": {
-                "function-bind": "^1.1.1"
-            },
             "engines": {
                 "node": ">= 0.4.0"
             }
@@ -1909,9 +1930,9 @@
             }
         },
         "node_modules/http-status-codes": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz",
-            "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
+            "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="
         },
         "node_modules/https-proxy-agent": {
             "version": "5.0.1",
@@ -2052,9 +2073,10 @@
             }
         },
         "node_modules/is-arrayish": {
-            "version": "0.3.2",
-            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-            "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+            "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+            "dev": true
         },
         "node_modules/is-core-module": {
             "version": "2.9.0",
@@ -2614,6 +2636,15 @@
                 "node": ">=8"
             }
         },
+        "node_modules/parents": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+            "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
+            "dev": true,
+            "dependencies": {
+                "path-platform": "~0.11.15"
+            }
+        },
         "node_modules/parse-json": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
@@ -2652,6 +2683,15 @@
             "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
             "dev": true
         },
+        "node_modules/path-platform": {
+            "version": "0.11.15",
+            "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+            "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
         "node_modules/path-type": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -2926,9 +2966,9 @@
             }
         },
         "node_modules/resolve": {
-            "version": "1.22.4",
-            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
-            "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
+            "version": "1.22.6",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
+            "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
             "dev": true,
             "dependencies": {
                 "is-core-module": "^2.13.0",
@@ -3143,6 +3183,11 @@
                 "is-arrayish": "^0.3.1"
             }
         },
+        "node_modules/simple-swizzle/node_modules/is-arrayish": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+            "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+        },
         "node_modules/slash": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
diff --git a/ExerciseChecker/package.json b/ExerciseChecker/package.json
index 329592384a03d940f152d855dffbc6af02c6a464..dd642ad59ea36467d750324b532b6d596e78a3e9 100644
--- a/ExerciseChecker/package.json
+++ b/ExerciseChecker/package.json
@@ -1,6 +1,9 @@
 {
     "name"           : "dojo_exercise_checker",
+    "description"    : "App that check an exercise of the Dojo project",
     "version"        : "2.2.0",
+    "license"        : "AGPLv3",
+    "author"         : "Michaƫl Minelli <dojo@minelli.me>",
     "main"           : "dist/app.js",
     "bin"            : {
         "dirmanager": "./dist/app.js"
@@ -18,9 +21,11 @@
         ]
     },
     "scripts"        : {
-        "build"    : "npx tsc",
-        "start:dev": "npx ts-node src/app.ts",
-        "test"     : "echo \"Error: no test specified\" && exit 1"
+        "dotenv:build": "npx dotenv-vault local build",
+        "genversion"  : "npx genversion -s -e src/config/Version.ts",
+        "build"       : "npm run genversion; npx tsc",
+        "start:dev"   : "npm run genversion; npx ts-node src/app.ts",
+        "test"        : "echo \"Error: no test specified\" && exit 1"
     },
     "dependencies"   : {
         "ajv"              : "^8.12.0",
@@ -43,6 +48,7 @@
         "@types/node"       : "^18.17.1",
         "@types/tar-stream" : "^2.2.2",
         "dotenv-vault"      : "^1.25.0",
+        "genversion"        : "^3.1.1",
         "pkg"               : "^5.8.1",
         "tiny-typed-emitter": "^2.1.0",
         "ts-node"           : "^10.9.1",
diff --git a/ExerciseChecker/src/config/Config.ts b/ExerciseChecker/src/config/Config.ts
index 9072ff8f963c7dd4cd392cd07ff6e3397caa6ce8..42c446229456f1c92c316a4e7b27b54779f73c7a 100644
--- a/ExerciseChecker/src/config/Config.ts
+++ b/ExerciseChecker/src/config/Config.ts
@@ -13,6 +13,12 @@ class Config {
         id: string; secret: string;
     };
 
+    public readonly dockerhub: {
+        repositories: {
+            exerciseChecker: string
+        }
+    };
+
     constructor() {
         this.appName = process.env.APP_NAME || '';
 
@@ -28,6 +34,12 @@ class Config {
             id    : process.env.DOJO_EXERCISE_ID || '',
             secret: process.env.DOJO_SECRET || ''
         };
+
+        this.dockerhub = {
+            repositories: {
+                exerciseChecker: process.env.DOCKERHUB_EXERCISE_CHECKER_REPOSITORY || ''
+            }
+        };
     }
 
     private resetResultsVolume(): void {
diff --git a/ExerciseChecker/src/managers/HttpManager.ts b/ExerciseChecker/src/managers/HttpManager.ts
index fb113963ab8d37459ff72bf05d33827598889edd..54d6990ad2c31f3a0307a56b13f305b0285ee0db 100644
--- a/ExerciseChecker/src/managers/HttpManager.ts
+++ b/ExerciseChecker/src/managers/HttpManager.ts
@@ -2,6 +2,11 @@ import axios, { AxiosRequestHeaders } from 'axios';
 import FormData                       from 'form-data';
 import ClientsSharedConfig            from '../sharedByClients/config/ClientsSharedConfig';
 import Config                         from '../config/Config';
+import { version }                    from '../config/Version';
+import boxen                          from 'boxen';
+import DojoStatusCode                 from '../shared/types/Dojo/DojoStatusCode';
+import DojoBackendResponse            from '../shared/types/Dojo/DojoBackendResponse';
+import { StatusCodes }                from 'http-status-codes';
 
 
 class HttpManager {
@@ -12,6 +17,19 @@ class HttpManager {
         this.registerResponseInterceptor();
     }
 
+    private requestError(message: string) {
+        console.log(boxen(message, {
+            title         : 'Request error',
+            titleAlignment: 'center',
+            borderColor   : 'red',
+            borderStyle   : 'bold',
+            margin        : 1,
+            padding       : 1,
+            textAlignment : 'left'
+        }));
+        process.exit(1);
+    }
+
     private registerRequestInterceptor() {
         axios.interceptors.request.use((config) => {
             if ( config.data instanceof FormData ) {
@@ -26,6 +44,9 @@ class HttpManager {
                 }
 
                 config.headers.Authorization = `ExerciseSecret ${ Config.exercise.secret }`;
+
+                config.headers['client'] = 'DojoExerciseChecker';
+                config.headers['client-version'] = version;
             }
 
             return config;
@@ -36,6 +57,25 @@ class HttpManager {
         axios.interceptors.response.use((response) => {
             return response;
         }, (error) => {
+            if ( error.response ) {
+                if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && error.response.data ) {
+                    const data: DojoBackendResponse<{}> = error.response.data;
+
+                    switch ( data.code ) {
+                        case DojoStatusCode.CLIENT_NOT_SUPPORTED:
+                            this.requestError('Client not recognized by the server. Please contact the administrator.');
+                            break;
+                        case DojoStatusCode.CLIENT_VERSION_NOT_SUPPORTED:
+                            this.requestError(`ExerciseChecker version not supported by the server.\nPlease check that the CI/CD pipeline use the "${ Config.dockerhub.repositories.exerciseChecker }:latest" image.\nIf yes, try again later and if the problem persists, please contact the administrator.`);
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            } else {
+                this.requestError('Error connecting to the server. Please check your internet connection. If the problem persists, please contact the administrator.');
+            }
+
             return Promise.reject(error);
         });
     }
diff --git a/ExerciseChecker/src/shared b/ExerciseChecker/src/shared
index 8bdbef31376a8284bd8a5139588b43a57cf74a4b..8424367748a6fc47f8da10b85e7663f3f7d07620 160000
--- a/ExerciseChecker/src/shared
+++ b/ExerciseChecker/src/shared
@@ -1 +1 @@
-Subproject commit 8bdbef31376a8284bd8a5139588b43a57cf74a4b
+Subproject commit 8424367748a6fc47f8da10b85e7663f3f7d07620