diff --git a/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt b/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt
index f59a347c03400f87c1212dc1057a84ea6a570023..85d9f53d49571175a1214147ce61788ab26bc873 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt
@@ -1,5 +1,6 @@
 package org.futo.circles.feature.circles
 
+import android.util.Log
 import androidx.lifecycle.asFlow
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.combine
@@ -11,13 +12,13 @@ import org.futo.circles.core.model.CIRCLES_SPACE_ACCOUNT_DATA_KEY
 import org.futo.circles.core.model.TIMELINE_TYPE
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.core.utils.getJoinedRoomById
+import org.futo.circles.core.utils.getTimelinesLiveData
 import org.futo.circles.mapping.toJoinedCircleListItem
 import org.futo.circles.model.CircleInvitesNotificationListItem
 import org.futo.circles.model.CircleListItem
 import org.futo.circles.model.CirclesHeaderItem
 import org.matrix.android.sdk.api.session.room.model.Membership
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
-import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
 import javax.inject.Inject
 
 class CirclesDataSource @Inject constructor(
@@ -26,19 +27,16 @@ class CirclesDataSource @Inject constructor(
 ) {
 
     fun getCirclesFlow() = combine(
-        MatrixSessionProvider.getSessionOrThrow().roomService()
-            .getRoomSummariesLive(roomSummaryQueryParams { excludeType = null })
-            .asFlow(),
+        getTimelinesLiveData().asFlow(),
         MatrixSessionProvider.getSessionOrThrow().roomService().getChangeMembershipsLive().asFlow()
-    ) { roomSummaries, _ ->
-        withContext(Dispatchers.IO) { buildCirclesList(roomSummaries) }
+    ) { timelines, _ ->
+        withContext(Dispatchers.IO) { buildCirclesList(timelines) }
     }.distinctUntilChanged()
 
-    private fun buildCirclesList(list: List<RoomSummary>): List<CircleListItem> {
-        val invitesCount = list.filter { isInviteToCircleTimeline(it) }.size
+    private fun buildCirclesList(timelines: List<RoomSummary>): List<CircleListItem> {
+        val invitesCount = timelines.filter { it.membership == Membership.INVITE }.size
 
-        val joinedCirclesSpaceIds = getJoinedCirclesIds()
-        val joinedCircles = list.filter { isJoinedCircle(it, joinedCirclesSpaceIds) }
+        val joinedCircles = getJoinedCirclesIds().mapNotNull { getJoinedRoomById(it)?.roomSummary() }
 
         val sharedCirclesTimelinesIds = sharedCircleDataSource.getSharedCirclesTimelinesIds()
         val sharedCircles = joinedCircles.filter { joinedCircle ->
@@ -63,9 +61,6 @@ class CirclesDataSource @Inject constructor(
         return displayList
     }
 
-    fun isJoinedCircle(summary: RoomSummary, joinedCirclesIds: List<String>): Boolean =
-        joinedCirclesIds.contains(summary.roomId)
-
     fun getJoinedCirclesIds(): List<String> {
         val circlesSpaceId = spacesTreeAccountDataSource.getRoomIdByKey(
             CIRCLES_SPACE_ACCOUNT_DATA_KEY
diff --git a/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt b/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt
index 75922ab74b7ae7a83f3845123b55a76198f9af66..db72dff03630b1e9bc65106da9d04ab86dba967d 100644
--- a/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt
+++ b/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt
@@ -2,7 +2,9 @@ package org.futo.circles.core.utils
 
 import org.futo.circles.core.model.GALLERY_TYPE
 import org.futo.circles.core.model.GROUP_TYPE
+import org.futo.circles.core.model.TIMELINE_TYPE
 import org.futo.circles.core.provider.MatrixSessionProvider
+import org.matrix.android.sdk.api.query.RoomCategoryFilter
 import org.matrix.android.sdk.api.session.room.model.Membership
 import org.matrix.android.sdk.api.session.room.model.RoomType
 import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
@@ -10,6 +12,14 @@ import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
 const val roomType = "m.room"
 const val spaceType = RoomType.SPACE
 
+private val roomTypes = listOf(
+    roomType,
+    spaceType,
+    GALLERY_TYPE,
+    TIMELINE_TYPE,
+    GROUP_TYPE
+)
+
 private fun getRoomsLiveDataWithType(
     type: String,
     membershipFilter: List<Membership> = Membership.activeMemberships()
@@ -22,24 +32,27 @@ private fun getRoomsWithType(
 ) = MatrixSessionProvider.getSessionOrThrow().roomService()
     .getRoomSummaries(getCirclesRoomTypeFilter(type, membershipFilter))
 
-private fun getCirclesRoomTypeFilter(type: String, membershipFilter: List<Membership>) =
+private fun getCirclesRoomTypeFilter(type:String, membershipFilter: List<Membership>) =
     roomSummaryQueryParams {
         memberships = membershipFilter
         includeType = listOf(type)
-        excludeType = listOf(roomType, spaceType)
+        excludeType = roomTypes - type
+        roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS
     }
 
 fun getGroupsLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) =
     getRoomsLiveDataWithType(GROUP_TYPE, membershipFilter)
 
-fun getGroups(membershipFilter: List<Membership> = Membership.activeMemberships()) =
-    getRoomsWithType(GROUP_TYPE, membershipFilter)
-
 fun getGalleriesLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) =
     getRoomsLiveDataWithType(GALLERY_TYPE, membershipFilter)
 
 fun getGalleries(membershipFilter: List<Membership> = Membership.activeMemberships()) =
     getRoomsWithType(GALLERY_TYPE, membershipFilter)
 
+fun getSpacesLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) =
+    getRoomsLiveDataWithType(spaceType, membershipFilter)
+
+fun getTimelinesLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) =
+    getRoomsLiveDataWithType(TIMELINE_TYPE, membershipFilter)