diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt
index dd7d02755cfef783ea7868668ece6b31ee396fcc..c485c3b2e88188ad0e06e4588fe041644c21d1a6 100644
--- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt
@@ -8,40 +8,35 @@ import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.update
-import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.extensions.getOrThrow
 import org.futo.circles.core.model.toFilterTimelinesListItem
 import org.futo.circles.core.provider.MatrixSessionProvider
-import org.futo.circles.core.utils.getTimelineRoomFor
 import org.matrix.android.sdk.api.session.getRoom
 import javax.inject.Inject
 
 class FilterTimelinesDataSource @Inject constructor(
-    savedStateHandle: SavedStateHandle
+    savedStateHandle: SavedStateHandle,
+    private val circleFilterAccountDataManager: CircleFilterAccountDataManager
 ) {
 
     private val circleId: String = savedStateHandle.getOrThrow("circleId")
 
     private val session = MatrixSessionProvider.getSessionOrThrow()
     val circleSummaryLiveData = session.roomService().getRoomSummaryLive(circleId)
-    private val selectedTimelinesIds = MutableStateFlow(getCircleFilter())
+    private val selectedTimelinesIds =
+        MutableStateFlow(circleFilterAccountDataManager.getCircleFilter(circleId))
 
     val timelinesLiveData = combine(
         circleSummaryLiveData.asFlow(),
         selectedTimelinesIds
     ) { _, selectedIds ->
-        getAllTimelinesIds().mapNotNull {
+        circleFilterAccountDataManager.getAllTimelinesIds(circleId).mapNotNull {
             session.getRoom(it)?.roomSummary()?.toFilterTimelinesListItem(selectedIds.contains(it))
         }
     }.flowOn(Dispatchers.IO).asLiveData()
 
-    suspend fun applyFilter() = createResult {
-        session.getRoom(circleId)?.roomAccountDataService()
-            ?.updateAccountData(
-                CIRCLE_FILTER_EVENT_TYPE,
-                mapOf(TIMELINES_KEY to selectedTimelinesIds.value)
-            )
-    }
+    suspend fun applyFilter() =
+        circleFilterAccountDataManager.updateFilter(circleId, selectedTimelinesIds.value)
 
     fun toggleItemSelected(roomId: String) {
         val isItemSelected = selectedTimelinesIds.value.contains(roomId)
@@ -54,30 +49,7 @@ class FilterTimelinesDataSource @Inject constructor(
     }
 
     fun selectAllTimelines() {
-        selectedTimelinesIds.update { getAllTimelinesIds() }
-    }
-
-    private fun getCircleFilter(): Set<String> {
-        val content = session.getRoom(circleId)?.roomAccountDataService()
-            ?.getAccountDataEvent(CIRCLE_FILTER_EVENT_TYPE)?.content ?: return getAllTimelinesIds()
-        return (content[TIMELINES_KEY] as? List<*>)?.map { it.toString() }?.toSet()
-            ?: getAllTimelinesIds()
+        selectedTimelinesIds.update { circleFilterAccountDataManager.getAllTimelinesIds(circleId) }
     }
 
-    private fun getAllTimelinesIds(): Set<String> {
-        val children = session.getRoom(circleId)?.roomSummary()?.spaceChildren ?: emptyList()
-        val myTimelineId = getTimelineRoomFor(circleId)?.roomId
-        return children.mapNotNull {
-            val timelineSummary =
-                session.getRoom(it.childRoomId)?.roomSummary()?.takeIf { summary ->
-                    summary.membership.isActive() && summary.roomId != myTimelineId
-                }
-            timelineSummary?.roomId
-        }.toSet()
-    }
-
-    companion object {
-        private const val CIRCLE_FILTER_EVENT_TYPE = "m.circle.filter"
-        private const val TIMELINES_KEY = "timelines"
-    }
 }
\ No newline at end of file