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 f876fe84b1b51e83329a92d52e8c302d6e4b97a8..cc5b9ccbd7fc1a4e1e771ff76ab7f53219284484 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
@@ -79,7 +79,7 @@ class CirclesDataSource @Inject constructor(
         val sharedCircleSpaceId = sharedCircleDataSource.getSharedCirclesSpaceId()
         val ids = getJoinedRoomById(circlesSpaceId)?.roomSummary()?.spaceChildren
             ?.map { it.childRoomId }
-            ?.filter { it != sharedCircleSpaceId }
+            ?.filter { it != sharedCircleSpaceId && getJoinedRoomById(it) != null }
         return ids ?: emptyList()
     }
 
diff --git a/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt b/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt
index 66f853d2c27a720611e53b3ed36408876e21c867..08a4127f10c9f3c02cbd6ebfd7cef2b24ea26426 100644
--- a/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt
@@ -116,9 +116,6 @@ class HomeFragment : Fragment(R.layout.fragment_bottom_navigation), DeepLinkInte
     }
 
     private fun setupObservers() {
-        viewModel.inviteIntoSharedSpaceLiveData?.observeData(this) {
-            viewModel.autoAcceptInviteOnKnock(it)
-        }
         viewModel.mediaBackupSettingsLiveData?.observeData(this) {
             mediaBackupServiceManager.bindMediaServiceIfNeeded(requireContext(), it)
         }
diff --git a/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt b/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt
index a8fcde94838226bdd1158789548dc31a4f8951aa..8431a4e25201172b77a04a64ccd6571fd103c5aa 100644
--- a/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt
@@ -1,7 +1,6 @@
 package org.futo.circles.feature.home
 
 import androidx.lifecycle.ViewModel
-import androidx.lifecycle.map
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.auth.feature.workspace.data_source.ConfigureWorkspaceDataSource
@@ -11,14 +10,12 @@ 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.GROUP_TYPE
-import org.futo.circles.core.provider.MatrixSessionProvider
+import org.futo.circles.core.workspace.SharedCircleDataSource
 import org.futo.circles.feature.notifications.PushersManager
 import org.futo.circles.feature.notifications.ShortcutsHandler
 import org.futo.circles.gallery.feature.backup.RoomAccountDataSource
 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.model.RoomType
-import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
 import javax.inject.Inject
 
 @HiltViewModel
@@ -27,19 +24,16 @@ class HomeViewModel @Inject constructor(
     private val workspaceTasksProvider: WorkspaceTasksProvider,
     private val workspaceDataSource: ConfigureWorkspaceDataSource,
     roomAccountDataSource: RoomAccountDataSource,
-    shortcutsHandler: ShortcutsHandler
+    shortcutsHandler: ShortcutsHandler,
+    sharedCircleDataSource: SharedCircleDataSource
 ) : ViewModel() {
 
     val validateWorkspaceResultLiveData = SingleEventLiveData<Response<Unit>>()
     val mediaBackupSettingsLiveData = roomAccountDataSource.getMediaBackupSettingsLive()
-    val inviteIntoSharedSpaceLiveData = MatrixSessionProvider.currentSession?.roomService()
-        ?.getRoomSummariesLive(roomSummaryQueryParams {
-            excludeType = null
-            memberships = listOf(Membership.INVITE)
-        })?.map { it.filter { it.roomType == RoomType.SPACE }.map { it.roomId } }
 
     init {
         shortcutsHandler.observeRoomsAndBuildShortcuts(viewModelScope)
+        sharedCircleDataSource.observeAndAutoAcceptSharedSpaceInvites(viewModelScope)
         validateWorkspace()
     }
 
@@ -71,10 +65,4 @@ class HomeViewModel @Inject constructor(
         summary.spaceParents?.firstOrNull { it.roomSummary?.membership == Membership.JOIN }
             ?.roomSummary?.roomId
 
-
-    fun autoAcceptInviteOnKnock(roomIds: List<String>) {
-        MatrixSessionProvider.currentSession?.let { session ->
-            roomIds.forEach { launchBg { session.roomService().joinRoom(it) } }
-        }
-    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/people/UserOptionsDataSource.kt b/app/src/main/java/org/futo/circles/feature/people/UserOptionsDataSource.kt
index 4a234e39a5263b69f0e4ca52a5757633a228820f..b8e6a00c8c0fd5628adc878f9f922b9213abe607 100644
--- a/app/src/main/java/org/futo/circles/feature/people/UserOptionsDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/people/UserOptionsDataSource.kt
@@ -25,7 +25,6 @@ class UserOptionsDataSource @Inject constructor(
         sharedCircleDataSource.getSharedCircleFor(userId) != null
 
     suspend fun unFollowUser(userId: String): Response<Unit?> = createResult {
-        MatrixSessionProvider.currentSession?.roomService()
-            ?.leaveRoom(sharedCircleDataSource.getSharedCircleFor(userId)?.roomId ?: "")
+        sharedCircleDataSource.unfollowUsersSharedCircle(userId)
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/room/leave/LeaveRoomDataSource.kt b/core/src/main/java/org/futo/circles/core/room/leave/LeaveRoomDataSource.kt
index 12924c682eba811da14aa4749a92fd0c15ee7531..a2b608e109a8b20560cf16039df8b277d91bc306 100644
--- a/core/src/main/java/org/futo/circles/core/room/leave/LeaveRoomDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/room/leave/LeaveRoomDataSource.kt
@@ -29,6 +29,7 @@ class LeaveRoomDataSource @Inject constructor(
         createResult { session?.roomService()?.leaveRoom(roomId) }
 
     suspend fun deleteCircle() = createResult {
+        roomRelationsBuilder.removeFromAllParents(roomId)
         room?.roomSummary()?.spaceChildren?.forEach {
             roomRelationsBuilder.removeRelations(it.childRoomId, roomId)
         }
diff --git a/core/src/main/java/org/futo/circles/core/workspace/SharedCircleDataSource.kt b/core/src/main/java/org/futo/circles/core/workspace/SharedCircleDataSource.kt
index e7253a585757a203c1b2222b2524d549c2c060ff..0ed778a34f931bbc0bb80795c7e9d46711f6fe9b 100644
--- a/core/src/main/java/org/futo/circles/core/workspace/SharedCircleDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/workspace/SharedCircleDataSource.kt
@@ -1,12 +1,26 @@
 package org.futo.circles.core.workspace
 
+import android.os.Build
+import androidx.lifecycle.asFlow
+import androidx.lifecycle.map
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.catch
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.withContext
 import org.futo.circles.core.extensions.getRoomOwners
 import org.futo.circles.core.model.PROFILE_SPACE_ACCOUNT_DATA_KEY
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.core.room.RoomRelationsBuilder
+import org.futo.circles.core.utils.getJoinedRoomById
 import org.futo.circles.core.utils.getTimelineRoomFor
+import org.matrix.android.sdk.api.session.Session
 import org.matrix.android.sdk.api.session.getRoomSummary
 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.model.RoomType
 import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
 import javax.inject.Inject
@@ -19,6 +33,34 @@ class SharedCircleDataSource @Inject constructor(
     fun getSharedCirclesSpaceId() =
         spacesTreeAccountDataSource.getRoomIdByKey(PROFILE_SPACE_ACCOUNT_DATA_KEY)
 
+    suspend fun unfollowUsersSharedCircle(userId: String) {
+        val userSharedCircleId =
+            getSharedCircleFor(userId)?.roomId ?: throw IllegalArgumentException("User's profile not found")
+        val mySharedCircleId = getSharedCirclesSpaceId()
+            ?: throw IllegalArgumentException("Workspace configuration failure")
+
+        roomRelationsBuilder.removeRelations(userSharedCircleId, mySharedCircleId)
+        MatrixSessionProvider.getSessionOrThrow().roomService().leaveRoom(userSharedCircleId)
+    }
+
+    fun observeAndAutoAcceptSharedSpaceInvites(coroutineScope: CoroutineScope): Job {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return Job()
+        val session = MatrixSessionProvider.currentSession ?: return Job()
+        return session.roomService().getRoomSummariesLive(
+            roomSummaryQueryParams {
+                excludeType = null
+                memberships = listOf(Membership.INVITE)
+            }).map { it.filter { it.roomType == RoomType.SPACE }.map { it.roomId } }
+            .asFlow().onEach { roomsIds ->
+                withContext(Dispatchers.IO) {
+                    roomsIds.forEach { acceptSharedCircleInvite(session, it) }
+                }
+            }
+            .flowOn(Dispatchers.Default)
+            .catch { }
+            .launchIn(coroutineScope)
+    }
+
     suspend fun addToSharedCircles(timelineId: String) {
         getSharedCirclesSpaceId()?.let { roomRelationsBuilder.setRelations(timelineId, it) }
     }
@@ -27,11 +69,14 @@ class SharedCircleDataSource @Inject constructor(
         getSharedCirclesSpaceId()?.let { roomRelationsBuilder.removeRelations(timelineId, it) }
     }
 
-    fun getSharedCircleFor(userId: String) = MatrixSessionProvider.currentSession?.roomService()
-        ?.getRoomSummaries(roomSummaryQueryParams { excludeType = null })?.firstOrNull { summary ->
-            summary.roomType == RoomType.SPACE && summary.membership == Membership.JOIN &&
-                    getRoomOwners(summary.roomId).map { it.userId }.contains(userId)
-        }
+    fun getSharedCircleFor(userId: String): RoomSummary? {
+        val sharedCirclesSpaceId = getSharedCirclesSpaceId() ?: return null
+        val userSharedCircleId =
+            getJoinedRoomById(sharedCirclesSpaceId)?.roomSummary()?.spaceChildren?.firstOrNull { child ->
+                getRoomOwners(child.childRoomId).map { it.userId }.contains(userId)
+            }?.childRoomId ?: return null
+        return getJoinedRoomById(userSharedCircleId)?.roomSummary()
+    }
 
     fun getSharedCirclesTimelinesIds() = getSharedCirclesSpaceId()?.let {
         MatrixSessionProvider.currentSession?.getRoomSummary(it)?.spaceChildren?.map { it.childRoomId }
@@ -41,4 +86,10 @@ class SharedCircleDataSource @Inject constructor(
         val timelineId = getTimelineRoomFor(circleId)?.roomId
         return sharedCirclesTimelineIds.contains(timelineId)
     }
+
+    private suspend fun acceptSharedCircleInvite(session: Session, roomId: String) {
+        session.roomService().joinRoom(roomId)
+        val sharedCirclesSpaceId = getSharedCirclesSpaceId() ?: return
+        roomRelationsBuilder.setRelations(roomId, sharedCirclesSpaceId)
+    }
 }
\ No newline at end of file