diff --git a/NodeApp/src/commander/CommanderApp.ts b/NodeApp/src/commander/CommanderApp.ts
index 1f3619e55f76e4d40af303dc9fa0f39969521f03..fa4460ed8e072392ee19c1d90e4718d21d82db58 100644
--- a/NodeApp/src/commander/CommanderApp.ts
+++ b/NodeApp/src/commander/CommanderApp.ts
@@ -11,6 +11,7 @@ import Config              from '../config/Config';
 import CompletionCommand   from './completion/CompletionCommand';
 import AuthCommand         from './auth/AuthCommand';
 import SessionCommand      from './auth/SessionCommand';
+import UpgradeCommand      from './UpgradeCommand';
 
 
 class CommanderApp {
@@ -116,6 +117,7 @@ https://gitedu.hesge.ch/dojo_project/projects/ui/dojocli/-/releases/Latest`, {
         AssignmentCommand.registerOnCommand(this.program);
         ExerciseCommand.registerOnCommand(this.program);
         CompletionCommand.registerOnCommand(this.program);
+        UpgradeCommand.registerOnCommand(this.program);
     }
 }
 
diff --git a/NodeApp/src/commander/UpgradeCommand.ts b/NodeApp/src/commander/UpgradeCommand.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b0ba3dddee68e41a8dcb57130b7da7aa286adad8
--- /dev/null
+++ b/NodeApp/src/commander/UpgradeCommand.ts
@@ -0,0 +1,61 @@
+import CommanderCommand from './CommanderCommand';
+import ora              from 'ora';
+import Config           from '../config/Config';
+import TextStyle        from '../types/TextStyle';
+import os               from 'os';
+import { spawn }        from 'child_process';
+
+
+class UpgradeCommand extends CommanderCommand {
+    protected commandName: string = 'upgrade';
+
+    protected defineCommand() {
+        this.command.description('upgrade the DojoCLI.')
+            .option('--pre-alpha', 'upgrade to the latest pre-alpha (dev) version. Attention it\'s an unstable version without support.')
+            .option('-o, --instructions', 'only display upgrade instructions.')
+            .action(this.commandAction.bind(this));
+    }
+
+    private displayInstructions(upgradeCommand: string, preAlpha: boolean) {
+        console.log(TextStyle.BLOCK(`You can upgrade DojoCLI on ${ os.platform() === 'darwin' ? 'macOS' : 'Linux' }:`));
+        ora().start().info(`By executing this command: ${ TextStyle.CODE(' ' + upgradeCommand + ' ') }`);
+        console.log('or');
+        ora().start().info(`By downloading the release from: ${ preAlpha ? Config.gitlab.cliPreAlphaReleasePage : Config.gitlab.cliReleasePage }`);
+    }
+
+    private upgrade(upgradeCommand: string) {
+        const upgradeSpinner = ora().start('DojoCLI upgrade is in progress. Please wait...');
+
+        const upgradeProcess = spawn(upgradeCommand, {
+            shell: true
+        });
+
+        upgradeProcess.on('exit', code => {
+            code === null || code !== 0 ? upgradeSpinner.fail('DojoCLI upgrade failed... Please try again manually.') : upgradeSpinner.succeed('DojoCLI upgrade is successful.');
+        });
+    }
+
+    protected async commandAction(options: { preAlpha: boolean, instructions: boolean }): Promise<void> {
+        if ( os.platform() === 'win32' ) {
+            if ( !options.instructions ) {
+                ora().start().warn('Automatic upgrade is not supported on Windows. \n');
+            }
+
+            console.log(TextStyle.BLOCK('You can upgrade DojoCLI on Windows:'));
+            ora().start().info(`By downloading the release from: ${ options.preAlpha ? Config.gitlab.cliPreAlphaReleasePage : Config.gitlab.cliReleasePage }`);
+
+            return;
+        }
+
+        const upgradeCommand = `curl -L "https://dojo.isc-hesge.ch/installer.sh" | sh /dev/stdin${ options.preAlpha ? ' installer=pre-alpha' : '' }`;
+
+        if ( options.instructions ) {
+            this.displayInstructions(upgradeCommand, options.preAlpha);
+        } else {
+            this.upgrade(upgradeCommand);
+        }
+    }
+}
+
+
+export default new UpgradeCommand();
\ No newline at end of file