diff --git a/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt b/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt
index ae378a0c73bb9c004bf64b3338ba358e714f1953..d1eec62ed527a02146b09e0e85346f2f14704555 100644
--- a/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt
@@ -4,7 +4,11 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.R
+import org.futo.circles.core.SingleEventLiveData
+import org.futo.circles.core.extensions.Response
+import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.extensions.launchBg
+import org.futo.circles.core.model.Circle
 import org.futo.circles.core.model.Gallery
 import org.futo.circles.core.model.GroupsSpace
 import org.futo.circles.core.model.MandatoryWorkspaceTask
@@ -13,6 +17,9 @@ import org.futo.circles.core.model.PeopleSpace
 import org.futo.circles.core.model.PhotosSpace
 import org.futo.circles.core.model.RootSpace
 import org.futo.circles.core.model.SharedCirclesSpace
+import org.futo.circles.core.model.TaskStatus
+import org.futo.circles.core.model.WorkspaceTask
+import org.futo.circles.core.workspace.data_source.ConfigureWorkspaceDataSource
 import javax.inject.Inject
 
 @HiltViewModel
@@ -22,38 +29,60 @@ class ConfigureWorkspaceViewModel @Inject constructor(
 
     val tasksLiveData = MutableLiveData(
         listOf(
-            MandatoryWorkspaceTask(RootSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(GroupsSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(PhotosSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(PeopleSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(SharedCirclesSpace(), R.string.camera, R.string.camera),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            ),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            ),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            ),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            )
+            MandatoryWorkspaceTask(RootSpace(), R.string.camera),
+            MandatoryWorkspaceTask(GroupsSpace(), R.string.camera),
+            MandatoryWorkspaceTask(PhotosSpace(), R.string.camera),
+            MandatoryWorkspaceTask(PeopleSpace(), R.string.camera),
+            MandatoryWorkspaceTask(SharedCirclesSpace(), R.string.camera),
+            OptionalWorkspaceTask(Gallery(nameId = R.string.photos), R.string.camera),
+            OptionalWorkspaceTask(Circle(nameId = R.string.friends), R.string.camera),
+            OptionalWorkspaceTask(Circle(nameId = R.string.family), R.string.camera),
+            OptionalWorkspaceTask(Circle(nameId = R.string.community), R.string.camera)
         )
     )
+    val workspaceResultLiveData = SingleEventLiveData<Response<Unit>>()
+
+    fun createWorkspace() = launchBg {
+        val tasks = tasksLiveData.value?.toMutableList() ?: mutableListOf()
+        tasks.forEachIndexed { i, item ->
+            (item as? OptionalWorkspaceTask)?.let { if (!it.isSelected) return@forEachIndexed }
+            if (item.status == TaskStatus.SUCCESS) return@forEachIndexed
+
+            updateTaskStatus(tasks, i, TaskStatus.RUNNING)
+            when (val result = createResult { workspaceDataSource.perform(item.room) }) {
+                is Response.Error -> {
+                    updateTaskStatus(tasks, i, TaskStatus.FAILED)
+                    workspaceResultLiveData.postValue(result)
+                    return@launchBg
+                }
 
-    suspend fun createWorkspace() {
-        launchBg {
+                is Response.Success -> updateTaskStatus(tasks, i, TaskStatus.SUCCESS)
+            }
+        }
+        workspaceResultLiveData.postValue(Response.Success(Unit))
+    }
 
+    fun onOptionalTaskSelectionChanged(optionalWorkspaceTask: OptionalWorkspaceTask) {
+        val newList = tasksLiveData.value?.toMutableList()?.apply {
+            val index = indexOf(optionalWorkspaceTask).takeIf { it != -1 } ?: return
+            add(index, optionalWorkspaceTask.copy(isSelected = !optionalWorkspaceTask.isSelected))
+            remove(optionalWorkspaceTask)
+        }
+        tasksLiveData.postValue(newList)
+    }
+
+    private fun updateTaskStatus(tasks: List<WorkspaceTask>, index: Int, status: TaskStatus) {
+        val task = tasks.getOrNull(index) ?: return
+        val newList = tasks.toMutableList().apply {
+            add(
+                index, when (task) {
+                    is MandatoryWorkspaceTask -> task.copy(status = status)
+                    is OptionalWorkspaceTask -> task.copy(status = status)
+                }
+            )
+            remove(task)
         }
+        tasksLiveData.postValue(newList)
     }
 
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt b/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt
index 00125bcc6e2e1d464ff6379a97da7949e4941e82..eb40b700542fedc874fc29623b47003b5db7adf8 100644
--- a/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt
@@ -2,8 +2,6 @@ package org.futo.circles.core.workspace.data_source
 
 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
@@ -14,9 +12,7 @@ class ConfigureWorkspaceDataSource @Inject constructor(
     private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource
 ) {
 
-    suspend fun perform(task: WorkspaceTask) {
-        if ((task as? OptionalWorkspaceTask)?.isSelected != true) return
-        val room = task.room
+    suspend fun perform(room: CirclesRoom) {
         val roomId = createRoomDataSource.createRoom(room)
         room.accountDataKey?.let { key ->
             spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId)
@@ -24,9 +20,7 @@ class ConfigureWorkspaceDataSource @Inject constructor(
         delay(CREATE_ROOM_DELAY)
     }
 
-    suspend fun validate(task: WorkspaceTask): Boolean {
-        if (task is OptionalWorkspaceTask) return true
-        val room = task.room
+    suspend fun validate(room: CirclesRoom): Boolean {
         val accountDataKey = room.accountDataKey ?: return false
         if (spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey) == null) {
             addRecordToAccountDataIfRoomExist(room)
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index b3e7fd2827a113a28282ea09b47cc186e8ebed48..4387e2c20e4870bac09f6f64ab4b9c05b1577c98 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -133,5 +133,9 @@
     <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>
+    <string name="friends">Friends</string>
+    <string name="family">Family</string>
+    <string name="community">Community</string>
+    <string name="retry">Retry</string>
 
 </resources>
\ No newline at end of file