diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts
index 8a876b338555b9d2e6f0a0bebcc5060b6aaad5d3..bb8b9dc8c08aab3fd421d2c9c8c0319ea40fffc7 100644
--- a/deadlock-plugins/deadlock-extension/src/core/controller.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts
@@ -8,11 +8,12 @@ import QuickSetupView from '../view/quickSetupView';
 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/mission';
 import ApiService from './api.service';
 import SshKeyManager from './sshKeyManager';
 import { GiteaPublicProperties } from '../model/giteaPublicProperties.model';
 import { User } from '../model/user.model';
+import { openEditorInFolder } from './mission/missionOpenInEditor';
+import { Mission } from './mission/mission';
 
 export default class Controller {
   public connection: KeycloakOAuth2DeviceFlowConnection;
@@ -88,8 +89,11 @@ export default class Controller {
   }
 
   public async clear() {
+    console.log('CLEAR');
     await this.extensionStore.clear();
+    console.log('CLEAR2');
     this.quickSetupView.isAlreadyConnected = false;
+    console.log('CLEAR3');
   }
 
   public async createSshKeyPairIfNotExist() {
@@ -127,20 +131,20 @@ export default class Controller {
     const user: User = await this.callApiService.getUser();
     const giteaPublicProperties: GiteaPublicProperties = await this.callApiService.getGiteaPublicProperties();
 
-      const mission = new Mission(
-        {
-          missionId: missionId,
-          missionVersion: missionVersion,
-        },
-        user,
-        giteaPublicProperties,
-      );
-      vscode.window.showInformationMessage(
-        'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId,
-      );
-      await mission.setup();
-
-    await mission.openEditorInFolder();
+    const mission = new Mission(
+      `${ExtensionStore.getInstance().getMissionWorkdir()}/${missionId}`,
+      missionId,
+      missionVersion,
+      giteaPublicProperties,
+    );
+
+    vscode.window.showInformationMessage(
+      'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId,
+    );
+
+    await mission.setup(user);
+
+    openEditorInFolder(`${mission.directory}/.config`);
 
     vscode.commands.executeCommand(OPEN_QUICK_SETUP_COMMAND.cmd);
   }
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts b/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts
index dc1808af35e68af50ece12803ae0a9ba0fc1d119..bd236bec81753342bc7b594fa82239fd9b5783af 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/mission.ts
@@ -1,64 +1,34 @@
-import { exec as _exec } from 'child_process';
 import * as fs from 'fs';
-import * as util from 'util';
-import * as vscode from 'vscode';
-import { error as err, log } from '../../recorder/utils';
-import ExtensionStore from '../extensionStore';
-import { userSshKeyFolderPath } from '../config';
 import { GiteaPublicProperties } from '../../model/giteaPublicProperties.model';
-import { User, UserChallengeJson } from '../../model/user.model';
-import { createDevContainerFile } from './missionDevContainer';
+import { User } from '../../model/user.model';
 import { DockerfileSpecific, Base, VSCodespecific, LifecycleScripts } from './devContainer';
-import { MissionResource } from './missionResources';
+import { createDevContainerFile } from './missionDevContainer';
 import { createUserChallengeJsonFile } from './missionUserChallenge';
 
-/**
- * {@link https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback}
- */
-const exec = util.promisify(_exec);
-
-export default class Mission {
-  private readonly hostBaseWorkDir: string;
-  private readonly hostMissionDir: string;
-  private readonly hostMissionDevcontainerDir: string;
-  private readonly hostMissionMountDir: string;
-  private readonly userMissionConfigPath: string;
-  private readonly user: User;
-  private readonly giteaPublicProperties: GiteaPublicProperties;
-  private readonly missionRessource: MissionResource;
+export class Mission {
+  readonly directory: string;
+  readonly id: string;
+  readonly version: string;
+  readonly giteaProperties: GiteaPublicProperties;
 
-  constructor(
-    private params: { missionId: string; missionVersion: string },
-    user: User,
-    giteaPublicProperties: GiteaPublicProperties,
-  ) {
-    const { missionId, missionVersion } = params;
-    this.hostBaseWorkDir = ExtensionStore.getInstance().getMissionWorkdir() ?? '';
-    this.hostMissionDir = `${this.hostBaseWorkDir}/${missionId}`;
-    this.userMissionConfigPath = `${this.hostMissionDir}/.config`;
-    this.hostMissionDevcontainerDir = `${this.hostMissionDir}/.devcontainer`;
-    this.hostMissionMountDir = `${this.hostMissionDir}/mounted`;
-    this.user = user;
-    this.giteaPublicProperties = giteaPublicProperties;
-    this.missionRessource = new MissionResource(this.hostMissionDir, missionId, missionVersion);
+  constructor(directory: string, id: string, version: string, giteaProperties: GiteaPublicProperties) {
+    this.directory = directory;
+    this.id = id;
+    this.version = version;
+    this.giteaProperties = giteaProperties;
   }
 
-  public async setup(options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) {
-    await fs.promises.mkdir(this.hostMissionDevcontainerDir, { recursive: true });
-    await fs.promises.mkdir(this.hostMissionMountDir, { recursive: true });
-    await fs.promises.mkdir(this.userMissionConfigPath, { recursive: true });
-    await createDevContainerFile(this.missionRessource, options);
-    await createUserChallengeJsonFile(this.user, this.missionRessource, this.giteaPublicProperties);
+  public async setup(user: User, options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) {
+    await this.createDirectories([
+      `${this.directory}/.config`,
+      `${this.directory}/.devcontainer`,
+      `${this.directory}/mounted`,
+    ]);
+    await createDevContainerFile(this, options);
+    await createUserChallengeJsonFile(user, this, this.giteaProperties);
   }
 
-  public async openEditorInFolder(arbitraryPath?: string) {
-    if (arbitraryPath) {
-      return vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(arbitraryPath));
-    }
-    if (!fs.existsSync(this.hostMissionDir)) {
-      log('WARN missing path ', this.hostMissionDir);
-      await fs.promises.mkdir(this.hostMissionDir, { recursive: true });
-    }
-    await vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(this.hostMissionDir));
+  private createDirectories(directoryPaths: string[]) {
+    return Promise.all(directoryPaths.map((directoryPath) => fs.promises.mkdir(directoryPath, { recursive: true })));
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
index 37403ba5a04af97494906c0453e5c3818ecc4c69..aff814655d451ca5e1b61e74d943706d38f06b33 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
@@ -2,12 +2,12 @@ import { userSshKeyFolderPath } from '../config';
 import ExtensionStore from '../extensionStore';
 import { Base, DockerfileSpecific, LifecycleScripts, VSCodespecific } from './devContainer';
 import * as fs from 'fs';
-import { MissionResource } from './missionResources';
+import { Mission } from './mission';
 
 const DOCKER_IMAGE_URL = 'registry.takima.io/deadlock/deadlock-challenges';
 
 export function createDevContainerFile(
-  mission: MissionResource,
+  mission: Mission,
   options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>,
 ) {
   const hostBaseWorkDir = ExtensionStore.getInstance().getMissionWorkdir() ?? '';
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDocker.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDocker.ts
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4c3f8367bc3f0fd3cf886830815ff52a43a77d03
--- /dev/null
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionOpenInEditor.ts
@@ -0,0 +1,11 @@
+import * as fs from 'fs';
+import { error as err, log } from '../../recorder/utils';
+import * as vscode from 'vscode';
+
+export async function openEditorInFolder(folderPath: string) {
+  if (!fs.existsSync(folderPath)) {
+    log('WARN missing path ', folderPath);
+    await fs.promises.mkdir(folderPath, { recursive: true });
+  }
+  await vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(folderPath));
+}
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts
deleted file mode 100644
index 7196429d9554c1f32a7957e16f96b30258c983ac..0000000000000000000000000000000000000000
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionResources.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export class MissionResource {
-  constructor(public missionDir: string, public id: string, public version: string) {
-    this.missionDir = missionDir;
-    this.id = id;
-    this.version = version;
-  }
-}
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts
index 13166798da2d7c09d2d17b7177f4d0dc6cce0616..aa98cfbbec7d13447978c9b9230c6e2d11bbc7da 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionUserChallenge.ts
@@ -1,15 +1,15 @@
 import { User, UserChallengeJson } from '../../model/user.model';
 import * as fs from 'fs';
 import { GiteaPublicProperties } from '../../model/giteaPublicProperties.model';
-import { MissionResource } from './missionResources';
+import { Mission } from './mission';
 
 export function createUserChallengeJsonFile(
   user: User,
-  mission: MissionResource,
+  mission: Mission,
   giteaPublicProperties: GiteaPublicProperties,
 ) {
   return fs.promises.writeFile(
-    `${mission.missionDir}/.config/user-challenge.json`,
+    `${mission.directory}/.config/user-challenge.json`,
     (() => {
       const userChallengeJson: UserChallengeJson = {
         giteaHost: giteaPublicProperties.sshHost,