diff --git a/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts b/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts
index 0e9882660eb9cb19e555cc56d59db1f8bebeeba5..e2405a9e94c11bd4a6aa563ca2256706db70a839 100644
--- a/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts
+++ b/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts
@@ -41,7 +41,7 @@ class ExerciseCorrectionCommand extends CommanderCommand {
         return assignment.corrections.map(correction => {
             return {
                 name : correction.name.replace(correction.assignmentName, '').split('-')[2].trim(),
-                value: correction.correctionCommit!.web_url?.replace('/commit/', '/tree/') ?? ''
+                value: correction.correctionCommit?.web_url?.replace('/commit/', '/tree/') ?? ''
             };
         });
     }
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index b2ef6295a811b254a32f333d7f4fd2800bd91420..9bf65df250b19eae0aa58a8b97885cb651be88c0 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -9,6 +9,7 @@ import Exercise              from '../sharedByClients/models/Exercise';
 import GitlabToken           from '../shared/types/Gitlab/GitlabToken';
 import User                  from '../sharedByClients/models/User';
 import DojoStatusCode        from '../shared/types/Dojo/DojoStatusCode';
+import DojoBackendHelper     from '../sharedByClients/helpers/Dojo/DojoBackendHelper';
 
 
 class DojoBackendManager {
@@ -55,14 +56,9 @@ class DojoBackendManager {
     }
 
 
-    public getApiUrl(route: ApiRoute): string {
-        return `${ ClientsSharedConfig.apiURL }${ route }`;
-    }
-
-
     public async login(gitlabTokens: GitlabToken): Promise<User | undefined> {
         try {
-            return (await axios.post<DojoBackendResponse<User>>(this.getApiUrl(ApiRoute.LOGIN), {
+            return (await axios.post<DojoBackendResponse<User>>(DojoBackendHelper.getApiUrl(ApiRoute.LOGIN), {
                 accessToken : gitlabTokens.access_token,
                 refreshToken: gitlabTokens.refresh_token
             })).data.data;
@@ -73,7 +69,7 @@ class DojoBackendManager {
 
 
     public async refreshTokens(refreshToken: string): Promise<GitlabToken> {
-        return (await axios.post<DojoBackendResponse<GitlabToken>>(this.getApiUrl(ApiRoute.REFRESH_TOKENS), {
+        return (await axios.post<DojoBackendResponse<GitlabToken>>(DojoBackendHelper.getApiUrl(ApiRoute.REFRESH_TOKENS), {
             refreshToken: refreshToken
         })).data.data;
     }
@@ -81,7 +77,7 @@ class DojoBackendManager {
 
     public async getAssignment(nameOrUrl: string): Promise<Assignment | undefined> {
         try {
-            return (await axios.get<DojoBackendResponse<Assignment>>(this.getApiUrl(ApiRoute.ASSIGNMENT_GET).replace('{{nameOrUrl}}', encodeURIComponent(nameOrUrl)))).data.data;
+            return (await axios.get<DojoBackendResponse<Assignment>>(DojoBackendHelper.getApiUrl(ApiRoute.ASSIGNMENT_GET, { assignmentNameOrUrl: nameOrUrl }))).data.data;
         } catch ( error ) {
             return undefined;
         }
@@ -96,7 +92,7 @@ class DojoBackendManager {
         }
 
         try {
-            await axios.get(this.getApiUrl(ApiRoute.GITLAB_CHECK_TEMPLATE_ACCESS).replace('{{id}}', idOrNamespace));
+            await axios.get(DojoBackendHelper.getApiUrl(ApiRoute.GITLAB_CHECK_TEMPLATE_ACCESS, { gitlabProjectId: idOrNamespace }));
 
             if ( verbose ) {
                 spinner.succeed('Template access granted');
@@ -118,10 +114,10 @@ class DojoBackendManager {
         }
 
         try {
-            const response = await axios.post<DojoBackendResponse<Assignment>>(this.getApiUrl(ApiRoute.ASSIGNMENT_CREATE), Object.assign({
-                                                                                                                                             name   : name,
-                                                                                                                                             members: JSON.stringify(members)
-                                                                                                                                         }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {}));
+            const response = await axios.post<DojoBackendResponse<Assignment>>(DojoBackendHelper.getApiUrl(ApiRoute.ASSIGNMENT_CREATE), Object.assign({
+                                                                                                                                                          name   : name,
+                                                                                                                                                          members: JSON.stringify(members)
+                                                                                                                                                      }, templateIdOrNamespace ? { template: templateIdOrNamespace } : {}));
 
             if ( verbose ) {
                 spinner.succeed(`Assignment successfully created`);
@@ -143,7 +139,7 @@ class DojoBackendManager {
         }
 
         try {
-            const response = await axios.post<DojoBackendResponse<Exercise>>(this.getApiUrl(ApiRoute.EXERCISE_CREATE).replace('{{nameOrUrl}}', encodeURIComponent(assignmentName)), { members: JSON.stringify(members) });
+            const response = await axios.post<DojoBackendResponse<Exercise>>(DojoBackendHelper.getApiUrl(ApiRoute.EXERCISE_CREATE, { assignmentNameOrUrl: assignmentName }), { members: JSON.stringify(members) });
 
             if ( verbose ) {
                 spinner.succeed(`Exercise successfully created`);
@@ -165,7 +161,7 @@ class DojoBackendManager {
         }
 
         try {
-            await axios.patch<DojoBackendResponse<null>>(this.getApiUrl(publish ? ApiRoute.ASSIGNMENT_PUBLISH : ApiRoute.ASSIGNMENT_UNPUBLISH).replace('{{nameOrUrl}}', encodeURIComponent(assignment.name)), {});
+            await axios.patch<DojoBackendResponse<null>>(DojoBackendHelper.getApiUrl(publish ? ApiRoute.ASSIGNMENT_PUBLISH : ApiRoute.ASSIGNMENT_UNPUBLISH, { assignmentNameOrUrl: assignment.name }), {});
 
             if ( verbose ) {
                 spinner.succeed(`Assignment ${ assignment.name } successfully ${ publish ? 'published' : 'unpublished' }`);
@@ -196,9 +192,12 @@ class DojoBackendManager {
             const axiosFunction = isUpdate ? axios.patch : axios.post;
             const route = isUpdate ? ApiRoute.ASSIGNMENT_CORRECTION_UPDATE : ApiRoute.ASSIGNMENT_CORRECTION_LINK;
 
-            await axiosFunction(this.getApiUrl(route).replace('{{assignmentNameOrUrl}}', encodeURIComponent(assignment.name)).replace('{{exerciseIdOrUrl}}', encodeURIComponent(exerciseIdOrUrl)), {
-                exerciseIdOrUrl: exerciseIdOrUrl
-            });
+            await axiosFunction(DojoBackendHelper.getApiUrl(route, {
+                assignmentNameOrUrl: assignment.name,
+                exerciseIdOrUrl    : exerciseIdOrUrl
+            }), {
+                                    exerciseIdOrUrl: exerciseIdOrUrl
+                                });
 
             if ( verbose ) {
                 spinner.succeed(`Correction ${ isUpdate ? 'updated' : 'linked' }`);
diff --git a/NodeApp/src/sharedByClients b/NodeApp/src/sharedByClients
index 2b2b2376b0389a39283327bba5bfaf7d1ce136ac..ce495680ad5fe004f65f7b062660280077d23909 160000
--- a/NodeApp/src/sharedByClients
+++ b/NodeApp/src/sharedByClients
@@ -1 +1 @@
-Subproject commit 2b2b2376b0389a39283327bba5bfaf7d1ce136ac
+Subproject commit ce495680ad5fe004f65f7b062660280077d23909