diff --git a/NodeApp/src/commander/CommanderCommand.ts b/NodeApp/src/commander/CommanderCommand.ts
index f4c9bea4bc5a9dcd931a4992efa7328245f06534..7d2c2ccb1e9dd7be9ad3478f79664f08b848c4e7 100644
--- a/NodeApp/src/commander/CommanderCommand.ts
+++ b/NodeApp/src/commander/CommanderCommand.ts
@@ -5,8 +5,6 @@ abstract class CommanderCommand {
     protected abstract commandName: string;
     command: Command = new Command();
 
-    protected constructor() {}
-
     registerOnCommand(parent: Command) {
         this.command = parent.command(this.commandName);
 
diff --git a/NodeApp/src/commander/enonce/EnonceCommand.ts b/NodeApp/src/commander/enonce/EnonceCommand.ts
index 1594e6187339b0f6209eb9c5f6b98423e2d759cc..dc3a5f3a4cf399998813aa2d1720911ef4a2ee71 100644
--- a/NodeApp/src/commander/enonce/EnonceCommand.ts
+++ b/NodeApp/src/commander/enonce/EnonceCommand.ts
@@ -1,22 +1,12 @@
-import CommanderCommand    from '../CommanderCommand';
-import EnonceCreateCommand from './EnonceCreateCommand';
+import CommanderCommand       from '../CommanderCommand';
+import EnonceCreateCommand    from './EnonceCreateCommand';
+import EnoncePublishCommand   from './EnoncePublishCommand';
+import EnonceUnpublishCommand from './EnonceUnpublishCommand';
 
 
 class EnonceCommand extends CommanderCommand {
     protected commandName: string = 'enonce';
 
-    private static _instance: EnonceCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): EnonceCommand {
-        if ( !EnonceCommand._instance ) {
-            EnonceCommand._instance = new EnonceCommand();
-        }
-
-        return EnonceCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('manage an enonce');
@@ -24,10 +14,12 @@ class EnonceCommand extends CommanderCommand {
 
     protected defineSubCommands() {
         EnonceCreateCommand.registerOnCommand(this.command);
+        EnoncePublishCommand.registerOnCommand(this.command);
+        EnonceUnpublishCommand.registerOnCommand(this.command);
     }
 
     protected async commandAction(options: any): Promise<void> { }
 }
 
 
-export default EnonceCommand.instance;
\ No newline at end of file
+export default new EnonceCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/enonce/EnonceCreateCommand.ts b/NodeApp/src/commander/enonce/EnonceCreateCommand.ts
index 537b899a2ceabbdec27f95f9f6e5432583b16f81..2ea03fb4d7afb81cab400935dd418c8db60e5478 100644
--- a/NodeApp/src/commander/enonce/EnonceCreateCommand.ts
+++ b/NodeApp/src/commander/enonce/EnonceCreateCommand.ts
@@ -11,19 +11,7 @@ import Toolbox            from '../../shared/helpers/Toolbox';
 
 class EnonceCreateCommand extends CommanderCommand {
     protected commandName: string = 'create';
-
-    private static _instance: EnonceCreateCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): EnonceCreateCommand {
-        if ( !EnonceCreateCommand._instance ) {
-            EnonceCreateCommand._instance = new EnonceCreateCommand();
-        }
-
-        return EnonceCreateCommand._instance;
-    }
-
+    
     protected defineCommand() {
         this.command
         .description('create a new repository for an enonce')
@@ -107,4 +95,4 @@ class EnonceCreateCommand extends CommanderCommand {
 }
 
 
-export default EnonceCreateCommand.instance;
\ No newline at end of file
+export default new EnonceCreateCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/exercice/ExerciceCommand.ts b/NodeApp/src/commander/exercice/ExerciceCommand.ts
index 7833c5719a10af723351c59511095535a4f5a8a9..da670d46f3dab00e8d10258b4d73ce3217d43d54 100644
--- a/NodeApp/src/commander/exercice/ExerciceCommand.ts
+++ b/NodeApp/src/commander/exercice/ExerciceCommand.ts
@@ -5,18 +5,6 @@ import ExerciceCreateCommand from './ExerciceCreateCommand';
 class ExerciceCommand extends CommanderCommand {
     protected commandName: string = 'exercice';
 
-    private static _instance: ExerciceCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): ExerciceCommand {
-        if ( !ExerciceCommand._instance ) {
-            ExerciceCommand._instance = new ExerciceCommand();
-        }
-
-        return ExerciceCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('manage an exercice');
@@ -30,4 +18,4 @@ class ExerciceCommand extends CommanderCommand {
 }
 
 
-export default ExerciceCommand.instance;
\ No newline at end of file
+export default new ExerciceCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts b/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts
index a3c0fdc9d6893856a087a7e2d78634a111c6c435..015b780c9dfc963175eaf267f8c29f12d2a9e342 100644
--- a/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts
+++ b/NodeApp/src/commander/exercice/ExerciceCreateCommand.ts
@@ -12,18 +12,6 @@ import Exercice           from '../../types/Exercice';
 class ExerciceCreateCommand extends CommanderCommand {
     protected commandName: string = 'create';
 
-    private static _instance: ExerciceCreateCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): ExerciceCreateCommand {
-        if ( !ExerciceCreateCommand._instance ) {
-            ExerciceCreateCommand._instance = new ExerciceCreateCommand();
-        }
-
-        return ExerciceCreateCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('create a new exercice from an enonce')
@@ -111,4 +99,4 @@ class ExerciceCreateCommand extends CommanderCommand {
 }
 
 
-export default ExerciceCreateCommand.instance;
\ No newline at end of file
+export default new ExerciceCreateCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/App/SessionAppCommand.ts b/NodeApp/src/commander/session/App/SessionAppCommand.ts
index 29b3f0836cdb9e25313d6dfa163379d71e136c6d..d0c943b10a8f3a38fe93fd245c0c533582bffd8e 100644
--- a/NodeApp/src/commander/session/App/SessionAppCommand.ts
+++ b/NodeApp/src/commander/session/App/SessionAppCommand.ts
@@ -6,18 +6,6 @@ import SessionAppLogoutCommand from './SessionAppLogoutCommand';
 class SessionAppCommand extends CommanderCommand {
     protected commandName: string = 'application';
 
-    private static _instance: SessionAppCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionAppCommand {
-        if ( !SessionAppCommand._instance ) {
-            SessionAppCommand._instance = new SessionAppCommand();
-        }
-
-        return SessionAppCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('manage application session');
@@ -32,4 +20,4 @@ class SessionAppCommand extends CommanderCommand {
 }
 
 
-export default SessionAppCommand.instance;
\ No newline at end of file
+export default new SessionAppCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/App/SessionAppLoginCommand.ts b/NodeApp/src/commander/session/App/SessionAppLoginCommand.ts
index 4b03d6cb561098b54820f3f1eb84271f48839a26..514353fd4f34e498125eee4e9427ba5c9cef3790 100644
--- a/NodeApp/src/commander/session/App/SessionAppLoginCommand.ts
+++ b/NodeApp/src/commander/session/App/SessionAppLoginCommand.ts
@@ -7,18 +7,6 @@ import SessionManager   from '../../../managers/SessionManager';
 class SessionAppLoginCommand extends CommanderCommand {
     protected commandName: string = 'login';
 
-    private static _instance: SessionAppLoginCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionAppLoginCommand {
-        if ( !SessionAppLoginCommand._instance ) {
-            SessionAppLoginCommand._instance = new SessionAppLoginCommand();
-        }
-
-        return SessionAppLoginCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('login into the application')
@@ -46,4 +34,4 @@ class SessionAppLoginCommand extends CommanderCommand {
 }
 
 
-export default SessionAppLoginCommand.instance;
\ No newline at end of file
+export default new SessionAppLoginCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/App/SessionAppLogoutCommand.ts b/NodeApp/src/commander/session/App/SessionAppLogoutCommand.ts
index e91555df8310801d02e2514de102a00aec6ee5e8..650440d8396647ecfc4d634b4eda32347c2473b6 100644
--- a/NodeApp/src/commander/session/App/SessionAppLogoutCommand.ts
+++ b/NodeApp/src/commander/session/App/SessionAppLogoutCommand.ts
@@ -7,18 +7,6 @@ import ora              from 'ora';
 class SessionAppLogoutCommand extends CommanderCommand {
     protected commandName: string = 'logout';
 
-    private static _instance: SessionAppLogoutCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionAppLogoutCommand {
-        if ( !SessionAppLogoutCommand._instance ) {
-            SessionAppLogoutCommand._instance = new SessionAppLogoutCommand();
-        }
-
-        return SessionAppLogoutCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('logout of the application')
@@ -47,4 +35,4 @@ class SessionAppLogoutCommand extends CommanderCommand {
 }
 
 
-export default SessionAppLogoutCommand.instance;
\ No newline at end of file
+export default new SessionAppLogoutCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/Gitlab/SessionGitlabCommand.ts b/NodeApp/src/commander/session/Gitlab/SessionGitlabCommand.ts
index 58cb860ae02f00e59751b2df309c83fe992a1fed..3662faa1e86d0d7f0d78ac71de71c4c4c02254ca 100644
--- a/NodeApp/src/commander/session/Gitlab/SessionGitlabCommand.ts
+++ b/NodeApp/src/commander/session/Gitlab/SessionGitlabCommand.ts
@@ -6,18 +6,6 @@ import SessionGitlabLogoutCommand from './SessionGitlabLogoutCommand';
 class SessionGitlabCommand extends CommanderCommand {
     protected commandName: string = 'gitlab';
 
-    private static _instance: SessionGitlabCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionGitlabCommand {
-        if ( !SessionGitlabCommand._instance ) {
-            SessionGitlabCommand._instance = new SessionGitlabCommand();
-        }
-
-        return SessionGitlabCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('manage Gitlab session');
@@ -32,4 +20,4 @@ class SessionGitlabCommand extends CommanderCommand {
 }
 
 
-export default SessionGitlabCommand.instance;
\ No newline at end of file
+export default new SessionGitlabCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/Gitlab/SessionGitlabLoginCommand.ts b/NodeApp/src/commander/session/Gitlab/SessionGitlabLoginCommand.ts
index 30c92418c4a15d27d9dfc190a7e26d2418ebb2b9..33ffe4713dbce6bf01101a2314a03dc8d8d6edae 100644
--- a/NodeApp/src/commander/session/Gitlab/SessionGitlabLoginCommand.ts
+++ b/NodeApp/src/commander/session/Gitlab/SessionGitlabLoginCommand.ts
@@ -6,18 +6,6 @@ import GitlabManager    from '../../../managers/GitlabManager';
 class SessionGitlabLoginCommand extends CommanderCommand {
     protected commandName: string = 'login';
 
-    private static _instance: SessionGitlabLoginCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionGitlabLoginCommand {
-        if ( !SessionGitlabLoginCommand._instance ) {
-            SessionGitlabLoginCommand._instance = new SessionGitlabLoginCommand();
-        }
-
-        return SessionGitlabLoginCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('register the gitlab token')
@@ -35,4 +23,4 @@ class SessionGitlabLoginCommand extends CommanderCommand {
 }
 
 
-export default SessionGitlabLoginCommand.instance;
\ No newline at end of file
+export default new SessionGitlabLoginCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/Gitlab/SessionGitlabLogoutCommand.ts b/NodeApp/src/commander/session/Gitlab/SessionGitlabLogoutCommand.ts
index edd2b24744c817e7b33d0e43d1e3ed9058a20020..6b86883c7f4021362d6b0ca785d95cd7101e2a29 100644
--- a/NodeApp/src/commander/session/Gitlab/SessionGitlabLogoutCommand.ts
+++ b/NodeApp/src/commander/session/Gitlab/SessionGitlabLogoutCommand.ts
@@ -7,18 +7,6 @@ import GitlabManager    from '../../../managers/GitlabManager';
 class SessionGitlabLogoutCommand extends CommanderCommand {
     protected commandName: string = 'logout';
 
-    private static _instance: SessionGitlabLogoutCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionGitlabLogoutCommand {
-        if ( !SessionGitlabLogoutCommand._instance ) {
-            SessionGitlabLogoutCommand._instance = new SessionGitlabLogoutCommand();
-        }
-
-        return SessionGitlabLogoutCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('logout of Gitlab')
@@ -47,4 +35,4 @@ class SessionGitlabLogoutCommand extends CommanderCommand {
 }
 
 
-export default SessionGitlabLogoutCommand.instance;
\ No newline at end of file
+export default new SessionGitlabLogoutCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/SessionCommand.ts b/NodeApp/src/commander/session/SessionCommand.ts
index 29b8a5a4302fc1f5b7982a93c9796fcde0d01eaa..c7089d6b0441979a93133f0cab4a30ee3bad306e 100644
--- a/NodeApp/src/commander/session/SessionCommand.ts
+++ b/NodeApp/src/commander/session/SessionCommand.ts
@@ -7,18 +7,6 @@ import SessionGitlabCommand from './Gitlab/SessionGitlabCommand';
 class SessionCommand extends CommanderCommand {
     protected commandName: string = 'session';
 
-    private static _instance: SessionCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionCommand {
-        if ( !SessionCommand._instance ) {
-            SessionCommand._instance = new SessionCommand();
-        }
-
-        return SessionCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('manage Dojo and Gitlab sessions');
@@ -34,4 +22,4 @@ class SessionCommand extends CommanderCommand {
 }
 
 
-export default SessionCommand.instance;
\ No newline at end of file
+export default new SessionCommand();
\ No newline at end of file
diff --git a/NodeApp/src/commander/session/SessionTestCommand.ts b/NodeApp/src/commander/session/SessionTestCommand.ts
index 890fc03a71c376ca6aa2d77e32e45fe13a13595c..d0ab1b62051f3e7a6555081957851cde1461cc7f 100644
--- a/NodeApp/src/commander/session/SessionTestCommand.ts
+++ b/NodeApp/src/commander/session/SessionTestCommand.ts
@@ -6,18 +6,6 @@ import GitlabManager    from '../../managers/GitlabManager';
 class SessionTestCommand extends CommanderCommand {
     protected commandName: string = 'test';
 
-    private static _instance: SessionTestCommand;
-
-    private constructor() { super(); }
-
-    public static get instance(): SessionTestCommand {
-        if ( !SessionTestCommand._instance ) {
-            SessionTestCommand._instance = new SessionTestCommand();
-        }
-
-        return SessionTestCommand._instance;
-    }
-
     protected defineCommand() {
         this.command
         .description('test availability of registered Dojo API and Gitlab API sessions')
@@ -31,4 +19,4 @@ class SessionTestCommand extends CommanderCommand {
 }
 
 
-export default SessionTestCommand.instance;
\ No newline at end of file
+export default new SessionTestCommand();
\ No newline at end of file
diff --git a/NodeApp/src/config/Config.ts b/NodeApp/src/config/Config.ts
index fc3d3df1c90ca38a7298b9239852fdec7f8a17cc..f65322a3daaa6470daad131de071d326f8a17ca9 100644
--- a/NodeApp/src/config/Config.ts
+++ b/NodeApp/src/config/Config.ts
@@ -2,8 +2,6 @@ import getAppDataPath from 'appdata-path';
 
 
 class Config {
-    private static _instance: Config;
-
     public apiURL: string;
 
     public gitlab: {
@@ -15,7 +13,7 @@ class Config {
         folder: string; file: string;
     };
 
-    private constructor() {
+    constructor() {
         this.apiURL = process.env.API_URL || '';
 
         this.gitlab = {
@@ -31,15 +29,7 @@ class Config {
             file  : process.env.LOCAL_CONFIG_FILE || ''
         };
     }
-
-    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/NodeApp/src/config/LocalConfig.ts b/NodeApp/src/config/LocalConfig.ts
index b150d5e67599cbde21c4bf37b51dd6fa3f5819fa..2f4ae036c774d80e0df82dac2976f5046bf3880e 100644
--- a/NodeApp/src/config/LocalConfig.ts
+++ b/NodeApp/src/config/LocalConfig.ts
@@ -7,24 +7,12 @@ import GitlabManager   from '../managers/GitlabManager';
 
 
 class LocalConfig {
-    private static _instance: LocalConfig;
-
     private get configPath(): string {
         return `${ Config.localConfig.folder }/${ Config.localConfig.file }`;
     }
 
     private _config: { [key in LocalConfigKeys]?: any } = {};
 
-    private constructor() { }
-
-    public static get instance(): LocalConfig {
-        if ( !LocalConfig._instance ) {
-            LocalConfig._instance = new LocalConfig();
-        }
-
-        return LocalConfig._instance;
-    }
-
     loadConfig() {
         if ( !fs.existsSync(this.configPath) ) {
             fs.mkdirSync(Config.localConfig.folder, { recursive: true });
@@ -56,4 +44,4 @@ class LocalConfig {
 }
 
 
-export default LocalConfig.instance;
\ No newline at end of file
+export default new LocalConfig();
\ No newline at end of file
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index 013f596b3b8f6031d42ece94582f6733536fa7c3..6d85b9872456ea03cb064e4fe6ce4ad6705813a8 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -10,18 +10,6 @@ import DojoResponse          from '../shared/types/DojoResponse';
 
 
 class DojoBackendManager {
-    constructor() { }
-
-    private static _instance: DojoBackendManager;
-
-    public static get instance(): DojoBackendManager {
-        if ( !DojoBackendManager._instance ) {
-            DojoBackendManager._instance = new DojoBackendManager();
-        }
-
-        return DojoBackendManager._instance;
-    }
-
     public getApiUrl(route: ApiRoutes): string {
         return `${ Config.apiURL }${ route }`;
     }
@@ -144,4 +132,4 @@ class DojoBackendManager {
 }
 
 
-export default DojoBackendManager.instance;
+export default new DojoBackendManager();
diff --git a/NodeApp/src/managers/GitlabManager.ts b/NodeApp/src/managers/GitlabManager.ts
index 775d9c17df8b4af3d849e5e9444884f03315bef0..b2d71c728d2a93e05288da70cd295949ff15677b 100644
--- a/NodeApp/src/managers/GitlabManager.ts
+++ b/NodeApp/src/managers/GitlabManager.ts
@@ -10,18 +10,6 @@ import GitlabRoutes    from '../shared/types/Gitlab/GitlabRoutes';
 class GitlabManager {
     private _token: string | null = null;
 
-    constructor() { }
-
-    private static _instance: GitlabManager;
-
-    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 }`;
     }
@@ -219,4 +207,4 @@ class GitlabManager {
 }
 
 
-export default GitlabManager.instance;
+export default new GitlabManager();
diff --git a/NodeApp/src/managers/HttpManager.ts b/NodeApp/src/managers/HttpManager.ts
index 1412a99b61cf4ec2afeb7fe01317c611bdeee872..044d0e11c0595681c5422fcdec10c16aca2c43ba 100644
--- a/NodeApp/src/managers/HttpManager.ts
+++ b/NodeApp/src/managers/HttpManager.ts
@@ -10,18 +10,6 @@ import { StatusCodes }                from 'http-status-codes';
 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();
@@ -86,5 +74,5 @@ class HttpManager {
 }
 
 
-export default HttpManager.instance;
+export default new HttpManager();
 
diff --git a/NodeApp/src/managers/SessionManager.ts b/NodeApp/src/managers/SessionManager.ts
index 8ad0290df6bc35c9e712b4c9e22c6d2a2f055057..aa1420a1bd97a1253a37e465a6320b6ddb848747 100644
--- a/NodeApp/src/managers/SessionManager.ts
+++ b/NodeApp/src/managers/SessionManager.ts
@@ -16,18 +16,6 @@ class SessionManager {
 
     public profile: User = new User();
 
-    constructor() { }
-
-    private static _instance: SessionManager;
-
-    public static get instance(): SessionManager {
-        if ( !SessionManager._instance ) {
-            SessionManager._instance = new SessionManager();
-        }
-
-        return SessionManager._instance;
-    }
-
     get isLogged(): boolean {
         return this._token !== null;
     }
@@ -140,4 +128,4 @@ class SessionManager {
 }
 
 
-export default SessionManager.instance;
+export default new SessionManager();
diff --git a/NodeApp/src/shared b/NodeApp/src/shared
index 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d..f20c94b884f7ab76936b059b712274a35fcc6318 160000
--- a/NodeApp/src/shared
+++ b/NodeApp/src/shared
@@ -1 +1 @@
-Subproject commit 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d
+Subproject commit f20c94b884f7ab76936b059b712274a35fcc6318