diff --git a/ExpressAPI/src/routes/ExerciceRoutes.ts b/ExpressAPI/src/routes/ExerciceRoutes.ts
index 967e720aae27614333ef52ac3f465e6eaef4cdbe..07239d0e90ad4a2f25be99b7e2788924b65b6bc2 100644
--- a/ExpressAPI/src/routes/ExerciceRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciceRoutes.ts
@@ -20,6 +20,11 @@ import { Prisma }                from '@prisma/client';
 import { Enonce, Exercice }      from '../types/DatabaseTypes';
 import db                        from '../helpers/DatabaseHelper';
 import SecurityCheckType         from '../types/SecurityCheckType';
+import GitlabTreeFile            from '../shared/types/Gitlab/GitlabTreeFile';
+import GitlabFile                from '../shared/types/Gitlab/GitlabFile';
+import YAML                      from 'yaml';
+import EnonceFile                from '../shared/types/Dojo/EnonceFile';
+import GitlabTreeFileType        from '../shared/types/Gitlab/GitlabTreeFileType';
 
 
 class ExerciceRoutes implements RoutesManager {
@@ -33,6 +38,8 @@ class ExerciceRoutes implements RoutesManager {
 
     registerOnBackend(backend: Express) {
         backend.post('/enonces/:enonceNameOrUrl/exercices', SecurityMiddleware.check(true, SecurityCheckType.ENONCE_IS_PUBLISHED), ParamsValidatorMiddleware.validate(this.exerciceValidator), this.createExercice.bind(this));
+
+        backend.get('/exercices/:exerciceId/enonce', SecurityMiddleware.check(false, SecurityCheckType.EXERCICE_SECRET), this.getEnonce.bind(this));
     }
 
     private getExerciceName(enonce: Enonce, members: Array<GitlabUser>, suffix: number): string {
@@ -127,6 +134,42 @@ class ExerciceRoutes implements RoutesManager {
             return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
         }
     }
+
+    private async getEnonce(req: ApiRequest, res: express.Response) {
+        const repoTree: Array<GitlabTreeFile> = await GitlabManager.getRepositoryTree(req.boundParams.exercice.gitlabId);
+
+        let enonceYamlFile: GitlabFile;
+        let immutableFiles: Array<GitlabFile> = await Promise.all(Config.enonce.baseFiles.map(async (baseFile: string) => {
+            let file = await GitlabManager.getFile(req.boundParams.exercice.gitlabId, baseFile);
+
+            if ( baseFile === Config.enonce.filename ) {
+                enonceYamlFile = file;
+            }
+
+            return file;
+        }));
+
+        const dojoEnonceFile: EnonceFile = YAML.parse(atob(enonceYamlFile.content));
+
+        const immutablePaths = dojoEnonceFile.immutable.map(fileDescriptor => fileDescriptor.path);
+
+        await Promise.all(repoTree.map(async gitlabTreeFile => {
+            if ( gitlabTreeFile.type == GitlabTreeFileType.BLOB ) {
+                for ( const immutablePath of immutablePaths ) {
+                    if ( gitlabTreeFile.path.startsWith(immutablePath) ) {
+                        immutableFiles.push(await GitlabManager.getFile(req.boundParams.exercice.gitlabId, gitlabTreeFile.path));
+                        break;
+                    }
+                }
+            }
+        }));
+
+        return req.session.sendResponse(res, StatusCodes.OK, {
+            enonce    : (req.boundParams.exercice as Exercice).enonce,
+            enonceFile: dojoEnonceFile,
+            immutable : immutableFiles
+        });
+    }
 }