diff --git a/app/src/handlers/appimagehandler.cpp b/app/src/handlers/appimagehandler.cpp
index 3f3fa704d6a50b775aac39ec430abf1965030a10..7ca9fc28bb5f2ae23a6cd6bb05da6166bf7d626a 100644
--- a/app/src/handlers/appimagehandler.cpp
+++ b/app/src/handlers/appimagehandler.cpp
@@ -1,6 +1,9 @@
 #include "appimagehandler.h"
 
 #ifdef QTLIB_UNIX
+#include <thread>
+#include <chrono>
+
 #include "appimage/update.h"
 #endif
 
@@ -39,12 +42,23 @@ bool AppImageHandler::isUpdateAvailable(const QString &path) const
 }
 
 #ifdef QTLIB_UNIX
-bool AppImageHandler::updateAppImage(const QString &path) const
+bool AppImageHandler::updateAppImage(const QString &path)
 {
     appimage::update::Updater appImageUpdater(path.toStdString(), false);
-    /*if (appImageUpdater.start()) {
-        // TODO: make signals&slots bindings later
-    }*/
+    if (appImageUpdater.start()) {
+        emit updateStarted(path);
+        while (!appImageUpdater.isDone()) {
+            std::this_thread::sleep_for(std::chrono::milliseconds(100));
+            double progress;
+            if (appImageUpdater.progress(progress)) {
+                emit updateProgress(path, progress * 100);
+            }
+        }
+        emit updateFinished(path);
+        if (!appImageUpdater.hasError()) {
+            return true;
+        }
+    }
 
     return false;
 }
diff --git a/app/src/handlers/appimagehandler.h b/app/src/handlers/appimagehandler.h
index 9b23165d9e5c8d2887dff23cfc65f324daafd449..2cdc8605108ea2c11dd9601eb01e8e6d0bdd73fd 100644
--- a/app/src/handlers/appimagehandler.h
+++ b/app/src/handlers/appimagehandler.h
@@ -11,12 +11,17 @@ class AppImageHandler : public QObject
 public:
     explicit AppImageHandler(ConfigHandler *configHandler, QObject *parent = nullptr);
 
+signals:
+    void updateStarted(QString path);
+    void updateFinished(QString path);
+    void updateProgress(QString path, int progress);
+
 public slots:
     QString describeAppImage(const QString &path) const;
     bool isUpdateAvailable(const QString &path) const;
 
 #ifdef QTLIB_UNIX
-    bool updateAppImage(const QString &path) const;
+    bool updateAppImage(const QString &path);
 #endif
 
 private:
diff --git a/app/src/websockets/websocketserver.cpp b/app/src/websockets/websocketserver.cpp
index 50799003f8242c76ffa440a73e4c65a979f1da69..649b8a874d4f45d6f87bd19178cbdbd8cbea8d5f 100644
--- a/app/src/websockets/websocketserver.cpp
+++ b/app/src/websockets/websocketserver.cpp
@@ -38,6 +38,10 @@ WebSocketServer::WebSocketServer(ConfigHandler *configHandler, const QString &se
     connect(itemHandler_, &ItemHandler::installFinished, this, &WebSocketServer::itemInstallFinished);
     connect(itemHandler_, &ItemHandler::uninstallStarted, this, &WebSocketServer::itemUninstallStarted);
     connect(itemHandler_, &ItemHandler::uninstallFinished, this, &WebSocketServer::itemUninstallFinished);
+
+    connect(appImageHandler_, &AppImageHandler::updateStarted, this, &WebSocketServer::appImageUpdateStarted);
+    connect(appImageHandler_, &AppImageHandler::updateFinished, this, &WebSocketServer::appImageUpdateFinished);
+    connect(appImageHandler_, &AppImageHandler::updateProgress, this, &WebSocketServer::appImageUpdateProgress);
 }
 
 WebSocketServer::~WebSocketServer()
@@ -193,6 +197,28 @@ void WebSocketServer::itemUninstallFinished(QJsonObject result)
     sendMessage("", "ItemHandler::uninstallFinished", data);
 }
 
+void WebSocketServer::appImageUpdateStarted(QString path)
+{
+    QJsonArray data;
+    data.append(path);
+    sendMessage("", "AppImageHandler::updateStarted", data);
+}
+
+void WebSocketServer::appImageUpdateFinished(QString path)
+{
+    QJsonArray data;
+    data.append(path);
+    sendMessage("", "AppImageHandler::updateFinished", data);
+}
+
+void WebSocketServer::appImageUpdateProgress(QString path, int progress)
+{
+    QJsonArray data;
+    data.append(path);
+    data.append(progress);
+    sendMessage("", "AppImageHandler::updateProgress", data);
+}
+
 void WebSocketServer::receiveMessage(const QString &id, const QString &func, const QJsonArray &data)
 {
     /* message object format
diff --git a/app/src/websockets/websocketserver.h b/app/src/websockets/websocketserver.h
index 595fb428d6d2c6a707b51af71e3326514986d7e2..0e4659b5975772c06f512ce4f139c69dc1e8f0da 100644
--- a/app/src/websockets/websocketserver.h
+++ b/app/src/websockets/websocketserver.h
@@ -51,6 +51,10 @@ private slots:
     void itemUninstallStarted(QJsonObject result);
     void itemUninstallFinished(QJsonObject result);
 
+    void appImageUpdateStarted(QString path);
+    void appImageUpdateFinished(QString path);
+    void appImageUpdateProgress(QString path, int progress);
+
 private:
     void receiveMessage(const QString &id, const QString &func, const QJsonArray &data);
     void sendMessage(const QString &id, const QString &func, const QJsonArray &data);