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 df94f0842c0ebfe548d16bc5d38fb560dfcc1018..e8bfab5106bafc4204b5ce4029805a293601c15a 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
@@ -2,6 +2,7 @@ package org.futo.circles.core.feature.circles.filter
 
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.asFlow
+import androidx.lifecycle.asLiveData
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.combine
@@ -9,7 +10,7 @@ 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.toCircleFilterListItem
+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
@@ -34,9 +35,9 @@ class FilterTimelinesDataSource @Inject constructor(
         children.mapNotNull {
             session.getRoom(it.childRoomId)?.roomSummary()?.takeIf { summary ->
                 summary.membership.isActive() && summary.roomId != myTimelineId
-            }?.toCircleFilterListItem(isTimelineSelected(selectedIds, it.childRoomId))
+            }?.toFilterTimelinesListItem(isTimelineSelected(selectedIds, it.childRoomId))
         }
-    }.flowOn(Dispatchers.IO)
+    }.flowOn(Dispatchers.IO).asLiveData()
 
     suspend fun applyFilter() = createResult {
         session.getRoom(circleId)?.roomAccountDataService()
@@ -56,6 +57,11 @@ class FilterTimelinesDataSource @Inject constructor(
         }
     }
 
+    fun selectAllTimelines() {
+        val ids = timelinesLiveData.value?.map { it.id }?.toSet() ?: emptySet()
+        selectedTimelinesIds.update { ids }
+    }
+
     private fun isTimelineSelected(selectedIds: Set<String>, roomId: String): Boolean =
         if (selectedIds.isEmpty()) true
         else selectedIds.contains(roomId)
diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt
index 6cb18bda06608510a2be8f4ee3d8f2219ef521ef..8c01da7d97c4644fd338395581b8f68d084fc617 100644
--- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt
@@ -4,12 +4,16 @@ import android.os.Bundle
 import android.view.View
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.DividerItemDecoration
 import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.core.R
 import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
 import org.futo.circles.core.base.fragment.HasLoadingState
 import org.futo.circles.core.databinding.DialogFragmentFilterTimelineBinding
 import org.futo.circles.core.extensions.observeData
+import org.futo.circles.core.extensions.observeResponse
+import org.futo.circles.core.extensions.showSuccess
+import org.futo.circles.core.feature.circles.filter.list.FilterTimelinesAdapter
 import org.futo.circles.core.mapping.nameOrId
 
 
@@ -24,6 +28,12 @@ class FilterTimelinesDialogFragment :
         getBinding() as DialogFragmentFilterTimelineBinding
     }
 
+    private val filterTimelinesAdapter by lazy {
+        FilterTimelinesAdapter(
+            onItemSelected = { id -> viewModel.toggleItemSelected(id) }
+        )
+    }
+
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         setupViews()
@@ -31,7 +41,17 @@ class FilterTimelinesDialogFragment :
     }
 
     private fun setupViews() {
-
+        with(binding) {
+            btnSave.setOnClickListener {
+                startLoading(btnSave)
+                viewModel.saveFilter()
+            }
+            btnSelectAll.setOnClickListener { viewModel.selectAllItems() }
+            rvTimelines.apply {
+                addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
+                adapter = filterTimelinesAdapter
+            }
+        }
     }
 
     private fun setupObservers() {
@@ -41,6 +61,14 @@ class FilterTimelinesDialogFragment :
                     getString(R.string.select_timelines_format, info.nameOrId())
             }
         }
+        viewModel.timelinesLiveData.observeData(this) {
+            filterTimelinesAdapter.submitList(it)
+        }
+        viewModel.updateFilterResultLiveData.observeResponse(this,
+            success = {
+                showSuccess(getString(R.string.updated))
+                dismiss()
+            })
     }
 
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt
index c5c29b9ef1dd4bed6602498fe658bf026aed4c54..b1aefc52a6c37e00ad3dda26c913c70911172647 100644
--- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt
@@ -27,4 +27,8 @@ class FilterTimelinesViewModel @Inject constructor(
         dataSource.toggleItemSelected(id)
     }
 
+    fun selectAllItems() {
+        dataSource.selectAllTimelines()
+    }
+
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesAdapter.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ec3560d135bca6e413912c31452daa762bed28f2
--- /dev/null
+++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesAdapter.kt
@@ -0,0 +1,23 @@
+package org.futo.circles.core.feature.circles.filter.list
+
+import android.view.ViewGroup
+import org.futo.circles.core.base.list.BaseRvAdapter
+import org.futo.circles.core.model.FilterTimelinesListItem
+
+class FilterTimelinesAdapter(
+    private val onItemSelected: (String) -> Unit
+) : BaseRvAdapter<FilterTimelinesListItem, FilterTimelinesViewHolder>(DefaultIdEntityCallback()) {
+
+    override fun onCreateViewHolder(
+        parent: ViewGroup,
+        viewType: Int
+    ): FilterTimelinesViewHolder = FilterTimelinesViewHolder(
+        parent = parent,
+        onItemClicked = { position -> onItemSelected(getItem(position).id) }
+    )
+
+    override fun onBindViewHolder(holder: FilterTimelinesViewHolder, position: Int) {
+        holder.bind(getItem(position))
+    }
+
+}
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/model/CircleFilterListItem.kt b/core/src/main/java/org/futo/circles/core/model/FilterTimelinesListItem.kt
similarity index 80%
rename from core/src/main/java/org/futo/circles/core/model/CircleFilterListItem.kt
rename to core/src/main/java/org/futo/circles/core/model/FilterTimelinesListItem.kt
index 637ef8fa1bb688b16103abe5b8df306b295b04b1..ba5b0b24c0c263fe8141f4d1dfcc33d2a640d23a 100644
--- a/core/src/main/java/org/futo/circles/core/model/CircleFilterListItem.kt
+++ b/core/src/main/java/org/futo/circles/core/model/FilterTimelinesListItem.kt
@@ -5,7 +5,7 @@ import org.futo.circles.core.extensions.getRoomOwner
 import org.futo.circles.core.mapping.nameOrId
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
 
-data class CircleFilterListItem(
+data class FilterTimelinesListItem(
     override val id: String,
     val name: String,
     val ownerName: String,
@@ -13,7 +13,7 @@ data class CircleFilterListItem(
     val isSelected: Boolean
 ) : IdEntity<String>
 
-fun RoomSummary.toCircleFilterListItem(isSelected: Boolean = true) = CircleFilterListItem(
+fun RoomSummary.toFilterTimelinesListItem(isSelected: Boolean = true) = FilterTimelinesListItem(
     id = roomId,
     name = nameOrId(),
     ownerName = getRoomOwner(roomId)?.displayName ?: "",
diff --git a/core/src/main/res/layout/dialog_fragment_filter_timeline.xml b/core/src/main/res/layout/dialog_fragment_filter_timeline.xml
index deed8c8e1383b6d5d1c615f72be5ba0a43df0afa..0a24f4d0f77ab839b3a3e7693f822e19e9d3f5c7 100644
--- a/core/src/main/res/layout/dialog_fragment_filter_timeline.xml
+++ b/core/src/main/res/layout/dialog_fragment_filter_timeline.xml
@@ -58,7 +58,7 @@
 
 
     <org.futo.circles.core.view.LoadingRecyclerView
-        android:id="@+id/rvUsers"
+        android:id="@+id/rvTimelines"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginTop="8dp"