diff --git a/resources/qml/ChatPage.qml b/resources/qml/ChatPage.qml
index df2bf41fc4505b83fcc848c4d33ff603bf768081..cd323a97b56961554ca54308cbfc2562b19bae13 100644
--- a/resources/qml/ChatPage.qml
+++ b/resources/qml/ChatPage.qml
@@ -71,7 +71,7 @@ Rectangle {
         AdaptiveLayoutElement {
             id: timlineViewC
 
-            minimumWidth: fontMetrics.averageCharacterWidth * 40 + Nheko.avatarSize + 2* Nheko.paddingMedium
+            minimumWidth: fontMetrics.averageCharacterWidth * 40 + Nheko.avatarSize + 2 * Nheko.paddingMedium
 
             TimelineView {
                 id: timeline
diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index 99e0ed41ccda392ea33da6dfca2131c1ec95d3d7..d69f608b0cc4652aaa58255d0b4580d101ee075c 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -254,9 +254,9 @@ Page {
 
                         Label {
                             id: timestamp
+
                             visible: !model.isInvite && !model.isSpace
                             width: visible ? 0 : undefined
-
                             Layout.alignment: Qt.AlignRight | Qt.AlignBottom
                             font.pixelSize: fontMetrics.font.pixelSize * 0.9
                             color: roomItem.unimportantText
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 90e2816666f8b4148bd9fda7d3112c8da0092d19..703f2fac9a916992693ca9370ed1a9144eaa5362 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -41,7 +41,8 @@ Item {
     ColumnLayout {
         id: timelineLayout
 
-        visible: room != null
+        visible: room != null && !room.isSpace
+        enabled: visible
         anchors.fill: parent
         spacing: 0
 
@@ -127,6 +128,66 @@ Item {
 
     }
 
+    ColumnLayout {
+        id: contentLayout1
+
+        visible: room != null && room.isSpace
+        enabled: visible
+        anchors.fill: parent
+        anchors.margins: Nheko.paddingLarge
+        spacing: Nheko.paddingLarge
+
+        Avatar {
+            url: room.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
+            displayName: room ? room.roomName : ""
+            height: 130
+            width: 130
+            Layout.alignment: Qt.AlignHCenter
+            enabled: false
+        }
+
+        MatrixText {
+            text: room ? room.roomName : ""
+            font.pixelSize: 24
+            Layout.alignment: Qt.AlignHCenter
+        }
+
+        MatrixText {
+            text: qsTr("%1 member(s)").arg(room ? room.roomMemberCount : 0)
+            Layout.alignment: Qt.AlignHCenter
+        }
+
+        ScrollView {
+            //Layout.maximumHeight: 75
+            Layout.alignment: Qt.AlignHCenter
+            width: parent.width
+
+            TextArea {
+                text: TimelineManager.escapeEmoji(room ? room.roomTopic : "")
+                wrapMode: TextEdit.WordWrap
+                textFormat: TextEdit.RichText
+                readOnly: true
+                background: null
+                selectByMouse: true
+                color: Nheko.colors.text
+                horizontalAlignment: TextEdit.AlignHCenter
+                onLinkActivated: Nheko.openLink(link)
+
+                CursorShape {
+                    anchors.fill: parent
+                    cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+                }
+
+            }
+
+        }
+
+        Item {
+            Layout.fillHeight: true
+        }
+
+    }
+
     NhekoDropArea {
         anchors.fill: parent
         roomid: room ? room.roomId() : ""
diff --git a/src/Cache.cpp b/src/Cache.cpp
index 8b1798d6ba4f57725e4d6d477dd087f8c487c361..144a2d9ab43a548801a751edeb758d9a61706515 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -1772,6 +1772,13 @@ Cache::relatedEvents(const std::string &room_id, const std::string &event_id)
         return related_ids;
 }
 
+size_t
+Cache::memberCount(const std::string &room_id)
+{
+        auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+        return getMembersDb(txn, room_id).size(txn);
+}
+
 QMap<QString, RoomInfo>
 Cache::roomInfo(bool withInvites)
 {
diff --git a/src/Cache_p.h b/src/Cache_p.h
index e35e78ec00846c1769742d0ed64c437a666bc617..cfcf9c9eb6358ca99a2edab4ddf2a7fbc4c589ac 100644
--- a/src/Cache_p.h
+++ b/src/Cache_p.h
@@ -101,6 +101,7 @@ public:
         std::vector<RoomMember> getMembers(const std::string &room_id,
                                            std::size_t startIndex = 0,
                                            std::size_t len        = 30);
+        size_t memberCount(const std::string &room_id);
 
         void saveState(const mtx::responses::Sync &res);
         bool isInitialized();
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 1ecb6cdfa18c2a48221c316cfcb121aab5b84e01..13919e6d8fa0f817a666a1fe9d0e2fd2bd3ed7e0 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -774,6 +774,7 @@ TimelineModel::syncState(const mtx::responses::State &s)
                 } else if (std::holds_alternative<StateEvent<state::Member>>(e)) {
                         emit roomAvatarUrlChanged();
                         emit roomNameChanged();
+                        emit roomMemberCountChanged();
                 }
         }
 }
@@ -830,6 +831,7 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
                 } else if (std::holds_alternative<StateEvent<state::Member>>(e)) {
                         emit roomAvatarUrlChanged();
                         emit roomNameChanged();
+                        emit roomMemberCountChanged();
                 }
         }
         updateLastMessage();
@@ -1935,3 +1937,9 @@ TimelineModel::roomTopic() const
                 return utils::replaceEmoji(utils::linkifyMessage(
                   QString::fromStdString(info[room_id_].topic).toHtmlEscaped()));
 }
+
+int
+TimelineModel::roomMemberCount() const
+{
+        return (int)cache::client()->memberCount(room_id_.toStdString());
+}
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 42aa136ffbc2bacb9b1be04f0da4b8d3dd518975..3392d4746f4e7b98b4d5e34e9e00acfb858a91cb 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -161,6 +161,7 @@ class TimelineModel : public QAbstractListModel
         Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
         Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged)
         Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged)
+        Q_PROPERTY(int roomMemberCount READ roomMemberCount NOTIFY roomMemberCountChanged)
         Q_PROPERTY(bool isSpace READ isSpace CONSTANT)
         Q_PROPERTY(InputBar *input READ input CONSTANT)
         Q_PROPERTY(Permissions *permissions READ permissions NOTIFY permissionsChanged)
@@ -264,6 +265,7 @@ public:
 
         DescInfo lastMessage() const { return lastMessage_; }
         bool isSpace() const { return isSpace_; }
+        int roomMemberCount() const;
 
 public slots:
         void setCurrentIndex(int index);
@@ -350,6 +352,7 @@ signals:
         void roomNameChanged();
         void roomTopicChanged();
         void roomAvatarUrlChanged();
+        void roomMemberCountChanged();
         void permissionsChanged();
         void forwardToRoom(mtx::events::collections::TimelineEvents *e, QString roomId);