diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2b918be7ef8a3fe2152a8952e4e291d29f5d07ce..aa81f285ceb1f9099efca6472e2321f2ffc55e5a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -303,6 +303,7 @@ set(SRC_FILES
 	src/TrayIcon.cpp
 	src/UserInfoWidget.cpp
 	src/UserSettingsPage.cpp
+	src/UsersModel.cpp
 	src/Utils.cpp
 	src/WebRTCSession.cpp
 	src/WelcomePage.cpp
diff --git a/src/UsersModel.cpp b/src/UsersModel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c63292bb6d8ca4cf05737974580569a4cc7c2e15
--- /dev/null
+++ b/src/UsersModel.cpp
@@ -0,0 +1,28 @@
+#include "UsersModel.h"
+
+#include "Cache.h"
+#include "CompletionModelRoles.h"
+
+#include <QPixmap>
+
+UsersModel::UsersModel(const std::string &roomId, QObject *parent)
+  : QAbstractListModel(parent)
+{
+        roomMembers_ = cache::getMembers(roomId, 0, 9999);
+}
+
+QVariant
+UsersModel::data(const QModelIndex &index, int role) const
+{
+        if (hasIndex(index.row(), index.column(), index.parent())) {
+                switch (role) {
+                case CompletionModel::CompletionRole:
+                case CompletionModel::SearchRole:
+                case Qt::DisplayRole:
+                        return roomMembers_[index.row()].display_name;
+                case Avatar:
+                        return roomMembers_[index.row()].avatar;
+                }
+        }
+        return {};
+}
diff --git a/src/UsersModel.h b/src/UsersModel.h
new file mode 100644
index 0000000000000000000000000000000000000000..09ccbf254d4024cf1e4e470bfeb187c289de6a60
--- /dev/null
+++ b/src/UsersModel.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <QAbstractListModel>
+
+class RoomMember;
+
+class UsersModel : public QAbstractListModel
+{
+public:
+        enum Roles
+        {
+                Avatar = Qt::UserRole // QImage avatar
+        };
+
+        UsersModel(const std::string &roomId, QObject *parent = nullptr);
+        int rowCount(const QModelIndex &parent = QModelIndex()) const override
+        {
+                return (parent == QModelIndex()) ? roomMembers_.size() : 0;
+        }
+        QVariant data(const QModelIndex &index, int role) const override;
+
+private:
+        std::vector<RoomMember> roomMembers_;
+};