diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 22acdeb3b65a81686e290da0b43537a4b0193b6e..151d8b784ba58f001692a6f994593e89df969cc1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -30,8 +30,6 @@
     <string name="circle_name">Circle name</string>
     <string name="group_topic_optional">Group topic (optional)</string>
     <string name="group_topic">Group topic</string>
-    <string name="setup_circles">Setup Circles</string>
-    <string name="circle_encryption_warning">NOTE: Circle name and cover image are not encrypted</string>
     <string name="friends">Friends</string>
     <string name="family">Family</string>
     <string name="community">Community</string>
@@ -240,12 +238,6 @@
         <item>@string/other_prohibited_content</item>
     </string-array>
 
-    <string-array name="setup_circles_list">
-        <item>@string/friends</item>
-        <item>@string/family</item>
-        <item>@string/community</item>
-    </string-array>
-
     <plurals name="notification_compat_summary_line_for_room">
         <item quantity="one">%1$s: %2$d message</item>
         <item quantity="other">%1$s: %2$d messages</item>
diff --git a/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceDataSource.kt b/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceDataSource.kt
deleted file mode 100644
index b669bf8042c688934ad075d80d150ad090d9e906..0000000000000000000000000000000000000000
--- a/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceDataSource.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.futo.circles.core.workspace
-
-import kotlinx.coroutines.delay
-import org.futo.circles.core.model.CirclesRoom
-import org.futo.circles.core.model.OptionalWorkspaceTask
-import org.futo.circles.core.model.WorkspaceTask
-import org.futo.circles.core.room.CreateRoomDataSource
-import org.futo.circles.core.utils.getJoinedRoomById
-import org.futo.circles.core.utils.getJoinedRoomIdByTag
-import javax.inject.Inject
-
-class ConfigureWorkspaceDataSource @Inject constructor(
-    private val createRoomDataSource: CreateRoomDataSource,
-    private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource
-) {
-
-    suspend fun perform(task: WorkspaceTask) {
-        if ((task as? OptionalWorkspaceTask)?.isSelected != true) return
-        val room = task.room
-        val roomId = createRoomDataSource.createRoom(room)
-        room.accountDataKey?.let { key ->
-            spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId)
-        }
-        delay(CREATE_ROOM_DELAY)
-    }
-
-    suspend fun validate(task: WorkspaceTask): Boolean {
-        if (task is OptionalWorkspaceTask) return true
-        val room = task.room
-        val accountDataKey = room.accountDataKey ?: return false
-        if (spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey) == null) {
-            addRecordToAccountDataIfRoomExist(room)
-        }
-        return getJoinedRoomById(
-            spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey) ?: ""
-        ) != null
-    }
-
-    private suspend fun addRecordToAccountDataIfRoomExist(room: CirclesRoom) {
-        val tag = room.tag ?: return
-        val key = room.accountDataKey ?: return
-        val roomId = getJoinedRoomIdByTag(tag, true) ?: return
-        spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId)
-    }
-
-    private companion object {
-        private const val CREATE_ROOM_DELAY = 1000L
-    }
-
-}
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/workspace/SpacesTreeAccountDataSource.kt b/core/src/main/java/org/futo/circles/core/workspace/SpacesTreeAccountDataSource.kt
deleted file mode 100644
index 0c2a293372fba462edc82a0d528a9b7ef3256779..0000000000000000000000000000000000000000
--- a/core/src/main/java/org/futo/circles/core/workspace/SpacesTreeAccountDataSource.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.futo.circles.core.workspace
-
-import org.futo.circles.core.provider.MatrixSessionProvider
-import javax.inject.Inject
-
-class SpacesTreeAccountDataSource @Inject constructor() {
-
-    fun getSpacesTreeConfig() =
-        MatrixSessionProvider.currentSession?.accountDataService()
-            ?.getUserAccountDataEvent(SPACES_CONFIG_KEY)?.content ?: emptyMap()
-
-    suspend fun updateSpacesConfigAccountData(key: String, roomId: String) {
-        val currentConfig = getSpacesTreeConfig().toMutableMap()
-        currentConfig[key] = roomId
-        saveSpacesTreeConfig(currentConfig)
-    }
-
-    fun getRoomIdByKey(key: String) = getSpacesTreeConfig()[key]?.toString()
-
-    private suspend fun saveSpacesTreeConfig(configMap: Map<String, Any>) {
-        MatrixSessionProvider.getSessionOrThrow().accountDataService()
-            .updateUserAccountData(SPACES_CONFIG_KEY, configMap)
-    }
-
-    companion object {
-        private const val SPACES_CONFIG_KEY = "org.futo.circles.config"
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/workspace/list/WorkspaceTaskViewHolder.kt b/core/src/main/java/org/futo/circles/core/workspace/list/WorkspaceTaskViewHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..436cdc881621d6c39cf55193adf6d61c20278335
--- /dev/null
+++ b/core/src/main/java/org/futo/circles/core/workspace/list/WorkspaceTaskViewHolder.kt
@@ -0,0 +1,97 @@
+package org.futo.circles.core.workspace.list
+
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.ProgressBar
+import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.RecyclerView
+import org.futo.circles.core.R
+import org.futo.circles.core.databinding.ListItemMandatoryWorkspaceTaskBinding
+import org.futo.circles.core.databinding.ListItemOptionalWorkspaceTaskBinding
+import org.futo.circles.core.extensions.gone
+import org.futo.circles.core.extensions.onClick
+import org.futo.circles.core.extensions.visible
+import org.futo.circles.core.list.ViewBindingHolder
+import org.futo.circles.core.list.context
+import org.futo.circles.core.model.OptionalWorkspaceTask
+import org.futo.circles.core.model.TaskStatus
+import org.futo.circles.core.model.WorkspaceTask
+
+
+abstract class WorkspaceTaskViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+    abstract fun bind(data: WorkspaceTask)
+
+    protected fun bindStatus(status: TaskStatus, ivStatus: ImageView, vTaskProgress: ProgressBar) {
+        when (status) {
+            TaskStatus.RUNNING -> {
+                ivStatus.gone()
+                vTaskProgress.visible()
+            }
+
+            TaskStatus.IDLE -> {
+                ivStatus.gone()
+                vTaskProgress.gone()
+            }
+
+            else -> {
+                vTaskProgress.gone()
+                ivStatus.apply {
+                    visible()
+                    setImageResource(
+                        if (status == TaskStatus.FAILED) R.drawable.ic_error
+                        else R.drawable.ic_check_circle
+                    )
+                    setColorFilter(
+                        ContextCompat.getColor(
+                            context,
+                            if (status == TaskStatus.FAILED) R.color.red
+                            else R.color.blue
+                        )
+                    )
+                }
+            }
+        }
+    }
+
+}
+
+class MandatoryWorkspaceTaskViewHolder(
+    parent: ViewGroup,
+) : WorkspaceTaskViewHolder(inflate(parent, ListItemMandatoryWorkspaceTaskBinding::inflate)) {
+
+    private companion object : ViewBindingHolder
+
+    private val binding = baseBinding as ListItemMandatoryWorkspaceTaskBinding
+
+    override fun bind(data: WorkspaceTask) {
+        with(binding) {
+            tvName.text = context.getString(data.titleResId)
+            tvMessage.text = context.getString(data.descriptionResId)
+            bindStatus(data.status, ivTaskStatus, taskProgress)
+        }
+    }
+}
+
+class OptionalWorkspaceTaskViewHolder(
+    parent: ViewGroup,
+    onItemClicked: (Int) -> Unit
+) : WorkspaceTaskViewHolder(inflate(parent, ListItemOptionalWorkspaceTaskBinding::inflate)) {
+
+    private companion object : ViewBindingHolder
+
+    private val binding = baseBinding as ListItemOptionalWorkspaceTaskBinding
+
+    init {
+        onClick(binding.rootItem) { onItemClicked(it) }
+    }
+
+    override fun bind(data: WorkspaceTask) {
+        with(binding.lTask) {
+            tvName.text = context.getString(data.titleResId)
+            tvMessage.text = context.getString(data.descriptionResId)
+            bindStatus(data.status, ivTaskStatus, taskProgress)
+        }
+        binding.taskCheck.isChecked = (data as? OptionalWorkspaceTask)?.isSelected ?: false
+    }
+}
\ No newline at end of file
diff --git a/core/src/main/res/layout/list_item_mandatory_workspace_task.xml b/core/src/main/res/layout/list_item_mandatory_workspace_task.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b6735ecb3112056eb926b9b1fb09de8f5ab1fb9
--- /dev/null
+++ b/core/src/main/res/layout/list_item_mandatory_workspace_task.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/lRoot"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingHorizontal="8dp"
+    android:paddingVertical="4dp">
+
+
+    <TextView
+        android:id="@+id/tvName"
+        style="@style/body"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginEnd="36dp"
+        android:ellipsize="end"
+        android:lines="1"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="Android01" />
+
+    <TextView
+        android:id="@+id/tvMessage"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginEnd="36dp"
+        android:ellipsize="end"
+        android:maxLines="4"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tvName"
+        tools:text="Android01" />
+
+    <ProgressBar
+        android:id="@+id/taskProgress"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        app:layout_constraintBottom_toBottomOf="@id/tvMessage"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/ivTaskStatus"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_check_circle"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@id/tvMessage"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:tint="@color/blue"
+        tools:visibility="visible" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/core/src/main/res/layout/list_item_optional_workspace_task.xml b/core/src/main/res/layout/list_item_optional_workspace_task.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ca9ddc308d422d8205c6e6b4bb6ba28cb60522a2
--- /dev/null
+++ b/core/src/main/res/layout/list_item_optional_workspace_task.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/rootItem"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?selectableItemBackground"
+    android:clickable="true"
+    android:focusable="true">
+
+
+    <com.google.android.material.checkbox.MaterialCheckBox
+        android:id="@+id/taskCheck"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:clickable="false"
+        android:focusable="false"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+    <include
+        android:id="@+id/lTask"
+        layout="@layout/list_item_mandatory_workspace_task"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/taskCheck" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 64169c1964d759b5eac649afb4cd8b52c695972e..b3e7fd2827a113a28282ea09b47cc186e8ebed48 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -131,5 +131,7 @@
     <string name="decline">Decline</string>
     <string name="requested_to_join_format">%s requested to join</string>
     <string name="invited_by_format">Invited by %s</string>
+    <string name="circle_encryption_warning">NOTE: Circle name and cover image are not encrypted</string>
+    <string name="create">Create</string>
 
 </resources>
\ No newline at end of file
diff --git a/gallery/src/main/res/values/strings.xml b/gallery/src/main/res/values/strings.xml
index 878656c6afa528bb23c360911e1bbf3636367889..62b06e9f7ca3c8959c81263700732f694ef1567b 100644
--- a/gallery/src/main/res/values/strings.xml
+++ b/gallery/src/main/res/values/strings.xml
@@ -17,7 +17,6 @@
     <string name="gallery_name">Gallery name</string>
     <string name="gallery_encryption_warning">NOTE: Gallery name and cover image are not encrypted</string>
     <string name="create_new_gallery">Create new gallery</string>
-    <string name="create">Create</string>
     <string name="photos_empty_message">Create your first Gallery</string>
 
 </resources>
\ No newline at end of file