diff --git a/src/app/accountadapter.cpp b/src/app/accountadapter.cpp
index bc6e4aa098422ed160af31880447ea20fb62cd2e..e7610a922c899b8652301eeb7053658e067e1eb8 100644
--- a/src/app/accountadapter.cpp
+++ b/src/app/accountadapter.cpp
@@ -27,10 +27,12 @@
 #include <QtConcurrent/QtConcurrent>
 
 AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager,
+                               SystemTray* systemTray,
                                LRCInstance* instance,
                                QObject* parent)
     : QmlAdapterBase(instance, parent)
     , settingsManager_(settingsManager)
+    , systemTray_(systemTray)
     , accountListModel_(new AccountListModel(instance))
     , deviceItemListModel_(new DeviceItemListModel(instance))
 {
@@ -46,6 +48,11 @@ AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager,
             &AccountModel::profileUpdated,
             this,
             &AccountAdapter::accountStatusChanged);
+
+    connect(systemTray_,
+            &SystemTray::countChanged,
+            accountListModel_.get(),
+            &AccountListModel::updateNotifications);
 }
 
 AccountModel*
@@ -354,4 +361,4 @@ AccountAdapter::setArchivePasswordAsync(const QString& accountID, const QString&
         config.archivePassword = password;
         lrcInstance_->accountModel().setAccountConfig(accountID, config);
     });
-}
+}
\ No newline at end of file
diff --git a/src/app/accountadapter.h b/src/app/accountadapter.h
index 83052c4e6392132db75c8ed7f3ce2b4b278c3ff0..a582a056c8ef75db22fe3be1f8728b0d6ea09d11 100644
--- a/src/app/accountadapter.h
+++ b/src/app/accountadapter.h
@@ -22,6 +22,7 @@
 
 #include "accountlistmodel.h"
 #include "deviceitemlistmodel.h"
+#include "systemtray.h"
 #include "lrcinstance.h"
 #include "utils.h"
 
@@ -44,6 +45,7 @@ Q_SIGNALS:
 
 public:
     explicit AccountAdapter(AppSettingsManager* settingsManager,
+                            SystemTray* systemTray,
                             LRCInstance* instance,
                             QObject* parent = nullptr);
     ~AccountAdapter() = default;
@@ -102,6 +104,7 @@ private:
     QMetaObject::Connection registeredNameSavedConnection_;
 
     AppSettingsManager* settingsManager_;
+    SystemTray* systemTray_;
 
     QScopedPointer<AccountListModel> accountListModel_;
     QScopedPointer<DeviceItemListModel> deviceItemListModel_;
diff --git a/src/app/accountlistmodel.cpp b/src/app/accountlistmodel.cpp
index e86983655a23f42eaa6810636c00b91958978e4a..9c6a73519eb332e9b5ea3ef5d0ea474e5a6bbd50 100644
--- a/src/app/accountlistmodel.cpp
+++ b/src/app/accountlistmodel.cpp
@@ -63,12 +63,23 @@ AccountListModel::data(const QModelIndex& index, int role) const
         return QVariant(static_cast<int>(accountInfo.profileInfo.type));
     case Role::Status:
         return QVariant(static_cast<int>(accountInfo.status));
+    case Role::NotificationCount:
+        return QVariant(static_cast<int>(accountInfo.conversationModel->notificationsCount()));
     case Role::ID:
         return QVariant(accountInfo.id);
     }
     return QVariant();
 }
 
+void
+AccountListModel::updateNotifications()
+{
+    for (int i = 0; i < lrcInstance_->accountModel().getAccountList().size(); ++i) {
+        QModelIndex modelIndex = QAbstractListModel::index(i, 0);
+        Q_EMIT dataChanged(modelIndex, modelIndex, {Role::NotificationCount});
+    }
+}
+
 QHash<int, QByteArray>
 AccountListModel::roleNames() const
 {
diff --git a/src/app/accountlistmodel.h b/src/app/accountlistmodel.h
index f184b190d642eb8dbfef21eda484e61f6802f155..e1df2c3038cb29b9913872a98acb4e9ea43152fb 100644
--- a/src/app/accountlistmodel.h
+++ b/src/app/accountlistmodel.h
@@ -26,6 +26,7 @@
     X(Username) \
     X(Type) \
     X(Status) \
+    X(NotificationCount) \
     X(ID)
 
 namespace AccountList {
@@ -53,6 +54,8 @@ public:
     // reset the model when there's new account added
     Q_INVOKABLE void reset();
 
+    void updateNotifications();
+
 protected:
     using Role = AccountList::Role;
 };
diff --git a/src/app/conversationsadapter.cpp b/src/app/conversationsadapter.cpp
index 6c06fe374da36ebc2c3a32d83fb2c209f320601c..02fa2368de52636e545808ba6137d05fb5c1e6df 100644
--- a/src/app/conversationsadapter.cpp
+++ b/src/app/conversationsadapter.cpp
@@ -379,7 +379,7 @@ ConversationsAdapter::updateConversationFilterData()
     }
     set_totalUnreadMessageCount(totalUnreadMessages);
     set_pendingRequestCount(accountInfo.conversationModel->pendingRequestCount());
-    systemTray_->setCount(lrcInstance_->notificationsCount());
+    systemTray_->onNotificationCountChanged(lrcInstance_->notificationsCount());
 
     if (get_pendingRequestCount() == 0 && get_filterRequests())
         set_filterRequests(false);
diff --git a/src/app/mainview/components/AccountItemDelegate.qml b/src/app/mainview/components/AccountItemDelegate.qml
index 9f5dc0c0618e3e15daec219eac862353ab8eb82c..b1835681c8e090f5fb5149e3ebd89155ffa9529b 100644
--- a/src/app/mainview/components/AccountItemDelegate.qml
+++ b/src/app/mainview/components/AccountItemDelegate.qml
@@ -91,5 +91,17 @@ ItemDelegate {
                 elide: Text.ElideRight
             }
         }
+
+        // unread message count
+        Item {
+            Layout.preferredWidth: childrenRect.width
+            Layout.preferredHeight: childrenRect.height
+            Layout.alignment: Qt.AlignRight
+            BadgeNotifier {
+                size: 20
+                count: NotificationCount
+                animate: index === 0
+            }
+        }
     }
 }
diff --git a/src/app/qmlregister.cpp b/src/app/qmlregister.cpp
index e9a9317709ed47031ac8da1f63cd47bff0594f17..54ed580614f17e3ab0038d4553e9f3490c86c6ad 100644
--- a/src/app/qmlregister.cpp
+++ b/src/app/qmlregister.cpp
@@ -113,7 +113,7 @@ registerTypes(QQmlEngine* engine,
     auto conversationsAdapter = new ConversationsAdapter(systemTray, lrcInstance, parent);
     auto avAdapter = new AvAdapter(lrcInstance, parent);
     auto contactAdapter = new ContactAdapter(lrcInstance, parent);
-    auto accountAdapter = new AccountAdapter(settingsManager, lrcInstance, parent);
+    auto accountAdapter = new AccountAdapter(settingsManager, systemTray, lrcInstance, parent);
     auto utilsAdapter = new UtilsAdapter(settingsManager, systemTray, lrcInstance, parent);
     auto pluginAdapter = new PluginAdapter(lrcInstance, parent);
     auto currentConversation = new CurrentConversation(lrcInstance, parent);
diff --git a/src/app/systemtray.cpp b/src/app/systemtray.cpp
index 5d6fe80524215e660c1dd569d8fbc0eb7acb60fc..e196da62e2c0e076fcf53e86ca9fde48e56c39ed 100644
--- a/src/app/systemtray.cpp
+++ b/src/app/systemtray.cpp
@@ -138,13 +138,14 @@ SystemTray::~SystemTray()
 }
 
 void
-SystemTray::setCount(int count)
+SystemTray::onNotificationCountChanged(int count)
 {
     if (count == 0) {
         setIcon(QIcon(":/images/jami.svg"));
     } else {
         setIcon(QIcon(":/images/jami-new.svg"));
     }
+    Q_EMIT countChanged();
 }
 
 #ifdef Q_OS_LINUX
diff --git a/src/app/systemtray.h b/src/app/systemtray.h
index d386fd7d4b7b4d40bd9d9e9c85c3c11d86c26659..b9d263e864306709d6bd6d824b49f0187ba1acee 100644
--- a/src/app/systemtray.h
+++ b/src/app/systemtray.h
@@ -37,7 +37,7 @@ public:
     explicit SystemTray(AppSettingsManager* settingsManager, QObject* parent = nullptr);
     ~SystemTray();
 
-    void setCount(int count);
+    void onNotificationCountChanged(int count);
 #ifdef Q_OS_LINUX
     bool hideNotification(const QString& id);
     void showNotification(const QString& id,
@@ -61,6 +61,9 @@ Q_SIGNALS:
     void setOnClickedCallback(Func&& onClickedCb);
 #endif // Q_OS_LINUX
 
+Q_SIGNALS:
+    void countChanged();
+
 private:
     QMetaObject::Connection messageClicked_;
     AppSettingsManager* settingsManager_;
diff --git a/tests/unittests/globaltestenvironment.h b/tests/unittests/globaltestenvironment.h
index ba083f701443ce7ac10d9b40ab597ff3884706d5..58596be83ad5b8e40591da91469d14173158e1e7 100644
--- a/tests/unittests/globaltestenvironment.h
+++ b/tests/unittests/globaltestenvironment.h
@@ -59,7 +59,10 @@ public:
         lrcInstance->subscribeToDebugReceived();
 
         // setup the adapters (their lifetimes are that of MainApplication)
-        accountAdapter.reset(new AccountAdapter(settingsManager.get(), lrcInstance.data(), nullptr));
+        accountAdapter.reset(new AccountAdapter(settingsManager.get(),
+                                                systemTray.get(),
+                                                lrcInstance.data(),
+                                                nullptr));
     }
 
     void TearDown()