 - Fixes #9641
 ### Implementation Details
- Introduces two new `DisplaySettings` sub-groups: `DisplayCoreSettings` and `DisplayInboxSettings`.
- Adds corresponding preference managers: `DisplayCoreSettingsPreferenceManager` and `DisplayInboxSettingsPreferenceManager`, along with their implementations.
- Updates the dependency graph to reflect these changes.
- Adjusts tests to align with the new structure.
- Updates code-base to align with the new structure.

Extract DisplayCoreSettings and DisplayInboxSettings from DisplaySettings
`DisplaySettings ` currently contains a number of  properties.
To improve maintainability and prepare for further modularization, this change will  introduce two dedicated settings groups:

`DisplayCoreSettings `→ for core display configurations (e.g., theme, split view, language).

`DisplayInboxSettings `→ for inbox and message list–specific display preferences.

This refactor will make `DisplaySettings` slimmer while preserving existing defaults and functionality.

./gradlew :legacy:core:testDebugUnitTest --tests "com.fsck.k9.UnifiedInboxConfiguratorTest"

diff --git a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettings.kt b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettings.kt
index 1bf3151cc14..4dd6fcab72d 100644
--- a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettings.kt
+++ b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettings.kt
@@ -1,56 +1,32 @@
 package net.thunderbird.core.preference.display

-import net.thunderbird.core.preference.AppTheme
-import net.thunderbird.core.preference.SplitViewMode
-import net.thunderbird.core.preference.SubTheme
+import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettings
+import net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettings

-const val DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME = true
-const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX = false
-const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT = false
-const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR = true
 const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_ANIMATION = true
 const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CORRESPONDENT_NAMES = true
-val DISPLAY_SETTINGS_DEFAULT_APP_THEME = AppTheme.FOLLOW_SYSTEM
 const val DISPLAY_SETTINGS_DEFAULT_SHOW_RECENT_CHANGES = true
-val DISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME = SubTheme.USE_GLOBAL
-val DISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME = SubTheme.USE_GLOBAL
 const val DISPLAY_SETTINGS_DEFAULT_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG = true
-const val DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT = false
 const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_NAME = false
 const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_PICTURE = true
 const val DISPLAY_SETTINGS_DEFAULT_IS_CHANGE_CONTACT_NAME_COLOR = true
 const val DISPLAY_SETTINGS_DEFAULT_IS_COLORIZE_MISSING_CONTACT_PICTURE = false
 const val DISPLAY_SETTINGS_DEFAULT_IS_USE_BACKGROUND_AS_INDICATOR = false
-const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST = true
-const val DISPLAY_SETTINGS_DEFAULT_IS_THREAD_VIEW_ENABLED = true
 const val DISPLAY_SETTINGS_DEFAULT_IS_USE_MESSAGE_VIEW_FIXED_WIDTH_FONT = false
 const val DISPLAY_SETTINGS_DEFAULT_IS_AUTO_FIT_WIDTH = true
-const val DISPLAY_SETTINGS_DEFAULT_APP_LANGUAGE = ""
-
-val DISPLAY_SETTINGS_DEFAULT_SPLIT_VIEW_MODE = SplitViewMode.NEVER

 data class DisplaySettings(
-    val fixedMessageViewTheme: Boolean = DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME,
-    val isShowUnifiedInbox: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX,
-    val isShowStarredCount: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT,
-    val isShowMessageListStars: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR,
+    val coreSettings: DisplayCoreSettings = DisplayCoreSettings(),
+    val inboxSettings: DisplayInboxSettings = DisplayInboxSettings(),
     val isShowAnimations: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_ANIMATION,
     val isShowCorrespondentNames: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CORRESPONDENT_NAMES,
-    val appTheme: AppTheme = DISPLAY_SETTINGS_DEFAULT_APP_THEME,
     val showRecentChanges: Boolean = DISPLAY_SETTINGS_DEFAULT_SHOW_RECENT_CHANGES,
-    val messageViewTheme: SubTheme = DISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME,
-    val messageComposeTheme: SubTheme = DISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME,
     val shouldShowSetupArchiveFolderDialog: Boolean = DISPLAY_SETTINGS_DEFAULT_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG,
-    val isMessageListSenderAboveSubject: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
     val isShowContactName: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_NAME,
     val isShowContactPicture: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_PICTURE,
     val isChangeContactNameColor: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_CHANGE_CONTACT_NAME_COLOR,
     val isColorizeMissingContactPictures: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_COLORIZE_MISSING_CONTACT_PICTURE,
     val isUseBackgroundAsUnreadIndicator: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_USE_BACKGROUND_AS_INDICATOR,
-    val isShowComposeButtonOnMessageList: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
-    val isThreadedViewEnabled: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_THREAD_VIEW_ENABLED,
     val isUseMessageViewFixedWidthFont: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_USE_MESSAGE_VIEW_FIXED_WIDTH_FONT,
     val isAutoFitWidth: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_AUTO_FIT_WIDTH,
-    val appLanguage: String = DISPLAY_SETTINGS_DEFAULT_APP_LANGUAGE,
-    val splitViewMode: SplitViewMode = DISPLAY_SETTINGS_DEFAULT_SPLIT_VIEW_MODE,
 )
diff --git a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettingsPreferenceManager.kt b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettingsPreferenceManager.kt
index dadf2e30ee0..cc25cf9c8b9 100644
--- a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettingsPreferenceManager.kt
+++ b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/DisplaySettingsPreferenceManager.kt
@@ -2,28 +2,17 @@ package net.thunderbird.core.preference.display

 import net.thunderbird.core.preference.PreferenceManager

-const val KEY_FIXED_MESSAGE_VIEW_THEME = "fixedMessageViewTheme"
-const val KEY_SHOW_UNIFIED_INBOX = "showUnifiedInbox"
-const val KEY_SHOW_STAR_COUNT = "showStarredCount"
 const val KEY_SHOW_CONTACT_NAME = "showContactName"
 const val KEY_SHOW_CORRESPONDENT_NAMES = "showCorrespondentNames"
-const val KEY_SHOW_MESSAGE_LIST_STARS = "messageListStars"
 const val KEY_SHOW_RECENT_CHANGES = "showRecentChanges"
 const val KEY_THEME = "theme"
 const val KEY_ANIMATION = "animations"
-const val KEY_MESSAGE_VIEW_THEME = "messageViewTheme"
-const val KEY_MESSAGE_COMPOSE_THEME = "messageComposeTheme"
 const val KEY_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG = "shouldShowSetupArchiveFolderDialog"
 const val KEY_CHANGE_REGISTERED_NAME_COLOR = "changeRegisteredNameColor"
 const val KEY_COLORIZE_MISSING_CONTACT_PICTURE = "colorizeMissingContactPictures"
 const val KEY_USE_BACKGROUND_AS_UNREAD_INDICATOR = "isUseBackgroundAsUnreadIndicator"
-const val KEY_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST = "showComposeButtonOnMessageList"
-const val KEY_THREAD_VIEW_ENABLED = "isThreadedViewEnabled"
 const val KEY_MESSAGE_VIEW_FIXED_WIDTH_FONT = "messageViewFixedWidthFont"
 const val KEY_AUTO_FIT_WIDTH = "autofitWidth"
-const val KEY_MESSAGE_LIST_SENDER_ABOVE_SUBJECT = "messageListSenderAboveSubject"
 const val KEY_SHOW_CONTACT_PICTURE = "showContactPicture"
-const val KEY_APP_LANGUAGE = "language"
-const val KEY_SPLIT_VIEW_MODE = "splitViewMode"

 interface DisplaySettingsPreferenceManager : PreferenceManager<DisplaySettings>
diff --git a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DisplayCoreSettings.kt b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DisplayCoreSettings.kt
new file mode 100644
index 00000000000..9729c645b34
--- /dev/null
+++ b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DisplayCoreSettings.kt
@@ -0,0 +1,20 @@
+package net.thunderbird.core.preference.display.coreSettings
+
+import net.thunderbird.core.preference.AppTheme
+import net.thunderbird.core.preference.SplitViewMode
+import net.thunderbird.core.preference.SubTheme
+
+const val DISPLAY_SETTINGS_DEFAULT_APP_LANGUAGE = ""
+const val DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME = true
+val DISPLAY_SETTINGS_DEFAULT_APP_THEME = AppTheme.FOLLOW_SYSTEM
+val DISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME = SubTheme.USE_GLOBAL
+val DISPLAY_SETTINGS_DEFAULT_SPLIT_VIEW_MODE = SplitViewMode.NEVER
+val DISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME = SubTheme.USE_GLOBAL
+data class DisplayCoreSettings(
+    val fixedMessageViewTheme: Boolean = DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME,
+    val appTheme: AppTheme = DISPLAY_SETTINGS_DEFAULT_APP_THEME,
+    val messageViewTheme: SubTheme = DISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME,
+    val messageComposeTheme: SubTheme = DISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME,
+    val appLanguage: String = DISPLAY_SETTINGS_DEFAULT_APP_LANGUAGE,
+    val splitViewMode: SplitViewMode = DISPLAY_SETTINGS_DEFAULT_SPLIT_VIEW_MODE,
+)
diff --git a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DisplayCoreSettingsPreferenceManager.kt b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DisplayCoreSettingsPreferenceManager.kt
new file mode 100644
index 00000000000..b0d5c77cb4e
--- /dev/null
+++ b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DisplayCoreSettingsPreferenceManager.kt
@@ -0,0 +1,11 @@
+package net.thunderbird.core.preference.display.coreSettings
+
+import net.thunderbird.core.preference.PreferenceManager
+
+const val KEY_FIXED_MESSAGE_VIEW_THEME = "fixedMessageViewTheme"
+const val KEY_MESSAGE_VIEW_THEME = "messageViewTheme"
+const val KEY_MESSAGE_COMPOSE_THEME = "messageComposeTheme"
+const val KEY_APP_LANGUAGE = "language"
+const val KEY_SPLIT_VIEW_MODE = "splitViewMode"
+
+interface DisplayCoreSettingsPreferenceManager : PreferenceManager<DisplayCoreSettings>
diff --git a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DisplayInboxSettings.kt b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DisplayInboxSettings.kt
new file mode 100644
index 00000000000..6b96b56dbf3
--- /dev/null
+++ b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DisplayInboxSettings.kt
@@ -0,0 +1,17 @@
+package net.thunderbird.core.preference.display.inboxSettings
+
+const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX = false
+const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT = false
+const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR = true
+const val DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT = false
+const val DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST = true
+const val DISPLAY_SETTINGS_DEFAULT_IS_THREAD_VIEW_ENABLED = true
+
+data class DisplayInboxSettings(
+    val isShowUnifiedInbox: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX,
+    val isShowStarredCount: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT,
+    val isShowMessageListStars: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR,
+    val isMessageListSenderAboveSubject: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
+    val isShowComposeButtonOnMessageList: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
+    val isThreadedViewEnabled: Boolean = DISPLAY_SETTINGS_DEFAULT_IS_THREAD_VIEW_ENABLED,
+)
diff --git a/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DisplayInboxSettingsPreferenceManager.kt b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DisplayInboxSettingsPreferenceManager.kt
new file mode 100644
index 00000000000..e38647f74a5
--- /dev/null
+++ b/core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DisplayInboxSettingsPreferenceManager.kt
@@ -0,0 +1,12 @@
+package net.thunderbird.core.preference.display.inboxSettings
+
+import net.thunderbird.core.preference.PreferenceManager
+
+const val KEY_MESSAGE_LIST_SENDER_ABOVE_SUBJECT = "messageListSenderAboveSubject"
+const val KEY_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST = "showComposeButtonOnMessageList"
+const val KEY_SHOW_MESSAGE_LIST_STARS = "messageListStars"
+const val KEY_SHOW_STAR_COUNT = "showStarredCount"
+const val KEY_SHOW_UNIFIED_INBOX = "showUnifiedInbox"
+const val KEY_THREAD_VIEW_ENABLED = "isThreadedViewEnabled"
+
+interface DisplayInboxSettingsPreferenceManager : PreferenceManager<DisplayInboxSettings>
diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/DefaultDisplaySettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/DefaultDisplaySettingsPreferenceManager.kt
index 8e2c26520f3..93b2f4c333a 100644
--- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/DefaultDisplaySettingsPreferenceManager.kt
+++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/DefaultDisplaySettingsPreferenceManager.kt
@@ -11,10 +11,9 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 import net.thunderbird.core.logging.Logger
+import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettingsPreferenceManager
 import net.thunderbird.core.preference.storage.Storage
 import net.thunderbird.core.preference.storage.StorageEditor
-import net.thunderbird.core.preference.storage.getEnumOrDefault
-import net.thunderbird.core.preference.storage.putEnum

 private const val TAG = "DefaultDisplaySettingsPreferenceManager"

@@ -24,6 +23,7 @@ class DefaultDisplaySettingsPreferenceManager(
     private val storageEditor: StorageEditor,
     private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
     private var scope: CoroutineScope = CoroutineScope(SupervisorJob()),
+    private val coreSettingsPreferenceManager: DisplayCoreSettingsPreferenceManager,
 ) : DisplaySettingsPreferenceManager {
     private val configState: MutableStateFlow<DisplaySettings> = MutableStateFlow(value = loadConfig())
     private val mutex = Mutex()
@@ -33,32 +33,17 @@ class DefaultDisplaySettingsPreferenceManager(

     override fun save(config: DisplaySettings) {
         logger.debug(TAG) { "save() called with: config = $config" }
+        coreSettingsPreferenceManager.save(config.coreSettings)
         writeConfig(config)
         configState.update { config }
     }

     private fun loadConfig(): DisplaySettings = DisplaySettings(
-        fixedMessageViewTheme = storage.getBoolean(
-            KEY_FIXED_MESSAGE_VIEW_THEME,
-            DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME,
-        ),
-        isShowUnifiedInbox = storage.getBoolean(
-            KEY_SHOW_UNIFIED_INBOX,
-            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX,
-        ),
+        coreSettings = coreSettingsPreferenceManager.getConfig(),
         showRecentChanges = storage.getBoolean(
             KEY_SHOW_RECENT_CHANGES,
             DISPLAY_SETTINGS_DEFAULT_SHOW_RECENT_CHANGES,
         ),
-        appTheme = storage.getEnumOrDefault(KEY_THEME, DISPLAY_SETTINGS_DEFAULT_APP_THEME),
-        messageViewTheme = storage.getEnumOrDefault(
-            KEY_MESSAGE_VIEW_THEME,
-            DISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME,
-        ),
-        messageComposeTheme = storage.getEnumOrDefault(
-            KEY_MESSAGE_COMPOSE_THEME,
-            DISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME,
-        ),
         shouldShowSetupArchiveFolderDialog = storage.getBoolean(
             KEY_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG,
             DISPLAY_SETTINGS_DEFAULT_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG,
@@ -75,14 +60,6 @@ class DefaultDisplaySettingsPreferenceManager(
             KEY_USE_BACKGROUND_AS_UNREAD_INDICATOR,
             DISPLAY_SETTINGS_DEFAULT_IS_USE_BACKGROUND_AS_INDICATOR,
         ),
-        isShowComposeButtonOnMessageList = storage.getBoolean(
-            KEY_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
-            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
-        ),
-        isThreadedViewEnabled = storage.getBoolean(
-            KEY_THREAD_VIEW_ENABLED,
-            DISPLAY_SETTINGS_DEFAULT_IS_THREAD_VIEW_ENABLED,
-        ),
         isUseMessageViewFixedWidthFont = storage.getBoolean(
             KEY_MESSAGE_VIEW_FIXED_WIDTH_FONT,
             DISPLAY_SETTINGS_DEFAULT_IS_USE_MESSAGE_VIEW_FIXED_WIDTH_FONT,
@@ -91,14 +68,6 @@ class DefaultDisplaySettingsPreferenceManager(
             KEY_AUTO_FIT_WIDTH,
             DISPLAY_SETTINGS_DEFAULT_IS_AUTO_FIT_WIDTH,
         ),
-        isShowStarredCount = storage.getBoolean(
-            KEY_SHOW_STAR_COUNT,
-            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT,
-        ),
-        isShowMessageListStars = storage.getBoolean(
-            KEY_SHOW_MESSAGE_LIST_STARS,
-            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR,
-        ),
         isShowAnimations = storage.getBoolean(
             KEY_ANIMATION,
             DISPLAY_SETTINGS_DEFAULT_IS_SHOW_ANIMATION,
@@ -107,10 +76,6 @@ class DefaultDisplaySettingsPreferenceManager(
             KEY_SHOW_CORRESPONDENT_NAMES,
             DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CORRESPONDENT_NAMES,
         ),
-        isMessageListSenderAboveSubject = storage.getBoolean(
-            KEY_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
-            DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
-        ),
         isShowContactName = storage.getBoolean(
             KEY_SHOW_CONTACT_NAME,
             DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_NAME,
@@ -119,31 +84,12 @@ class DefaultDisplaySettingsPreferenceManager(
             KEY_SHOW_CONTACT_PICTURE,
             DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_PICTURE,
         ),
-        appLanguage = storage.getStringOrDefault(
-            KEY_APP_LANGUAGE,
-            DISPLAY_SETTINGS_DEFAULT_APP_LANGUAGE,
-        ),
-        splitViewMode = storage.getEnumOrDefault(
-            KEY_SPLIT_VIEW_MODE,
-            DISPLAY_SETTINGS_DEFAULT_SPLIT_VIEW_MODE,
-        ),
     )

     private fun writeConfig(config: DisplaySettings) {
         logger.debug(TAG) { "writeConfig() called with: config = $config" }
         scope.launch(ioDispatcher) {
             mutex.withLock {
-                storageEditor.putEnum(KEY_THEME, config.appTheme)
-                storageEditor.putEnum(KEY_MESSAGE_VIEW_THEME, config.messageViewTheme)
-                storageEditor.putEnum(
-                    KEY_MESSAGE_COMPOSE_THEME,
-                    config.messageComposeTheme,
-                )
-                storageEditor.putBoolean(
-                    KEY_FIXED_MESSAGE_VIEW_THEME,
-                    config.fixedMessageViewTheme,
-                )
-                storageEditor.putBoolean(KEY_SHOW_UNIFIED_INBOX, config.isShowUnifiedInbox)
                 storageEditor.putBoolean(
                     KEY_CHANGE_REGISTERED_NAME_COLOR,
                     config.isChangeContactNameColor,
@@ -156,20 +102,11 @@ class DefaultDisplaySettingsPreferenceManager(
                     KEY_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG,
                     config.shouldShowSetupArchiveFolderDialog,
                 )
-                storageEditor.putBoolean(KEY_SHOW_STAR_COUNT, config.isShowStarredCount)
                 storageEditor.putBoolean(KEY_SHOW_CONTACT_NAME, config.isShowContactName)
-                storageEditor.putBoolean(
-                    KEY_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
-                    config.isMessageListSenderAboveSubject,
-                )
                 storageEditor.putBoolean(
                     KEY_SHOW_CORRESPONDENT_NAMES,
                     config.isShowCorrespondentNames,
                 )
-                storageEditor.putBoolean(
-                    KEY_SHOW_MESSAGE_LIST_STARS,
-                    config.isShowMessageListStars,
-                )
                 storageEditor.putBoolean(KEY_SHOW_RECENT_CHANGES, config.showRecentChanges)
                 storageEditor.putBoolean(KEY_ANIMATION, config.isShowAnimations)
                 storageEditor.putBoolean(
@@ -180,21 +117,11 @@ class DefaultDisplaySettingsPreferenceManager(
                     KEY_USE_BACKGROUND_AS_UNREAD_INDICATOR,
                     config.isUseBackgroundAsUnreadIndicator,
                 )
-                storageEditor.putBoolean(
-                    KEY_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
-                    config.isShowComposeButtonOnMessageList,
-                )
-                storageEditor.putBoolean(
-                    KEY_THREAD_VIEW_ENABLED,
-                    config.isThreadedViewEnabled,
-                )
                 storageEditor.putBoolean(
                     KEY_MESSAGE_VIEW_FIXED_WIDTH_FONT,
                     config.isUseMessageViewFixedWidthFont,
                 )
                 storageEditor.putBoolean(KEY_AUTO_FIT_WIDTH, config.isAutoFitWidth)
-                storageEditor.putString(KEY_APP_LANGUAGE, config.appLanguage)
-                storageEditor.putEnum(KEY_SPLIT_VIEW_MODE, config.splitViewMode)
                 storageEditor.commit().also { commited ->
                     logger.verbose(TAG) { "writeConfig: storageEditor.commit() resulted in: $commited" }
                 }
diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt
new file mode 100644
index 00000000000..eb93c0bd8b4
--- /dev/null
+++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt
@@ -0,0 +1,89 @@
+package net.thunderbird.core.preference.display.coreSettings
+
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+import net.thunderbird.core.logging.Logger
+import net.thunderbird.core.preference.display.KEY_THEME
+import net.thunderbird.core.preference.storage.Storage
+import net.thunderbird.core.preference.storage.StorageEditor
+import net.thunderbird.core.preference.storage.getEnumOrDefault
+import net.thunderbird.core.preference.storage.putEnum
+
+private const val TAG = "DefaultDisplayCoreSettingsPreferenceManager"
+
+class DefaultDisplayCoreSettingsPreferenceManager(
+    private val logger: Logger,
+    private val storage: Storage,
+    private val storageEditor: StorageEditor,
+    private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
+    private var scope: CoroutineScope = CoroutineScope(SupervisorJob()),
+) : DisplayCoreSettingsPreferenceManager {
+
+    private val configState: MutableStateFlow<DisplayCoreSettings> = MutableStateFlow(value = loadConfig())
+    private val mutex = Mutex()
+
+    override fun getConfig(): DisplayCoreSettings = configState.value
+
+    override fun getConfigFlow(): Flow<DisplayCoreSettings> = configState
+
+    override fun save(config: DisplayCoreSettings) {
+        logger.debug(TAG) { "save() called with: config = $config" }
+        writeConfig(config)
+        configState.update { config }
+    }
+
+    private fun loadConfig(): DisplayCoreSettings = DisplayCoreSettings(
+        fixedMessageViewTheme = storage.getBoolean(
+            KEY_FIXED_MESSAGE_VIEW_THEME,
+            DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME,
+        ),
+        appTheme = storage.getEnumOrDefault(KEY_THEME, DISPLAY_SETTINGS_DEFAULT_APP_THEME),
+        messageViewTheme = storage.getEnumOrDefault(
+            KEY_MESSAGE_VIEW_THEME,
+            DISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME,
+        ),
+        messageComposeTheme = storage.getEnumOrDefault(
+            KEY_MESSAGE_COMPOSE_THEME,
+            DISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME,
+        ),
+        appLanguage = storage.getStringOrDefault(
+            KEY_APP_LANGUAGE,
+            DISPLAY_SETTINGS_DEFAULT_APP_LANGUAGE,
+        ),
+        splitViewMode = storage.getEnumOrDefault(
+            KEY_SPLIT_VIEW_MODE,
+            DISPLAY_SETTINGS_DEFAULT_SPLIT_VIEW_MODE,
+        ),
+    )
+
+    private fun writeConfig(config: DisplayCoreSettings) {
+        logger.debug(TAG) { "writeConfig() called with: config = $config" }
+        scope.launch(ioDispatcher) {
+            mutex.withLock {
+                storageEditor.putEnum(KEY_THEME, config.appTheme)
+                storageEditor.putEnum(KEY_MESSAGE_VIEW_THEME, config.messageViewTheme)
+                storageEditor.putEnum(
+                    KEY_MESSAGE_COMPOSE_THEME,
+                    config.messageComposeTheme,
+                )
+                storageEditor.putBoolean(
+                    KEY_FIXED_MESSAGE_VIEW_THEME,
+                    config.fixedMessageViewTheme,
+                )
+                storageEditor.putString(KEY_APP_LANGUAGE, config.appLanguage)
+                storageEditor.putEnum(KEY_SPLIT_VIEW_MODE, config.splitViewMode)
+                storageEditor.commit().also { commited ->
+                    logger.verbose(TAG) { "writeConfig: storageEditor.commit() resulted in: $commited" }
+                }
+            }
+        }
+    }
+}
diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt
new file mode 100644
index 00000000000..525a1e04718
--- /dev/null
+++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt
@@ -0,0 +1,95 @@
+package net.thunderbird.core.preference.display.inboxSettings
+
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+import net.thunderbird.core.logging.Logger
+import net.thunderbird.core.preference.storage.Storage
+import net.thunderbird.core.preference.storage.StorageEditor
+
+private const val TAG = "DefaultDisplayInboxSettingsPreferenceManager"
+
+class DefaultDisplayInboxSettingsPreferenceManager(
+    private val logger: Logger,
+    private val storage: Storage,
+    private val storageEditor: StorageEditor,
+    private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
+    private var scope: CoroutineScope = CoroutineScope(SupervisorJob()),
+) : DisplayInboxSettingsPreferenceManager {
+
+    private val configState: MutableStateFlow<DisplayInboxSettings> = MutableStateFlow(value = loadConfig())
+    private val mutex = Mutex()
+
+    override fun getConfig(): DisplayInboxSettings = configState.value
+
+    override fun getConfigFlow(): Flow<DisplayInboxSettings> = configState
+
+    override fun save(config: DisplayInboxSettings) {
+        logger.debug(TAG) { "save() called with: config = $config" }
+        writeConfig(config)
+        configState.update { config }
+    }
+
+    private fun loadConfig(): DisplayInboxSettings = DisplayInboxSettings(
+        isShowUnifiedInbox = storage.getBoolean(
+            KEY_SHOW_UNIFIED_INBOX,
+            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX,
+        ),
+        isShowComposeButtonOnMessageList = storage.getBoolean(
+            KEY_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
+            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
+        ),
+        isThreadedViewEnabled = storage.getBoolean(
+            KEY_THREAD_VIEW_ENABLED,
+            DISPLAY_SETTINGS_DEFAULT_IS_THREAD_VIEW_ENABLED,
+        ),
+        isShowStarredCount = storage.getBoolean(
+            KEY_SHOW_STAR_COUNT,
+            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT,
+        ),
+        isShowMessageListStars = storage.getBoolean(
+            KEY_SHOW_MESSAGE_LIST_STARS,
+            DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR,
+        ),
+        isMessageListSenderAboveSubject = storage.getBoolean(
+            KEY_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
+            DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
+        ),
+    )
+
+    private fun writeConfig(config: DisplayInboxSettings) {
+        logger.debug(TAG) { "writeConfig() called with: config = $config" }
+        scope.launch(ioDispatcher) {
+            mutex.withLock {
+                storageEditor.putBoolean(
+                    KEY_MESSAGE_LIST_SENDER_ABOVE_SUBJECT,
+                    config.isMessageListSenderAboveSubject,
+                )
+                storageEditor.putBoolean(
+                    KEY_SHOW_MESSAGE_LIST_STARS,
+                    config.isShowMessageListStars,
+                )
+                storageEditor.putBoolean(
+                    KEY_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST,
+                    config.isShowComposeButtonOnMessageList,
+                )
+                storageEditor.putBoolean(
+                    KEY_THREAD_VIEW_ENABLED,
+                    config.isThreadedViewEnabled,
+                )
+                storageEditor.putBoolean(KEY_SHOW_UNIFIED_INBOX, config.isShowUnifiedInbox)
+                storageEditor.putBoolean(KEY_SHOW_STAR_COUNT, config.isShowStarredCount)
+                storageEditor.commit().also { commited ->
+                    logger.verbose(TAG) { "writeConfig: storageEditor.commit() resulted in: $commited" }
+                }
+            }
+        }
+    }
+}
diff --git a/core/ui/theme/manager/src/main/java/net/thunderbird/core/ui/theme/manager/ThemeManager.kt b/core/ui/theme/manager/src/main/java/net/thunderbird/core/ui/theme/manager/ThemeManager.kt
index b528ff7c759..8bc7ab0d94b 100644
--- a/core/ui/theme/manager/src/main/java/net/thunderbird/core/ui/theme/manager/ThemeManager.kt
+++ b/core/ui/theme/manager/src/main/java/net/thunderbird/core/ui/theme/manager/ThemeManager.kt
@@ -31,28 +31,28 @@ class ThemeManager(
         get() = generalSettingsManager.getConfig()

     override val appTheme: Theme
-        get() = when (generalSettings.display.appTheme) {
+        get() = when (generalSettings.display.coreSettings.appTheme) {
             AppTheme.LIGHT -> Theme.LIGHT
             AppTheme.DARK -> Theme.DARK
             AppTheme.FOLLOW_SYSTEM -> getSystemTheme()
         }

     override val messageViewTheme: Theme
-        get() = resolveTheme(generalSettings.display.messageViewTheme)
+        get() = resolveTheme(generalSettings.display.coreSettings.messageViewTheme)

     override val messageComposeTheme: Theme
-        get() = resolveTheme(generalSettings.display.messageComposeTheme)
+        get() = resolveTheme(generalSettings.display.coreSettings.messageComposeTheme)

     @get:StyleRes
     override val appThemeResourceId: Int = themeProvider.appThemeResourceId

     @get:StyleRes
     override val messageViewThemeResourceId: Int
-        get() = getSubThemeResourceId(generalSettings.display.messageViewTheme)
+        get() = getSubThemeResourceId(generalSettings.display.coreSettings.messageViewTheme)

     @get:StyleRes
     override val messageComposeThemeResourceId: Int
-        get() = getSubThemeResourceId(generalSettings.display.messageComposeTheme)
+        get() = getSubThemeResourceId(generalSettings.display.coreSettings.messageComposeTheme)

     @get:StyleRes
     override val dialogThemeResourceId: Int = themeProvider.dialogThemeResourceId
@@ -62,7 +62,7 @@ class ThemeManager(

     fun init() {
         generalSettingsManager.getSettingsFlow()
-            .map { it.display.appTheme }
+            .map { it.display.coreSettings.appTheme }
             .distinctUntilChanged()
             .onEach {
                 updateAppTheme(it)
@@ -82,11 +82,23 @@ class ThemeManager(
     fun toggleMessageViewTheme() {
         if (messageViewTheme === Theme.DARK) {
             generalSettingsManager.update { settings ->
-                settings.copy(display = settings.display.copy(messageViewTheme = SubTheme.LIGHT))
+                settings.copy(
+                    display = settings.display.copy(
+                        coreSettings = settings.display.coreSettings.copy(
+                            messageViewTheme = SubTheme.LIGHT,
+                        ),
+                    ),
+                )
             }
         } else {
             generalSettingsManager.update { settings ->
-                settings.copy(display = settings.display.copy(messageViewTheme = SubTheme.DARK))
+                settings.copy(
+                    display = settings.display.copy(
+                        coreSettings = settings.display.coreSettings.copy(
+                            messageViewTheme = SubTheme.DARK,
+                        ),
+                    ),
+                )
             }
         }
     }
diff --git a/feature/widget/message-list-glance/src/main/kotlin/net/thunderbird/feature/widget/message/list/MessageListWidget.kt b/feature/widget/message-list-glance/src/main/kotlin/net/thunderbird/feature/widget/message/list/MessageListWidget.kt
index c98d8ef5d2a..9172e5a73ae 100644
--- a/feature/widget/message-list-glance/src/main/kotlin/net/thunderbird/feature/widget/message/list/MessageListWidget.kt
+++ b/feature/widget/message-list-glance/src/main/kotlin/net/thunderbird/feature/widget/message/list/MessageListWidget.kt
@@ -49,7 +49,7 @@ internal class MessageListWidget : GlanceAppWidget(), KoinComponent {
                     val messageListConfig = MessageListConfig(
                         search = unifiedInboxSearch,
                         showingThreadedList = generalSettingsManager.getConfig()
-                            .display.isThreadedViewEnabled,
+                            .display.inboxSettings.isThreadedViewEnabled,
                         sortType = SortType.SORT_DATE,
                         sortAscending = false,
                         sortDateAscending = false,
diff --git a/feature/widget/message-list/src/main/kotlin/app/k9mail/feature/widget/message/list/MessageListRemoteViewFactory.kt b/feature/widget/message-list/src/main/kotlin/app/k9mail/feature/widget/message/list/MessageListRemoteViewFactory.kt
index 3535e89d5d6..c9ac7eba15a 100644
--- a/feature/widget/message-list/src/main/kotlin/app/k9mail/feature/widget/message/list/MessageListRemoteViewFactory.kt
+++ b/feature/widget/message-list/src/main/kotlin/app/k9mail/feature/widget/message/list/MessageListRemoteViewFactory.kt
@@ -36,7 +36,7 @@ internal class MessageListRemoteViewFactory(private val context: Context) : Remo
             unifiedInboxDetail = coreResourceProvider.searchUnifiedInboxDetail(),
         ).relatedSearch

-        senderAboveSubject = generalSettingsManager.getConfig().display.isMessageListSenderAboveSubject
+        senderAboveSubject = generalSettingsManager.getConfig().display.inboxSettings.isMessageListSenderAboveSubject
         readTextColor = ContextCompat.getColor(context, R.color.message_list_widget_text_read)
         unreadTextColor = ContextCompat.getColor(context, R.color.message_list_widget_text_unread)
     }
@@ -49,7 +49,10 @@ internal class MessageListRemoteViewFactory(private val context: Context) : Remo
         // TODO: Use same sort order that is used for the Unified Inbox inside the app
         val messageListConfig = MessageListConfig(
             search = unifiedInboxSearch,
-            showingThreadedList = generalSettingsManager.getConfig().display.isThreadedViewEnabled,
+            showingThreadedList = generalSettingsManager.getConfig()
+                .display
+                .inboxSettings
+                .isThreadedViewEnabled,
             sortType = SortType.SORT_DATE,
             sortAscending = false,
             sortDateAscending = false,
diff --git a/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationActionCreator.kt b/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationActionCreator.kt
index f30fcb54447..00b27aad37a 100644
--- a/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationActionCreator.kt
+++ b/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationActionCreator.kt
@@ -41,7 +41,8 @@ internal class K9NotificationActionCreator(

     override fun createViewMessagePendingIntent(messageReference: MessageReference): PendingIntent {
         val openInUnifiedInbox =
-            generalSettingsManager.getConfig().display.isShowUnifiedInbox && isIncludedInUnifiedInbox(messageReference)
+            generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox &&
+                isIncludedInUnifiedInbox(messageReference)
         val intent = createMessageViewIntent(messageReference, openInUnifiedInbox)

         return PendingIntentCompat.getActivity(context, 0, intent, FLAG_UPDATE_CURRENT, false)!!
@@ -58,7 +59,10 @@ internal class K9NotificationActionCreator(
     ): PendingIntent {
         val folderIds = extractFolderIds(messageReferences)

-        val intent = if (generalSettingsManager.getConfig().display.isShowUnifiedInbox &&
+        val intent = if (generalSettingsManager.getConfig()
+                .display
+                .inboxSettings
+                .isShowUnifiedInbox &&
             areAllIncludedInUnifiedInbox(account, folderIds)
         ) {
             createUnifiedInboxIntent(account)
diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultDrawerConfigManager.kt b/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultDrawerConfigManager.kt
index 91627c0b987..88a88211454 100644
--- a/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultDrawerConfigManager.kt
+++ b/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultDrawerConfigManager.kt
@@ -10,22 +10,22 @@ import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.flow.update
-import net.thunderbird.core.preference.display.DisplaySettingsPreferenceManager
+import net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsPreferenceManager
 import net.thunderbird.core.preference.update
 import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract.DrawerConfig

 internal class DefaultDrawerConfigManager(
     private val preferences: Preferences,
     coroutineScope: CoroutineScope,
-    private val displaySettingsPreferenceManager: DisplaySettingsPreferenceManager,
+    private val displayInboxSettingsPreferenceManager: DisplayInboxSettingsPreferenceManager,
 ) : DrawerConfigManager {
     private val showAccountSelector = MutableStateFlow(K9.isShowAccountSelector)
     private val drawerConfig: StateFlow<DrawerConfig> = showAccountSelector
-        .combine(displaySettingsPreferenceManager.getConfigFlow()) { showAccSelector, displaySettings ->
+        .combine(displayInboxSettingsPreferenceManager.getConfigFlow()) { showAccSelector, displayInboxSettings ->
             DrawerConfig(
                 showAccountSelector = showAccSelector,
-                showStarredCount = displaySettings.isShowStarredCount,
-                showUnifiedFolders = displaySettings.isShowUnifiedInbox,
+                showStarredCount = displayInboxSettings.isShowStarredCount,
+                showUnifiedFolders = displayInboxSettings.isShowUnifiedInbox,
             )
         }
         .stateIn(
@@ -39,7 +39,7 @@ internal class DefaultDrawerConfigManager(
         )

     override fun save(config: DrawerConfig) {
-        displaySettingsPreferenceManager.update {
+        displayInboxSettingsPreferenceManager.update {
             it.copy(
                 isShowStarredCount = config.showStarredCount,
                 isShowUnifiedInbox = config.showUnifiedFolders,
diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultGeneralSettingsManager.kt b/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultGeneralSettingsManager.kt
index 86953582565..317eac4886a 100644
--- a/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultGeneralSettingsManager.kt
+++ b/legacy/core/src/main/java/com/fsck/k9/preferences/DefaultGeneralSettingsManager.kt
@@ -19,6 +19,8 @@ import net.thunderbird.core.preference.GeneralSettingsManager
 import net.thunderbird.core.preference.PreferenceChangePublisher
 import net.thunderbird.core.preference.debugging.DebuggingSettingsPreferenceManager
 import net.thunderbird.core.preference.display.DisplaySettingsPreferenceManager
+import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettingsPreferenceManager
+import net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsPreferenceManager
 import net.thunderbird.core.preference.network.NetworkSettingsPreferenceManager
 import net.thunderbird.core.preference.notification.NotificationPreferenceManager
 import net.thunderbird.core.preference.privacy.PrivacySettingsPreferenceManager
@@ -41,6 +43,8 @@ internal class DefaultGeneralSettingsManager(
     private val privacySettingsPreferenceManager: PrivacySettingsPreferenceManager,
     private val notificationPreferenceManager: NotificationPreferenceManager,
     private val displaySettingsSettingsPreferenceManager: DisplaySettingsPreferenceManager,
+    private val displayCoreSettingsPreferenceManager: DisplayCoreSettingsPreferenceManager,
+    private val displayInboxSettingsPreferenceManager: DisplayInboxSettingsPreferenceManager,
     private val networkSettingsPreferenceManager: NetworkSettingsPreferenceManager,
     private val debuggingSettingsPreferenceManager: DebuggingSettingsPreferenceManager,
     private val debugLogConfigurator: DebugLogConfigurator,
@@ -66,6 +70,16 @@ internal class DefaultGeneralSettingsManager(
                 display = displaySettings,
             )
         }
+        .combine(displayCoreSettingsPreferenceManager.getConfigFlow()) { generalSettings, coreSettings ->
+            generalSettings.copy(
+                display = generalSettings.display.copy(coreSettings = coreSettings),
+            )
+        }
+        .combine(displayInboxSettingsPreferenceManager.getConfigFlow()) { generalSettings, inboxSettings ->
+            generalSettings.copy(
+                display = generalSettings.display.copy(inboxSettings = inboxSettings),
+            )
+        }
         .combine(networkSettingsPreferenceManager.getConfigFlow()) { generalSettings, networkSettings ->
             generalSettings.copy(
                 network = networkSettings,
@@ -125,6 +139,8 @@ internal class DefaultGeneralSettingsManager(
                 privacySettingsPreferenceManager.save(config.privacy)
                 notificationPreferenceManager.save(config.notification)
                 displaySettingsSettingsPreferenceManager.save(config.display)
+                displayCoreSettingsPreferenceManager.save(config.display.coreSettings)
+                displayInboxSettingsPreferenceManager.save(config.display.inboxSettings)
                 networkSettingsPreferenceManager.save(config.network)
                 debuggingSettingsPreferenceManager.save(config.debugging)
             }
diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java b/legacy/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java
index 0a2b0335244..30c06f12173 100644
--- a/legacy/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java
+++ b/legacy/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java
@@ -41,26 +41,25 @@
 import net.thunderbird.core.preference.GeneralSettingsManager;
 import net.thunderbird.core.preference.SplitViewMode;
 import net.thunderbird.core.preference.SubTheme;
-import net.thunderbird.core.preference.display.DisplaySettingsKt;
+import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettingsKt;
 import net.thunderbird.core.preference.network.NetworkSettingsKt;
 import net.thunderbird.core.preference.storage.Storage;

 import static com.fsck.k9.K9.LockScreenNotificationVisibility;
-import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_AUTO_FIT_WIDTH;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_CHANGE_CONTACT_NAME_COLOR;
-import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_ANIMATION;
-import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_NAME;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_PICTURE;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CORRESPONDENT_NAMES;
-import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR;
-import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT;
-import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_USE_MESSAGE_VIEW_FIXED_WIDTH_FONT;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_SHOULD_SHOW_SETUP_ARCHIVE_FOLDER_DIALOG;
 import static net.thunderbird.core.preference.display.DisplaySettingsKt.DISPLAY_SETTINGS_DEFAULT_SHOW_RECENT_CHANGES;
+import static net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_MESSAGE_LIST_SENDER_ABOVE_SUBJECT;
+import static net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_COMPOSE_BUTTON_ON_MESSAGE_LIST;
+import static net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_MESSAGE_LIST_STAR;
+import static net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_STAR_COUNT;
+import static net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsKt.DISPLAY_SETTINGS_DEFAULT_IS_SHOW_UNIFIED_INBOX;
 import static net.thunderbird.core.preference.notification.NotificationPreferenceKt.NOTIFICATION_PREFERENCE_DEFAULT_IS_QUIET_TIME_ENABLED;
 import static net.thunderbird.core.preference.notification.NotificationPreferenceKt.NOTIFICATION_PREFERENCE_DEFAULT_QUIET_TIME_END;
 import static net.thunderbird.core.preference.notification.NotificationPreferenceKt.NOTIFICATION_PREFERENCE_DEFAULT_QUIET_TIME_STARTS;
@@ -212,11 +211,11 @@ class GeneralSettingsDescriptions {
         ));
         s.put("theme", Settings.versions(
             new V(1, new LegacyThemeSetting(AppTheme.LIGHT)),
-            new V(58, new ThemeSetting(DisplaySettingsKt.getDISPLAY_SETTINGS_DEFAULT_APP_THEME()))
+            new V(58, new ThemeSetting(DisplayCoreSettingsKt.getDISPLAY_SETTINGS_DEFAULT_APP_THEME()))
         ));
         s.put("messageViewTheme", Settings.versions(
             new V(16, new LegacyThemeSetting(AppTheme.LIGHT)),
-            new V(24, new SubThemeSetting(DisplaySettingsKt.getDISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME()))
+            new V(24, new SubThemeSetting(DisplayCoreSettingsKt.getDISPLAY_SETTINGS_DEFAULT_MESSAGE_VIEW_THEME()))
         ));
         s.put("useVolumeKeysForNavigation", Settings.versions(
             new V(1, new BooleanSetting(false))
@@ -232,10 +231,10 @@ class GeneralSettingsDescriptions {
             new V(23, new EnumSetting<>(SplitViewMode.class, SplitViewMode.NEVER))
         ));
         s.put("messageComposeTheme", Settings.versions(
-            new V(24, new SubThemeSetting(DisplaySettingsKt.getDISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME()))
+            new V(24, new SubThemeSetting(DisplayCoreSettingsKt.getDISPLAY_SETTINGS_DEFAULT_MESSAGE_COMPOSE_THEME()))
         ));
         s.put("fixedMessageViewTheme", Settings.versions(
-            new V(24, new BooleanSetting(DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME))
+            new V(24, new BooleanSetting(DisplayCoreSettingsKt.DISPLAY_SETTINGS_DEFAULT_FIXED_MESSAGE_VIEW_THEME))
         ));
         s.put("showContactPicture", Settings.versions(
             new V(25, new BooleanSetting(DISPLAY_SETTINGS_DEFAULT_IS_SHOW_CONTACT_PICTURE))
diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt b/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt
index 2cda0b84a69..e3505358661 100644
--- a/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt
+++ b/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt
@@ -11,6 +11,10 @@ import net.thunderbird.core.preference.debugging.DebuggingSettingsPreferenceMana
 import net.thunderbird.core.preference.debugging.DefaultDebuggingSettingsPreferenceManager
 import net.thunderbird.core.preference.display.DefaultDisplaySettingsPreferenceManager
 import net.thunderbird.core.preference.display.DisplaySettingsPreferenceManager
+import net.thunderbird.core.preference.display.coreSettings.DefaultDisplayCoreSettingsPreferenceManager
+import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettingsPreferenceManager
+import net.thunderbird.core.preference.display.inboxSettings.DefaultDisplayInboxSettingsPreferenceManager
+import net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsPreferenceManager
 import net.thunderbird.core.preference.network.DefaultNetworkSettingsPreferenceManager
 import net.thunderbird.core.preference.network.NetworkSettingsPreferenceManager
 import net.thunderbird.core.preference.notification.DefaultNotificationPreferenceManager
@@ -52,11 +56,26 @@ val preferencesModule = module {
             storageEditor = get<Preferences>().createStorageEditor(),
         )
     }
+    single<DisplayCoreSettingsPreferenceManager> {
+        DefaultDisplayCoreSettingsPreferenceManager(
+            logger = get(),
+            storage = get<Preferences>().storage,
+            storageEditor = get<Preferences>().createStorageEditor(),
+        )
+    }
+    single<DisplayInboxSettingsPreferenceManager> {
+        DefaultDisplayInboxSettingsPreferenceManager(
+            logger = get(),
+            storage = get<Preferences>().storage,
+            storageEditor = get<Preferences>().createStorageEditor(),
+        )
+    }
     single<DisplaySettingsPreferenceManager> {
         DefaultDisplaySettingsPreferenceManager(
             logger = get(),
             storage = get<Preferences>().storage,
             storageEditor = get<Preferences>().createStorageEditor(),
+            coreSettingsPreferenceManager = get(),
         )
     }
     single<NetworkSettingsPreferenceManager> {
@@ -87,6 +106,8 @@ val preferencesModule = module {
             privacySettingsPreferenceManager = get(),
             notificationPreferenceManager = get(),
             displaySettingsSettingsPreferenceManager = get(),
+            displayCoreSettingsPreferenceManager = get(),
+            displayInboxSettingsPreferenceManager = get(),
             networkSettingsPreferenceManager = get(),
             debuggingSettingsPreferenceManager = get(),
             debugLogConfigurator = get(),
@@ -96,7 +117,7 @@ val preferencesModule = module {
         DefaultDrawerConfigManager(
             preferences = get(),
             coroutineScope = get(named("AppCoroutineScope")),
-            displaySettingsPreferenceManager = get(),
+            displayInboxSettingsPreferenceManager = get(),
         )
     } bind DrawerConfigManager::class

diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/UnifiedInboxConfigurator.kt b/legacy/core/src/main/java/com/fsck/k9/preferences/UnifiedInboxConfigurator.kt
index 163c9def32e..a46cf4dae47 100644
--- a/legacy/core/src/main/java/com/fsck/k9/preferences/UnifiedInboxConfigurator.kt
+++ b/legacy/core/src/main/java/com/fsck/k9/preferences/UnifiedInboxConfigurator.kt
@@ -14,7 +14,13 @@ class UnifiedInboxConfigurator(
     fun configureUnifiedInbox() {
         if (accountManager.getAccounts().size == 2) {
             generalSettingsManager.update { settings ->
-                settings.copy(display = settings.display.copy(isShowUnifiedInbox = true))
+                settings.copy(
+                    display = settings.display.copy(
+                        inboxSettings = settings.display.inboxSettings.copy(
+                            isShowUnifiedInbox = true,
+                        ),
+                    ),
+                )
             }
         }
     }
diff --git a/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/AppLanguageManager.kt b/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/AppLanguageManager.kt
index c1987f77206..cb3b67f3ac2 100644
--- a/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/AppLanguageManager.kt
+++ b/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/AppLanguageManager.kt
@@ -10,7 +10,7 @@ import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
-import net.thunderbird.core.preference.display.DisplaySettingsPreferenceManager
+import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettingsPreferenceManager
 import net.thunderbird.core.preference.update

 /**
@@ -22,7 +22,7 @@ import net.thunderbird.core.preference.update
 class AppLanguageManager(
     private val systemLocaleManager: SystemLocaleManager,
     private val coroutineScope: CoroutineScope = MainScope(),
-    private val displaySettingsPreferenceManager: DisplaySettingsPreferenceManager,
+    private val displayCoreSettingsPreferenceManager: DisplayCoreSettingsPreferenceManager,
 ) {
     private var currentOverrideLocale: Locale? = null
     private val _overrideLocale = MutableSharedFlow<Locale?>(replay = 1)
@@ -43,15 +43,15 @@ class AppLanguageManager(
     fun getOverrideLocale(): Locale? = currentOverrideLocale

     fun getAppLanguage(): String {
-        return displaySettingsPreferenceManager.getConfig().appLanguage
+        return displayCoreSettingsPreferenceManager.getConfig().appLanguage
     }

     fun setAppLanguage(appLanguage: String) {
         if (appLanguage == getAppLanguage()) {
             return
         }
-        displaySettingsPreferenceManager.update { displaySettings ->
-            displaySettings.copy(appLanguage = appLanguage)
+        displayCoreSettingsPreferenceManager.update { displayCoreSettings ->
+            displayCoreSettings.copy(appLanguage = appLanguage)
         }

         setLocale(appLanguage)
diff --git a/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/KoinModule.kt b/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/KoinModule.kt
index d21b3e54bb8..2878bb87847 100644
--- a/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/KoinModule.kt
+++ b/legacy/ui/base/src/main/java/com/fsck/k9/ui/base/KoinModule.kt
@@ -14,6 +14,6 @@ val uiBaseModule = module {
             appCoroutineScope = get(named("AppCoroutineScope")),
         )
     }
-    single { AppLanguageManager(systemLocaleManager = get(), displaySettingsPreferenceManager = get()) }
+    single { AppLanguageManager(systemLocaleManager = get(), displayCoreSettingsPreferenceManager = get()) }
     single { SystemLocaleManager(context = get()) }
 }
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/AccountList.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/AccountList.kt
index 2d34f8ef014..5fb68a4203f 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/AccountList.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/AccountList.kt
@@ -76,7 +76,7 @@ abstract class AccountList : K9ListActivity(), OnItemClickListener {
     private fun populateListView(realAccounts: List<LegacyAccount>) {
         val accounts: MutableList<BaseAccount> = ArrayList()

-        if (generalSettingsManager.getConfig().display.isShowUnifiedInbox) {
+        if (generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox) {
             val unifiedInboxAccount: BaseAccount = SearchAccount.createUnifiedInboxAccount(
                 unifiedInboxTitle = coreResourceProvider.searchUnifiedInboxTitle(),
                 unifiedInboxDetail = coreResourceProvider.searchUnifiedInboxDetail(),
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt
index 8ad1d83ab79..471132d3cc7 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt
@@ -278,7 +278,11 @@ open class MessageList :
             val messageListFragment = MessageListFragment.newInstance(
                 search!!,
                 false,
-                generalSettingsManager.getConfig().display.isThreadedViewEnabled && !noThreading,
+                generalSettingsManager.getConfig()
+                    .display
+                    .inboxSettings
+                    .isThreadedViewEnabled &&
+                    !noThreading,
             )
             fragmentTransaction.add(R.id.message_list_container, messageListFragment)
             fragmentTransaction.commitNow()
@@ -327,7 +331,7 @@ open class MessageList :
     }

     private fun useSplitView(): Boolean {
-        val splitViewMode = generalSettingsManager.getConfig().display.splitViewMode
+        val splitViewMode = generalSettingsManager.getConfig().display.coreSettings.splitViewMode
         val orientation = resources.configuration.orientation
         return splitViewMode === SplitViewMode.ALWAYS ||
             splitViewMode === SplitViewMode.WHEN_IN_LANDSCAPE &&
@@ -381,7 +385,7 @@ open class MessageList :
         val launchData = decodeExtrasToLaunchData(intent)
         // If Unified Inbox was disabled show default account instead
         val search = if (launchData.search.isUnifiedInbox &&
-            !generalSettingsManager.getConfig().display.isShowUnifiedInbox
+            !generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox
         ) {
             createDefaultLocalSearch()
         } else {
@@ -542,7 +546,7 @@ open class MessageList :
         }

         // Default action
-        val search = if (generalSettingsManager.getConfig().display.isShowUnifiedInbox) {
+        val search = if (generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox) {
             createSearchAccount().relatedSearch
         } else {
             createDefaultLocalSearch()
@@ -746,7 +750,7 @@ open class MessageList :
         val messageListFragment = MessageListFragment.newInstance(
             search,
             false,
-            generalSettingsManager.getConfig().display.isThreadedViewEnabled,
+            generalSettingsManager.getConfig().display.inboxSettings.isThreadedViewEnabled,
         )
         openFolderTransaction.replace(R.id.message_list_container, messageListFragment)

@@ -782,7 +786,7 @@ open class MessageList :
             collapseSearchView()
         } else {
             if (isDrawerEnabled && account != null && supportFragmentManager.backStackEntryCount == 0) {
-                if (generalSettingsManager.getConfig().display.isShowUnifiedInbox) {
+                if (generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox) {
                     if (search!!.id != SearchAccount.UNIFIED_INBOX) {
                         openUnifiedInbox()
                     } else {
@@ -1482,7 +1486,7 @@ open class MessageList :
                 // Don't select any item in the drawer because the Unified Inbox is displayed,
                 // but not listed in the drawer
                 search.id == SearchAccount.UNIFIED_INBOX &&
-                    !generalSettingsManager.getConfig().display.isShowUnifiedInbox -> drawer.deselect()
+                    !generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox -> drawer.deselect()

                 search.id == SearchAccount.UNIFIED_INBOX -> drawer.selectUnifiedInbox()
             }
@@ -1570,6 +1574,7 @@ open class MessageList :
                 if (newTask) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
             }
         }
+
         fun createUnifiedInboxIntent(
             context: Context,
             account: LegacyAccount,
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageListActivityConfig.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageListActivityConfig.kt
index c69ac9b8bb2..51ce69d202a 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageListActivityConfig.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageListActivityConfig.kt
@@ -45,22 +45,22 @@ data class MessageListActivityConfig(
         ): MessageListActivityConfig {
             val settings = generalSettingsManager.getConfig()
             return MessageListActivityConfig(
-                appTheme = settings.display.appTheme,
-                isShowUnifiedInbox = settings.display.isShowUnifiedInbox,
-                isShowMessageListStars = settings.display.isShowMessageListStars,
+                appTheme = settings.display.coreSettings.appTheme,
+                isShowUnifiedInbox = settings.display.inboxSettings.isShowUnifiedInbox,
+                isShowMessageListStars = settings.display.inboxSettings.isShowMessageListStars,
                 isShowCorrespondentNames = settings.display.isShowCorrespondentNames,
-                isMessageListSenderAboveSubject = settings.display.isMessageListSenderAboveSubject,
+                isMessageListSenderAboveSubject = settings.display.inboxSettings.isMessageListSenderAboveSubject,
                 isShowContactName = settings.display.isShowContactName,
                 isChangeContactNameColor = settings.display.isChangeContactNameColor,
                 isShowContactPicture = settings.display.isShowContactPicture,
                 isColorizeMissingContactPictures = settings.display.isColorizeMissingContactPictures,
                 isUseBackgroundAsUnreadIndicator = settings.display.isUseBackgroundAsUnreadIndicator,
-                isShowComposeButton = settings.display.isShowComposeButtonOnMessageList,
+                isShowComposeButton = settings.display.inboxSettings.isShowComposeButtonOnMessageList,
                 contactNameColor = K9.contactNameColor,
-                messageViewTheme = settings.display.messageViewTheme,
+                messageViewTheme = settings.display.coreSettings.messageViewTheme,
                 messageListPreviewLines = K9.messageListPreviewLines,
                 messageListDensity = K9.messageListDensity,
-                splitViewMode = settings.display.splitViewMode,
+                splitViewMode = settings.display.coreSettings.splitViewMode,
                 fontSizeMessageListSubject = K9.fontSizes.messageListSubject,
                 fontSizeMessageListSender = K9.fontSizes.messageListSender,
                 fontSizeMessageListDate = K9.fontSizes.messageListDate,
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt
index b485a3d04a6..29ba4b2aecd 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt
@@ -246,7 +246,7 @@ class MessageListFragment :
              * from the fragment's arguments rather than the flow.
              */
             .drop(1)
-            .map { it.display.isThreadedViewEnabled }
+            .map { it.display.inboxSettings.isThreadedViewEnabled }
             .distinctUntilChanged()
             .onEach {
                 showingThreadedList = it
@@ -402,7 +402,10 @@ class MessageListFragment :
     }

     private fun initializeFloatingActionButton(view: View) {
-        isShowFloatingActionButton = generalSettingsManager.getConfig().display.isShowComposeButtonOnMessageList
+        isShowFloatingActionButton = generalSettingsManager.getConfig()
+            .display
+            .inboxSettings
+            .isShowComposeButtonOnMessageList
         if (isShowFloatingActionButton) {
             enableFloatingActionButton(view)
         } else {
@@ -698,8 +701,12 @@ class MessageListFragment :
         get() = MessageListAppearance(
             fontSizes = K9.fontSizes,
             previewLines = K9.messageListPreviewLines,
-            stars = !isOutbox && generalSettingsManager.getConfig().display.isShowMessageListStars,
-            senderAboveSubject = generalSettingsManager.getConfig().display.isMessageListSenderAboveSubject,
+            stars = !isOutbox && generalSettingsManager.getConfig().display.inboxSettings.isShowMessageListStars,
+            senderAboveSubject = generalSettingsManager
+                .getConfig()
+                .display
+                .inboxSettings
+                .isMessageListSenderAboveSubject,
             showContactPicture = generalSettingsManager.getConfig().display.isShowContactPicture,
             showingThreadedList = showingThreadedList,
             backGroundAsReadIndicator = generalSettingsManager.getConfig().display.isUseBackgroundAsUnreadIndicator,
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt
index 483f00bbebe..0e758ddd161 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt
@@ -319,7 +319,7 @@ class MessageViewFragment :
         menu.findItem(R.id.compose).isVisible = true

         val toggleTheme = menu.findItem(R.id.toggle_message_view_theme)
-        if (generalSettingsManager.getConfig().display.fixedMessageViewTheme) {
+        if (generalSettingsManager.getConfig().display.coreSettings.fixedMessageViewTheme) {
             toggleTheme.isVisible = false
         } else {
             // Set title of menu item to switch to dark/light theme
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt
index d630edb024b..b910bee6184 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt
@@ -27,16 +27,16 @@ class GeneralSettingsDataStore(

     override fun getBoolean(key: String, defValue: Boolean): Boolean {
         return when (key) {
-            "fixed_message_view_theme" -> generalSettingsManager.getConfig().display.fixedMessageViewTheme
+            "fixed_message_view_theme" -> generalSettingsManager.getConfig().display.coreSettings.fixedMessageViewTheme
             "animations" -> generalSettingsManager.getConfig().display.isShowAnimations
-            "show_unified_inbox" -> generalSettingsManager.getConfig().display.isShowUnifiedInbox
-            "show_starred_count" -> generalSettingsManager.getConfig().display.isShowStarredCount
-            "messagelist_stars" -> generalSettingsManager.getConfig().display.isShowMessageListStars
+            "show_unified_inbox" -> generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox
+            "show_starred_count" -> generalSettingsManager.getConfig().display.inboxSettings.isShowStarredCount
+            "messagelist_stars" -> generalSettingsManager.getConfig().display.inboxSettings.isShowMessageListStars
             "messagelist_show_correspondent_names" -> generalSettingsManager.getConfig()
                 .display.isShowCorrespondentNames

             "messagelist_sender_above_subject" -> generalSettingsManager.getConfig()
-                .display.isMessageListSenderAboveSubject
+                .display.inboxSettings.isMessageListSenderAboveSubject

             "messagelist_show_contact_name" -> generalSettingsManager.getConfig()
                 .display.isShowContactName
@@ -54,10 +54,10 @@ class GeneralSettingsDataStore(
                 .display.isUseBackgroundAsUnreadIndicator

             "show_compose_button" -> generalSettingsManager.getConfig()
-                .display.isShowComposeButtonOnMessageList
+                .display.inboxSettings.isShowComposeButtonOnMessageList

             "threaded_view" -> generalSettingsManager.getConfig()
-                .display.isThreadedViewEnabled
+                .display.inboxSettings.isThreadedViewEnabled

             "messageview_fixedwidth_font" -> generalSettingsManager.getConfig()
                 .display.isUseMessageViewFixedWidthFont
@@ -143,11 +143,17 @@ class GeneralSettingsDataStore(
     override fun getString(key: String, defValue: String?): String? {
         return when (key) {
             "language" -> appLanguageManager.getAppLanguage()
-            "theme" -> appThemeToString(generalSettingsManager.getConfig().display.appTheme)
-            "message_compose_theme" -> subThemeToString(generalSettingsManager.getConfig().display.messageComposeTheme)
-            "messageViewTheme" -> subThemeToString(generalSettingsManager.getConfig().display.messageViewTheme)
+            "theme" -> appThemeToString(generalSettingsManager.getConfig().display.coreSettings.appTheme)
+            "message_compose_theme" -> subThemeToString(
+                generalSettingsManager.getConfig().display.coreSettings.messageComposeTheme,
+            )
+
+            "messageViewTheme" -> subThemeToString(
+                generalSettingsManager.getConfig().display.coreSettings.messageViewTheme,
+            )
+
             "messagelist_preview_lines" -> K9.messageListPreviewLines.toString()
-            "splitview_mode" -> generalSettingsManager.getConfig().display.splitViewMode.name
+            "splitview_mode" -> generalSettingsManager.getConfig().display.coreSettings.splitViewMode.name
             "notification_quick_delete" -> K9.notificationQuickDeleteBehaviour.name
             "lock_screen_notification_visibility" -> K9.lockScreenNotificationVisibility.name
             "background_ops" -> generalSettingsManager.getConfig().network.backgroundOps.name
@@ -285,55 +291,108 @@ class GeneralSettingsDataStore(
     private fun setTheme(value: String) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(appTheme = stringToAppTheme(value)))
+            settings.copy(
+                display = settings.display.copy(
+                    coreSettings = settings.display.coreSettings.copy(
+                        appTheme = stringToAppTheme(value),
+                    ),
+                ),
+            )
         }
     }

     private fun setMessageComposeTheme(subThemeString: String) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(messageComposeTheme = stringToSubTheme(subThemeString)))
+            settings.copy(
+                display = settings.display.copy(
+                    coreSettings = settings.display.coreSettings.copy(
+                        messageComposeTheme = stringToSubTheme(
+                            subThemeString,
+                        ),
+                    ),
+                ),
+            )
         }
     }

     private fun setMessageViewTheme(subThemeString: String) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(messageViewTheme = stringToSubTheme(subThemeString)))
+            settings.copy(
+                display = settings.display.copy(
+                    coreSettings = settings.display.coreSettings.copy(
+                        messageViewTheme = stringToSubTheme(
+                            subThemeString,
+                        ),
+                    ),
+                ),
+            )
         }
     }
+
     private fun setSplitViewModel(mode: SplitViewMode) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(splitViewMode = mode))
+            settings.copy(
+                display = settings.display.copy(
+                    coreSettings = settings.display.coreSettings.copy(
+                        splitViewMode = mode,
+                    ),
+                ),
+            )
         }
     }

     private fun setFixedMessageViewTheme(fixedMessageViewTheme: Boolean) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(fixedMessageViewTheme = fixedMessageViewTheme))
+            settings.copy(
+                display = settings.display.copy(
+                    coreSettings = settings.display.coreSettings.copy(
+                        fixedMessageViewTheme = fixedMessageViewTheme,
+                    ),
+                ),
+            )
         }
     }

     private fun setIsShowStarredCount(isShowStarredCount: Boolean) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(isShowStarredCount = isShowStarredCount))
+            settings.copy(
+                display = settings.display.copy(
+                    inboxSettings = settings.display.inboxSettings.copy(
+                        isShowStarredCount = isShowStarredCount,
+                    ),
+                ),
+            )
         }
     }

     private fun setIsShowUnifiedInbox(isShowUnifiedInbox: Boolean) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(isShowUnifiedInbox = isShowUnifiedInbox))
+            settings.copy(
+                display = settings.display.copy(
+                    inboxSettings = settings.display.inboxSettings.copy(
+                        isShowUnifiedInbox = isShowUnifiedInbox,
+                    ),
+                ),
+            )
         }
     }

     private fun setIsShowMessageListStars(isShowMessageListStars: Boolean) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(isShowMessageListStars = isShowMessageListStars))
+            settings.copy(
+                display = settings.display.copy(
+                    inboxSettings = settings.display.inboxSettings.copy(
+                        isShowMessageListStars = isShowMessageListStars,
+                    ),
+                ),
+            )
         }
     }

@@ -355,7 +414,11 @@ class GeneralSettingsDataStore(
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
             settings.copy(
-                display = settings.display.copy(isMessageListSenderAboveSubject = isMessageListSenderAboveSubject),
+                display = settings.display.copy(
+                    inboxSettings = settings.display.inboxSettings.copy(
+                        isMessageListSenderAboveSubject = isMessageListSenderAboveSubject,
+                    ),
+                ),
             )
         }
     }
@@ -403,7 +466,11 @@ class GeneralSettingsDataStore(
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
             settings.copy(
-                display = settings.display.copy(isShowComposeButtonOnMessageList = isShowComposeButtonOnMessageList),
+                display = settings.display.copy(
+                    inboxSettings = settings.display.inboxSettings.copy(
+                        isShowComposeButtonOnMessageList = isShowComposeButtonOnMessageList,
+                    ),
+                ),
             )
         }
     }
@@ -411,7 +478,13 @@ class GeneralSettingsDataStore(
     private fun setIsThreadedViewEnabled(isThreadedViewEnabled: Boolean) {
         skipSaveSettings = true
         generalSettingsManager.update { settings ->
-            settings.copy(display = settings.display.copy(isThreadedViewEnabled = isThreadedViewEnabled))
+            settings.copy(
+                display = settings.display.copy(
+                    inboxSettings = settings.display.inboxSettings.copy(
+                        isThreadedViewEnabled = isThreadedViewEnabled,
+                    ),
+                ),
+            )
         }
     }

diff --git a/legacy/core/src/test/java/com/fsck/k9/UnifiedInboxConfiguratorTest.kt b/legacy/core/src/test/java/com/fsck/k9/UnifiedInboxConfiguratorTest.kt
index d6c202f42ad..98f4e140b7d 100644
--- a/legacy/core/src/test/java/com/fsck/k9/UnifiedInboxConfiguratorTest.kt
+++ b/legacy/core/src/test/java/com/fsck/k9/UnifiedInboxConfiguratorTest.kt
@@ -7,6 +7,7 @@ import net.thunderbird.core.android.account.AccountManager
 import net.thunderbird.core.preference.GeneralSettings
 import net.thunderbird.core.preference.GeneralSettingsManager
 import net.thunderbird.core.preference.display.DisplaySettings
+import net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettings
 import org.junit.After
 import org.junit.Before
 import org.junit.Test
@@ -29,7 +30,15 @@ class UnifiedInboxConfiguratorTest {
     fun setUp() {
         accountManager = mock(AccountManager::class.java)
         generalSettingsManager =
-            FakeGeneralSettingsManager(GeneralSettings(display = DisplaySettings(isShowUnifiedInbox = false)))
+            FakeGeneralSettingsManager(
+                GeneralSettings(
+                    display = DisplaySettings(
+                        inboxSettings = DisplayInboxSettings(
+                            isShowUnifiedInbox = false,
+                        ),
+                    ),
+                ),
+            )
         configurator = UnifiedInboxConfigurator(accountManager, generalSettingsManager)

         startKoin {
@@ -55,7 +64,7 @@ class UnifiedInboxConfiguratorTest {
         configurator.configureUnifiedInbox()

         // Then
-        assertThat(generalSettingsManager.getConfig().display.isShowUnifiedInbox).isEqualTo(true)
+        assertThat(generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox).isEqualTo(true)
     }

     @Test
@@ -67,7 +76,7 @@ class UnifiedInboxConfiguratorTest {
         configurator.configureUnifiedInbox()

         // Then
-        assertThat(generalSettingsManager.getConfig().display.isShowUnifiedInbox).isEqualTo(false)
+        assertThat(generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox).isEqualTo(false)
     }

     @Test
@@ -79,7 +88,7 @@ class UnifiedInboxConfiguratorTest {
         configurator.configureUnifiedInbox()

         // Then
-        assertThat(generalSettingsManager.getConfig().display.isShowUnifiedInbox).isEqualTo(false)
+        assertThat(generalSettingsManager.getConfig().display.inboxSettings.isShowUnifiedInbox).isEqualTo(false)
     }
 }


fix(notifications): Respect isQuietTimeEnabled

This PR restores quiet time behaviour from before #9405/TB12. It resolves problems with tests failing between 23:00 and 00:00 and modifies one of the tests, so that such regression will be caught earlier in the future (not only after 23:00).

Fixes #9629

<!-- Please ensure that your pull request meets the following requirements - thanks!

- Does not contain merge commits. Rebase instead.
- Contains commits with descriptive titles.
- New code is written in Kotlin whenever possible.
- Follows our existing codestyle (`gradlew spotlessCheck` to check and `gradlew spotlessApply` to format your source code; will be checked by CI).
- Does not break any unit tests (`gradlew testDebugUnitTest`; will be checked by CI).
- Uses a descriptive title; don't put issue numbers in there.
- Contains a reference to the issue that it fixes (e.g. _Closes #XXX_ or _Fixes #XXX_) in the body text.
- For cosmetic changes add one or multiple images, if possible.

Finally, please replace this template text with a description of the change and additional context if necessary.
-->

Quiet time always acts as enabled

Quiet time always acts as enabled
~~**Note:** This issue is based only on code analysis and problems observed in tests. I did not check if it's a problem when using the app.~~ **EDIT:** Tested, see https://github.com/thunderbird/thunderbird-android/issues/9629#issuecomment-3258078905

When Quiet Time is not enabled, notifications are issued as silent between Quiet Time start and Quiet Time end. #9448 introduced new `isQuietTime` methods that do not check the `isQuietTimeEnabled` preference:

1. https://github.com/thunderbird/thunderbird-android/blob/39a6a6d559760d7052fc6c0cc871a8d5bdf6fb64/legacy/core/src/main/java/com/fsck/k9/notification/NotificationHelper.kt#L143-L153
2. https://github.com/thunderbird/thunderbird-android/blob/39a6a6d559760d7052fc6c0cc871a8d5bdf6fb64/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationStrategy.kt#L85-L95

The earlier version introduced in #9405 - `getIsQuietTime` - wasn't correct either. It returned that Quiet Time was disabled when it was enabled:

- old and correct version:
  https://github.com/thunderbird/thunderbird-android/blob/616705c1f39446845c4ad491d9cd73c9b0d87c77/legacy/core/src/main/java/com/fsck/k9/K9.kt#L260-L269
- version that replaced it in #9405 (notice the missing `!` in line 179):
  https://github.com/thunderbird/thunderbird-android/blob/6a7ef80f09cffda73031e129d16756bcdb16deb7/legacy/core/src/main/java/com/fsck/k9/preferences/RealGeneralSettingsManager.kt#L164-L190

## Original issue description

4 tests related to notifications fail between 23:00 and 00:00 of machine's local time.

```
NewMailNotificationManagerTest > add first notification FAILED
    org.opentest4j.AssertionFailedError: expected to be false
        at app//com.fsck.k9.notification.NewMailNotificationManagerTest.add first notification(NewMailNotificationManagerTest.kt:117)

NewMailNotificationManagerTest > add second notification FAILED
    org.opentest4j.AssertionFailedError: expected to be false
        at app//com.fsck.k9.notification.NewMailNotificationManagerTest.add second notification(NewMailNotificationManagerTest.kt:163)

SummaryNotificationDataCreatorTest > single notification with quiet time disabled FAILED
    org.opentest4j.AssertionFailedError: expected to be false
        at app//com.fsck.k9.notification.SummaryNotificationDataCreatorTest.single notification with quiet time disabled(SummaryNotificationDataCreatorTest.kt:116)

SummaryNotificationDataCreatorTest > inbox-style notification with quiet time disabled FAILED
    org.opentest4j.AssertionFailedError: expected to be false
        at app//com.fsck.k9.notification.SummaryNotificationDataCreatorTest.inbox-style notification with quiet time disabled(SummaryNotificationDataCreatorTest.kt:152)
```

Example failed CI build: https://github.com/thunderbird/thunderbird-android/actions/runs/16762410368/job/47460999106

The failing tests:

1. use quiet time 23:00 - 00:00
2. create notifications with `silent` argument `false`
3. expect the `.isSilent` property to be `false`

However, notifications are silent if `silent` is `true` or it is quiet time. Since these tests do not change the clock, running them after 23:00 (local time) results in silent notifications and failures.

https://github.com/thunderbird/thunderbird-android/blob/f952209a8128ef0b186661cf4d8acba7d7dd79ce/legacy/core/src/main/java/com/fsck/k9/notification/SummaryNotificationDataCreator.kt#L13-L15

./gradlew :legacy:core:testDebugUnitTest --tests "com.fsck.k9.notification.SummaryNotificationDataCreatorTest"

diff --git a/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationStrategy.kt b/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationStrategy.kt
index 3bf142cdd79..d84f4f677a6 100644
--- a/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationStrategy.kt
+++ b/legacy/common/src/main/java/com/fsck/k9/notification/K9NotificationStrategy.kt
@@ -85,6 +85,10 @@ class K9NotificationStrategy(
     @OptIn(ExperimentalTime::class)
     private val NotificationPreference.isQuietTime: Boolean
         get() {
+            if (!isQuietTimeEnabled) {
+                return false
+            }
+
             val clock = DI.get<Clock>()
             val quietTimeChecker = QuietTimeChecker(
                 clock = clock,
diff --git a/legacy/core/src/main/java/com/fsck/k9/notification/NotificationHelper.kt b/legacy/core/src/main/java/com/fsck/k9/notification/NotificationHelper.kt
index f6504faecb3..3f99f873da1 100644
--- a/legacy/core/src/main/java/com/fsck/k9/notification/NotificationHelper.kt
+++ b/legacy/core/src/main/java/com/fsck/k9/notification/NotificationHelper.kt
@@ -143,6 +143,10 @@ internal fun NotificationCompat.Builder.setAppearance(
 @OptIn(ExperimentalTime::class)
 internal val NotificationPreference.isQuietTime: Boolean
     get() {
+        if (!isQuietTimeEnabled) {
+            return false
+        }
+
         val clock = DI.get<Clock>()
         val quietTimeChecker = QuietTimeChecker(
             clock = clock,

diff --git a/legacy/core/src/test/java/com/fsck/k9/notification/SummaryNotificationDataCreatorTest.kt b/legacy/core/src/test/java/com/fsck/k9/notification/SummaryNotificationDataCreatorTest.kt
index 3a35507d448..4274f621877 100644
--- a/legacy/core/src/test/java/com/fsck/k9/notification/SummaryNotificationDataCreatorTest.kt
+++ b/legacy/core/src/test/java/com/fsck/k9/notification/SummaryNotificationDataCreatorTest.kt
@@ -104,6 +104,7 @@ class SummaryNotificationDataCreatorTest {

     @Test
     fun `single notification with quiet time disabled`() {
+        setClockTo("23:01")
         setQuietTime(false)
         val notificationData = createNotificationData()