diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts
index 25fe14e32fdce903603a1b7a79bfefd8759ab31d..6c96eaef26bf0c5835733e11543a3549614986df 100644
--- a/deadlock-plugins/deadlock-extension/src/core/controller.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts
@@ -1,12 +1,18 @@
 import * as vscode from 'vscode';
-import { KEYCLOAK_DEVICE_AUTH_URL, KEYCLOAK_TOKEN_CREATE_URL, KEYCLOAK_USER_INFO_URL } from '../config';
-import { copyProjectSources, log } from '../recorder/utils';
+import {
+  KEYCLOAK_DEVICE_AUTH_URL,
+  KEYCLOAK_TOKEN_CREATE_URL,
+  KEYCLOAK_USER_INFO_URL,
+  REGISTRY_MISSION_URL,
+} from '../config';
+import { log } from '../recorder/utils';
 import { OPEN_GETTING_STARTED_COMMAND } from '../theia/command';
 import BriefingView from '../view/briefingView';
 import GettingStartedView from '../view/gettingStartedView';
 import { CHOOSE_MISSION_WORKDIR_COMMAND, CommandHandler, OPEN_URL_IN_BROWSER_COMMAND } from './commandHandler';
 import ExtensionStore from './extensionStore';
 import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection';
+import Mission from './mission';
 
 export default class Controller {
   public connection: KeycloakOAuth2DeviceFlowConnection;
@@ -37,7 +43,7 @@ export default class Controller {
 
         switch (action) {
           case 'open-challenge':
-            that.launchMission(queryParams.get('missionId'));
+            that.launchMission(queryParams.get('missionId'), queryParams.get('missionVersion'));
             break;
 
           default:
@@ -87,8 +93,8 @@ export default class Controller {
     vscode.commands.executeCommand(OPEN_URL_IN_BROWSER_COMMAND.cmd, vscode.Uri.parse(url));
   }
 
-  public async launchMission(missionId: string | null) {
-    if (missionId) {
+  public async launchMission(missionId: string | null, missionVersion: string | null) {
+    if (missionId && missionVersion) {
       vscode.window.showInformationMessage(`vous lancez la mission ${missionId}`);
       const hadMissionWorkdir = this.extensionStore.getMissionWorkdir() !== undefined;
       if (!hadMissionWorkdir) {
@@ -103,16 +109,19 @@ export default class Controller {
       } else {
         vscode.window.showInformationMessage('Déjà connecté: session récupérée');
       }
-      await copyProjectSources(
-        'Documents/deadlock-challenges/resources/code_desktop_exemple',
-        this.extensionStore.getMissionWorkdir()!,
-      ).catch((e) => {
-        log(e);
+
+      // TODO Should I fetch GET api/missions/{missionId} one day instead of passing necessary parameters in vscode xdg-open link ?
+      const mission = new Mission({
+        registryBaseURL: REGISTRY_MISSION_URL,
+        missionId: missionId,
+        missionVersion: missionVersion,
       });
-      await vscode.commands.executeCommand(
-        'remote-containers.openFolder',
-        vscode.Uri.file(this.extensionStore.getMissionWorkdir()!),
+      vscode.window.showInformationMessage(
+        'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId,
       );
+      await mission.setup({});
+      await mission.openEditorInFolder();
+
       vscode.commands.executeCommand(OPEN_GETTING_STARTED_COMMAND.cmd);
     }
   }