diff --git a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt
index bc3692c51..4406f7511 100644
--- a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt
+++ b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt
@@ -338,8 +338,8 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
     override fun newFriend(bot: Bot, friendInfo: FriendInfo): FriendImpl {
         return FriendImpl(
             bot.asQQAndroidBot(),
-            bot.coroutineContext + SupervisorJob(bot.supervisorJob),
-            friendInfo
+            bot.coroutineContext,
+            friendInfo.impl(),
         )
     }
 
@@ -347,8 +347,8 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
     override fun newStranger(bot: Bot, strangerInfo: StrangerInfo): StrangerImpl {
         return StrangerImpl(
             bot.asQQAndroidBot(),
-            bot.coroutineContext + SupervisorJob(bot.supervisorJob),
-            strangerInfo
+            bot.coroutineContext,
+            strangerInfo.impl(),
         )
     }
 
diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt
index 76eef94d6..2440a0a9e 100644
--- a/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt
@@ -9,15 +9,14 @@
 
 package net.mamoe.mirai.internal.contact
 
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.SupervisorJob
 import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.internal.QQAndroidBot
+import net.mamoe.mirai.utils.childScopeContext
 import kotlin.coroutines.CoroutineContext
 
 internal abstract class AbstractContact(
     final override val bot: QQAndroidBot,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
 ) : Contact {
-    final override val coroutineContext: CoroutineContext = coroutineContext + SupervisorJob(coroutineContext[Job])
+    final override val coroutineContext: CoroutineContext = parentCoroutineContext.childScopeContext()
 }
\ No newline at end of file
diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt
index 17bf99da2..0e08270ef 100644
--- a/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt
@@ -18,9 +18,9 @@ import kotlin.coroutines.CoroutineContext
 
 internal abstract class AbstractMember(
     final override val group: GroupImpl,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
     memberInfo: MemberInfo,
-) : AbstractUser(group.bot, coroutineContext, memberInfo), Member {
+) : AbstractUser(group.bot, parentCoroutineContext, memberInfo), Member {
     final override val info: MemberInfoImpl = memberInfo.cast()
 
     override val nameCard: String get() = info.nameCard
diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt
index bc9222711..41874e0fe 100644
--- a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt
@@ -41,9 +41,10 @@ internal val User.info: UserInfo? get() = this.castOrNull<AbstractUser>()?.info
 
 internal abstract class AbstractUser(
     bot: QQAndroidBot,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
     userInfo: UserInfo,
-) : User, AbstractContact(bot, coroutineContext) {
+) : User, AbstractContact(bot, parentCoroutineContext) {
+
     final override val id: Long = userInfo.uin
     final override var nick: String = userInfo.nick
     final override val remark: String = userInfo.remark
diff --git a/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt b/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt
index a3dcb35e5..abef0d842 100644
--- a/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt
@@ -19,9 +19,9 @@ import kotlin.coroutines.CoroutineContext
 
 internal class AnonymousMemberImpl(
     group: GroupImpl,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
     memberInfo: MemberInfo,
-) : AnonymousMember, AbstractMember(group, coroutineContext, memberInfo) {
+) : AnonymousMember, AbstractMember(group, parentCoroutineContext, memberInfo) {
     init {
         requireNotNull(memberInfo.anonymousId) { "anonymousId must not be null" }
     }
diff --git a/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt b/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt
index d0d80a0ba..35cf93d25 100644
--- a/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt
@@ -63,13 +63,12 @@ internal inline fun Friend.checkIsFriendImpl(): FriendImpl {
 
 internal class FriendImpl(
     bot: QQAndroidBot,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
     internal val friendInfo: FriendInfo,
-) : Friend, AbstractUser(bot, coroutineContext, friendInfo) {
+) : Friend, AbstractUser(bot, parentCoroutineContext, friendInfo) {
     @Suppress("unused") // bug
     val lastMessageSequence: AtomicInt = atomic(-1)
     val friendPkgMsgParsingCache = C2CPkgMsgParsingCache()
-
     override suspend fun delete() {
         check(bot.friends[this.id] != null) {
             "Friend ${this.id} had already been deleted"
diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt
index 73ce1e1bc..a297aadf6 100644
--- a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt
@@ -68,11 +68,11 @@ internal fun Group.checkIsGroupImpl(): GroupImpl {
 @Suppress("PropertyName")
 internal class GroupImpl(
     bot: QQAndroidBot,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
     override val id: Long,
     groupInfo: GroupInfo,
     members: Sequence<MemberInfo>,
-) : Group, AbstractContact(bot, coroutineContext) {
+) : Group, AbstractContact(bot, parentCoroutineContext) {
     companion object
 
     val uin: Long = groupInfo.uin
diff --git a/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt b/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt
index 6600d8b56..2b900bf58 100644
--- a/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt
+++ b/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt
@@ -49,9 +49,9 @@ internal inline fun Stranger.checkIsImpl(): StrangerImpl {
 
 internal class StrangerImpl(
     bot: QQAndroidBot,
-    coroutineContext: CoroutineContext,
+    parentCoroutineContext: CoroutineContext,
     internal val strangerInfo: StrangerInfo,
-) : Stranger, AbstractUser(bot, coroutineContext, strangerInfo) {
+) : Stranger, AbstractUser(bot, parentCoroutineContext, strangerInfo) {
     @Suppress("unused") // bug
     val lastMessageSequence: AtomicInt = atomic(-1)
     override suspend fun delete() {