diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts
index a5e22d715b5135444879f40a828854c41a5dbbd6..fb538734e4a7207e434b3177027bd7fca5005db9 100644
--- a/ExpressAPI/src/helpers/DojoValidators.ts
+++ b/ExpressAPI/src/helpers/DojoValidators.ts
@@ -1,9 +1,9 @@
 import ApiRequest                                                   from '../models/ApiRequest';
 import Config                                                       from '../config/Config';
-import GitlabHelper                                                 from './GitlabHelper';
 import { StatusCodes }                                              from 'http-status-codes';
 import { CustomValidator, ErrorMessage, FieldMessageFactory, Meta } from 'express-validator/src/base';
 import { BailOptions, ValidationChain }                             from 'express-validator/src/chain';
+import GitlabManager                                                from '../managers/GitlabManager';
 
 
 declare type DojoMeta = Meta & {
@@ -74,7 +74,7 @@ class DojoValidators {
                                                                           return new Promise((resolve, reject) => {
                                                                               const template = this.getParamValue(req, path);
                                                                               if ( template ) {
-                                                                                  GitlabHelper.checkTemplateAccess(template, req).then((templateAccess) => {
+                                                                                  GitlabManager.checkTemplateAccess(template, req).then((templateAccess) => {
                                                                                       templateAccess !== StatusCodes.OK ? reject() : resolve(true);
                                                                                   });
                                                                               }
diff --git a/ExpressAPI/src/helpers/GitlabHelper.ts b/ExpressAPI/src/managers/GitlabManager.ts
similarity index 69%
rename from ExpressAPI/src/helpers/GitlabHelper.ts
rename to ExpressAPI/src/managers/GitlabManager.ts
index d4b61a7541c4963b85dc769aeab6dca45693eab4..1631bc346fe4f229819e0d628b6e783beccb5b3f 100644
--- a/ExpressAPI/src/helpers/GitlabHelper.ts
+++ b/ExpressAPI/src/managers/GitlabManager.ts
@@ -6,33 +6,57 @@ import GitlabMember      from '../shared/types/Gitlab/GitlabMember';
 import { StatusCodes }   from 'http-status-codes';
 import GitlabVisibility  from '../shared/types/Gitlab/GitlabVisibility';
 import ApiRequest        from '../models/ApiRequest';
+import GitlabUser        from '../shared/types/Gitlab/GitlabUser';
+import GitlabRoutes      from '../shared/types/Gitlab/GitlabRoutes';
 
 
-enum GitlabRoutes {
-    REPOSITORY_GET         = '/projects/{{id}}',
-    REPOSITORY_CREATE      = '/projects',
-    REPOSITORY_MEMBER_ADD  = '/projects/{{id}}/members',
-    REPOSITORY_MEMBERS_GET = '/projects/{{id}}/members/all'
-}
-
-
-class GitlabHelper {
-    private static _instance: GitlabHelper;
+class GitlabManager {
+    private static _instance: GitlabManager;
 
     private constructor() { }
 
-    public static get instance(): GitlabHelper {
-        if ( !GitlabHelper._instance ) {
-            GitlabHelper._instance = new GitlabHelper();
+    public static get instance(): GitlabManager {
+        if ( !GitlabManager._instance ) {
+            GitlabManager._instance = new GitlabManager();
         }
 
-        return GitlabHelper._instance;
+        return GitlabManager._instance;
     }
 
     private getApiUrl(route: GitlabRoutes): string {
         return `${ Config.gitlab.apiURL }${ route }`;
     }
 
+    private async getGitlabUser(paramToSearch: string | number, paramName: string): Promise<GitlabUser | undefined> {
+        try {
+            const params: any = {};
+            params[paramName] = paramToSearch;
+            return (await axios.get<Array<GitlabUser>>(this.getApiUrl(GitlabRoutes.USERS_GET), { params: params })).data[0];
+        } catch ( e ) { }
+
+        return undefined;
+    }
+
+    public async getUserById(id: number): Promise<GitlabUser | undefined> {
+        return await this.getGitlabUser(id, 'id');
+    }
+
+    public async getUserByUsername(username: string): Promise<GitlabUser | undefined> {
+        return await this.getGitlabUser(username, 'search');
+    }
+
+    async getRepository(idOrNamespace: string): Promise<GitlabRepository> {
+        const response = await axios.get<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_GET).replace('{{id}}', encodeURIComponent(idOrNamespace)));
+
+        return response.data;
+    }
+
+    async getRepositoryMembers(idOrNamespace: string): Promise<Array<GitlabMember>> {
+        const response = await axios.get<Array<GitlabMember>>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBERS_GET).replace('{{id}}', encodeURIComponent(idOrNamespace)));
+
+        return response.data;
+    }
+
     async createRepository(name: string, description: string, visibility: string, initializeWithReadme: boolean, namespace: number, sharedRunnersEnabled: boolean, wikiEnabled: boolean, import_url: string): Promise<GitlabRepository> {
         const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_CREATE), {
             name                  : name,
@@ -48,14 +72,14 @@ class GitlabHelper {
         return response.data;
     }
 
-    async getRepository(idOrNamespace: string): Promise<GitlabRepository> {
-        const response = await axios.get<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_GET).replace('{{id}}', encodeURIComponent(idOrNamespace)));
-
-        return response.data;
-    }
-
-    async getRepositoryMembers(idOrNamespace: string): Promise<Array<GitlabMember>> {
-        const response = await axios.get<Array<GitlabMember>>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBERS_GET).replace('{{id}}', encodeURIComponent(idOrNamespace)));
+    async forkRepository(forkId: number, name: string, path: string, description: string, visibility: string, namespace: number): Promise<GitlabRepository> {
+        const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_FORK).replace('{{id}}', String(forkId)), {
+            name        : name,
+            path        : path,
+            description : description,
+            namespace_id: namespace,
+            visibility  : visibility
+        });
 
         return response.data;
     }
@@ -102,4 +126,4 @@ class GitlabHelper {
 }
 
 
-export default GitlabHelper.instance;
+export default GitlabManager.instance;
diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts
index d194b06bccb042badd135d4007163e139e36ed3c..6585d07ebaf88cb706a8e06837bebd265c1a401f 100644
--- a/ExpressAPI/src/routes/EnonceRoutes.ts
+++ b/ExpressAPI/src/routes/EnonceRoutes.ts
@@ -8,7 +8,7 @@ import ApiRequest                from '../models/ApiRequest';
 import SecurityMiddleware        from '../middlewares/SecurityMiddleware';
 import SecurityCheckType         from '../types/SecurityCheckType';
 import GitlabUser                from '../shared/types/Gitlab/GitlabUser';
-import GitlabHelper              from '../helpers/GitlabHelper';
+import GitlabManager             from '../managers/GitlabManager';
 import Config                    from '../config/Config';
 import GitlabMember              from '../shared/types/Gitlab/GitlabMember';
 import GitlabAccessLevel         from '../shared/types/Gitlab/GitlabAccessLevel';
@@ -67,7 +67,7 @@ class EnonceRoutes implements RoutesManager {
 
         let repository: GitlabRepository;
         try {
-            repository = await GitlabHelper.createRepository(params.name, Config.enonce.default.description.replace('{{ENONCE_NAME}}', params.name), Config.enonce.default.visibility, Config.enonce.default.initReadme, Config.gitlab.group.enonces, Config.enonce.default.sharedRunnersEnabled, Config.enonce.default.wikiEnabled, params.template);
+            repository = await GitlabManager.createRepository(params.name, Config.enonce.default.description.replace('{{ENONCE_NAME}}', params.name), Config.enonce.default.visibility, Config.enonce.default.initReadme, Config.gitlab.group.enonces, Config.enonce.default.sharedRunnersEnabled, Config.enonce.default.wikiEnabled, params.template);
         } catch ( error ) {
             if ( error instanceof AxiosError ) {
                 if ( error.response.data.message.name && error.response.data.message.name == 'has already been taken' ) {
@@ -84,7 +84,7 @@ class EnonceRoutes implements RoutesManager {
         try {
             const members: Array<GitlabMember | false> = await Promise.all([ req.session.profile.userGitlabId, ...params.members.map(member => member.id) ].map(async (memberId: number): Promise<GitlabMember | false> => {
                 try {
-                    return await GitlabHelper.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer);
+                    return await GitlabManager.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer);
                 } catch ( e ) {
                     return false;
                 }
diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts
index be2257a92eada2b2cf4c2b61d0ff29f7eba089df..a9097f6fb409714c3d238947ec6a32ed238d1b4b 100644
--- a/ExpressAPI/src/routes/GitlabRoutes.ts
+++ b/ExpressAPI/src/routes/GitlabRoutes.ts
@@ -4,7 +4,7 @@ import RoutesManager      from '../express/RoutesManager';
 import ApiRequest         from '../models/ApiRequest';
 import SecurityMiddleware from '../middlewares/SecurityMiddleware';
 import SecurityCheckType  from '../types/SecurityCheckType';
-import GitlabHelper       from '../helpers/GitlabHelper';
+import GitlabManager      from '../managers/GitlabManager';
 
 
 class EnonceRoutes implements RoutesManager {
@@ -27,7 +27,7 @@ class EnonceRoutes implements RoutesManager {
     private async checkTemplateAccess(req: ApiRequest, res: express.Response) {
         const idOrNamespace: string = req.params.idOrNamespace;
 
-        return res.status(await GitlabHelper.checkTemplateAccess(idOrNamespace, req)).send();
+        return res.status(await GitlabManager.checkTemplateAccess(idOrNamespace, req)).send();
     }
 }