diff --git a/mirai-core/src/commonMain/kotlin/network/Packet.kt b/mirai-core/src/commonMain/kotlin/network/Packet.kt
index b0b9ec4c6..fa605f698 100644
--- a/mirai-core/src/commonMain/kotlin/network/Packet.kt
+++ b/mirai-core/src/commonMain/kotlin/network/Packet.kt
@@ -33,22 +33,48 @@ interface Packet {
 /**
  * PacketFactory 可以一次解析多个包出来. 它们将会被分别广播.
  */
-internal interface MultiPacket : Packet, Collection<Packet>
+internal interface MultiPacket : Packet {
+    /**
+     * `true` if this packet has some useful meaning, otherwise it will be considered just as a wrapper of its children.
+     */
+    val isMeaningful: Boolean
+
+    /**
+     * if item is [MultiPacket], its children will be ignored.
+     */
+    fun children(): Iterator<Packet>
+}
 
 internal fun Collection<Packet>.toPacket(): Packet {
     return when (this.size) {
         1 -> this.single()
-        else -> MultiPacketImpl(this)
+        else -> MultiPacket(this)
     }
 }
 
-internal fun MultiPacket(delegate: Collection<Packet>): MultiPacket = MultiPacketImpl(delegate)
+internal fun MultiPacket(delegate: Collection<Packet>): MultiPacket {
+    return MultiPacketImpl(delegate)
+}
+
 internal fun MultiPacket(delegate: Packet): MultiPacket =
     if (delegate is MultiPacket) delegate else MultiPacket(listOf(delegate))
 
-internal open class MultiPacketImpl(
+
+private class MultiPacketImpl(
     val delegate: Collection<Packet>,
-) : MultiPacket, Collection<Packet> by delegate {
+) : MultiPacket {
+    override val isMeaningful: Boolean get() = false
+
+    override fun children(): Iterator<Packet> {
+        return sequence {
+            for (packet in delegate) {
+                yield(packet)
+                if (packet is MultiPacket) {
+                    yieldAll(packet.children())
+                }
+            }
+        }.iterator()
+    }
 
     override fun toString(): String = delegate.joinToString(
         separator = "\n",
diff --git a/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt b/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt
index e85c42c0f..fdab008d1 100644
--- a/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt
+++ b/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt
@@ -76,7 +76,8 @@ internal class EventBroadcasterPacketHandler(
     private fun impl(packet: Packet?) {
         if (packet == null) return
         if (packet is MultiPacket) {
-            for (p in packet) {
+            if (packet.isMeaningful) impl(packet)
+            for (p in packet.children()) {
                 impl(p)
             }
         }
diff --git a/mirai-core/src/commonMain/kotlin/network/components/PacketLoggingStrategy.kt b/mirai-core/src/commonMain/kotlin/network/components/PacketLoggingStrategy.kt
index adc0c2ab8..b02e9a410 100644
--- a/mirai-core/src/commonMain/kotlin/network/components/PacketLoggingStrategy.kt
+++ b/mirai-core/src/commonMain/kotlin/network/components/PacketLoggingStrategy.kt
@@ -58,7 +58,8 @@ internal class PacketLoggingStrategyImpl(
                 }
 
                 if (packet is MultiPacket) {
-                    for (d in packet) {
+                    if (packet.isMeaningful) logReceivedImpl(packet, incomingPacket, logger)
+                    for (d in packet.children()) {
                         logReceivedImpl(d, incomingPacket, logger)
                     }
                 }
diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt
index 081bd5c18..37f8bd3f7 100644
--- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt
+++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt
@@ -81,13 +81,17 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
      */
     open class Response(
         internal val syncFlagFromServer: MsgSvc.SyncFlag,
-        delegate: List<Packet>,
+        private val delegate: List<Packet>,
         val syncCookie: ByteArray?, override val bot: Bot,
     ) : AbstractEvent(),
         MultiPacket,
-        Collection<Packet> by delegate,
         Packet.NoEventLog,
         BotEvent {
+        override val isMeaningful: Boolean get() = true
+
+        override fun children(): Iterator<Packet> {
+            return delegate.iterator()
+        }
 
         override fun toString(): String =
             "MessageSvcPbGetMsg.Response(flag=$syncFlagFromServer)"
diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt
index 56790d6d6..26b94bcaf 100644
--- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt
+++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt
@@ -11,25 +11,16 @@ package net.mamoe.mirai.internal.network.protocol.packet.chat.receive
 
 import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.internal.QQAndroidBot
-import net.mamoe.mirai.internal.contact.GroupImpl
 import net.mamoe.mirai.internal.network.MultiPacket
 import net.mamoe.mirai.internal.network.Packet
 import net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline
-import net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo
-import net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210
 import net.mamoe.mirai.internal.network.protocol.data.jce.OnlinePushPack
-import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x122
 import net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory
 import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket
 import net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket
-import net.mamoe.mirai.internal.utils._miraiContentToString
-import net.mamoe.mirai.internal.utils.io.serialization.loadAs
 import net.mamoe.mirai.internal.utils.io.serialization.readUniPacket
 import net.mamoe.mirai.internal.utils.io.serialization.writeJceRequestPacket
-import net.mamoe.mirai.utils.debug
 
-
-//0C 01 B1 89 BE 09 5E 3D 72 A6 00 01 73 68 FC 06 00 00 00 3C
 internal object OnlinePushReqPush : IncomingPacketFactory<OnlinePushReqPush.ReqPushDecoded>(
     "OnlinePush.ReqPush",
     "OnlinePush.RespPush",
@@ -65,165 +56,4 @@ internal object OnlinePushReqPush : IncomingPacketFactory<OnlinePushReqPush.ReqP
             )
         }
     }
-}
-
-
-internal interface Lambda732 {
-    operator fun invoke(pk: ByteReadPacket, group: GroupImpl, bot: QQAndroidBot): Sequence<Packet>
-}
-
-internal inline fun lambda732(crossinline block: ByteReadPacket.(GroupImpl, QQAndroidBot) -> Sequence<Packet>): Lambda732 {
-    return object : Lambda732 {
-        override fun invoke(pk: ByteReadPacket, group: GroupImpl, bot: QQAndroidBot): Sequence<Packet> {
-            return block(pk, group, bot)
-        }
-    }
-}
-
-internal object Transformers732 : Map<Int, Lambda732> by mapOf(
-    // mute
-    0x0c to lambda732 { group: GroupImpl, bot: QQAndroidBot ->
-        TODO("removed")
-    },
-
-    // anonymous
-    0x0e to lambda732 { group: GroupImpl, _: QQAndroidBot ->
-        TODO("removed")
-    },
-
-    //系统提示
-    0x14 to lambda732 { group: GroupImpl, bot: QQAndroidBot ->
-        TODO("removed")
-    },
-    // 传字符串信息
-    0x10 to lambda732 { group: GroupImpl, bot: QQAndroidBot ->
-        TODO("removed")
-        /*
-        val dataBytes = readBytes(26)
-
-        when (dataBytes[0].toInt() and 0xFF) {
-            59 -> { // TODO 应该在 Transformers528 处理
-                val size = readByte().toInt() // orthodox, don't `readUByte`
-                if (size < 0) {
-                    // java.lang.IllegalStateException: negative array size: -100, remaining bytes=B0 E6 99 90 D8 E8 02 98 06 01
-                    // java.lang.IllegalStateException: negative array size: -121, remaining bytes=03 10 D9 F7 A2 93 0D 18 E0 DB E8 CA 0B 32 22 61 34 64 31 34 64 61 64 65 65 38 32 32 34 62 64 32 35 34 65 63 37 62 62 30 33 30 66 61 36 66 61 6D 6A 38 0E 48 00 58 01 70 C8 E8 9B 07 7A AD 02 3C 7B 22 69 63 6F 6E 22 3A 22 71 71 77 61 6C 6C 65 74 5F 63 75 73 74 6F 6D 5F 74 69 70 73 5F 69 64 69 6F 6D 5F 69 63 6F 6E 2E 70 6E 67 22 2C 22 61 6C 74 22 3A 22 22 7D 3E 3C 7B 22 63 6D 64 22 3A 31 2C 22 64 61 74 61 22 3A 22 6C 69 73 74 69 64 3D 31 30 30 30 30 34 35 32 30 31 32 30 30 34 30 38 31 32 30 30 31 30 39 36 31 32 33 31 34 35 30 30 26 67 72 6F 75 70 74 79 70 65 3D 31 22 2C 22 74 65 78 74 43 6F 6C 6F 72 22 3A 22 30 78 38 37 38 42 39 39 22 2C 22 74 65 78 74 22 3A 22 E6 8E A5 E9 BE 99 E7 BA A2 E5 8C 85 E4 B8 8B E4 B8 80 E4 B8 AA E6 8B BC E9 9F B3 EF BC 9A 22 7D 3E 3C 7B 22 63 6D 64 22 3A 31 2C 22 64 61 74 61 22 3A 22 6C 69 73 74 69 64 3D 31 30 30 30 30 34 35 32 30 31 32 30 30 34 30 38 31 32 30 30 31 30 39 36 31 32 33 31 34 35 30 30 26 67 72 6F 75 70 74 79 70 65 3D 31 22 2C 22 74 65 78 74 43 6F 6C 6F 72 22 3A 22 30 78 45 36 32 35 35 35 22 2C 22 74 65 78 74 22 3A 22 64 69 6E 67 22 7D 3E 82 01 0C E8 80 81 E5 83 A7 E5 85 A5 E5 AE 9A 88 01 03 92 01 04 64 69 6E 67 A0 01 00
-                    // negative array size: -40, remaining bytes=D6 94 C3 8C D8 E8 02 98 06 01
-                    error("negative array size: $size, remaining bytes=${readBytes().toUHexString()}")
-                }
-
-                // println(dataBytes.toUHexString())
-                //println(message + ":" + dataBytes.toUHexString())
-
-                val new = when (val message = readString(size)) {
-                    "管理员已关闭群聊坦白说" -> false
-                    "管理员已开启群聊坦白说" -> true
-                    else -> {
-                        bot.network.logger.debug { "Unknown server messages $message" }
-                        return@lambda732 emptySequence()
-                    }
-                }
-
-                // @Suppress("DEPRECATION")
-                // if (group.settings.isConfessTalkEnabled == new) {
-                //     return@lambda732 emptySequence()
-                // }
-
-                return@lambda732 sequenceOf(
-                    GroupAllowConfessTalkEvent(
-                        new,
-                        false,
-                        group,
-                        false
-                    )
-                )
-            }
-
-            0x2D -> {
-                // 修改群名. 在 Transformers528 0x27L 处理
-                return@lambda732 emptySequence()
-            }
-            else -> {
-                /*
-                bot.network.logger.debug("unknown Transformer732 0xunknown type: ${dataBytes[0].toString(16)
-                    .uppercase()}")
-                bot.network.logger.debug("unknown Transformer732 0xdata= ${readBytes().toUHexString()}")
-                */
-                return@lambda732 emptySequence()
-
-                /*
-                if (group.name == message) {
-                    return@lambda732 emptySequence()
-                }
-
-                return@lambda732 sequenceOf(
-                    GroupNameChangeEvent(
-                        group.name.also { group._name = message },
-                        message, group, false
-                    )
-                )*/
-            }
-        }*/
-    },
-
-    // recall
-    0x11 to lambda732 { group: GroupImpl, bot: QQAndroidBot ->
-        TODO("removed")
-    },
-)
-
-internal interface Lambda528 {
-    suspend operator fun invoke(msg: MsgType0x210, bot: QQAndroidBot, msgInfo: MsgInfo): Sequence<Packet>
-}
-
-internal inline fun lambda528(crossinline block: suspend MsgType0x210.(QQAndroidBot) -> Sequence<Packet>): Lambda528 {
-    return object : Lambda528 {
-        override suspend fun invoke(msg: MsgType0x210, bot: QQAndroidBot, msgInfo: MsgInfo): Sequence<Packet> {
-            return block(msg, bot)
-        }
-
-    }
-}
-
-internal inline fun lambda528(crossinline block: suspend MsgType0x210.(QQAndroidBot, MsgInfo) -> Sequence<Packet>): Lambda528 {
-    return object : Lambda528 {
-        override suspend fun invoke(msg: MsgType0x210, bot: QQAndroidBot, msgInfo: MsgInfo): Sequence<Packet> {
-            return block(msg, bot, msgInfo)
-        }
-
-    }
-}
-
-// uSubMsgType to vProtobuf
-// 138 or 139: top_package/akln.java:1568
-// 66: top_package/nhz.java:269
-/**
- * @see MsgType0x210
- */
-@OptIn(ExperimentalStdlibApi::class)
-internal object Transformers528 : Map<Long, Lambda528> by mapOf(
-
-    0x8AL to lambda528 { bot ->
-        TODO("removed")
-    },
-
-    //戳一戳信息等
-    0x122L to lambda528 { bot, msgInfo ->
-        val body = vProtobuf.loadAs(Submsgtype0x122.Submsgtype0x122.MsgBody.serializer())
-        when (body.templId) {
-            //戳一戳
-            1132L, 1133L, 1134L, 1135L, 1136L, 10043L -> {
-                TODO("removed")
-            }
-            else -> {
-                bot.logger.debug {
-                    "Unknown Transformers528 0x122L template\ntemplId=${body.templId}\nPermList=${body.msgTemplParam._miraiContentToString()}"
-                }
-                return@lambda528 emptySequence()
-            }
-        }
-    },
-    // 群相关,  ModFriendRemark, DelFriend, ModGroupProfile
-    0x27L to lambda528 { bot ->
-        TODO("removed")
-    },
-)
+}
\ No newline at end of file