diff --git a/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt b/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt
index a5911a72c..cc2115c25 100644
--- a/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt
+++ b/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt
@@ -38,12 +38,14 @@ import net.mamoe.mirai.message.data.Message
 import net.mamoe.mirai.utils.BotConfiguration
 import net.mamoe.mirai.utils.LoginSolver
 import net.mamoe.mirai.utils.MiraiLogger
+import net.mamoe.mirai.utils.NotStableForInheritance
 import java.nio.file.Path
 import java.util.*
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.annotation.AnnotationTarget.*
 import kotlin.concurrent.thread
 import kotlin.coroutines.CoroutineContext
+import kotlin.reflect.KClass
 
 
 /**
@@ -227,7 +229,7 @@ public interface MiraiConsoleImplementation : CoroutineScope {
     /**
      * 前端预先定义的 [LoggerController], 以允许前端使用自己的配置系统
      */
-    public val loggerController: LoggerController get() = LoggerControllerImpl
+    public val loggerController: LoggerController get() = LoggerControllerImpl()
 
     ///////////////////////////////////////////////////////////////////////////
     // ConsoleDataScope
@@ -257,17 +259,40 @@ public interface MiraiConsoleImplementation : CoroutineScope {
      * @since 2.10.0-RC
      */
     @ConsoleFrontEndImplementation
+    @NotStableForInheritance
     public interface ConsoleDataScope {
         public val dataHolder: AutoSavePluginDataHolder
         public val configHolder: AutoSavePluginDataHolder
         public fun addAndReloadConfig(config: PluginConfig)
+
+        /**
+         * @since 2.11.0-RC
+         */
+        public fun <T : PluginData> find(type: KClass<T>): T?
+
+        /**
+         * @since 2.11.0-RC
+         */
+        public fun <T : PluginData> get(type: KClass<T>): T =
+            find(type) ?: throw NoSuchElementException(type.qualifiedName)
+
         public fun reloadAll()
 
         /**
-         * @since 2.10.0-RCl
+         * @since 2.10.0-RC
          */
         @ConsoleFrontEndImplementation
         public companion object {
+            /**
+             * @since 2.11.0-RC
+             */
+            public inline fun <reified T : PluginData> ConsoleDataScope.find(): T? = find(T::class)
+
+            /**
+             * @since 2.11.0-RC
+             */
+            public inline fun <reified T : PluginData> ConsoleDataScope.get(): T = get(T::class)
+
             @JvmStatic
             public fun createDefault(
                 coroutineContext: CoroutineContext,
diff --git a/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt b/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt
index 4b24c829c..778f1fc6e 100644
--- a/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt
+++ b/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt
@@ -15,6 +15,7 @@ import kotlinx.coroutines.sync.withLock
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.console.MiraiConsole
 import net.mamoe.mirai.console.MiraiConsoleImplementation
+import net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get
 import net.mamoe.mirai.console.command.CommandManager.INSTANCE.allRegisteredCommands
 import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register
 import net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException
@@ -28,6 +29,7 @@ import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig
 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.*
 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5
 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN
+import net.mamoe.mirai.console.internal.data.builtins.DataScope
 import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage
 import net.mamoe.mirai.console.internal.permission.BuiltInPermissionService
 import net.mamoe.mirai.console.internal.pluginManagerImpl
@@ -203,7 +205,8 @@ public object BuiltInCommands {
             }
 
             suspend fun getPassword(id: Long): Any? {
-                val acc = AutoLoginConfig.accounts.firstOrNull { it.account == id.toString() }
+                val config = DataScope.get<AutoLoginConfig>()
+                val acc = config.accounts.firstOrNull { it.account == id.toString() }
                 if (acc == null) {
                     sendMessage("Could not find '$id' in AutoLogin config. Please specify password.")
                     return null
@@ -321,8 +324,9 @@ public object BuiltInCommands {
         @Description("查看自动登录账号列表")
         @SubCommand
         public suspend fun CommandSender.list() {
+            val config = DataScope.get<AutoLoginConfig>()
             sendMessage(buildString {
-                for (account in AutoLoginConfig.accounts) {
+                for (account in config.accounts) {
                     if (account.account == "123456") continue
                     append("- ")
                     append("账号: ")
@@ -346,27 +350,30 @@ public object BuiltInCommands {
         @Description("添加自动登录, passwordKind 可选 PLAIN 或 MD5")
         @SubCommand
         public suspend fun CommandSender.add(account: Long, password: String, passwordKind: PasswordKind = PLAIN) {
+            val config = DataScope.get<AutoLoginConfig>()
             val accountStr = account.toString()
-            if (AutoLoginConfig.accounts.any { it.account == accountStr }) {
+            if (config.accounts.any { it.account == accountStr }) {
                 sendMessage("已有相同账号在自动登录配置中. 请先删除该账号.")
                 return
             }
-            AutoLoginConfig.accounts.add(AutoLoginConfig.Account(accountStr, Password(passwordKind, password)))
+            config.accounts.add(AutoLoginConfig.Account(accountStr, Password(passwordKind, password)))
             sendMessage("已成功添加 '$account'.")
         }
 
         @Description("清除所有配置")
         @SubCommand
         public suspend fun CommandSender.clear() {
-            AutoLoginConfig.accounts.clear()
+            val config = DataScope.get<AutoLoginConfig>()
+            config.accounts.clear()
             sendMessage("已清除所有自动登录配置.")
         }
 
         @Description("删除一个账号")
         @SubCommand
         public suspend fun CommandSender.remove(account: Long) {
+            val config = DataScope.get<AutoLoginConfig>()
             val accountStr = account.toString()
-            if (AutoLoginConfig.accounts.removeIf { it.account == accountStr }) {
+            if (config.accounts.removeIf { it.account == accountStr }) {
                 sendMessage("已成功删除 '$account'.")
                 return
             }
@@ -376,9 +383,10 @@ public object BuiltInCommands {
         @Description("设置一个账号的一个配置项")
         @SubCommand
         public suspend fun CommandSender.setConfig(account: Long, configKey: ConfigurationKey, value: String) {
+            val config = DataScope.get<AutoLoginConfig>()
             val accountStr = account.toString()
 
-            val oldAccount = AutoLoginConfig.accounts.find { it.account == accountStr } ?: kotlin.run {
+            val oldAccount = config.accounts.find { it.account == accountStr } ?: kotlin.run {
                 sendMessage("未找到账号 $account.")
                 return
             }
@@ -389,8 +397,8 @@ public object BuiltInCommands {
                 put(configKey, value)
             })
 
-            AutoLoginConfig.accounts.remove(oldAccount)
-            AutoLoginConfig.accounts.add(newAccount)
+            config.accounts.remove(oldAccount)
+            config.accounts.add(newAccount)
 
             sendMessage("成功修改 '$account' 的配置 '$configKey' 为 '$value'")
         }
@@ -398,9 +406,10 @@ public object BuiltInCommands {
         @Description("删除一个账号的一个配置项")
         @SubCommand
         public suspend fun CommandSender.removeConfig(account: Long, configKey: ConfigurationKey) {
+            val config = DataScope.get<AutoLoginConfig>()
             val accountStr = account.toString()
 
-            val oldAccount = AutoLoginConfig.accounts.find { it.account == accountStr } ?: kotlin.run {
+            val oldAccount = config.accounts.find { it.account == accountStr } ?: kotlin.run {
                 sendMessage("未找到账号 $account.")
                 return
             }
@@ -409,8 +418,8 @@ public object BuiltInCommands {
                 remove(configKey)
             })
 
-            AutoLoginConfig.accounts.remove(oldAccount)
-            AutoLoginConfig.accounts.add(newAccount)
+            config.accounts.remove(oldAccount)
+            config.accounts.add(newAccount)
 
             sendMessage("成功删除 '$account' 的配置 '$configKey'.")
         }
diff --git a/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt b/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt
index 4434fc256..6dbc4d8ba 100644
--- a/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt
+++ b/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt
@@ -19,6 +19,7 @@ import net.mamoe.mirai.Bot
 import net.mamoe.mirai.console.MalformedMiraiConsoleImplementationError
 import net.mamoe.mirai.console.MiraiConsole
 import net.mamoe.mirai.console.MiraiConsoleImplementation
+import net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get
 import net.mamoe.mirai.console.command.BuiltInCommands
 import net.mamoe.mirai.console.command.CommandManager
 import net.mamoe.mirai.console.command.ConsoleCommandSender
@@ -34,7 +35,8 @@ import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig
 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.ConfigurationKey
 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5
 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN
-import net.mamoe.mirai.console.internal.data.builtins.LoggerConfig
+import net.mamoe.mirai.console.internal.data.builtins.DataScope
+import net.mamoe.mirai.console.internal.data.builtins.PluginDependenciesConfig
 import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage
 import net.mamoe.mirai.console.internal.extension.GlobalComponentStorageImpl
 import net.mamoe.mirai.console.internal.logging.LoggerControllerImpl
@@ -115,14 +117,6 @@ internal class MiraiConsoleImplementationBridge(
             }
         }
 
-        phase("setup logger controller") {
-            if (loggerController === LoggerControllerImpl) {
-                // Reload LoggerConfig.
-                consoleDataScope.addAndReloadConfig(LoggerConfig)
-                LoggerControllerImpl.initialized = true
-            }
-        }
-
         phase("greeting") {
             val buildDateFormatted =
                 buildDate.atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
@@ -152,7 +146,13 @@ internal class MiraiConsoleImplementationBridge(
 
         phase("load configurations") {
             mainLogger.verbose { "Loading configurations..." }
-            consoleDataScope.addAndReloadConfig(CommandConfig)
+            consoleDataScope.addAndReloadConfig(AutoLoginConfig())
+            consoleDataScope.addAndReloadConfig(CommandConfig())
+            consoleDataScope.addAndReloadConfig(PluginDependenciesConfig())
+            val loggerController = loggerController
+            if (loggerController is LoggerControllerImpl) {
+                consoleDataScope.addAndReloadConfig(loggerController.loggerConfig)
+            }
             consoleDataScope.reloadAll()
         }
 
@@ -227,7 +227,8 @@ internal class MiraiConsoleImplementationBridge(
 
         phase("auto-login bots") {
             runBlocking {
-                val accounts = AutoLoginConfig.accounts.toList()
+                val config = DataScope.get<AutoLoginConfig>()
+                val accounts = config.accounts.toList()
                 for (account in accounts.filter {
                     it.configuration[ConfigurationKey.enable]?.toString()?.equals("true", true) ?: true
                 }) {
diff --git a/mirai-console/backend/mirai-console/src/internal/command/CommandManagerImpl.kt b/mirai-console/backend/mirai-console/src/internal/command/CommandManagerImpl.kt
index ba1d8cd93..d40bc063d 100644
--- a/mirai-console/backend/mirai-console/src/internal/command/CommandManagerImpl.kt
+++ b/mirai-console/backend/mirai-console/src/internal/command/CommandManagerImpl.kt
@@ -1,10 +1,10 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
- *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  *
- *  https://github.com/mamoe/mirai/blob/master/LICENSE
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
  */
 
 package net.mamoe.mirai.console.internal.command
@@ -12,6 +12,7 @@ package net.mamoe.mirai.console.internal.command
 import kotlinx.atomicfu.locks.withLock
 import kotlinx.coroutines.CoroutineScope
 import net.mamoe.mirai.console.MiraiConsole
+import net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get
 import net.mamoe.mirai.console.command.*
 import net.mamoe.mirai.console.command.Command.Companion.allNames
 import net.mamoe.mirai.console.command.CommandManager.INSTANCE.findDuplicate
@@ -21,12 +22,12 @@ import net.mamoe.mirai.console.command.parse.CommandCallParser.Companion.parseCo
 import net.mamoe.mirai.console.command.resolve.CommandCallInterceptor.Companion.intercepted
 import net.mamoe.mirai.console.command.resolve.CommandCallResolver.Companion.resolve
 import net.mamoe.mirai.console.command.resolve.getOrElse
+import net.mamoe.mirai.console.internal.data.builtins.DataScope
 import net.mamoe.mirai.console.internal.util.ifNull
 import net.mamoe.mirai.console.permission.PermissionService.Companion.testPermission
 import net.mamoe.mirai.message.data.Message
 import net.mamoe.mirai.message.data.toMessageChain
 import net.mamoe.mirai.utils.MiraiLogger
-import net.mamoe.mirai.utils.castOrNull
 import net.mamoe.mirai.utils.childScope
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.coroutines.CoroutineContext
@@ -69,7 +70,7 @@ internal class CommandManagerImpl(
         _registeredCommands.filter { it.owner == owner }
 
     override val allRegisteredCommands: List<Command> get() = _registeredCommands.toList() // copy
-    override val commandPrefix: String get() = CommandConfig.commandPrefix
+    override val commandPrefix: String get() = DataScope.get<CommandConfig>().commandPrefix
     override fun unregisterAllCommands(owner: CommandOwner) {
         for (registeredCommand in getRegisteredCommands(owner)) {
             unregisterCommand(registeredCommand)
diff --git a/mirai-console/backend/mirai-console/src/internal/command/CommnadConfig.kt b/mirai-console/backend/mirai-console/src/internal/command/CommnadConfig.kt
index c71ecd460..3c3c76942 100644
--- a/mirai-console/backend/mirai-console/src/internal/command/CommnadConfig.kt
+++ b/mirai-console/backend/mirai-console/src/internal/command/CommnadConfig.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
  * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -19,7 +19,7 @@ import net.mamoe.mirai.console.data.value
     内置指令系统配置
 """
 )
-internal object CommandConfig : ReadOnlyPluginConfig("Command") {
+internal class CommandConfig : ReadOnlyPluginConfig("Command") {
     @ValueDescription(
         """
         指令前缀, 默认 "/"
diff --git a/mirai-console/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt b/mirai-console/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt
index ebf029b04..06c782f7d 100644
--- a/mirai-console/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt
+++ b/mirai-console/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt
@@ -1,10 +1,10 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
- *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  *
- *  https://github.com/mamoe/mirai/blob/master/LICENSE
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
  */
 
 @file:Suppress("EXPOSED_SUPER_CLASS")
@@ -21,13 +21,12 @@ import net.mamoe.mirai.console.data.ValueDescription
 import net.mamoe.mirai.console.data.value
 import net.mamoe.mirai.console.util.ConsoleExperimentalApi
 import net.mamoe.mirai.utils.SecretsProtection
-import net.mamoe.mirai.utils.readString
 import net.mamoe.yamlkt.Comment
 import net.mamoe.yamlkt.YamlDynamicSerializer
 
 @ConsoleExperimentalApi
 @ValueDescription("自动登录配置")
-public object AutoLoginConfig : AutoSavePluginConfig("AutoLogin") {
+public class AutoLoginConfig : AutoSavePluginConfig("AutoLogin") {
 
     @Serializable
     public data class Account(
diff --git a/mirai-console/backend/mirai-console/src/internal/data/builtins/ConsoleDataScopeImpl.kt b/mirai-console/backend/mirai-console/src/internal/data/builtins/ConsoleDataScopeImpl.kt
index 79f3a6bd3..e3e7a199e 100644
--- a/mirai-console/backend/mirai-console/src/internal/data/builtins/ConsoleDataScopeImpl.kt
+++ b/mirai-console/backend/mirai-console/src/internal/data/builtins/ConsoleDataScopeImpl.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
  * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -17,28 +17,34 @@ import net.mamoe.mirai.console.data.PluginData
 import net.mamoe.mirai.console.data.PluginDataStorage
 import net.mamoe.mirai.utils.childScope
 import net.mamoe.mirai.utils.minutesToMillis
+import java.util.concurrent.ConcurrentLinkedQueue
 import kotlin.coroutines.CoroutineContext
+import kotlin.reflect.KClass
 
+internal val DataScope get() = MiraiConsoleImplementation.getBridge().consoleDataScope
 
 internal class ConsoleDataScopeImpl(
     parentCoroutineContext: CoroutineContext,
     private val dataStorage: PluginDataStorage,
     private val configStorage: PluginDataStorage,
-) : CoroutineScope by parentCoroutineContext.childScope("ConsoleDataScope"), MiraiConsoleImplementation.ConsoleDataScope {
+) : CoroutineScope by parentCoroutineContext.childScope("ConsoleDataScope"),
+    MiraiConsoleImplementation.ConsoleDataScope {
     override val dataHolder: AutoSavePluginDataHolder = ConsoleBuiltInPluginDataHolder(this.coroutineContext)
     override val configHolder: AutoSavePluginDataHolder = ConsoleBuiltInPluginConfigHolder(this.coroutineContext)
 
-    private val data: List<PluginData> = mutableListOf()
-    private val configs: MutableList<PluginConfig> = mutableListOf(
-        AutoLoginConfig,
-        PluginDependenciesConfig,
-    )
+    private val data: MutableCollection<PluginData> = ConcurrentLinkedQueue() // tentatively make it thread-safe
+    private val configs: MutableCollection<PluginConfig> = ConcurrentLinkedQueue()
 
     override fun addAndReloadConfig(config: PluginConfig) {
         configs.add(config)
         configStorage.load(configHolder, config)
     }
 
+    override fun <T : PluginData> find(type: KClass<T>): T? {
+        @Suppress("UNCHECKED_CAST")
+        return (data.find { type.isInstance(it) } ?: configs.find { type.isInstance(it) }) as T?
+    }
+
     override fun reloadAll() {
         data.forEach { dt ->
             dataStorage.load(dataHolder, dt)
diff --git a/mirai-console/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt b/mirai-console/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt
index 37bb8e335..83ce36abf 100644
--- a/mirai-console/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt
+++ b/mirai-console/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
  * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -9,25 +9,29 @@
 
 package net.mamoe.mirai.console.internal.data.builtins
 
+import net.mamoe.mirai.console.ConsoleFrontEndImplementation
 import net.mamoe.mirai.console.data.ReadOnlyPluginConfig
 import net.mamoe.mirai.console.data.ValueDescription
 import net.mamoe.mirai.console.data.value
 import net.mamoe.mirai.console.logging.AbstractLoggerController
+import net.mamoe.mirai.utils.MiraiExperimentalApi
 
-internal object LoggerConfig : ReadOnlyPluginConfig("Logger") {
+@ConsoleFrontEndImplementation
+@MiraiExperimentalApi
+public class LoggerConfig : ReadOnlyPluginConfig("Logger") {
     @ValueDescription(
         """
         日志输出等级 可选值: ALL, VERBOSE, DEBUG, INFO, WARNING, ERROR, NONE
     """
     )
-    val defaultPriority by value(AbstractLoggerController.LogPriority.INFO)
+    public val defaultPriority: AbstractLoggerController.LogPriority by value(AbstractLoggerController.LogPriority.INFO)
 
     @ValueDescription(
         """
         特定日志记录器输出等级
     """
     )
-    val loggers: Map<String, AbstractLoggerController.LogPriority> by value(
+    public val loggers: Map<String, AbstractLoggerController.LogPriority> by value(
         mapOf(
             "example.logger" to AbstractLoggerController.LogPriority.NONE,
             "console.debug" to AbstractLoggerController.LogPriority.NONE,
diff --git a/mirai-console/backend/mirai-console/src/internal/data/builtins/PluginDependenciesConfig.kt b/mirai-console/backend/mirai-console/src/internal/data/builtins/PluginDependenciesConfig.kt
index 102958ee9..ad85947b5 100644
--- a/mirai-console/backend/mirai-console/src/internal/data/builtins/PluginDependenciesConfig.kt
+++ b/mirai-console/backend/mirai-console/src/internal/data/builtins/PluginDependenciesConfig.kt
@@ -14,7 +14,7 @@ import net.mamoe.mirai.console.data.ValueDescription
 import net.mamoe.mirai.console.data.value
 
 @Suppress("RemoveExplicitTypeArguments")
-internal object PluginDependenciesConfig : ReadOnlyPluginConfig("PluginDependencies") {
+internal class PluginDependenciesConfig : ReadOnlyPluginConfig("PluginDependencies") {
     @ValueDescription("远程仓库, 如无必要无需修改")
     val repoLoc by value(listOf<String>("https://maven.aliyun.com/repository/public"))
 }
\ No newline at end of file
diff --git a/mirai-console/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt b/mirai-console/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt
index 618f7e849..5577966cd 100644
--- a/mirai-console/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt
+++ b/mirai-console/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt
@@ -9,8 +9,8 @@
 
 package net.mamoe.mirai.console.internal.extension
 
+import net.mamoe.mirai.console.MiraiConsoleImplementation
 import net.mamoe.mirai.console.extension.*
-import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
 import net.mamoe.mirai.console.internal.data.kClassQualifiedNameOrTip
 import net.mamoe.mirai.console.plugin.Plugin
 import net.mamoe.mirai.console.plugin.name
@@ -22,7 +22,7 @@ import kotlin.contracts.contract
 internal class GlobalComponentStorageImpl : AbstractConcurrentComponentStorage()
 
 // source compatibility for <2.11
-internal val GlobalComponentStorage get() = MiraiConsoleImplementationBridge.globalComponentStorage
+internal val GlobalComponentStorage get() = MiraiConsoleImplementation.getBridge().globalComponentStorage
 
 /**
  * thread-safe.
diff --git a/mirai-console/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt b/mirai-console/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt
index 0ccd6f413..4c6e1f745 100644
--- a/mirai-console/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt
+++ b/mirai-console/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
  * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -9,25 +9,24 @@
 
 package net.mamoe.mirai.console.internal.logging
 
-import net.mamoe.mirai.console.ConsoleFrontEndImplementation
 import net.mamoe.mirai.console.internal.data.builtins.LoggerConfig
 import net.mamoe.mirai.console.logging.AbstractLoggerController
-import net.mamoe.mirai.console.util.ConsoleInternalApi
 
-@ConsoleFrontEndImplementation
-@ConsoleInternalApi
-internal object LoggerControllerImpl : AbstractLoggerController.PathBased() {
-    internal var initialized = false
+internal class LoggerControllerImpl : AbstractLoggerController.PathBased() {
+    // 防止 stack overflow (使用 logger 要加载 LoggerController, LoggerConfig 可能会使用 logger)
+    // 在 console init 阶段 register
+    internal val loggerConfig: LoggerConfig by lazy {
+        LoggerConfig()
+    }
 
     override fun findPriority(identity: String?): LogPriority? {
-        if (!initialized) return LogPriority.NONE
         return if (identity == null) {
-            LoggerConfig.defaultPriority
+            loggerConfig.defaultPriority
         } else {
-            LoggerConfig.loggers[identity]
+            loggerConfig.loggers[identity]
         }
     }
 
     override val defaultPriority: LogPriority
-        get() = if (initialized) LoggerConfig.defaultPriority else LogPriority.NONE
+        get() = loggerConfig.defaultPriority
 }
\ No newline at end of file
diff --git a/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginDependencyDownload.kt b/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginDependencyDownload.kt
index 74286f9aa..c5692e9b0 100644
--- a/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginDependencyDownload.kt
+++ b/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginDependencyDownload.kt
@@ -9,7 +9,9 @@
 
 package net.mamoe.mirai.console.internal.plugin
 
+import net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get
 import net.mamoe.mirai.console.internal.MiraiConsoleBuildDependencies
+import net.mamoe.mirai.console.internal.data.builtins.DataScope
 import net.mamoe.mirai.console.internal.data.builtins.PluginDependenciesConfig
 import net.mamoe.mirai.console.plugin.PluginManager
 import net.mamoe.mirai.utils.MiraiLogger
@@ -193,13 +195,14 @@ internal class JvmPluginDependencyDownloader(
 
         }
         session.setReadOnly()
+        val config = DataScope.get<PluginDependenciesConfig>()
         repositories = repository.newResolutionRepositories(
             session,
-            PluginDependenciesConfig.repoLoc.map { url ->
+            config.repoLoc.map { url ->
                 RemoteRepository.Builder(null, "default", url).build()
             }
         )
-        logger.debug { "Remote server: " + PluginDependenciesConfig.repoLoc }
+        logger.debug { "Remote server: " + config.repoLoc }
     }
 
     public fun resolveDependencies(deps: Collection<String>, vararg filters: DependencyFilter): DependencyResult {