diff --git a/.gitignore b/.gitignore
index 3d3345425a8616324ffadec9f97a5a6e85a840ee..cdf8c8c9de66faea499ec10e6c555332c6f87065 100644
--- a/.gitignore
+++ b/.gitignore
@@ -195,6 +195,7 @@ web_modules/
 .flaskenv*
 !.env.project
 !.env.vault
+!config.env
 
 # parcel-bundler cache (https://parceljs.org/)
 .cache
diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml
new file mode 100644
index 0000000000000000000000000000000000000000..920abda0193d56ef57d670c01fde14585907eea9
--- /dev/null
+++ b/.idea/material_theme_project_new.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MaterialThemeProjectNewConfig">
+    <option name="metadata">
+      <MTProjectMetadataState>
+        <option name="userId" value="-6f2668ee:1924765eb2a:-7fc3" />
+      </MTProjectMetadataState>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 35eb1ddfbbc029bcab630581847471d7f238ec53..05ce24af59594c62a686c8ba4e7987f4073508bd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -2,5 +2,6 @@
 <project version="4">
   <component name="VcsDirectoryMappings">
     <mapping directory="" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/ExpressAPI/src/shared" vcs="Git" />
   </component>
 </project>
\ No newline at end of file
diff --git a/ExpressAPI/.idea/dataSources b/ExpressAPI/.idea/dataSources
new file mode 120000
index 0000000000000000000000000000000000000000..dad593ac636a6315d6d91992d4b1e57e31182df2
--- /dev/null
+++ b/ExpressAPI/.idea/dataSources
@@ -0,0 +1 @@
+jetbrainsConfiguration/dataSources/
\ No newline at end of file
diff --git a/ExpressAPI/config.env b/ExpressAPI/config.env
new file mode 100644
index 0000000000000000000000000000000000000000..e3f29d426c0823ec9767c546c037c65ae4fe706e
--- /dev/null
+++ b/ExpressAPI/config.env
@@ -0,0 +1,55 @@
+########################### Server env vars
+API_PORT=30992
+LOGS_FOLDER=logs
+
+
+########################### Requests env vars
+REQUEST_CLIENT_VALIDATION="{
+    'version': {
+        'DojoCLI': '>=5.0.0',
+        'DojoExerciseChecker': '>=5.0.0',
+        'DojoAssignmentChecker': '>=5.0.0'
+    }
+}"
+
+
+########################### DojoCLI env vars
+DOJO_CLI_VERSION_UPDATE_PERIOD_MS=7200000
+DOJO_CLI_GITLAB_REPOSITORY_ID=12972
+
+
+########################### Session env vars
+SESSION_TIMEOUT=0
+
+LOGIN_SERVER_PORT=30992
+LOGIN_SERVER_ROUTE=login
+LOGIN_GITLAB_URL_REDIRECT=http://localhost:${LOGIN_SERVER_PORT}/${LOGIN_SERVER_ROUTE}
+LOGIN_GITLAB_URL_TOKEN=${GITLAB_URL}/oauth/token
+
+
+########################### Gitlab env vars
+GITLAB_API_URL=${GITLAB_URL}/api/v4
+GITLAB_REPOSITORY_CREATION_TIMEOUT=5000
+
+GITLAB_BADGE_PIPELINE_LINK=${GITLAB_URL}/%{project_path}/-/pipelines
+GITLAB_BADGE_PIPELINE_IMAGE_URL=${GITLAB_URL}/%{project_path}/badges/%{default_branch}/pipeline.svg
+
+
+########################### Assignment env vars
+ASSIGNMENT_DEFAULT_DESCRIPTION="Dojo assignment repository.\n\nName of the assignment: {{ASSIGNMENT_NAME}}"
+ASSIGNMENT_DEFAULT_INIT_README=false
+ASSIGNMENT_DEFAULT_SHARED_RUNNERS_ENABLED=true
+ASSIGNMENT_DEFAULT_VISIBILITY=private
+ASSIGNMENT_DEFAULT_WIKI_ENABLED=false
+ASSIGNMENT_FILENAME=dojo_assignment.json
+ASSIGNMENT_BASE_FILES='["${ASSIGNMENT_FILENAME}", "README.md", "docker-compose.yml"]'
+ASSIGNMENT_DEFAULT_TEMPLATE=https://{{USERNAME}}:{{TOKEN}}@${GITLAB_DOMAIN}/dojo/template/empty_template.git
+
+
+########################### Exercise env vars
+EXERCISE_DEFAULT_DESCRIPTION="Dojo exercise repository based on the the assignment: {{ASSIGNMENT_NAME}}"
+EXERCISE_DEFAULT_VISIBILITY=private
+EXERCISE_MAX_PER_ASSIGNMENT=2
+EXERCISE_MAX_SAME_NAME=10
+EXERCISE_PIPELINE_RESULTS_FOLDER=\$CI_PROJECT_DIR/Results_of_exercise_\$DOJO_EXERCISE_ID
+EXERCISE_RESULTS_FOLDER=/dojoFiles/results/
\ No newline at end of file
diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts
index 29301c0cc30fca094b4d1b3b7ba59de1c4c99085..e191f2162d1780d14fe48c39c9e1c934916e4cdb 100644
--- a/ExpressAPI/src/config/Config.ts
+++ b/ExpressAPI/src/config/Config.ts
@@ -33,13 +33,21 @@ class Config {
     public readonly login: {
         gitlab: {
             client: {
-                secret: string
+                id: string, secret: string
+            }, url: {
+                redirect: string, token: string
             }
         }
     };
 
+    public readonly dockerhub: {
+        repositories: {
+            assignmentChecker: string, exerciseChecker: string
+        }
+    };
+
     public readonly gitlab: {
-        urls: Array<string>; repository: {
+        url: string; urls: Array<string>; repository: {
             timeoutAfterCreation: number;
         }; account: {
             id: number; username: string; token: string;
@@ -82,12 +90,25 @@ class Config {
         this.login = {
             gitlab: {
                 client: {
+                    id    : process.env.LOGIN_GITLAB_CLIENT_ID || '',
                     secret: process.env.LOGIN_GITLAB_CLIENT_SECRET || ''
+                },
+                url   : {
+                    redirect: process.env.LOGIN_GITLAB_URL_REDIRECT ?? '',
+                    token   : process.env.LOGIN_GITLAB_URL_TOKEN ?? ''
                 }
             }
         };
 
+        this.dockerhub = {
+            repositories: {
+                assignmentChecker: process.env.DOCKERHUB_REPO_ASSIGNMENT_CHECKER ?? '',
+                exerciseChecker  : process.env.DOCKERHUB_REPO_EXERCISE_CHECKER ?? ''
+            }
+        };
+
         this.gitlab = {
+            url       : process.env.GITLAB_URL || '',
             urls      : JSON5.parse(process.env.GITLAB_URLS || '[]'),
             account   : {
                 id      : Number(process.env.GITLAB_DOJO_ACCOUNT_ID || 0),
diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts
index 5ad9dca9dd1bad96492bdb4dd32040c040442aaa..e153d8958e0d0f309809032051a4a4e1bc32db7f 100644
--- a/ExpressAPI/src/managers/GitlabManager.ts
+++ b/ExpressAPI/src/managers/GitlabManager.ts
@@ -2,7 +2,6 @@ import Config
 import { StatusCodes }                                                                                                                                                                        from 'http-status-codes';
 import GitlabVisibility                                                                                                                                                                       from '../shared/types/Gitlab/GitlabVisibility.js';
 import express                                                                                                                                                                                from 'express';
-import SharedConfig                                                                                                                                                                           from '../shared/config/SharedConfig.js';
 import { CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest';
 import logger                                                                                                                                                                                 from '../shared/logging/WinstonLogger.js';
 import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema }                                                                          from '@gitbeaker/core';
@@ -12,13 +11,13 @@ import SharedGitlabManager
 
 class GitlabManager extends SharedGitlabManager {
     constructor() {
-        super(Config.gitlab.account.token);
+        super(Config.gitlab.url, Config.gitlab.account.token);
     }
 
     getUserProfile(token: string): Promise<ExpandedUserSchema> | undefined {
         try {
             const profileApi = new Gitlab({
-                                              host      : SharedConfig.gitlab.URL,
+                                              host      : Config.gitlab.url,
                                               oauthToken: token
                                           });