diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts
index 4bbdee7322c2b034ca43bc205b5d856071f40fea..7087949b9710fbdbfc01947357852b9f71fd19c4 100644
--- a/deadlock-plugins/deadlock-extension/src/core/api.service.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/api.service.ts
@@ -113,17 +113,29 @@ export default class ApiService {
     }
   }
 
-  getGiteaPublicProperties(): Promise<GiteaPublicProperties> {
-    return this.axiosInstance.get<GiteaPublicProperties>(`gitea`).then((res) => res.data);
+  async getGiteaPublicProperties(): Promise<GiteaPublicProperties> {
+    const res = await this.axiosInstance.get<GiteaPublicProperties>(`gitea`);
+    return res.data;
   }
 
-  getUserSshKey(): Promise<SshKeyPair> {
-    return this.axiosInstance.put<SshKeyPair>(`users/gitea/keypair`).then((res) => res.data);
+  async getUserSshKey(): Promise<SshKeyPair> {
+    const res = await this.axiosInstance.put<SshKeyPair>(`users/gitea/keypair`);
+    return res.data;
   }
 
-  getUser(): Promise<User> {
-    return this.axiosInstance.get<User>(`auth`).then((res) => {
-      return res.data;
-    });
+  async getCurrentUser(): Promise<User> {
+    const res = await this.axiosInstance.get<User>(`auth`);
+    return res.data;
+  }
+
+  async getUser(userId: string | null): Promise<User> {
+    if (!userId) return this.getCurrentUser();
+    const res = await this.axiosInstance.get<User>(`users/${userId}`);
+    return res.data;
+  }
+
+  async getAccessToRepository(userId: string, missionId: string): Promise<any> {
+    const res = await this.axiosInstance.get<any>(`users/${userId}/missions/${missionId}/repositoryAccess`);
+    return res.data;
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts
index 145974603be899716d75a8f23573a9438a25bd52..68c852a62e481a60914a7ec60bfafd1ca5c5bbad 100644
--- a/deadlock-plugins/deadlock-extension/src/core/controller.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts
@@ -46,6 +46,7 @@ export default class Controller {
         // TODO: Should we follow eslint no-case-declarations ?
         const missionId = queryParams.get('missionId');
         const missionVersion = queryParams.get('missionVersion');
+        const userId = queryParams.get('userId');
         log('Opening link', uri);
 
         switch (action) {
@@ -53,7 +54,7 @@ export default class Controller {
             if (!missionId || !missionVersion) {
               window.showErrorMessage('Identifiant ou version de la mission incorrect');
             } else {
-              that.launchMission(missionId, missionVersion);
+              that.launchMission(missionId, missionVersion, userId);
             }
 
             break;
@@ -111,7 +112,7 @@ export default class Controller {
     commands.executeCommand(openUrlInBrowserCommand.cmd, Uri.parse(url));
   }
 
-  public async launchMission(missionId: string, missionVersion: string) {
+  public async launchMission(missionId: string, missionVersion: string, userId: string | null) {
     window.showInformationMessage(`vous lancez la mission ${missionId}`);
     const hadMissionWorkdir = this.extensionStore.getMissionWorkdir() !== undefined;
     if (!hadMissionWorkdir) {
@@ -128,10 +129,22 @@ export default class Controller {
     const mission = new Mission(missionId, missionVersion);
 
     const missionsWorkdir = this.extensionStore.getMissionWorkdir() ?? '';
-    const user: User = await this.apiService.getUser();
+
+    const currentUser = await this.apiService.getCurrentUser();
+
+    const user: User = await this.apiService.getUser(userId);
+
+    const response: any = this.apiService.getAccessToRepository(user.id, mission.id);
+
     const giteaPublicProperties: GiteaPublicProperties = await this.apiService.getGiteaPublicProperties();
 
-    const missionDevcontainer = new MissionDevContainer(missionsWorkdir, user, mission, giteaPublicProperties);
+    const missionDevcontainer = new MissionDevContainer(
+      missionsWorkdir,
+      user,
+      currentUser,
+      mission,
+      giteaPublicProperties,
+    );
 
     window.showInformationMessage(
       'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId,
diff --git a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts
index 9759b5e1559f2e1252a1c3a5740dc9beb47e99a9..ce92b124f79d3488b23582f6c3edece7d1a1cc0e 100644
--- a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts
@@ -1,5 +1,6 @@
 import { ExtensionContext, Memento, SecretStorage, window } from 'vscode';
 import { extensionLog as log } from '../recorder/utils/log';
+import { removeFiles } from '../recorder/utils/workdir';
 
 export type GlobalStorageType = Memento & { setKeysForSync(keys: readonly string[]): void };
 
@@ -22,6 +23,7 @@ export default class ExtensionStore {
     }
     if (await this.secretStorage.get(StoreKey.AccessTokenKey)) this.secretStorage.delete(StoreKey.AccessTokenKey);
     if (await this.secretStorage.get(StoreKey.RefreshTokenKey)) this.secretStorage.delete(StoreKey.RefreshTokenKey);
+    await removeFiles(`${process.env.HOME}/.deadlock/.ssh/id_rsa`, `${process.env.HOME}/.deadlock/.ssh/id_rsa.pub`);
   }
 
   public static getInstance(context?: ExtensionContext): ExtensionStore {
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
index 7de285acbc2014626a17a71bfee2eb2b621027a8..4ff26fba8154b8be68bc5d485243e2a934345926 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
@@ -19,19 +19,26 @@ export class MissionDevContainer {
   private readonly dockerImageUrl = 'registry.takima.io/deadlock/deadlock-challenges';
   private readonly remoteGiteaWorkDir = `/workdir`;
 
-  private readonly dirs = {
-    missionWorkdir: `${this.missionsWorkdir}/${this.mission.id}`,
-    config: `${this.missionsWorkdir}/${this.mission.id}/.config`,
-    devcontainer: `${this.missionsWorkdir}/${this.mission.id}/.devcontainer`,
-    mounted: `${this.missionsWorkdir}/${this.mission.id}/mounted`,
-  };
+  private readonly dirs: { missionWorkdir: string; config: string; devcontainer: string; mounted: string };
 
   constructor(
     private readonly missionsWorkdir: string,
     private readonly user: User,
+    private readonly currentUser: User,
     private readonly mission: Mission,
     private readonly giteaProperties: GiteaPublicProperties,
-  ) {}
+  ) {
+    let prefix = `${this.missionsWorkdir}`;
+    if (this.isReviewingStudent()) {
+      prefix += `/students/${this.user.details.lastName}_${this.user.details.firstName}-${this.user.id}`;
+    }
+    this.dirs = {
+      missionWorkdir: `${prefix}/${this.mission.id}`,
+      config: `${prefix}/${this.mission.id}/.config`,
+      devcontainer: `${prefix}/${this.mission.id}/.devcontainer`,
+      mounted: `${prefix}/${this.mission.id}/mounted`,
+    };
+  }
 
   async open() {
     if (!this.isInit) {
@@ -51,6 +58,10 @@ export class MissionDevContainer {
     await this.createUserChallengeJsonFile();
   }
 
+  private isReviewingStudent() {
+    return this.currentUser.id !== this.user.id;
+  }
+
   private createUserChallengeJsonFile() {
     return writeFile(
       `${this.dirs.config}/user-challenge.json`,
@@ -62,7 +73,7 @@ export class MissionDevContainer {
           email: `${this.user.id.split('-').join('')}@deadlock.io`,
           missionId: this.mission.id,
           remoteGitUsername: this.user.id.split('-').join(''),
-          currentUserDetails: this.user.details,
+          currentUserDetails: this.currentUser ? this.currentUser.details : this.user.details,
           remoteUserDetails: this.user.details,
         };
         return JSON.stringify(userChallengeJson, null, 2);
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
index c7de234a5c80bf1c6ec88eb3d3e36e88f710cb59..f528864d7420dd5e566db99a2e0b8517fca89f01 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
@@ -81,3 +81,11 @@ export function copyGitUserFiles(srcPath: string, destPath: string, userId: stri
   copyFolderIfExistsSync(join(srcPath, '.git'), join(destPath, `user-git-${userId}`));
   copyFileIfExistsSync(join(srcPath, '.gitignore'), join(destPath, `user-gitignore-${userId}`));
 }
+
+export async function removeFiles(...paths: string[]) {
+  for (const path of paths) {
+    if (existsSync(path)) {
+      await unlink(path);
+    }
+  }
+}