diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts
index 14733202d9585c21f050eef5c0aced5c0528dd89..ec34e5c6c00b9e831db93e362c9de04ea41e1997 100644
--- a/ExpressAPI/src/config/Config.ts
+++ b/ExpressAPI/src/config/Config.ts
@@ -1,6 +1,4 @@
 class Config {
-    private static _instance: Config;
-
     public readonly api: {
         port: number
     };
@@ -28,7 +26,7 @@ class Config {
     public readonly userPasswordLength: number;
     public readonly userPasswordSaltRounds: number;
 
-    private constructor() {
+    constructor() {
         this.api = {
             port: Number(process.env.API_PORT)
         };
@@ -82,15 +80,7 @@ class Config {
 
 
     }
-
-    public static get instance(): Config {
-        if ( !Config._instance ) {
-            Config._instance = new Config();
-        }
-
-        return Config._instance;
-    }
 }
 
 
-export default Config.instance;
+export default new Config();
diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts
index ca7124c59324d49881359c7d2111420ea27761f1..d86a8f711e6dad056a5a80f16c5d7a4ba9cb4daa 100644
--- a/ExpressAPI/src/helpers/DojoValidators.ts
+++ b/ExpressAPI/src/helpers/DojoValidators.ts
@@ -14,18 +14,6 @@ declare type DojoCustomValidator = (input: any, meta: DojoMeta) => any;
 
 
 class DojoValidators {
-    private static _instance: DojoValidators;
-
-    private constructor() { }
-
-    public static get instance(): DojoValidators {
-        if ( !DojoValidators._instance ) {
-            DojoValidators._instance = new DojoValidators();
-        }
-
-        return DojoValidators._instance;
-    }
-
     private toValidatorSchemaOptions(arg: { errorMessage?: FieldMessageFactory | ErrorMessage, negated?: boolean, bail?: boolean | BailOptions, if?: DojoCustomValidator | ValidationChain, options?: DojoCustomValidator }) {
         // This is a hack to make the types work with req arg as ApiRequest instead of Request
         return arg as unknown as { errorMessage?: FieldMessageFactory | ErrorMessage, negated?: boolean, bail?: boolean | BailOptions, if?: CustomValidator | ValidationChain, options?: CustomValidator };
@@ -94,4 +82,4 @@ class DojoValidators {
 }
 
 
-export default DojoValidators.instance;
\ No newline at end of file
+export default new DojoValidators();
\ No newline at end of file
diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts
index 8474c7db75277b916546c49ff7378dc303a67a71..f4b6354e761ac203e8fc40d5417fb0eafe782790 100644
--- a/ExpressAPI/src/managers/GitlabManager.ts
+++ b/ExpressAPI/src/managers/GitlabManager.ts
@@ -11,18 +11,6 @@ import GitlabRoutes      from '../shared/types/Gitlab/GitlabRoutes';
 
 
 class GitlabManager {
-    private static _instance: GitlabManager;
-
-    private constructor() { }
-
-    public static get instance(): GitlabManager {
-        if ( !GitlabManager._instance ) {
-            GitlabManager._instance = new GitlabManager();
-        }
-
-        return GitlabManager._instance;
-    }
-
     private getApiUrl(route: GitlabRoutes): string {
         return `${ Config.gitlab.apiURL }${ route }`;
     }
@@ -126,4 +114,4 @@ class GitlabManager {
 }
 
 
-export default GitlabManager.instance;
+export default new GitlabManager();
diff --git a/ExpressAPI/src/managers/HttpManager.ts b/ExpressAPI/src/managers/HttpManager.ts
index 87e636e0a45294065c936ad7aa8045ca3c7845bd..958f8b921b8fddf66ae254818a01fb4c15aab235 100644
--- a/ExpressAPI/src/managers/HttpManager.ts
+++ b/ExpressAPI/src/managers/HttpManager.ts
@@ -5,20 +5,6 @@ import logger                                     from '../shared/logging/Winsto
 
 
 class HttpManager {
-    public handleCommandErrors: boolean = true;
-
-    private static _instance: HttpManager;
-
-    public static get instance(): HttpManager {
-        if ( !HttpManager._instance ) {
-            HttpManager._instance = new HttpManager();
-        }
-
-        return HttpManager._instance;
-    }
-
-    private constructor() { }
-
     registerAxiosInterceptor() {
         this.registerRequestInterceptor();
         this.registerResponseInterceptor();
@@ -54,5 +40,5 @@ class HttpManager {
 }
 
 
-export default HttpManager.instance;
+export default new HttpManager();
 
diff --git a/ExpressAPI/src/managers/UserManager.ts b/ExpressAPI/src/managers/UserManager.ts
index 545683878358a0970adca8d37835c6a50d2e1498..35f63d19c25a7e903d892e40abd3f11162249618 100644
--- a/ExpressAPI/src/managers/UserManager.ts
+++ b/ExpressAPI/src/managers/UserManager.ts
@@ -5,18 +5,6 @@ import { User }   from '../types/DatabaseTypes';
 
 
 class UserManager {
-    private static _instance: UserManager;
-
-    private constructor() { }
-
-    public static get instance(): UserManager {
-        if ( !UserManager._instance ) {
-            UserManager._instance = new UserManager();
-        }
-
-        return UserManager._instance;
-    }
-
     async getByMail(mail: string, include: Prisma.UserInclude | undefined = undefined): Promise<User | undefined> {
         return db.user.findUnique({
                                       where  : {
@@ -65,4 +53,4 @@ class UserManager {
 }
 
 
-export default UserManager.instance;
+export default new UserManager();
diff --git a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
index 4c09baa0c2f7bae21dcd62e9caaa0891a09231e2..c0ccb3919fe05658801ab0734a9f08685d4f6446 100644
--- a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
+++ b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
@@ -6,18 +6,6 @@ import EnonceManager   from '../managers/EnonceManager';
 
 
 class ParamsCallbackManager {
-    private static _instance: ParamsCallbackManager;
-
-    private constructor() { }
-
-    public static get instance(): ParamsCallbackManager {
-        if ( !ParamsCallbackManager._instance ) {
-            ParamsCallbackManager._instance = new ParamsCallbackManager();
-        }
-
-        return ParamsCallbackManager._instance;
-    }
-
     protected listenParam(paramName: string, backend: Express, getFunction: (id: string | number, ...args: Array<any>) => Promise<any>, args: Array<any>, indexName: string) {
         backend.param(paramName, (req: ApiRequest, res: express.Response, next: express.NextFunction, id: string | number) => {
             getFunction(id, ...args).then(result => {
@@ -42,17 +30,12 @@ class ParamsCallbackManager {
     }
 
     register(backend: Express) {
-        this.listenParam('enonceNameOrUrl',
-                         backend,
-                         EnonceManager.get.bind(EnonceManager),
-                         [ {
-                             exercices: true,
-                             staff: true
-                         } ],
-                         'enonce'
-        );
+        this.listenParam('enonceNameOrUrl', backend, EnonceManager.get.bind(EnonceManager), [ {
+            exercices: true,
+            staff    : true
+        } ], 'enonce');
     }
 }
 
 
-export default ParamsCallbackManager.instance;
+export default new ParamsCallbackManager();
diff --git a/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts b/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts
index f9a927c3969b9713daaaf3967ff6bb759bc166cc..9d70f6cc44e676c98da81496b3efc30bec2a5e52 100644
--- a/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts
+++ b/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts
@@ -5,18 +5,6 @@ import ApiRequest            from '../types/ApiRequest';
 
 
 class ParamsValidatorMiddleware {
-    private static _instance: ParamsValidatorMiddleware;
-
-    private constructor() { }
-
-    public static get instance(): ParamsValidatorMiddleware {
-        if ( !ParamsValidatorMiddleware._instance ) {
-            ParamsValidatorMiddleware._instance = new ParamsValidatorMiddleware();
-        }
-
-        return ParamsValidatorMiddleware._instance;
-    }
-
     validate(validations: Array<ExpressValidator.ValidationChain> | ExpressValidator.Schema): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void {
         return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => {
 
@@ -37,4 +25,4 @@ class ParamsValidatorMiddleware {
 }
 
 
-export default ParamsValidatorMiddleware.instance;
+export default new ParamsValidatorMiddleware();
diff --git a/ExpressAPI/src/middlewares/SecurityMiddleware.ts b/ExpressAPI/src/middlewares/SecurityMiddleware.ts
index a48803754c61d05df9dee9e2111864439ada4026..62030f9446a1cf25d7e0d0eed0e7fcc11248a733 100644
--- a/ExpressAPI/src/middlewares/SecurityMiddleware.ts
+++ b/ExpressAPI/src/middlewares/SecurityMiddleware.ts
@@ -6,18 +6,6 @@ import ApiRequest        from '../types/ApiRequest';
 
 
 class SecurityMiddleware {
-    private static _instance: SecurityMiddleware;
-
-    private constructor() { }
-
-    public static get instance(): SecurityMiddleware {
-        if ( !SecurityMiddleware._instance ) {
-            SecurityMiddleware._instance = new SecurityMiddleware();
-        }
-
-        return SecurityMiddleware._instance;
-    }
-
     // First check if connected then check if at least ONE rule match. It's NOT an AND but it's a OR function.
     check(checkIfConnected: boolean, ...checkTypes: Array<SecurityCheckType>): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void {
         return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => {
@@ -57,4 +45,4 @@ class SecurityMiddleware {
 }
 
 
-export default SecurityMiddleware.instance;
+export default new SecurityMiddleware();
diff --git a/ExpressAPI/src/middlewares/SessionMiddleware.ts b/ExpressAPI/src/middlewares/SessionMiddleware.ts
index 883918f6308035bc81b58474beae47e91ffb8786..120409163750ae01debdf5bbc13b3aeed7036a64 100644
--- a/ExpressAPI/src/middlewares/SessionMiddleware.ts
+++ b/ExpressAPI/src/middlewares/SessionMiddleware.ts
@@ -4,18 +4,6 @@ import Session    from '../controllers/Session';
 
 
 class SessionMiddleware {
-    private static _instance: SessionMiddleware;
-
-    private constructor() { }
-
-    public static get instance(): SessionMiddleware {
-        if ( !SessionMiddleware._instance ) {
-            SessionMiddleware._instance = new SessionMiddleware();
-        }
-
-        return SessionMiddleware._instance;
-    }
-
     register(): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void {
         return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => {
             req.session = new Session();
@@ -27,4 +15,4 @@ class SessionMiddleware {
 }
 
 
-export default SessionMiddleware.instance;
+export default new SessionMiddleware();
diff --git a/ExpressAPI/src/routes/ApiRoutesManager.ts b/ExpressAPI/src/routes/ApiRoutesManager.ts
index f45b5cf3fd3f65a869098440d3ec85b71725f90f..d7641bc9c66668f9983e8ac70379fe375e5b5f48 100644
--- a/ExpressAPI/src/routes/ApiRoutesManager.ts
+++ b/ExpressAPI/src/routes/ApiRoutesManager.ts
@@ -8,18 +8,6 @@ import ExerciceRoutes from './ExerciceRoutes';
 
 
 class AdminRoutesManager implements RoutesManager {
-    private static _instance: AdminRoutesManager;
-
-    private constructor() { }
-
-    public static get instance(): AdminRoutesManager {
-        if ( !AdminRoutesManager._instance ) {
-            AdminRoutesManager._instance = new AdminRoutesManager();
-        }
-
-        return AdminRoutesManager._instance;
-    }
-
     registerOnBackend(backend: Express) {
         BaseRoutes.registerOnBackend(backend);
         SessionRoutes.registerOnBackend(backend);
@@ -30,4 +18,4 @@ class AdminRoutesManager implements RoutesManager {
 }
 
 
-export default AdminRoutesManager.instance;
+export default new AdminRoutesManager();
diff --git a/ExpressAPI/src/routes/BaseRoutes.ts b/ExpressAPI/src/routes/BaseRoutes.ts
index e78112aba02b67110e29c8ce2bd6b1d945e70e0d..d8cbce5ede3c65953e5fa904181a9d2bf91b2bad 100644
--- a/ExpressAPI/src/routes/BaseRoutes.ts
+++ b/ExpressAPI/src/routes/BaseRoutes.ts
@@ -6,18 +6,6 @@ import RoutesManager   from '../express/RoutesManager';
 
 
 class BaseRoutes implements RoutesManager {
-    private static _instance: BaseRoutes;
-
-    private constructor() { }
-
-    public static get instance(): BaseRoutes {
-        if ( !BaseRoutes._instance ) {
-            BaseRoutes._instance = new BaseRoutes();
-        }
-
-        return BaseRoutes._instance;
-    }
-
     registerOnBackend(backend: Express) {
         backend.get('/', (req: ApiRequest, res: express.Response) => { res.status(StatusCodes.OK).end(); });
         backend.get('/health_check', (req: ApiRequest, res: express.Response) => { res.status(StatusCodes.OK).end(); });
@@ -25,4 +13,4 @@ class BaseRoutes implements RoutesManager {
 }
 
 
-export default BaseRoutes.instance;
+export default new BaseRoutes();
diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts
index 1a5843759c88553a48f32e7895243c1b2c71eab2..3881412b9960ad6874bf69d279493aa31d006686 100644
--- a/ExpressAPI/src/routes/EnonceRoutes.ts
+++ b/ExpressAPI/src/routes/EnonceRoutes.ts
@@ -19,21 +19,10 @@ import DojoValidators            from '../helpers/DojoValidators';
 import { Prisma }                from '@prisma/client';
 import db                        from '../helpers/DatabaseHelper';
 import { Enonce }                from '../types/DatabaseTypes';
+import EnonceManager             from '../managers/EnonceManager';
 
 
 class EnonceRoutes implements RoutesManager {
-    private static _instance: EnonceRoutes;
-
-    private constructor() { }
-
-    public static get instance(): EnonceRoutes {
-        if ( !EnonceRoutes._instance ) {
-            EnonceRoutes._instance = new EnonceRoutes();
-        }
-
-        return EnonceRoutes._instance;
-    }
-
     private readonly enonceValidator: ExpressValidator.Schema = {
         name    : {
             trim    : true,
@@ -58,7 +47,19 @@ class EnonceRoutes implements RoutesManager {
 
     // Get an enonce by its name or gitlab url
     private async getEnonce(req: ApiRequest, res: express.Response) {
-        return req.boundParams.enonce ? req.session.sendResponse(res, StatusCodes.OK, req.boundParams.enonce) : res.status(StatusCodes.NOT_FOUND).send();
+        const enonce: Enonce = req.boundParams.enonce;
+
+        if ( enonce && !enonce.published && !await EnonceManager.isUserAllowedToAccessEnonce(enonce, req.session.profile) ) {
+            delete enonce.gitlabId;
+            delete enonce.gitlabLink;
+            delete enonce.gitlabCreationInfo;
+            delete enonce.gitlabLastInfo;
+            delete enonce.gitlabLastInfoDate;
+            delete enonce.staff;
+            delete enonce.exercices;
+        }
+
+        return enonce ? req.session.sendResponse(res, StatusCodes.OK, enonce) : res.status(StatusCodes.NOT_FOUND).send();
     }
 
     private async createEnonce(req: ApiRequest, res: express.Response) {
@@ -129,4 +130,4 @@ class EnonceRoutes implements RoutesManager {
 }
 
 
-export default EnonceRoutes.instance;
+export default new EnonceRoutes();
diff --git a/ExpressAPI/src/routes/ExerciceRoutes.ts b/ExpressAPI/src/routes/ExerciceRoutes.ts
index 840f4ed221381dc3753dc4ecf69b4be4eca7193b..49ac712e2ace3c2791a89713e5b3a2ba4970841c 100644
--- a/ExpressAPI/src/routes/ExerciceRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciceRoutes.ts
@@ -22,18 +22,6 @@ import db                        from '../helpers/DatabaseHelper';
 
 
 class ExerciceRoutes implements RoutesManager {
-    private static _instance: ExerciceRoutes;
-
-    private constructor() { }
-
-    public static get instance(): ExerciceRoutes {
-        if ( !ExerciceRoutes._instance ) {
-            ExerciceRoutes._instance = new ExerciceRoutes();
-        }
-
-        return ExerciceRoutes._instance;
-    }
-
     private readonly exerciceValidator: ExpressValidator.Schema = {
         members: {
             trim           : true,
@@ -133,4 +121,4 @@ class ExerciceRoutes implements RoutesManager {
 }
 
 
-export default ExerciceRoutes.instance;
+export default new ExerciceRoutes();
diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts
index 99ff714d85edd2f1bd610bbb854ba3236c185360..6804d9467e72dc598964d16df4c378c82df22d63 100644
--- a/ExpressAPI/src/routes/GitlabRoutes.ts
+++ b/ExpressAPI/src/routes/GitlabRoutes.ts
@@ -8,18 +8,6 @@ import GitlabManager      from '../managers/GitlabManager';
 
 
 class EnonceRoutes implements RoutesManager {
-    private static _instance: EnonceRoutes;
-
-    private constructor() { }
-
-    public static get instance(): EnonceRoutes {
-        if ( !EnonceRoutes._instance ) {
-            EnonceRoutes._instance = new EnonceRoutes();
-        }
-
-        return EnonceRoutes._instance;
-    }
-
     registerOnBackend(backend: Express) {
         backend.get('/gitlab/project/:idOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess);
     }
@@ -32,4 +20,4 @@ class EnonceRoutes implements RoutesManager {
 }
 
 
-export default EnonceRoutes.instance;
+export default new EnonceRoutes();
diff --git a/ExpressAPI/src/routes/SessionRoutes.ts b/ExpressAPI/src/routes/SessionRoutes.ts
index 08c3f35b098fd96042016016bb25aff5fe5a6d81..839d091e23075b03886e6df03089c08c2347a3fc 100644
--- a/ExpressAPI/src/routes/SessionRoutes.ts
+++ b/ExpressAPI/src/routes/SessionRoutes.ts
@@ -12,18 +12,6 @@ import { User }                  from '../types/DatabaseTypes';
 
 
 class SessionRoutes implements RoutesManager {
-    private static _instance: SessionRoutes;
-
-    private constructor() { }
-
-    public static get instance(): SessionRoutes {
-        if ( !SessionRoutes._instance ) {
-            SessionRoutes._instance = new SessionRoutes();
-        }
-
-        return SessionRoutes._instance;
-    }
-
     private readonly loginValidator: ExpressValidator.Schema = {
         user    : {
             trim    : true,
@@ -59,4 +47,4 @@ class SessionRoutes implements RoutesManager {
 }
 
 
-export default SessionRoutes.instance;
+export default new SessionRoutes();
diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared
index 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d..f20c94b884f7ab76936b059b712274a35fcc6318 160000
--- a/ExpressAPI/src/shared
+++ b/ExpressAPI/src/shared
@@ -1 +1 @@
-Subproject commit 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d
+Subproject commit f20c94b884f7ab76936b059b712274a35fcc6318