diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt
index b1f3e6443..eb34395d1 100644
--- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt
+++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt
@@ -255,9 +255,8 @@ internal class TIMPCBotNetworkHandler internal constructor(coroutineContext: Cor
                     if (e.cause !is CancellationException) {
                         bot.logger.error("Caught SendPacketInternalException: ${e.cause?.message}")
                     }
-                    val configuration = bot.configuration
-                    delay(configuration.firstReconnectDelayMillis)
-                    bot.tryReinitializeNetworkHandler(configuration, e)
+                    delay(bot.configuration.firstReconnectDelayMillis)
+                    bot.tryReinitializeNetworkHandler(e)
                     return@withContext
                 } finally {
                     buffer.release(IoBuffer.Pool)
@@ -468,7 +467,7 @@ internal class TIMPCBotNetworkHandler internal constructor(coroutineContext: Cor
                                     } == null) {
                                     bot.logger.warning("Heartbeat timed out")
                                     delay(configuration.firstReconnectDelayMillis)
-                                    bot.tryReinitializeNetworkHandler(configuration, HeartbeatTimeoutException())
+                                    bot.tryReinitializeNetworkHandler(HeartbeatTimeoutException())
                                     return@launch
                                 }
                             }
diff --git a/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt b/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt
index a95de8e3f..51ec13712 100644
--- a/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt
+++ b/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt
@@ -379,7 +379,7 @@ when (idHex.substring(0, 5)) {
 internal object DebugNetworkHandler : BotNetworkHandler(), CoroutineScope {
     override val supervisor: CompletableJob = SupervisorJob()
 
-    override val bot: Bot = TIMPC.run { this@DebugNetworkHandler.Bot(qq ?: 0L, "", null) }
+    override val bot: Bot = TIMPC.Bot(qq ?: 0L, "", null)
 
     override suspend fun login() {}
 
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/ReceiveFriendAddRequestEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/ReceiveFriendAddRequestEvent.kt
index 0a7d591b1..fbb549286 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/ReceiveFriendAddRequestEvent.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/ReceiveFriendAddRequestEvent.kt
@@ -22,6 +22,6 @@ class ReceiveFriendAddRequestEvent(
      *
      * @param remark 备注名, 不设置则需为 `null`
      */
-    @JvmOverloads // TODO: 2019/12/17 协议抽象
+    @JvmOverloads
     suspend fun approve(remark: String? = null): Unit = qq.bot.approveFriendAddRequest(qq.id, remark)
 }
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt
index bc176c2c3..b5186aef2 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt
@@ -33,11 +33,13 @@ fun BytePacketBuilder.writeShortLVByteArray(byteArray: ByteArray) {
     this.writeFully(byteArray)
 }
 
-fun BytePacketBuilder.writeShortLVPacket(tag: UByte? = null, lengthOffset: ((Long) -> Long)? = null, builder: BytePacketBuilder.() -> Unit) =
+fun BytePacketBuilder.writeShortLVPacket(tag: UByte? = null, lengthOffset: ((Long) -> Long)? = null, builder: BytePacketBuilder.() -> Unit): Int =
     BytePacketBuilder().apply(builder).build().use {
         if (tag != null) writeUByte(tag)
-        writeUShort((lengthOffset?.invoke(it.remaining) ?: it.remaining).coerceAtMostOrFail(0xFFFFL).toUShort())
+        val length = (lengthOffset?.invoke(it.remaining) ?: it.remaining).coerceAtMostOrFail(0xFFFFL)
+        writeUShort(length.toUShort())
         writePacket(it)
+        return length.toInt()
     }
 
 fun BytePacketBuilder.writeUVarIntLVPacket(tag: UByte? = null, lengthOffset: ((Long) -> Long)? = null, builder: BytePacketBuilder.() -> Unit) =
diff --git a/mirai-demos/mirai-demo-android/src/main/kotlin/net/mamoe/mirai/demo/MiraiService.kt b/mirai-demos/mirai-demo-android/src/main/kotlin/net/mamoe/mirai/demo/MiraiService.kt
index 9fd8fd2e0..9ec9138df 100644
--- a/mirai-demos/mirai-demo-android/src/main/kotlin/net/mamoe/mirai/demo/MiraiService.kt
+++ b/mirai-demos/mirai-demo-android/src/main/kotlin/net/mamoe/mirai/demo/MiraiService.kt
@@ -41,17 +41,17 @@ class MiraiService : Service() {
 
     private fun login(qq: Long, pwd: String) {
         GlobalScope.launch {
-            mBot = TIMPC.Bot(qq, pwd).apply {
+            mBot = TIMPC.Bot(qq, pwd) {
+                captchaSolver = {
+                    val bytes = it.readBytes()
+                    val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
+                    mCaptchaDeferred = CompletableDeferred()
+                    mCallback?.get()?.onCaptcha(bitmap)
+                    mCaptchaDeferred.await()
+                }
+            }.apply {
                 try {
-                    login {
-                        captchaSolver = {
-                            val bytes = it.readBytes()
-                            val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
-                            mCaptchaDeferred = CompletableDeferred()
-                            mCallback?.get()?.onCaptcha(bitmap)
-                            mCaptchaDeferred.await()
-                        }
-                    }
+                    login()
                     mCallback?.get()?.onSuccess()
                 } catch (e: LoginFailedException) {
                     mCallback?.get()?.onFailed()