diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts
index 4097324791e961ef4c38172662eebc2b166e362d..49161651818ac940bc706b709375255564acaaff 100644
--- a/ExpressAPI/src/config/Config.ts
+++ b/ExpressAPI/src/config/Config.ts
@@ -2,6 +2,7 @@ import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility';
 import path             from 'path';
 import fs               from 'fs';
 import { Exercise }     from '../types/DatabaseTypes';
+import JSON5            from 'json5';
 
 
 type ConfigGitlabBadge = { link: string, imageUrl: string }
@@ -12,23 +13,25 @@ class Config {
         port: number
     };
 
-    public jwtConfig: {
+    public readonly requestClientValidation: { version: { [client: string]: string } }; // { version: { CLIENT: CONDITION } }
+
+    public readonly jwtConfig: {
         secret: string; expiresIn: number;
     };
 
-    public permissions: {
+    public readonly permissions: {
         teachingStaff: Array<string>;
     };
 
-    public gitlab: {
+    public readonly gitlab: {
         apiURL: string; urls: Array<string>; account: { id: number; username: string; token: string; }; group: { root: number; templates: number; assignments: number; exercises: number; }, badges: { pipeline: ConfigGitlabBadge }
     };
 
-    public assignment: {
+    public readonly assignment: {
         default: { description: string; initReadme: boolean; sharedRunnersEnabled: boolean; visibility: string; wikiEnabled: boolean; template: string }; baseFiles: Array<string>; filename: string
     };
 
-    public exercise: {
+    public readonly exercise: {
         maxSameName: number; resultsFolder: string, pipelineResultsFolder: string; default: { description: string; visibility: string; };
     };
 
@@ -40,36 +43,59 @@ class Config {
             port: Number(process.env.API_PORT || 30992)
         };
 
+        this.requestClientValidation = JSON5.parse(process.env.REQUEST_CLIENT_VALIDATION || '{"version": {}}');
+
         this.jwtConfig = {
-            secret: process.env.JWT_SECRET_KEY || '', expiresIn: Number(process.env.SESSION_TIMEOUT || 0)
+            secret   : process.env.JWT_SECRET_KEY || '',
+            expiresIn: Number(process.env.SESSION_TIMEOUT || 0)
         };
 
         this.permissions = {
-            teachingStaff: JSON.parse(process.env.ROLES_WITH_TEACHING_STAFF_PERMISSIONS || '[]')
+            teachingStaff: JSON5.parse(process.env.ROLES_WITH_TEACHING_STAFF_PERMISSIONS || '[]')
         };
 
         this.gitlab = {
-            apiURL   : process.env.GITLAB_API_URL || '', urls: JSON.parse(process.env.GITLAB_URLS || '[]'), account: {
-                id: Number(process.env.GITLAB_DOJO_ACCOUNT_ID || 0), username: process.env.GITLAB_DOJO_ACCOUNT_USERNAME || '', token: process.env.GITLAB_DOJO_ACCOUNT_TOKEN || ''
-            }, group : {
-                root: Number(process.env.GITLAB_GROUP_ROOT_ID || 0), templates: Number(process.env.GITLAB_GROUP_TEMPLATES_ID || 0), assignments: Number(process.env.GITLAB_GROUP_ASSIGNMENTS_ID || 0), exercises: Number(process.env.GITLAB_GROUP_EXERCISES_ID || 0)
-            }, badges: {
+            apiURL : process.env.GITLAB_API_URL || '',
+            urls   : JSON5.parse(process.env.GITLAB_URLS || '[]'),
+            account: {
+                id      : Number(process.env.GITLAB_DOJO_ACCOUNT_ID || 0),
+                username: process.env.GITLAB_DOJO_ACCOUNT_USERNAME || '',
+                token   : process.env.GITLAB_DOJO_ACCOUNT_TOKEN || ''
+            },
+            group  : {
+                root       : Number(process.env.GITLAB_GROUP_ROOT_ID || 0),
+                templates  : Number(process.env.GITLAB_GROUP_TEMPLATES_ID || 0),
+                assignments: Number(process.env.GITLAB_GROUP_ASSIGNMENTS_ID || 0),
+                exercises  : Number(process.env.GITLAB_GROUP_EXERCISES_ID || 0)
+            },
+            badges : {
                 pipeline: {
-                    link: process.env.GITLAB_BADGE_PIPELINE_LINK || '', imageUrl: process.env.GITLAB_BADGE_PIPELINE_IMAGE_URL || ''
+                    link    : process.env.GITLAB_BADGE_PIPELINE_LINK || '',
+                    imageUrl: process.env.GITLAB_BADGE_PIPELINE_IMAGE_URL || ''
                 }
             }
         };
 
         this.assignment = {
-            default     : {
-                description: process.env.ASSIGNMENT_DEFAULT_DESCRIPTION?.convertWithEnvVars() ?? '', initReadme: process.env.ASSIGNMENT_DEFAULT_INIT_README?.toBoolean() ?? false, sharedRunnersEnabled: process.env.ASSIGNMENT_DEFAULT_SHARED_RUNNERS_ENABLED?.toBoolean() ?? true, visibility: process.env.ASSIGNMENT_DEFAULT_VISIBILITY || GitlabVisibility.PRIVATE, wikiEnabled: process.env.ASSIGNMENT_DEFAULT_WIKI_ENABLED?.toBoolean() ?? false, template: process.env.ASSIGNMENT_DEFAULT_TEMPLATE?.replace('{{USERNAME}}', this.gitlab.account.username).replace('{{TOKEN}}', this.gitlab.account.token) ?? ''
-            }, baseFiles: JSON.parse(process.env.ASSIGNMENT_BASE_FILES || '[]'), filename: process.env.ASSIGNMENT_FILENAME || ''
+            default  : {
+                description         : process.env.ASSIGNMENT_DEFAULT_DESCRIPTION?.convertWithEnvVars() ?? '',
+                initReadme          : process.env.ASSIGNMENT_DEFAULT_INIT_README?.toBoolean() ?? false,
+                sharedRunnersEnabled: process.env.ASSIGNMENT_DEFAULT_SHARED_RUNNERS_ENABLED?.toBoolean() ?? true,
+                visibility          : process.env.ASSIGNMENT_DEFAULT_VISIBILITY || GitlabVisibility.PRIVATE,
+                wikiEnabled         : process.env.ASSIGNMENT_DEFAULT_WIKI_ENABLED?.toBoolean() ?? false,
+                template            : process.env.ASSIGNMENT_DEFAULT_TEMPLATE?.replace('{{USERNAME}}', this.gitlab.account.username).replace('{{TOKEN}}', this.gitlab.account.token) ?? ''
+            },
+            baseFiles: JSON5.parse(process.env.ASSIGNMENT_BASE_FILES || '[]'),
+            filename : process.env.ASSIGNMENT_FILENAME || ''
         };
 
         this.exercise = {
-            maxSameName: Number(process.env.EXERCISE_MAX_SAME_NAME || 0), resultsFolder: process.env.EXERCISE_RESULTS_FOLDER?.convertWithEnvVars() ?? '', pipelineResultsFolder: process.env.EXERCISE_PIPELINE_RESULTS_FOLDER ?? '', //Do not use convertWithEnvVars() because it is used in the exercise creation and muste be interpreted at exercise runtime
-            default    : {
-                description: process.env.EXERCISE_DEFAULT_DESCRIPTION?.convertWithEnvVars() ?? '', visibility: process.env.EXERCISE_DEFAULT_VISIBILITY || GitlabVisibility.PRIVATE
+            maxSameName          : Number(process.env.EXERCISE_MAX_SAME_NAME || 0),
+            resultsFolder        : process.env.EXERCISE_RESULTS_FOLDER?.convertWithEnvVars() ?? '',
+            pipelineResultsFolder: process.env.EXERCISE_PIPELINE_RESULTS_FOLDER ?? '', //Do not use convertWithEnvVars() because it is used in the exercise creation and muste be interpreted at exercise runtime
+            default              : {
+                description: process.env.EXERCISE_DEFAULT_DESCRIPTION?.convertWithEnvVars() ?? '',
+                visibility : process.env.EXERCISE_DEFAULT_VISIBILITY || GitlabVisibility.PRIVATE
             }
         };