Repository: thunderbird/thunderbird-android (language: kotlin)

Issue:
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.


Discussion hints:
nan

Pull request: Extract DisplayCoreSettings and DisplayInboxSettings from DisplaySettings
 - 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.

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

Fix patch:
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,
+                    ),
+                ),
+            )
         }
     }
 


Test patch:
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)
     }
 }