diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index f1ef688c7117a8e49e08bbfaf41a7ebb1f0ee74d..5ba1dcdc541d1cc803e8f6e7eb160869ca4c9f6f 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -69,7 +69,6 @@ UserSettings::load(std::optional<QString> profile)
     hasDesktopNotifications_ = settings.value("user/desktop_notifications", true).toBool();
     hasAlertOnNotification_  = settings.value("user/alert_on_notification", false).toBool();
     groupView_               = settings.value("user/group_view", true).toBool();
-    hiddenTags_              = settings.value("user/hidden_tags", QStringList{}).toStringList();
     buttonsInTimeline_       = settings.value("user/timeline/buttons", true).toBool();
     timelineMaxWidth_        = settings.value("user/timeline/max_width", 0).toInt();
     messageHoverHighlight_ =
@@ -117,6 +116,12 @@ UserSettings::load(std::optional<QString> profile)
     homeserver_    = settings.value(prefix + "auth/home_server", "").toString();
     userId_        = settings.value(prefix + "auth/user_id", "").toString();
     deviceId_      = settings.value(prefix + "auth/device_id", "").toString();
+    hiddenTags_    = settings.value(prefix + "user/hidden_tags", QStringList{}).toStringList();
+
+    collapsedSpaces_.clear();
+    for (const auto &e :
+         settings.value(prefix + "user/collapsed_spaces", QList<QVariant>{}).toList())
+        collapsedSpaces_.push_back(e.toStringList());
 
     shareKeysWithTrustedUsers_ =
       settings.value(prefix + "user/automatically_share_keys_with_trusted_users", false).toBool();
@@ -195,6 +200,13 @@ UserSettings::setHiddenTags(QStringList hiddenTags)
     save();
 }
 
+void
+UserSettings::setCollapsedSpaces(QList<QStringList> spaces)
+{
+    collapsedSpaces_ = spaces;
+    save();
+}
+
 void
 UserSettings::setMarkdown(bool state)
 {
@@ -658,7 +670,6 @@ UserSettings::save()
     settings.setValue("minor_events", sortByImportance_);
     settings.setValue("read_receipts", readReceipts_);
     settings.setValue("group_view", groupView_);
-    settings.setValue("hidden_tags", hiddenTags_);
     settings.setValue("markdown_enabled", markdown_);
     settings.setValue("animate_images_on_hover", animateImagesOnHover_);
     settings.setValue("desktop_notifications", hasDesktopNotifications_);
@@ -695,6 +706,12 @@ UserSettings::save()
     settings.setValue(prefix + "user/only_share_keys_with_verified_users",
                       onlyShareKeysWithVerifiedUsers_);
     settings.setValue(prefix + "user/online_key_backup", useOnlineKeyBackup_);
+    settings.setValue(prefix + "user/hidden_tags", hiddenTags_);
+
+    QVariantList v;
+    for (const auto &e : collapsedSpaces_)
+        v.push_back(e);
+    settings.setValue(prefix + "user/collapsed_spaces", v);
 
     settings.setValue("disable_certificate_validation", disableCertificateValidation_);
 
diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index 31e28db25f68eaef3156db29f0851821fd362dfa..c47844cb41609e9c01fade941349867817ed317d 100644
--- a/src/UserSettingsPage.h
+++ b/src/UserSettingsPage.h
@@ -172,6 +172,7 @@ public:
     void setDisableCertificateValidation(bool disabled);
     void setHiddenTags(QStringList hiddenTags);
     void setUseIdenticon(bool state);
+    void setCollapsedSpaces(QList<QStringList> spaces);
 
     QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; }
     bool messageHoverHighlight() const { return messageHoverHighlight_; }
@@ -228,6 +229,7 @@ public:
     bool disableCertificateValidation() const { return disableCertificateValidation_; }
     QStringList hiddenTags() const { return hiddenTags_; }
     bool useIdenticon() const { return useIdenticon_ && JdenticonProvider::isAvailable(); }
+    QList<QStringList> collapsedSpaces() const { return collapsedSpaces_; }
 
 signals:
     void groupViewStateChanged(bool state);
@@ -329,6 +331,7 @@ private:
     QString deviceId_;
     QString homeserver_;
     QStringList hiddenTags_;
+    QList<QStringList> collapsedSpaces_;
     bool useIdenticon_;
 
     QSettings settings;
diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp
index fb8aac24c625f16bd5c14fa2bdfd30e14684db2e..3c28463e6461cb724703117e8bee7dc5ad26990f 100644
--- a/src/timeline/CommunitiesModel.cpp
+++ b/src/timeline/CommunitiesModel.cpp
@@ -40,6 +40,7 @@ CommunitiesModel::setData(const QModelIndex &index, const QVariant &value, int r
 
         const auto cindex = spaceOrder_.lastChild(index.row() - 2);
         emit dataChanged(index, this->index(cindex + 2), {Collapsed, Qt::DisplayRole});
+        spaceOrder_.storeCollapsed();
         return true;
     } else
         return false;
@@ -276,6 +277,7 @@ CommunitiesModel::initializeSidebar()
         tags_.push_back(QString::fromStdString(t));
 
     hiddentTagIds_ = UserSettings::instance()->hiddenTags();
+    spaceOrder_.restoreCollapsed();
     endResetModel();
 
     emit tagsChanged();
@@ -283,6 +285,55 @@ CommunitiesModel::initializeSidebar()
     emit containsSubspacesChanged();
 }
 
+void
+CommunitiesModel::FlatTree::storeCollapsed()
+{
+    QList<QStringList> elements;
+
+    int depth = -1;
+
+    QStringList current;
+
+    for (const auto &e : tree) {
+        if (e.depth > depth) {
+            current.push_back(e.name);
+        } else if (e.depth == depth) {
+            current.back() = e.name;
+        } else {
+            current.pop_back();
+            current.back() = e.name;
+        }
+
+        if (e.collapsed)
+            elements.push_back(current);
+    }
+
+    UserSettings::instance()->setCollapsedSpaces(elements);
+}
+void
+CommunitiesModel::FlatTree::restoreCollapsed()
+{
+    QList<QStringList> elements = UserSettings::instance()->collapsedSpaces();
+
+    int depth = -1;
+
+    QStringList current;
+
+    for (auto &e : tree) {
+        if (e.depth > depth) {
+            current.push_back(e.name);
+        } else if (e.depth == depth) {
+            current.back() = e.name;
+        } else {
+            current.pop_back();
+            current.back() = e.name;
+        }
+
+        if (elements.contains(current))
+            e.collapsed = true;
+    }
+}
+
 void
 CommunitiesModel::clear()
 {
diff --git a/src/timeline/CommunitiesModel.h b/src/timeline/CommunitiesModel.h
index 5191b239c6ed382b07e0a19d89436317e7e31ad8..0cba71047085c54703c90eb9bf97e89340f06c41 100644
--- a/src/timeline/CommunitiesModel.h
+++ b/src/timeline/CommunitiesModel.h
@@ -92,6 +92,9 @@ public:
                     break;
             return i;
         }
+
+        void storeCollapsed();
+        void restoreCollapsed();
     };
 
     CommunitiesModel(QObject *parent = nullptr);