diff --git a/src/MainApplicationWindow.qml b/src/MainApplicationWindow.qml
index 784b13ef838efeb524bd12dc86d199d5ec70f5d4..8f590131748476aaaf0d162deb396b6689be7f7e 100644
--- a/src/MainApplicationWindow.qml
+++ b/src/MainApplicationWindow.qml
@@ -123,4 +123,14 @@ ApplicationWindow {
             duration: 500
         }
     }
+
+    Connections {
+        target: ClientWrapper.lrcInstance
+        onRestoreAppRequested: {
+            if (mainViewLoader.item)
+                mainViewLoader.item.show()
+            else
+                wizardView.show()
+        }
+    }
 }
diff --git a/src/lrcinstance.h b/src/lrcinstance.h
index 19d15e5f7c22c484b8e4cb114e3c94b1c88b8667..776c3a1f5f184aae578aa0bd92043df31ee34dda 100644
--- a/src/lrcinstance.h
+++ b/src/lrcinstance.h
@@ -444,6 +444,7 @@ public:
 signals:
     void accountListChanged();
     void currentAccountChanged();
+    void restoreAppRequested();
 
 private:
     LRCInstance(migrateCallback willMigrateCb = {}, migrateCallback didMigrateCb = {})
diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp
index c6087be0454758edbcea0c62de220bf600105b7e..d3d6a68b5e5531122c8fc3397bf04c6a8c58fdf5 100644
--- a/src/mainapplication.cpp
+++ b/src/mainapplication.cpp
@@ -58,7 +58,9 @@
 #include "videoformatresolutionmodel.h"
 #include "videoinputdevicemodel.h"
 
+#include <QAction>
 #include <QFontDatabase>
+#include <QMenu>
 #include <QQmlContext>
 #include <QtWebEngine>
 
@@ -455,5 +457,28 @@ MainApplication::applicationSetup()
      */
     qmlInitialization();
 
+    /*
+     * Systray menu.
+     */
+    GlobalSystemTray& sysIcon = GlobalSystemTray::instance();
+    sysIcon.setIcon(QIcon(":images/jami.png"));
+
+    QMenu* systrayMenu = new QMenu();
+
+    QAction* exitAction = new QAction(tr("Exit"), this);
+    connect(exitAction, &QAction::triggered,
+            [this] {
+                QCoreApplication::exit();
+            });
+
+     connect(&sysIcon, &QSystemTrayIcon::activated,
+             [this](QSystemTrayIcon::ActivationReason reason) {
+                 emit LRCInstance::instance().restoreAppRequested();
+             });
+
+    systrayMenu->addAction(exitAction);
+    sysIcon.setContextMenu(systrayMenu);
+    sysIcon.show();
+
     return true;
 }
diff --git a/src/runguard.cpp b/src/runguard.cpp
index 4d22959d29c03cb04cb6037b86d9e425afc24e83..b3c126edc6864550c1419fa20ebe5ff4212e0450 100644
--- a/src/runguard.cpp
+++ b/src/runguard.cpp
@@ -18,6 +18,9 @@
 // Based on: https://stackoverflow.com/a/28172162
 
 #include "runguard.h"
+
+#include "lrcinstance.h"
+
 #include <QCryptographicHash>
 
 namespace {
@@ -52,9 +55,7 @@ RunGuard::~RunGuard()
 void
 RunGuard::tryRestorePrimaryInstance()
 {
-    /*
-     * TODO: relaunch application
-     */
+    emit LRCInstance::instance().restoreAppRequested();
 }
 
 bool