summary refs log tree commit diff
path: root/resources/qml
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2023-06-02 01:29:05 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2023-06-08 22:32:07 +0200
commit54e2295c214874a316d22eaedaf5c2db17b59df0 (patch)
tree2c88e09be38e2758dfcd3fe6732da484f99d94c5 /resources/qml
parentFirst runnable qt6 Nheko (diff)
downloadnheko-54e2295c214874a316d22eaedaf5c2db17b59df0.tar.xz
Fix palette access and QMediaPlayer errors
Diffstat (limited to 'resources/qml')
-rw-r--r--resources/qml/Avatar.qml6
-rw-r--r--resources/qml/ChatPage.qml2
-rw-r--r--resources/qml/CommunitiesList.qml30
-rw-r--r--resources/qml/Completer.qml30
-rw-r--r--resources/qml/ElidedLabel.qml2
-rw-r--r--resources/qml/EncryptionIndicator.qml2
-rw-r--r--resources/qml/ForwardCompleter.qml11
-rw-r--r--resources/qml/ImageButton.qml4
-rw-r--r--resources/qml/MatrixText.qml2
-rw-r--r--resources/qml/MatrixTextField.qml10
-rw-r--r--resources/qml/MessageInput.qml15
-rw-r--r--resources/qml/MessageInputWarning.qml3
-rw-r--r--resources/qml/MessageView.qml30
-rw-r--r--resources/qml/QuickSwitcher.qml3
-rw-r--r--resources/qml/Reactions.qml14
-rw-r--r--resources/qml/ReplyPopup.qml8
-rw-r--r--resources/qml/RoomList.qml49
-rw-r--r--resources/qml/Root.qml1
-rw-r--r--resources/qml/SelfVerificationCheck.qml22
-rw-r--r--resources/qml/TimelineRow.qml22
-rw-r--r--resources/qml/TimelineView.qml14
-rw-r--r--resources/qml/ToggleButton.qml4
-rw-r--r--resources/qml/TopBar.qml18
-rw-r--r--resources/qml/TypingIndicator.qml6
-rw-r--r--resources/qml/UploadBox.qml6
-rw-r--r--resources/qml/components/AvatarListTile.qml30
-rw-r--r--resources/qml/components/FlatButton.qml4
-rw-r--r--resources/qml/components/MainWindowDialog.qml2
-rw-r--r--resources/qml/components/NhekoTabButton.qml6
-rw-r--r--resources/qml/components/ReorderableListview.qml4
-rw-r--r--resources/qml/components/TextButton.qml4
-rw-r--r--resources/qml/components/UserListRow.qml4
-rw-r--r--resources/qml/delegates/Encrypted.qml5
-rw-r--r--resources/qml/delegates/EncryptionEnabled.qml6
-rw-r--r--resources/qml/delegates/FileMessage.qml8
-rw-r--r--resources/qml/delegates/ImageMessage.qml12
-rw-r--r--resources/qml/delegates/MessageDelegate.qml8
-rw-r--r--resources/qml/delegates/NoticeMessage.qml2
-rw-r--r--resources/qml/delegates/Pill.qml4
-rw-r--r--resources/qml/delegates/Placeholder.qml2
-rw-r--r--resources/qml/delegates/PlayableMediaMessage.qml8
-rw-r--r--resources/qml/delegates/Redacted.qml6
-rw-r--r--resources/qml/delegates/Reply.qml6
-rw-r--r--resources/qml/delegates/TextMessage.qml14
-rw-r--r--resources/qml/device-verification/DeviceVerification.qml5
-rw-r--r--resources/qml/device-verification/DigitVerification.qml8
-rw-r--r--resources/qml/device-verification/EmojiVerification.qml8
-rw-r--r--resources/qml/device-verification/Failed.qml2
-rw-r--r--resources/qml/device-verification/NewVerificationRequest.qml2
-rw-r--r--resources/qml/device-verification/Success.qml2
-rw-r--r--resources/qml/device-verification/Waiting.qml4
-rw-r--r--resources/qml/dialogs/AliasEditor.qml16
-rw-r--r--resources/qml/dialogs/AllowedRoomsSettingsDialog.qml11
-rw-r--r--resources/qml/dialogs/ConfirmJoinRoomDialog.qml13
-rw-r--r--resources/qml/dialogs/CreateDirect.qml6
-rw-r--r--resources/qml/dialogs/CreateRoom.qml10
-rw-r--r--resources/qml/dialogs/ImagePackEditorDialog.qml18
-rw-r--r--resources/qml/dialogs/ImagePackSettingsDialog.qml19
-rw-r--r--resources/qml/dialogs/InputDialog.qml2
-rw-r--r--resources/qml/dialogs/InviteDialog.qml19
-rw-r--r--resources/qml/dialogs/JoinRoomDialog.qml5
-rw-r--r--resources/qml/dialogs/PhoneNumberInputDialog.qml2
-rw-r--r--resources/qml/dialogs/PowerLevelEditor.qml29
-rw-r--r--resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml13
-rw-r--r--resources/qml/dialogs/RawMessageDialog.qml8
-rw-r--r--resources/qml/dialogs/ReadReceipts.qml12
-rw-r--r--resources/qml/dialogs/RoomDirectory.qml15
-rw-r--r--resources/qml/dialogs/RoomMembers.qml12
-rw-r--r--resources/qml/dialogs/RoomSettings.qml45
-rw-r--r--resources/qml/dialogs/UserProfile.qml18
-rw-r--r--resources/qml/emoji/StickerPicker.qml19
-rw-r--r--resources/qml/pages/LoginPage.qml5
-rw-r--r--resources/qml/pages/RegisterPage.qml7
-rw-r--r--resources/qml/pages/UserSettingsPage.qml9
-rw-r--r--resources/qml/pages/WelcomePage.qml6
-rw-r--r--resources/qml/ui/NhekoSlider.qml4
-rw-r--r--resources/qml/ui/Ripple.qml2
-rw-r--r--resources/qml/ui/Snackbar.qml4
-rw-r--r--resources/qml/ui/media/MediaControls.qml8
-rw-r--r--resources/qml/voip/CallDevices.qml9
-rw-r--r--resources/qml/voip/CallInvite.qml15
-rw-r--r--resources/qml/voip/CallInviteBar.qml2
-rw-r--r--resources/qml/voip/DeviceError.qml8
-rw-r--r--resources/qml/voip/PlaceCall.qml11
-rw-r--r--resources/qml/voip/ScreenShare.qml13
85 files changed, 410 insertions, 465 deletions
diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml
index 4951a9fb..8302f8fa 100644
--- a/resources/qml/Avatar.qml
+++ b/resources/qml/Avatar.qml
@@ -24,7 +24,7 @@ AbstractButton {
     background: Rectangle {
         id: bg
         radius: Settings.avatarCircles ? height / 2 : height / 8
-        color: Nheko.colors.alternateBase
+        color: palette.alternateBase
     }
 
     Label {
@@ -39,7 +39,7 @@ AbstractButton {
         verticalAlignment: Text.AlignVCenter
         horizontalAlignment: Text.AlignHCenter
         visible: img.status != Image.Ready && !Settings.useIdenticon
-        color: Nheko.colors.text
+        color: palette.text
     }
 
     Image {
@@ -109,7 +109,7 @@ AbstractButton {
     }
 
     Ripple {
-        color: Qt.rgba(Nheko.colors.alternateBase.r, Nheko.colors.alternateBase.g, Nheko.colors.alternateBase.b, 0.5)
+        color: Qt.rgba(palette.alternateBase.r, palette.alternateBase.g, palette.alternateBase.b, 0.5)
     }
 
 }
diff --git a/resources/qml/ChatPage.qml b/resources/qml/ChatPage.qml
index d4d2b845..564c093d 100644
--- a/resources/qml/ChatPage.qml
+++ b/resources/qml/ChatPage.qml
@@ -14,7 +14,7 @@ import QtQml 2.15
 Rectangle {
     id: chatPage
 
-    color: Nheko.colors.window
+    color: palette.window
 
     ColumnLayout {
         spacing: 0
diff --git a/resources/qml/CommunitiesList.qml b/resources/qml/CommunitiesList.qml
index ee49ae2d..5bf239a6 100644
--- a/resources/qml/CommunitiesList.qml
+++ b/resources/qml/CommunitiesList.qml
@@ -78,11 +78,11 @@ Page {
         delegate: ItemDelegate {
             id: communityItem
 
-            property color backgroundColor: Nheko.colors.window
-            property color importantText: Nheko.colors.text
-            property color unimportantText: Nheko.colors.buttonText
-            property color bubbleBackground: Nheko.colors.highlight
-            property color bubbleText: Nheko.colors.highlightedText
+            property color backgroundColor: palette.window
+            property color importantText: palette.text
+            property color unimportantText: palette.buttonText
+            property color bubbleBackground: palette.highlight
+            property color bubbleText: palette.highlightedText
             required property var model
 
             height: avatarSize + 2 * Nheko.paddingMedium
@@ -100,11 +100,11 @@ Page {
 
                     PropertyChanges {
                         target: communityItem
-                        backgroundColor: Nheko.colors.dark
-                        importantText: Nheko.colors.brightText
-                        unimportantText: Nheko.colors.brightText
-                        bubbleBackground: Nheko.colors.highlight
-                        bubbleText: Nheko.colors.highlightedText
+                        backgroundColor: palette.dark
+                        importantText: palette.brightText
+                        unimportantText: palette.brightText
+                        bubbleBackground: palette.highlight
+                        bubbleText: palette.highlightedText
                     }
 
                 },
@@ -114,11 +114,11 @@ Page {
 
                     PropertyChanges {
                         target: communityItem
-                        backgroundColor: Nheko.colors.highlight
-                        importantText: Nheko.colors.highlightedText
-                        unimportantText: Nheko.colors.highlightedText
-                        bubbleBackground: Nheko.colors.highlightedText
-                        bubbleText: Nheko.colors.highlight
+                        backgroundColor: palette.highlight
+                        importantText: palette.highlightedText
+                        unimportantText: palette.highlightedText
+                        bubbleBackground: palette.highlightedText
+                        bubbleText: palette.highlight
                     }
 
                 }
diff --git a/resources/qml/Completer.qml b/resources/qml/Completer.qml
index 0a9c41ed..95bebc1b 100644
--- a/resources/qml/Completer.qml
+++ b/resources/qml/Completer.qml
@@ -127,8 +127,8 @@ Control {
 
             ListView.delayRemove: true
 
-            color: model.index == popup.currentIndex ? Nheko.colors.highlight : Nheko.colors.base
-            height: chooser.child.implicitHeight + 2 * popup.rowMargin
+            color: model.index == popup.currentIndex ? palette.highlight : palette.base
+            height: (chooser.child?.implicitHeight ?? 0) + 2 * popup.rowMargin
             implicitWidth: fullWidth ? ListView.view.width : chooser.child.implicitWidth + 4
 
             MouseArea {
@@ -146,7 +146,7 @@ Control {
                 }
             }
             Ripple {
-                color: Qt.rgba(Nheko.colors.base.r, Nheko.colors.base.g, Nheko.colors.base.b, 0.5)
+                color: Qt.rgba(palette.base.r, palette.base.g, palette.base.b, 0.5)
             }
 
             DelegateChooser {
@@ -177,12 +177,12 @@ Control {
 
                         Label {
                             text: model.displayName
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
                         }
 
                         Label {
                             text: "(" + model.userid + ")"
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.buttonText
                         }
 
                     }
@@ -201,7 +201,7 @@ Control {
                         Label {
                             visible: !!model.unicode
                             text: model.unicode
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
                             font: Settings.emojiFont
                         }
 
@@ -220,12 +220,12 @@ Control {
                             Layout.leftMargin: Nheko.paddingSmall
                             Layout.rightMargin: Nheko.paddingSmall
                             text: model.shortcode
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
                         }
 
                         Label {
                             text: "(" + model.packname + ")"
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.buttonText
                         }
 
                     }
@@ -243,13 +243,13 @@ Control {
 
                         Label {
                             text: model.name
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
                             font.bold: true
                         }
 
                         Label {
                             text: model.description
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.buttonText
                         }
 
                     }
@@ -277,7 +277,7 @@ Control {
                         Label {
                             text: model.roomName
                             font.pixelSize: popup.avatarHeight * 0.5
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
                             font.italic: model.isTombstoned
                             textFormat: Text.RichText
                         }
@@ -306,14 +306,14 @@ Control {
 
                         Label {
                             text: model.roomName
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
                             font.italic: model.isTombstoned
                             textFormat: Text.RichText
                         }
 
                         Label {
                             text: "(" + model.roomAlias + ")"
-                            color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
+                            color: model.index == popup.currentIndex ? palette.highlightedText : palette.buttonText
                             textFormat: Text.RichText
                         }
 
@@ -329,8 +329,8 @@ Control {
 
 
     background: Rectangle {
-        color: Nheko.colors.base
-        border.color: Nheko.colors.mid
+        color: palette.base
+        border.color: palette.mid
     }
 
 }
diff --git a/resources/qml/ElidedLabel.qml b/resources/qml/ElidedLabel.qml
index 180259b1..2d53faff 100644
--- a/resources/qml/ElidedLabel.qml
+++ b/resources/qml/ElidedLabel.qml
@@ -13,7 +13,7 @@ Label {
     property alias elideWidth: metrics.elideWidth
     property int fullTextWidth: Math.ceil(metrics.advanceWidth)
 
-    color: Nheko.colors.text
+    color: palette.text
     text: (textFormat == Text.PlainText) ? metrics.elidedText : TimelineManager.escapeEmoji(metrics.elidedText)
     maximumLineCount: 1
     elide: Text.ElideRight
diff --git a/resources/qml/EncryptionIndicator.qml b/resources/qml/EncryptionIndicator.qml
index 5338b6be..c675fb52 100644
--- a/resources/qml/EncryptionIndicator.qml
+++ b/resources/qml/EncryptionIndicator.qml
@@ -43,7 +43,7 @@ Image {
             case Crypto.Verified:
                 return sourceUrl + Nheko.theme.green;
             case Crypto.TOFU:
-                return sourceUrl + Nheko.colors.buttonText;
+                return sourceUrl + palette.buttonText;
             default:
                 return sourceUrl + Nheko.theme.error;
             }
diff --git a/resources/qml/ForwardCompleter.qml b/resources/qml/ForwardCompleter.qml
index 4ab23a4f..a5787189 100644
--- a/resources/qml/ForwardCompleter.qml
+++ b/resources/qml/ForwardCompleter.qml
@@ -19,7 +19,6 @@ Popup {
     x: Math.round(parent.width / 2 - width / 2)
     y: Math.round(parent.height / 4)
     modal: true
-    palette: Nheko.colors
     parent: Overlay.overlay
     width: timelineRoot.width * 0.8
     leftPadding: 10
@@ -39,7 +38,7 @@ Popup {
             text: qsTr("Forward Message")
             font.bold: true
             bottomPadding: 10
-            color: Nheko.colors.text
+            color: palette.text
         }
 
         Reply {
@@ -50,7 +49,7 @@ Popup {
 
             width: parent.width
 
-            userColor: TimelineManager.userColor(modelData.userId, Nheko.colors.window)
+            userColor: TimelineManager.userColor(modelData.userId, palette.window)
             blurhash: modelData.blurhash ?? ""
             body: modelData.body ?? ""
             formattedBody: modelData.formattedBody ?? ""
@@ -72,7 +71,7 @@ Popup {
             id: roomTextInput
 
             width: forwardMessagePopup.width - forwardMessagePopup.leftPadding * 2
-            color: Nheko.colors.text
+            color: palette.text
             onTextEdited: {
                 completerPopup.completer.searchString = text;
             }
@@ -123,11 +122,11 @@ Popup {
     }
 
     background: Rectangle {
-        color: Nheko.colors.window
+        color: palette.window
     }
 
     Overlay.modal: Rectangle {
-        color: Qt.rgba(Nheko.colors.window.r, Nheko.colors.window.g, Nheko.colors.window.b, 0.7)
+        color: Qt.rgba(palette.window.r, palette.window.g, palette.window.b, 0.7)
     }
 
 }
diff --git a/resources/qml/ImageButton.qml b/resources/qml/ImageButton.qml
index 547b4a12..ecb402c7 100644
--- a/resources/qml/ImageButton.qml
+++ b/resources/qml/ImageButton.qml
@@ -12,8 +12,8 @@ AbstractButton {
 
     property alias cursor: mouseArea.cursorShape
     property string image: undefined
-    property color highlightColor: Nheko.colors.highlight
-    property color buttonTextColor: Nheko.colors.buttonText
+    property color highlightColor: palette.highlight
+    property color buttonTextColor: palette.buttonText
     property bool changeColorOnHover: true
     property bool ripple: true
 
diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml
index 7956f0b6..96303a2b 100644
--- a/resources/qml/MatrixText.qml
+++ b/resources/qml/MatrixText.qml
@@ -18,7 +18,7 @@ TextEdit {
     selectByMouse: !Settings.mobileMode
     // this always has to be enabled, otherwise you can't click links anymore!
     //enabled: selectByMouse
-    color: Nheko.colors.text
+    color: palette.text
     onLinkActivated: Nheko.openLink(link)
     ToolTip.visible: hoveredLink || false
     ToolTip.text: hoveredLink
diff --git a/resources/qml/MatrixTextField.qml b/resources/qml/MatrixTextField.qml
index 74cacf33..f1ff2836 100644
--- a/resources/qml/MatrixTextField.qml
+++ b/resources/qml/MatrixTextField.qml
@@ -10,7 +10,7 @@ import im.nheko 1.0
 
 ColumnLayout {
     id: c
-    property color backgroundColor: Nheko.colors.base
+    property color backgroundColor: palette.base
     property alias color: labelC.color
     property alias textPadding: input.padding
     property alias text: input.text
@@ -61,8 +61,7 @@ ColumnLayout {
             y: contentHeight + input.padding + Nheko.paddingSmall
             enabled: false
 
-            palette: Nheko.colors
-            color: Nheko.colors.text
+            color: palette.text
             font.pixelSize: input.font.pixelSize
             font.weight: Font.DemiBold
             font.letterSpacing: input.font.pixelSize * 0.02
@@ -114,7 +113,6 @@ ColumnLayout {
         id: input
         Layout.fillWidth: true
 
-        palette: Nheko.colors
         color: labelC.color
         opacity: labelC.text ? 0 : 1
         focus: true
@@ -156,7 +154,7 @@ ColumnLayout {
 
         Layout.fillWidth: true
 
-        color: Nheko.colors.highlight
+        color: palette.highlight
         height: 1
 
         Rectangle {
@@ -166,7 +164,7 @@ ColumnLayout {
             anchors.horizontalCenter: parent.horizontalCenter
             height: parent.height*2
             width: 0
-            color: Nheko.colors.text
+            color: palette.text
 
             states: State {
                 name: "focused"
diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index 8e72f458..6220249b 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -16,7 +16,7 @@ Rectangle {
 
     readonly property string text: messageInput.text
 
-    color: Nheko.colors.window
+    color: palette.window
     Layout.fillWidth: true
     Layout.preferredHeight: row.implicitHeight
     Layout.minimumHeight: 40
@@ -90,7 +90,7 @@ Rectangle {
 
             Rectangle {
                 anchors.fill: parent
-                color: Nheko.colors.window
+                color: palette.window
                 visible: room && room.input.uploading
 
                 Spinner {
@@ -144,8 +144,8 @@ Rectangle {
 
                 selectByMouse: true
                 placeholderText: qsTr("Write a message...")
-                placeholderTextColor: Nheko.colors.buttonText
-                color: Nheko.colors.text
+                placeholderTextColor: palette.buttonText
+                color: palette.text
                 width: textInput.width 
                 verticalAlignment: TextEdit.AlignVCenter
                 wrapMode: TextEdit.Wrap
@@ -192,8 +192,8 @@ Rectangle {
                 onSelectionStartChanged: room.input.updateState(selectionStart, selectionEnd, cursorPosition, text)
                 onSelectionEndChanged: room.input.updateState(selectionStart, selectionEnd, cursorPosition, text)
                 // Ensure that we get escape key press events first.
-                Keys.onShortcutOverride: event.accepted = (popup.opened && (event.key === Qt.Key_Escape || event.key === Qt.Key_Tab || event.key === Qt.Key_Enter || event.key === Qt.Key_Space))
-                Keys.onPressed: {
+                Keys.onShortcutOverride: (event) => event.accepted = (popup.opened && (event.key === Qt.Key_Escape || event.key === Qt.Key_Tab || event.key === Qt.Key_Enter || event.key === Qt.Key_Space))
+                Keys.onPressed: (event) => {
                     if (event.matches(StandardKey.Paste)) {
                         event.accepted = room.input.tryPasteAttachment(false);
                     } else if (event.key == Qt.Key_Space) {
@@ -438,7 +438,6 @@ Rectangle {
             StickerPicker {
                 id: stickerPopup
 
-                colors: Nheko.colors
                 emoji: false
             }
 
@@ -463,7 +462,6 @@ Rectangle {
             StickerPicker {
                 id: emojiPopup
 
-                colors: Nheko.colors
                 emoji: true
             }
         }
@@ -489,7 +487,6 @@ Rectangle {
         anchors.centerIn: parent
         visible: room ? (!room.permissions.canSend(MtxEvent.TextMessage)) : false
         text: qsTr("You don't have permission to send messages in this room")
-        color: Nheko.colors.text
     }
 
 }
diff --git a/resources/qml/MessageInputWarning.qml b/resources/qml/MessageInputWarning.qml
index 9b0b0907..be73df2a 100644
--- a/resources/qml/MessageInputWarning.qml
+++ b/resources/qml/MessageInputWarning.qml
@@ -16,7 +16,7 @@ Rectangle {
     implicitHeight: visible ? warningDisplay.implicitHeight + 4 * Nheko.paddingSmall : 0
     height: implicitHeight
     Layout.fillWidth: true
-    color: Nheko.colors.window // required to hide the timeline behind this warning
+    color: palette.window // required to hide the timeline behind this warning
 
     Rectangle {
         id: warningRect
@@ -37,7 +37,6 @@ Rectangle {
             anchors.left: parent.left
             anchors.verticalCenter: parent.verticalCenter
             anchors.margins: Nheko.paddingSmall
-            color: Nheko.colors.text
             text: warningRoot.text
             textFormat: Text.PlainText
         }
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index d0ec3214..b35db9ac 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -91,8 +91,8 @@ Item {
             z: 10
 
             background: Rectangle {
-                color: Nheko.colors.window
-                border.color: Nheko.colors.buttonText
+                color: palette.window
+                border.color: palette.buttonText
                 border.width: 1
                 radius: padding
             }
@@ -113,8 +113,8 @@ Item {
 
                         required property string modelData
 
-                        property color highlightColor: Nheko.colors.highlight
-                        property color buttonTextColor: Nheko.colors.buttonText
+                        property color highlightColor: palette.highlight
+                        property color buttonTextColor: palette.buttonText
                         property bool showImage: modelData.startsWith("mxc://")
 
                         //Layout.preferredHeight: fontMetrics.height
@@ -170,7 +170,7 @@ Item {
 
                 ImageButton {
                     visible: !!row.model && row.model.isEditable
-                    buttonTextColor: Nheko.colors.buttonText
+                    buttonTextColor: palette.buttonText
                     width: 16
                     hoverEnabled: true
                     image: ":/icons/icons/ui/edit.svg"
@@ -223,7 +223,7 @@ Item {
 
                 ImageButton {
                     visible: !!row.model && filteredTimeline.filterByContent
-                    buttonTextColor: Nheko.colors.buttonText
+                    buttonTextColor: palette.buttonText
                     width: 16
                     hoverEnabled: true
                     image: ":/icons/icons/ui/go-to.svg"
@@ -354,7 +354,7 @@ Item {
                     anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
                     visible: room && previousMessageDay !== day
                     text: room ? room.formatDateSeparator(timestamp) : ""
-                    color: Nheko.colors.text
+                    color: palette.text
                     height: Math.round(fontMetrics.height * 1.4)
                     width: contentWidth * 1.2
                     horizontalAlignment: Text.AlignHCenter
@@ -362,7 +362,7 @@ Item {
 
                     background: Rectangle {
                         radius: parent.height / 2
-                        color: Nheko.colors.window
+                        color: palette.window
                     }
 
                 }
@@ -404,7 +404,7 @@ Item {
                         contentItem: ElidedLabel {
                             id: userName_
                             fullText: userName
-                            color: TimelineManager.userColor(userId, Nheko.colors.base)
+                            color: TimelineManager.userColor(userId, palette.base)
                             textFormat: Text.RichText
                             elideWidth: Math.min(userInfo.remainingWidth-Math.min(statusMsg.implicitWidth,userInfo.remainingWidth/3), userName_.fullTextWidth)
                         }
@@ -427,7 +427,7 @@ Item {
                     Label {
                         id: statusMsg
                         anchors.baseline: userNameButton.baseline
-                        color: Nheko.colors.buttonText
+                        color: palette.buttonText
                         text: userStatus.replace(/\n/g, " ")
                         textFormat: Text.PlainText
                         elide: Text.ElideRight
@@ -580,7 +580,7 @@ Item {
                     visible: true
                     z: 1
                     enabled: false
-                    color: Nheko.colors.highlight
+                    color: palette.highlight
 
                     states: State {
                         name: "revealed"
@@ -646,7 +646,7 @@ Item {
                 anchors.centerIn: parent
                 anchors.margins: Nheko.paddingLarge
                 running: (room && room.paginationInProgress) || chat.filteringInProgress
-                foreground: Nheko.colors.mid
+                foreground: palette.mid
                 z: 3
             }
 
@@ -892,9 +892,9 @@ Item {
         hoverEnabled: true
 
         background: Rectangle {
-            color: toEndButton.down ? Nheko.colors.highlight : Nheko.colors.button
+            color: toEndButton.down ? palette.highlight : palette.button
             opacity: enabled ? 1 : 0.3
-            border.color: toEndButton.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText
+            border.color: toEndButton.hovered ? palette.highlight : palette.buttonText
             border.width: 1
             radius: toEndButton.radius
         }
@@ -915,7 +915,7 @@ Item {
             id: buttonImg
             anchors.fill: parent
             anchors.margins: Nheko.paddingMedium
-            source: "image://colorimage/:/icons/icons/ui/download.svg?" + (toEndButton.down ? Nheko.colors.highlightedText : Nheko.colors.buttonText)
+            source: "image://colorimage/:/icons/icons/ui/download.svg?" + (toEndButton.down ? palette.highlightedText : palette.buttonText)
             fillMode: Image.PreserveAspectFit
         }
 
diff --git a/resources/qml/QuickSwitcher.qml b/resources/qml/QuickSwitcher.qml
index 916a4cee..5878b391 100644
--- a/resources/qml/QuickSwitcher.qml
+++ b/resources/qml/QuickSwitcher.qml
@@ -19,7 +19,6 @@ Popup {
     modal: true
     closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
     parent: Overlay.overlay
-    palette: Nheko.colors
     onOpened: {
         roomTextInput.forceActiveFocus();
     }
@@ -35,7 +34,7 @@ Popup {
 
             width: parent.width
             font.pixelSize: Math.ceil(quickSwitcher.textHeight * 0.6)
-            color: Nheko.colors.text
+            color: palette.text
             onTextEdited: {
                 completerPopup.completer.searchString = text;
             }
diff --git a/resources/qml/Reactions.qml b/resources/qml/Reactions.qml
index cce8720a..caee708e 100644
--- a/resources/qml/Reactions.qml
+++ b/resources/qml/Reactions.qml
@@ -12,8 +12,8 @@ Flow {
     id: reactionFlow
 
     // lower-contrast colors to avoid distracting from text & to enhance hover effect
-    property color gentleHighlight: Qt.hsla(Nheko.colors.highlight.hslHue, Nheko.colors.highlight.hslSaturation, Nheko.colors.highlight.hslLightness, 0.8)
-    property color gentleText: Qt.hsla(Nheko.colors.text.hslHue, Nheko.colors.text.hslSaturation, Nheko.colors.text.hslLightness, 0.6)
+    property color gentleHighlight: Qt.hsla(palette.highlight.hslHue, palette.highlight.hslSaturation, palette.highlight.hslLightness, 0.8)
+    property color gentleText: Qt.hsla(palette.text.hslHue, palette.text.hslSaturation, palette.text.hslLightness, 0.6)
     property string eventId
     property alias reactions: repeater.model
 
@@ -69,7 +69,7 @@ Flow {
                         return textMetrics.elidedText;
                     }
                     font.family: Settings.emojiFont
-                    color: (reaction.hovered || modelData.selfReactedEvent !== '') ? Nheko.colors.highlightedText: Nheko.colors.text
+                    color: (reaction.hovered || modelData.selfReactedEvent !== '') ? palette.highlightedText: palette.text
                     maximumLineCount: 1
                     visible: !modelData.key.startsWith("mxc://")
                 }
@@ -87,7 +87,7 @@ Flow {
 
                     height: Math.floor(reactionCounter.implicitHeight * 1.4)
                     width: 1
-                    color: reaction.hovered ? Nheko.colors.text: gentleText
+                    color: reaction.hovered ? palette.text: gentleText
                 }
 
                 Text {
@@ -96,7 +96,7 @@ Flow {
                     anchors.verticalCenter: divider.verticalCenter
                     text: modelData.count
                     font: reaction.font
-                    color: (reaction.hovered || modelData.selfReactedEvent !== '') ? Nheko.colors.highlightedText: Nheko.colors.windowText
+                    color: (reaction.hovered || modelData.selfReactedEvent !== '') ? palette.highlightedText: palette.windowText
                 }
 
             }
@@ -105,8 +105,8 @@ Flow {
                 anchors.centerIn: parent
                 implicitWidth: reaction.implicitWidth
                 implicitHeight: reaction.implicitHeight
-                border.color: reaction.hovered ? Nheko.colors.text: gentleText
-                color: reaction.hovered ? Nheko.colors.highlight : (modelData.selfReactedEvent !== '' ? gentleHighlight : Nheko.colors.window)
+                border.color: reaction.hovered ? palette.text: gentleText
+                color: reaction.hovered ? palette.highlight : (modelData.selfReactedEvent !== '' ? gentleHighlight : palette.window)
                 border.width: 1
                 radius: reaction.height / 2
             }
diff --git a/resources/qml/ReplyPopup.qml b/resources/qml/ReplyPopup.qml
index 365c5bff..6fceb4e5 100644
--- a/resources/qml/ReplyPopup.qml
+++ b/resources/qml/ReplyPopup.qml
@@ -15,7 +15,7 @@ Rectangle {
     visible: room && (room.reply || room.edit || room.thread)
     // Height of child, plus margins, plus border
     implicitHeight: (room && room.reply ? replyPreview.height : Math.max(closeEditButton.height, closeThreadButton.height)) + Nheko.paddingSmall
-    color: Nheko.colors.window
+    color: palette.window
     z: 3
 
     Reply {
@@ -31,7 +31,7 @@ Rectangle {
         anchors.rightMargin: replyPopup.width < 450? 2*(22+16) : 3*(22+16)
         anchors.top: parent.top
         anchors.topMargin: Nheko.paddingSmall
-        userColor: TimelineManager.userColor(modelData.userId, Nheko.colors.window)
+        userColor: TimelineManager.userColor(modelData.userId, palette.window)
         blurhash: modelData.blurhash ?? ""
         body: modelData.body ?? ""
         formattedBody: modelData.formattedBody ?? ""
@@ -46,7 +46,7 @@ Rectangle {
         isOnlyEmoji: modelData.isOnlyEmoji ?? false
         userId: modelData.userId ?? ""
         userName: modelData.userName ?? ""
-        encryptionError: modelData.encryptionError ?? ""
+        encryptionError: modelData.encryptionError ?? 0
         width: parent.width
     }
 
@@ -90,7 +90,7 @@ Rectangle {
         anchors.margins: 8
         anchors.top: parent.top
         hoverEnabled: true
-        buttonTextColor: room ? TimelineManager.userColor(room.thread, Nheko.colors.base) : Nheko.colors.buttonText
+        buttonTextColor: room ? TimelineManager.userColor(room.thread, palette.base) : palette.buttonText
         image: ":/icons/icons/ui/dismiss_thread.svg"
         width: 22
         height: 22
diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index 49a36d8f..733063f9 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -97,8 +97,7 @@ Page {
                 width: 420
                 minimumWidth: 150
                 minimumHeight: 150
-                palette: Nheko.colors
-                color: Nheko.colors.window
+                color: palette.window
                 title: room.plainRoomName
                 //flags: Qt.Window | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
@@ -197,8 +196,8 @@ Page {
 
                 Instantiator {
                     model: Communities.tagsWithDefault
-                    onObjectAdded: tagsMenu.insertItem(index, object)
-                    onObjectRemoved: tagsMenu.removeItem(object)
+                    onObjectAdded: (index, object) => tagsMenu.insertItem(index, object)
+                    onObjectRemoved: (index, object) => tagsMenu.removeItem(object)
 
                     delegate: Platform.MenuItem {
                         property string t: modelData
@@ -241,11 +240,11 @@ Page {
         delegate: ItemDelegate {
             id: roomItem
 
-            property color backgroundColor: Nheko.colors.window
-            property color importantText: Nheko.colors.text
-            property color unimportantText: Nheko.colors.buttonText
-            property color bubbleBackground: Nheko.colors.highlight
-            property color bubbleText: Nheko.colors.highlightedText
+            property color backgroundColor: palette.window
+            property color importantText: palette.text
+            property color unimportantText: palette.buttonText
+            property color bubbleBackground: palette.highlight
+            property color bubbleText: palette.highlightedText
             required property string roomName
             required property string roomId
             required property string avatarUrl
@@ -261,7 +260,7 @@ Page {
             required property string directChatOtherUserId
 
             Ripple {
-                color: Qt.rgba(Nheko.colors.dark.r, Nheko.colors.dark.g, Nheko.colors.dark.b, 0.5)
+                color: Qt.rgba(palette.dark.r, palette.dark.g, palette.dark.b, 0.5)
             }
 
             height: avatarSize + 2 * Nheko.paddingMedium
@@ -290,11 +289,11 @@ Page {
 
                     PropertyChanges {
                         target: roomItem
-                        backgroundColor: Nheko.colors.dark
-                        importantText: Nheko.colors.brightText
-                        unimportantText: Nheko.colors.brightText
-                        bubbleBackground: Nheko.colors.highlight
-                        bubbleText: Nheko.colors.highlightedText
+                        backgroundColor: palette.dark
+                        importantText: palette.brightText
+                        unimportantText: palette.brightText
+                        bubbleBackground: palette.highlight
+                        bubbleText: palette.highlightedText
                     }
 
                 },
@@ -304,11 +303,11 @@ Page {
 
                     PropertyChanges {
                         target: roomItem
-                        backgroundColor: Nheko.colors.highlight
-                        importantText: Nheko.colors.highlightedText
-                        unimportantText: Nheko.colors.highlightedText
-                        bubbleBackground: Nheko.colors.highlightedText
-                        bubbleText: Nheko.colors.highlight
+                        backgroundColor: palette.highlight
+                        importantText: palette.highlightedText
+                        unimportantText: palette.highlightedText
+                        bubbleBackground: palette.highlightedText
+                        bubbleText: palette.highlight
                     }
 
                 }
@@ -450,7 +449,7 @@ Page {
                 anchors.verticalCenter: parent.verticalCenter
                 height: parent.height - Nheko.paddingSmall * 2
                 width: 3
-                color: Nheko.colors.highlight
+                color: palette.highlight
                 visible: hasUnreadMessages
             }
 
@@ -491,7 +490,7 @@ Page {
             padding: Nheko.paddingMedium
             Layout.minimumHeight: 40
 
-            background: Rectangle {color: Nheko.colors.window}
+            background: Rectangle {color: palette.window}
 
             InputDialog {
                 id: statusDialog
@@ -572,7 +571,7 @@ Page {
 
                     ElidedLabel {
                         Layout.alignment: Qt.AlignTop
-                        color: Nheko.colors.buttonText
+                        color: palette.buttonText
                         font.pointSize: fontMetrics.font.pointSize * 0.9
                         elideWidth: col.width
                         fullText: userInfoGrid.profile ? userInfoGrid.profile.userid : ""
@@ -627,7 +626,7 @@ Page {
 
                     Layout.margins: Nheko.paddingMedium
                     Layout.rightMargin: Nheko.paddingSmall
-                    color: Nheko.colors.buttonText
+                    color: palette.buttonText
                     Layout.fillWidth: true
                     text: {
                         switch (SelfVerificationStatus.status) {
@@ -711,7 +710,7 @@ Page {
             horizontalPadding: Nheko.paddingMedium
             verticalPadding: 0
 
-            background: Rectangle {color: Nheko.colors.window}
+            background: Rectangle {color: palette.window}
             contentItem: RowLayout {
                 id: buttonRow
 
diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index 4b71af37..01fde18e 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -20,7 +20,6 @@ import im.nheko.EmojiModel 1.0
 Pane {
     id: timelineRoot
 
-    palette: Nheko.colors
     background: null
     padding: 0
 
diff --git a/resources/qml/SelfVerificationCheck.qml b/resources/qml/SelfVerificationCheck.qml
index 4f2d9202..bb7ea5f0 100644
--- a/resources/qml/SelfVerificationCheck.qml
+++ b/resources/qml/SelfVerificationCheck.qml
@@ -37,7 +37,7 @@ Item {
                 Layout.maximumWidth: (Overlay.overlay ? Overlay.overlay.width : 400) - Nheko.paddingMedium * 4
                 Layout.fillWidth: true
                 text: qsTr("This is your recovery key. You will need it to restore access to your encrypted messages and verification keys. Keep this safe. Don't share it with anyone and don't lose it! Do not pass go! Do not collect $200!")
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -49,7 +49,7 @@ Item {
                 readOnly: true
                 selectByMouse: true
                 text: showRecoverKeyDialog.recoveryKey
-                color: Nheko.colors.text
+                color: palette.text
                 font.bold: true
                 wrapMode: TextEdit.Wrap
             }
@@ -57,7 +57,7 @@ Item {
         }
 
         background: Rectangle {
-            color: Nheko.colors.window
+            color: palette.window
             border.color: Nheko.theme.separator
             border.width: 1
             radius: Nheko.paddingSmall
@@ -101,7 +101,7 @@ Item {
                 Layout.columnSpan: 2
                 font.pointSize: fontMetrics.font.pointSize * 2
                 text: qsTr("Setup Encryption")
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -111,7 +111,7 @@ Item {
                 Layout.columnSpan: 2
                 Layout.maximumWidth: grid.width - Nheko.paddingMedium * 2
                 text: qsTr("Hello and welcome to Matrix!\nIt seems like you are new. Before you can securely encrypt your messages, we need to setup a few small things. You can either press accept immediately or adjust a few basic options. We also try to explain a few of the basics. You can skip those parts, but they might prove to be helpful!")
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -121,7 +121,7 @@ Item {
                 Layout.columnSpan: 1
                 Layout.maximumWidth: Math.floor(grid.width / 2) - Nheko.paddingMedium * 2
                 text: "Store secrets online.\nYou have a few secrets to make all the encryption magic work. While you can keep them stored only locally, we recommend storing them encrypted on the server. Otherwise it will be painful to recover them. Only disable this if you are paranoid and like losing your data!"
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -148,7 +148,7 @@ Item {
                 Layout.maximumWidth: Math.floor(grid.width / 2) - Nheko.paddingMedium * 2
                 visible: storeSecretsOnline.checked
                 text: "Set an online backup password.\nWe recommend you DON'T set a password and instead only rely on the recovery key. You will get a recovery key in any case when storing the cross-signing secrets online, but passwords are usually not very random, so they are easier to attack than a completely random recovery key. If you choose to use a password, DON'T make it the same as your login password, otherwise your server can read all your encrypted messages. (You don't want that.)"
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -187,7 +187,7 @@ Item {
                 Layout.columnSpan: 1
                 Layout.maximumWidth: Math.floor(grid.width / 2) - Nheko.paddingMedium * 2
                 text: "Use online key backup.\nStore the keys for your messages securely encrypted online. In general you do want this, because it protects your messages from becoming unreadable, if you log out by accident. It does however carry a small security risk, if you ever share your recovery key by accident. Currently this also has some other weaknesses, that might allow the server to insert new keys into your backup. The server will however never be able to read your messages."
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -209,7 +209,7 @@ Item {
         }
 
         background: Rectangle {
-            color: Nheko.colors.window
+            color: palette.window
             border.color: Nheko.theme.separator
             border.width: 1
             radius: Nheko.paddingSmall
@@ -235,7 +235,7 @@ Item {
                 //Layout.columnSpan: 2
                 font.pointSize: fontMetrics.font.pointSize * 2
                 text: qsTr("Activate Encryption")
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
@@ -245,7 +245,7 @@ Item {
                 //Layout.columnSpan: 2
                 Layout.maximumWidth: grid.width - Nheko.paddingMedium * 2
                 text: qsTr("It seems like you have encryption already configured for this account. To be able to access your encrypted messages and make this device appear as trusted, you can either verify an existing device or (if you have one) enter your recovery passphrase. Please select one of the options below.\nIf you choose verify, you need to have the other device available. If you choose \"enter passphrase\", you will need your recovery key or passphrase. If you click cancel, you can choose to verify yourself at a later point.")
-                color: Nheko.colors.text
+                color: palette.text
                 wrapMode: Text.Wrap
             }
 
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index d9deefa0..07cb5ce2 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -54,7 +54,7 @@ AbstractButton {
     height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 )+unreadRow.height
 
     Rectangle {
-        color: (Settings.messageHoverHighlight && hovered) ? Nheko.colors.alternateBase : "transparent"
+        color: (Settings.messageHoverHighlight && hovered) ? palette.alternateBase : "transparent"
         anchors.fill: parent
         // this looks better without margins
         TapHandler {
@@ -112,7 +112,7 @@ AbstractButton {
         Rectangle {
             id: threadLine
 
-            color: TimelineManager.userColor(threadId, Nheko.colors.base)
+            color: TimelineManager.userColor(threadId, palette.base)
             anchors.fill: parent
         }
 
@@ -133,8 +133,8 @@ AbstractButton {
         width: Settings.bubbles? Math.min(maxWidth,Math.max(reply.implicitWidth+8,contentItem.implicitWidth+metadata.width+20)) : maxWidth
         height: msg.height+msg.anchors.margins*2
 
-        property color userColor: TimelineManager.userColor(userId, Nheko.colors.base)
-        property color bgColor: Nheko.colors.base
+        property color userColor: TimelineManager.userColor(userId, palette.base)
+        property color bgColor: palette.base
         color: (Settings.bubbles && !isStateEvent) ? Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2)) : "#00000000"
         radius: 4
         border.width: r.notificationlevel == MtxEvent.Highlight ? 1 : 0
@@ -169,7 +169,7 @@ AbstractButton {
                     return replyTo != "" ? room.dataById(replyTo, role, r.eventId) : null;
                 }
                 visible: replyTo
-                userColor: r.relatedEventCacheBuster, TimelineManager.userColor(userId, Nheko.colors.base)
+                userColor: r.relatedEventCacheBuster, TimelineManager.userColor(userId, palette.base)
                 blurhash: r.relatedEventCacheBuster, fromModel(Room.Blurhash) ?? ""
                 body: r.relatedEventCacheBuster, fromModel(Room.Body) ?? ""
                 formattedBody: r.relatedEventCacheBuster, fromModel(Room.FormattedBody) ?? ""
@@ -186,11 +186,11 @@ AbstractButton {
                 userId: r.relatedEventCacheBuster, fromModel(Room.UserId) ?? ""
                 userName: r.relatedEventCacheBuster, fromModel(Room.UserName) ?? ""
                 thumbnailUrl: r.relatedEventCacheBuster, fromModel(Room.ThumbnailUrl) ?? ""
-                duration: r.relatedEventCacheBuster, fromModel(Room.Duration) ?? ""
+                duration: r.relatedEventCacheBuster, fromModel(Room.Duration) ?? 0
                 roomTopic: r.relatedEventCacheBuster, fromModel(Room.RoomTopic) ?? ""
                 roomName: r.relatedEventCacheBuster, fromModel(Room.RoomName) ?? ""
                 callType: r.relatedEventCacheBuster, fromModel(Room.CallType) ?? ""
-                encryptionError: r.relatedEventCacheBuster, fromModel(Room.EncryptionError) ?? ""
+                encryptionError: r.relatedEventCacheBuster, fromModel(Room.EncryptionError) ?? 0
                 relatedEventCacheBuster: r.relatedEventCacheBuster, fromModel(Room.RelatedEventCacheBuster) ?? 0
             }
 
@@ -260,7 +260,7 @@ AbstractButton {
                     width: parent.iconSize
                     sourceSize.width: parent.iconSize * Screen.devicePixelRatio
                     sourceSize.height: parent.iconSize * Screen.devicePixelRatio
-                    source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((eventId == room.edit) ? Nheko.colors.highlight : Nheko.colors.buttonText)
+                    source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((eventId == room.edit) ? palette.highlight : palette.buttonText)
                     ToolTip.visible: editHovered.hovered
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("Edited")
@@ -278,7 +278,7 @@ AbstractButton {
                     height: parent.iconSize
                     width: parent.iconSize
                     image: ":/icons/icons/ui/thread.svg"
-                    buttonTextColor: TimelineManager.userColor(threadId, Nheko.colors.base)
+                    buttonTextColor: TimelineManager.userColor(threadId, palette.base)
                     ToolTip.visible: hovered
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("Part of a thread")
@@ -303,7 +303,7 @@ AbstractButton {
                     Layout.alignment: Qt.AlignRight | Qt.AlignTop
                     Layout.preferredWidth: implicitWidth
                     text: timestamp.toLocaleTimeString(Locale.ShortFormat)
-                    color: Nheko.inactiveColors.text
+                    color: palette.inactive.text
                     ToolTip.visible: ma.hovered
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: Qt.formatDateTime(timestamp, Qt.DefaultLocaleLongDate)
@@ -341,7 +341,7 @@ AbstractButton {
             left: parent.left
             right: parent.right
         }
-        color: Nheko.colors.highlight
+        color: palette.highlight
         
         visible: (r.index > 0 && (room.fullyReadEventId == r.eventId))
         height: visible ? 3 : 0
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index c8b22616..8fc567f2 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -32,12 +32,11 @@ Item {
     StickerPicker {
         id: emojiPopup
 
-        colors: Nheko.colors
         emoji: true
     }
 
     // focus message input on key press, but not on Ctrl-C and such.
-    Keys.onPressed: {
+    Keys.onPressed: (event) => {
         if (event.text && event.key !== Qt.Key_Enter && event.key !== Qt.Key_Return && !topBar.searchHasFocus) {
             TimelineManager.focusMessageInput();
             room.input.setText(room.input.text + event.text);
@@ -54,13 +53,12 @@ Item {
         anchors.centerIn: parent
         text: qsTr("No room open")
         font.pointSize: 24
-        color: Nheko.colors.text
     }
 
     Spinner {
         visible: TimelineManager.isInitialSync
         anchors.centerIn: parent
-        foreground: Nheko.colors.mid
+        foreground: palette.mid
         running: TimelineManager.isInitialSync
         // height is somewhat arbitrary here... don't set width because width scales w/ height
         height: parent.height / 16
@@ -102,7 +100,7 @@ Item {
 
             Layout.fillWidth: true
             Layout.fillHeight: true
-            color: Nheko.colors.base
+            color: palette.base
 
             ColumnLayout {
                 anchors.fill: parent
@@ -223,7 +221,7 @@ Item {
             Layout.alignment: Qt.AlignHCenter
 
             MatrixText {
-                text: !roomPreview.isFetched ? qsTr("No preview available") : preview.roomName
+                text: !(roomPreview?.isFetched ?? false) ? qsTr("No preview available") : preview.roomName
                 font.pixelSize: 24
             }
 
@@ -264,13 +262,12 @@ Item {
             Layout.rightMargin: Nheko.paddingLarge
 
             TextArea {
-                text: roomPreview.isFetched ? TimelineManager.escapeEmoji(preview.roomTopic) : qsTr("This room is possibly inaccessible. If this room is private, you should remove it from this community.")
+                text: (roomPreview?.isFetched ?? false) ? TimelineManager.escapeEmoji(preview.roomTopic) : qsTr("This room is possibly inaccessible. If this room is private, you should remove it from this community.")
                 wrapMode: TextEdit.WordWrap
                 textFormat: TextEdit.RichText
                 readOnly: true
                 background: null
                 selectByMouse: true
-                color: Nheko.colors.text
                 horizontalAlignment: TextEdit.AlignHCenter
                 onLinkActivated: Nheko.openLink(link)
 
@@ -328,7 +325,6 @@ Item {
                 readOnly: true
                 background: null
                 selectByMouse: true
-                color: Nheko.colors.text
                 horizontalAlignment: TextEdit.AlignHCenter
             }
 
diff --git a/resources/qml/ToggleButton.qml b/resources/qml/ToggleButton.qml
index 6b43bec5..66902bfd 100644
--- a/resources/qml/ToggleButton.qml
+++ b/resources/qml/ToggleButton.qml
@@ -32,7 +32,7 @@ Switch {
 
             PropertyChanges {
                 target: track
-                border.color: Nheko.colors.highlight
+                border.color: palette.highlight
             }
 
             PropertyChanges {
@@ -88,7 +88,7 @@ Switch {
             width: parent.height * 0.9
             height: width
             radius: width / 2
-            color: Nheko.colors.button
+            color: palette.button
             border.color: "#767676"
         }
 
diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
index f23645a7..eaaa38ea 100644
--- a/resources/qml/TopBar.qml
+++ b/resources/qml/TopBar.qml
@@ -53,7 +53,7 @@ Pane {
 
     padding: 0
     background: Rectangle {
-        color: Nheko.colors.window
+        color: palette.window
     }
 
     TapHandler {
@@ -137,7 +137,7 @@ Pane {
                 Layout.column: 2
                 Layout.row: 0
                 Layout.fillWidth: true
-                color: Nheko.colors.text
+                color: palette.text
                 text: qsTr("In %1").arg(communityAvatar.displayName)
                 maximumLineCount: 1
                 elide: Text.ElideRight
@@ -178,7 +178,7 @@ Pane {
                 Layout.fillWidth: true
                 Layout.column: 2
                 Layout.row: 1
-                color: Nheko.colors.text
+                color: palette.text
                 font.pointSize: fontMetrics.font.pointSize * 1.1
                 font.bold: true
                 text: roomName
@@ -241,8 +241,8 @@ Pane {
                     trust: trustlevel
                     enabled: false
                     unencryptedIcon: ":/icons/icons/ui/people.svg"
-                    unencryptedColor: Nheko.colors.buttonText
-                    unencryptedHoverColor: Nheko.colors.highlight
+                    unencryptedColor: palette.buttonText
+                    unencryptedHoverColor: palette.highlight
                     hovered: parent.hovered
 
                     ToolTip.delay: Nheko.tooltipDelay
@@ -349,7 +349,6 @@ Pane {
                 visible: !!room && room.pinnedMessages.length > 0 && !Settings.hiddenPins.includes(roomId)
                 clip: true
 
-                palette: Nheko.colors
                 ScrollBar.horizontal.visible: false
 
                 ListView {
@@ -372,7 +371,7 @@ Pane {
                             Layout.fillWidth: true
                             Layout.preferredHeight: height
 
-                            userColor: TimelineManager.userColor(e.userId, Nheko.colors.window)
+                            userColor: TimelineManager.userColor(e.userId, palette.window)
                             blurhash: e.blurhash ?? ""
                             body: e.body ?? ""
                             formattedBody: e.formattedBody ?? ""
@@ -387,7 +386,7 @@ Pane {
                             isOnlyEmoji: e.isOnlyEmoji ?? false
                             userId: e.userId ?? ""
                             userName: e.userName ?? ""
-                            encryptionError: e.encryptionError ?? ""
+                            encryptionError: e.encryptionError ?? 0
                             keepFullText: true
                         }
 
@@ -430,7 +429,6 @@ Pane {
                 visible: !!room && room.widgetLinks.length > 0 && !Settings.hiddenWidgets.includes(roomId)
                 clip: true
 
-                palette: Nheko.colors
                 ScrollBar.horizontal.visible: false
 
                 ListView {
@@ -440,7 +438,7 @@ Pane {
                     delegate: MatrixText {
                         required property var modelData
 
-                        color: Nheko.colors.text
+                        color: palette.text
                         text: modelData
                     }
 
diff --git a/resources/qml/TypingIndicator.qml b/resources/qml/TypingIndicator.qml
index 027ae5b6..704fe8ef 100644
--- a/resources/qml/TypingIndicator.qml
+++ b/resources/qml/TypingIndicator.qml
@@ -15,7 +15,7 @@ Item {
         id: typingRect
 
         visible: (room && room.typingUsers.length > 0)
-        color: Nheko.colors.base
+        color: palette.base
         anchors.fill: parent
         z: 3
 
@@ -27,8 +27,8 @@ Item {
             anchors.right: parent.right
             anchors.rightMargin: 10
             anchors.bottom: parent.bottom
-            color: Nheko.colors.text
-            text: room ? room.formatTypingUsers(room.typingUsers, Nheko.colors.base) : ""
+            color: palette.text
+            text: room ? room.formatTypingUsers(room.typingUsers, palette.base) : ""
             textFormat: Text.RichText
         }
 
diff --git a/resources/qml/UploadBox.qml b/resources/qml/UploadBox.qml
index adb8c12b..ccec6131 100644
--- a/resources/qml/UploadBox.qml
+++ b/resources/qml/UploadBox.qml
@@ -40,7 +40,7 @@ Page {
             width: uploadPopup.availableHeight - buttons.height
 
             background: Rectangle {
-                color: Nheko.colors.window
+                color: palette.window
                 radius: Nheko.paddingMedium
             }
             contentItem: ColumnLayout {
@@ -60,7 +60,7 @@ Page {
                         case MediaUpload.Image: return "image";
                         default: return "zip";
                     }
-                    source: (modelData.thumbnail != "") ? modelData.thumbnail : ("image://colorimage/:/icons/icons/ui/"+typeStr+".svg?" + Nheko.colors.buttonText)
+                    source: (modelData.thumbnail != "") ? modelData.thumbnail : ("image://colorimage/:/icons/icons/ui/"+typeStr+".svg?" + palette.buttonText)
                 }
                 MatrixTextField {
                     id: namefield
@@ -85,6 +85,6 @@ Page {
     }
 
     background: Rectangle {
-        color: Nheko.colors.base
+        color: palette.base
     }
 }
diff --git a/resources/qml/components/AvatarListTile.qml b/resources/qml/components/AvatarListTile.qml
index 02c92a09..dad20e52 100644
--- a/resources/qml/components/AvatarListTile.qml
+++ b/resources/qml/components/AvatarListTile.qml
@@ -11,11 +11,11 @@ import im.nheko 1.0
 Rectangle {
     id: tile
 
-    property color background: Nheko.colors.window
-    property color importantText: Nheko.colors.text
-    property color unimportantText: Nheko.colors.buttonText
-    property color bubbleBackground: Nheko.colors.highlight
-    property color bubbleText: Nheko.colors.highlightedText
+    property color background: palette.window
+    property color importantText: palette.text
+    property color unimportantText: palette.buttonText
+    property color bubbleBackground: palette.highlight
+    property color bubbleText: palette.highlightedText
     property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
     required property string avatarUrl
     required property string title
@@ -37,11 +37,11 @@ Rectangle {
 
             PropertyChanges {
                 target: tile
-                background: Nheko.colors.dark
-                importantText: Nheko.colors.brightText
-                unimportantText: Nheko.colors.brightText
-                bubbleBackground: Nheko.colors.highlight
-                bubbleText: Nheko.colors.highlightedText
+                background: palette.dark
+                importantText: palette.brightText
+                unimportantText: palette.brightText
+                bubbleBackground: palette.highlight
+                bubbleText: palette.highlightedText
             }
 
         },
@@ -51,11 +51,11 @@ Rectangle {
 
             PropertyChanges {
                 target: tile
-                background: Nheko.colors.highlight
-                importantText: Nheko.colors.highlightedText
-                unimportantText: Nheko.colors.highlightedText
-                bubbleBackground: Nheko.colors.highlightedText
-                bubbleText: Nheko.colors.highlight
+                background: palette.highlight
+                importantText: palette.highlightedText
+                unimportantText: palette.highlightedText
+                bubbleBackground: palette.highlightedText
+                bubbleText: palette.highlight
             }
 
         }
diff --git a/resources/qml/components/FlatButton.qml b/resources/qml/components/FlatButton.qml
index a3dedf35..0636bc04 100644
--- a/resources/qml/components/FlatButton.qml
+++ b/resources/qml/components/FlatButton.qml
@@ -47,7 +47,7 @@ Button {
             font.capitalization: Font.AllUppercase
             font.pointSize: Math.ceil(fontMetrics.font.pointSize * 1.5)
             //font.capitalization: Font.AllUppercase
-            color: Nheko.colors.light
+            color: palette.light
             horizontalAlignment: Text.AlignHCenter
             verticalAlignment: Text.AlignVCenter
             elide: Text.ElideRight
@@ -58,7 +58,7 @@ Button {
         //height: control.contentItem.implicitHeight * 2
         //width: control.contentItem.implicitWidth * 2
         radius: height / 8
-        color: Qt.lighter(Nheko.colors.dark, control.down ? 1.4 : (control.hovered ? 1.2 : 1))
+        color: Qt.lighter(palette.dark, control.down ? 1.4 : (control.hovered ? 1.2 : 1))
     }
 
 }
diff --git a/resources/qml/components/MainWindowDialog.qml b/resources/qml/components/MainWindowDialog.qml
index 1b063e0f..10c07aae 100644
--- a/resources/qml/components/MainWindowDialog.qml
+++ b/resources/qml/components/MainWindowDialog.qml
@@ -32,7 +32,7 @@ Dialog {
     ]
 
     background: Rectangle {
-        color: Nheko.colors.window
+        color: palette.window
         border.color: Nheko.theme.separator
         border.width: 1
         radius: Nheko.paddingSmall
diff --git a/resources/qml/components/NhekoTabButton.qml b/resources/qml/components/NhekoTabButton.qml
index 13549068..796177e8 100644
--- a/resources/qml/components/NhekoTabButton.qml
+++ b/resources/qml/components/NhekoTabButton.qml
@@ -13,15 +13,15 @@ TabButton {
         text: control.text
         font: control.font
         opacity: enabled ? 1.0 : 0.3
-        color: control.down ? Nheko.colors.highlightedText : Nheko.colors.text
+        color: control.down ? palette.highlightedText : palette.text
         horizontalAlignment: Text.AlignHCenter
         verticalAlignment: Text.AlignVCenter
         elide: Text.ElideRight
     }
 
     background: Rectangle {
-        border.color: control.down ? Nheko.colors.highlight : Nheko.theme.separator
-        color: control.checked ? Nheko.colors.highlight : Nheko.colors.base
+        border.color: control.down ? palette.highlight : Nheko.theme.separator
+        color: control.checked ? palette.highlight : palette.base
         border.width: 1
         radius: 2
     }
diff --git a/resources/qml/components/ReorderableListview.qml b/resources/qml/components/ReorderableListview.qml
index 137e92f8..4e67082e 100644
--- a/resources/qml/components/ReorderableListview.qml
+++ b/resources/qml/components/ReorderableListview.qml
@@ -47,9 +47,9 @@ Item {
                 width: dragArea.width; height: actualDelegate.implicitHeight + 4
 
                 border.width: dragArea.enabled ? 1 : 0
-                border.color: Nheko.colors.highlight
+                border.color: palette.highlight
 
-                color: dragArea.held ? Nheko.colors.highlight : Nheko.colors.base
+                color: dragArea.held ? palette.highlight : palette.base
                 Behavior on color { ColorAnimation { duration: 100 } }
 
                 radius: 2
diff --git a/resources/qml/components/TextButton.qml b/resources/qml/components/TextButton.qml
index a48aee2b..0b1ac270 100644
--- a/resources/qml/components/TextButton.qml
+++ b/resources/qml/components/TextButton.qml
@@ -11,8 +11,8 @@ AbstractButton {
     id: button
 
     property alias cursor: mouseArea.cursorShape
-    property color highlightColor: Nheko.colors.highlight
-    property color buttonTextColor: Nheko.colors.buttonText
+    property color highlightColor: palette.highlight
+    property color buttonTextColor: palette.buttonText
 
     focusPolicy: Qt.NoFocus
     width: buttonText.implicitWidth
diff --git a/resources/qml/components/UserListRow.qml b/resources/qml/components/UserListRow.qml
index 316baab0..2047f700 100644
--- a/resources/qml/components/UserListRow.qml
+++ b/resources/qml/components/UserListRow.qml
@@ -36,7 +36,7 @@ ItemDelegate {
         Label {
             Layout.fillWidth: true
             text: displayName
-            color: TimelineManager.userColor(userid, Nheko.colors.window)
+            color: TimelineManager.userColor(userid, palette.window)
             font.pointSize: fontMetrics.font.pointSize
         }
 
@@ -44,7 +44,7 @@ ItemDelegate {
             Layout.fillWidth: true
             Layout.alignment: Qt.AlignTop
             text: userid
-            color: Nheko.colors.buttonText
+            color: palette.buttonText
             font.pointSize: fontMetrics.font.pointSize * 0.9
         }
     }
diff --git a/resources/qml/delegates/Encrypted.qml b/resources/qml/delegates/Encrypted.qml
index 74e1cb0d..fdfe958e 100644
--- a/resources/qml/delegates/Encrypted.qml
+++ b/resources/qml/delegates/Encrypted.qml
@@ -18,7 +18,7 @@ Rectangle {
     width: parent.width? parent.width : 0
     implicitWidth: encryptedText.implicitWidth+24+Nheko.paddingMedium*3 // Column doesn't provide a useful implicitWidth, should be replaced by ColumnLayout
     height: contents.implicitHeight + Nheko.paddingMedium * 2
-    color: Nheko.colors.alternateBase
+    color: palette.alternateBase
 
     RowLayout {
         id: contents
@@ -58,12 +58,11 @@ Rectangle {
                         return qsTr("Unknown decryption error");
                     }
                 }
-                color: Nheko.colors.text
+                color: palette.text
                 width: parent.width
             }
 
             Button {
-                palette: Nheko.colors
                 visible: encryptionError == Olm.MissingSession || encryptionError == Olm.MissingSessionIndex
                 text: qsTr("Request key")
                 onClicked: room.requestKeyForEvent(eventId)
diff --git a/resources/qml/delegates/EncryptionEnabled.qml b/resources/qml/delegates/EncryptionEnabled.qml
index e38be4b0..c8671c84 100644
--- a/resources/qml/delegates/EncryptionEnabled.qml
+++ b/resources/qml/delegates/EncryptionEnabled.qml
@@ -17,7 +17,7 @@ Rectangle {
     width: parent.width ? Math.min(parent.width, 700) : 0
     anchors.horizontalCenter: parent.horizontalCenter
     height: contents.implicitHeight + Nheko.paddingMedium * 2
-    color: Nheko.colors.alternateBase
+    color: palette.alternateBase
     border.color: Nheko.theme.green
     border.width: 2
 
@@ -43,13 +43,13 @@ Rectangle {
                 text: qsTr("%1 enabled end-to-end encryption").arg(r.username)
                 font.bold: true
                 font.pointSize: 14
-                color: Nheko.colors.text
+                color: palette.text
                 width: parent.width
             }
 
             MatrixText {
                 text: qsTr("Encryption keeps your messages safe by only allowing the people you sent the message to to read it. For extra security, if you want to make sure you are talking to the right people, you can verify them in real life.")
-                color: Nheko.colors.text
+                color: palette.text
                 width: parent.width
             }
 
diff --git a/resources/qml/delegates/FileMessage.qml b/resources/qml/delegates/FileMessage.qml
index b3c44af2..e63ca8e3 100644
--- a/resources/qml/delegates/FileMessage.qml
+++ b/resources/qml/delegates/FileMessage.qml
@@ -27,7 +27,7 @@ Item {
         Rectangle {
             id: button
 
-            color: Nheko.colors.light
+            color: palette.light
             radius: 22
             height: 44
             width: 44
@@ -67,7 +67,7 @@ Item {
                 text: filename
                 textFormat: Text.PlainText
                 elide: Text.ElideRight
-                color: Nheko.colors.text
+                color: palette.text
             }
 
             Text {
@@ -77,7 +77,7 @@ Item {
                 text: filesize
                 textFormat: Text.PlainText
                 elide: Text.ElideRight
-                color: Nheko.colors.text
+                color: palette.text
             }
 
         }
@@ -85,7 +85,7 @@ Item {
     }
 
     Rectangle {
-        color: Nheko.colors.alternateBase
+        color: palette.alternateBase
         z: -1
         radius: 10
         anchors.fill: parent
diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml
index bed4b659..20d727c3 100644
--- a/resources/qml/delegates/ImageMessage.qml
+++ b/resources/qml/delegates/ImageMessage.qml
@@ -22,7 +22,7 @@ AbstractButton {
     property int tempWidth: originalWidth < 1? 400: originalWidth
 
     implicitWidth: Math.round(tempWidth*Math.min((timelineView.height/divisor)/(tempWidth*proportionalHeight), 1))
-    width: Math.min(parent.width,implicitWidth)
+    width: Math.min(parent?.width ?? 2000,implicitWidth)
     height: width*proportionalHeight
     hoverEnabled: true
 
@@ -106,14 +106,14 @@ AbstractButton {
     ]
 
     property int metadataWidth
-    property bool fitsMetadata: (parent.width - width) > metadataWidth+4
+    property bool fitsMetadata: parent != null ? (parent.width - width) > metadataWidth+4 : false
 
     Image {
         id: img
 
         visible: !mxcimage.loaded
         anchors.fill: parent
-        source: url.replace("mxc://", "image://MxcImage/") + "?scale"
+        source: url != "" ? (url.replace("mxc://", "image://MxcImage/") + "?scale") : ""
         asynchronous: true
         fillMode: Image.PreserveAspectFit
         smooth: true
@@ -137,7 +137,7 @@ AbstractButton {
         id: blurhash_
 
         anchors.fill: parent
-        source: blurhash ? ("image://blurhash/" + blurhash) : ("image://colorimage/:/icons/icons/ui/image-failed.svg?" + Nheko.colors.buttonText)
+        source: blurhash ? ("image://blurhash/" + blurhash) : ("image://colorimage/:/icons/icons/ui/image-failed.svg?" + palette.buttonText)
         asynchronous: true
         fillMode: Image.PreserveAspectFit
         sourceSize.width: parent.width * Screen.devicePixelRatio
@@ -158,7 +158,7 @@ AbstractButton {
             width: parent.width
             implicitHeight: imgcaption.implicitHeight
             anchors.bottom: overlay.bottom
-            color: Nheko.colors.window
+            color: palette.window
             opacity: 0.75
         }
 
@@ -171,7 +171,7 @@ AbstractButton {
             verticalAlignment: Text.AlignVCenter
             // See this MSC: https://github.com/matrix-org/matrix-doc/pull/2530
             text: filename ? filename : body
-            color: Nheko.colors.text
+            color: palette.text
         }
 
     }
diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml
index c0bcec0d..cd8109b4 100644
--- a/resources/qml/delegates/MessageDelegate.qml
+++ b/resources/qml/delegates/MessageDelegate.qml
@@ -13,7 +13,7 @@ Item {
     required property bool isReply
     property bool keepFullText: !isReply
     property alias child: chooser.child
-    implicitWidth: (chooser.child && chooser.child.implicitWidth) ? chooser.child.implicitWidth : 0
+    //implicitWidth: chooser.child?.implicitWidth ?? 0
     required property double proportionalHeight
     required property int type
     required property string typeString
@@ -48,7 +48,7 @@ Item {
         roleValue: type
         //anchors.fill: parent
 
-        width: parent.width? parent.width: 0 // this should get rid of "cannot read property 'width' of null"
+        width: parent?.width ?? 0 // this should get rid of "cannot read property 'width' of null"
 
         DelegateChoice {
             roleValue: MtxEvent.UnknownEvent
@@ -78,7 +78,6 @@ Item {
                 }
 
                 Button {
-                    palette: Nheko.colors
                     Layout.alignment: Qt.AlignHCenter
                     text: qsTr("Go to replacement room")
                     onClicked: room.joinReplacementRoom(eventId)
@@ -149,7 +148,7 @@ Item {
 
             NoticeMessage {
                 formatted: TimelineManager.escapeEmoji(d.userName) + " " + d.formattedBody
-                color: TimelineManager.userColor(d.userId, Nheko.colors.base)
+                color: TimelineManager.userColor(d.userId, palette.base)
                 body: d.body
                 isOnlyEmoji: d.isOnlyEmoji
                 isReply: d.isReply
@@ -617,7 +616,6 @@ Item {
 
                 Button {
                     visible: d.relatedEventCacheBuster, room.showAcceptKnockButton(d.eventId)
-                    palette: Nheko.colors
                     Layout.alignment: Qt.AlignHCenter
                     text: qsTr("Allow them in")
                     onClicked: room.acceptKnock(eventId)
diff --git a/resources/qml/delegates/NoticeMessage.qml b/resources/qml/delegates/NoticeMessage.qml
index d62afb96..88efe7b7 100644
--- a/resources/qml/delegates/NoticeMessage.qml
+++ b/resources/qml/delegates/NoticeMessage.qml
@@ -9,7 +9,7 @@ import im.nheko 1.0
 TextMessage {
     property bool isStateEvent
     font.italic: true
-    color: Nheko.colors.buttonText
+    color: palette.buttonText
     font.pointSize: isStateEvent? 0.8*Settings.fontSize : Settings.fontSize
     horizontalAlignment: isStateEvent? Text.AlignHCenter : undefined
 }
diff --git a/resources/qml/delegates/Pill.qml b/resources/qml/delegates/Pill.qml
index b60781cb..3f981d4d 100644
--- a/resources/qml/delegates/Pill.qml
+++ b/resources/qml/delegates/Pill.qml
@@ -8,14 +8,14 @@ import im.nheko 1.0
 
 Label {
     property bool isStateEvent
-    color: Nheko.colors.text
+    color: palette.text
     horizontalAlignment: Text.AlignHCenter
     height: Math.round(fontMetrics.height * 1.4)
     width: contentWidth * 1.2
 
     background: Rectangle {
         radius: parent.height / 2
-        color: Nheko.colors.alternateBase
+        color: palette.alternateBase
     }
 
 }
diff --git a/resources/qml/delegates/Placeholder.qml b/resources/qml/delegates/Placeholder.qml
index 08008765..66e28c03 100644
--- a/resources/qml/delegates/Placeholder.qml
+++ b/resources/qml/delegates/Placeholder.qml
@@ -10,5 +10,5 @@ MatrixText {
 
     text: qsTr("unimplemented event: ") + typeString
 //    width: parent.width
-    color: Nheko.inactiveColors.text
+    color: palette.inactive.text
 }
diff --git a/resources/qml/delegates/PlayableMediaMessage.qml b/resources/qml/delegates/PlayableMediaMessage.qml
index 1131856f..60a61372 100644
--- a/resources/qml/delegates/PlayableMediaMessage.qml
+++ b/resources/qml/delegates/PlayableMediaMessage.qml
@@ -47,7 +47,7 @@ Item {
     Rectangle {
         id: videoContainer
 
-        color: type == MtxEvent.VideoMessage ? Nheko.colors.window : "transparent"
+        color: type == MtxEvent.VideoMessage ? palette.window : "transparent"
         width: parent.width
         height: parent.height - fileInfoLabel.height
 
@@ -57,7 +57,7 @@ Item {
 
         Image {
             anchors.fill: parent
-            source: thumbnailUrl ? thumbnailUrl.replace("mxc://", "image://MxcImage/") + "?scale" : "image://colorimage/:/icons/icons/ui/video-file.svg?" + Nheko.colors.windowText
+            source: thumbnailUrl ? thumbnailUrl.replace("mxc://", "image://MxcImage/") + "?scale" : "image://colorimage/:/icons/icons/ui/video-file.svg?" + palette.windowText
             asynchronous: true
             fillMode: Image.PreserveAspectFit
 
@@ -99,10 +99,10 @@ Item {
         text: body + " [" + filesize + "]"
         textFormat: Text.RichText
         elide: Text.ElideRight
-        color: Nheko.colors.text
+        color: palette.text
 
         background: Rectangle {
-            color: Nheko.colors.base
+            color: palette.base
         }
 
     }
diff --git a/resources/qml/delegates/Redacted.qml b/resources/qml/delegates/Redacted.qml
index 74d4e015..4a9700dc 100644
--- a/resources/qml/delegates/Redacted.qml
+++ b/resources/qml/delegates/Redacted.qml
@@ -13,7 +13,7 @@ Rectangle{
     implicitWidth: redactedLayout.implicitWidth + 2 * Nheko.paddingMedium
     width: Math.min(parent.width,implicitWidth+1)
     radius: fontMetrics.lineSpacing / 2 + 2 * Nheko.paddingSmall
-    color: Nheko.colors.alternateBase
+    color: palette.alternateBase
     property int metadataWidth
     property bool fitsMetadata: parent.width - redactedLayout.width > metadataWidth + 4
 
@@ -28,7 +28,7 @@ Rectangle{
             Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
             Layout.preferredWidth: fontMetrics.font.pixelSize
             Layout.preferredHeight: fontMetrics.font.pixelSize
-            source: "image://colorimage/:/icons/icons/ui/delete.svg?" + Nheko.colors.text
+            source: "image://colorimage/:/icons/icons/ui/delete.svg?" + palette.text
         }
         Label {
             id: redactedLabel
@@ -39,7 +39,7 @@ Rectangle{
             property var redactedPair: room.formatRedactedEvent(eventId)
             text: redactedPair["first"]
             wrapMode: Label.WordWrap
-            color: Nheko.colors.text
+            color: palette.text
 
             ToolTip.text: redactedPair["second"]
             ToolTip.visible: hh.hovered
diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml
index c593a4f8..94128960 100644
--- a/resources/qml/delegates/Reply.qml
+++ b/resources/qml/delegates/Reply.qml
@@ -54,7 +54,7 @@ AbstractButton {
         anchors.top: replyContainer.top
         anchors.bottom: replyContainer.bottom
         width: 4
-        color: TimelineManager.userColor(userId, Nheko.colors.base)
+        color: TimelineManager.userColor(userId, palette.base)
     }
 
     onClicked: {
@@ -135,8 +135,8 @@ AbstractButton {
 
         z: -1
         anchors.fill: replyContainer
-        property color userColor: TimelineManager.userColor(userId, Nheko.colors.base)
-        property color bgColor: Nheko.colors.base
+        property color userColor: TimelineManager.userColor(userId, palette.base)
+        property color bgColor: palette.base
         color: Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.1))
     }
 
diff --git a/resources/qml/delegates/TextMessage.qml b/resources/qml/delegates/TextMessage.qml
index eb46a9ac..39e8b1a8 100644
--- a/resources/qml/delegates/TextMessage.qml
+++ b/resources/qml/delegates/TextMessage.qml
@@ -19,15 +19,15 @@ MatrixText {
     // table border-collapse doesn't seem to work
     text: "
     <style type=\"text/css\">
-    a { color:" + Nheko.colors.link + ";}
-    code { background-color: " + Nheko.colors.alternateBase + "; white-space: pre-wrap; }
-    pre { background-color: " + Nheko.colors.alternateBase + "; white-space: pre-wrap; }
+    a { color:" + palette.link + ";}
+    code { background-color: " + palette.alternateBase + "; white-space: pre-wrap; }
+    pre { background-color: " + palette.alternateBase + "; white-space: pre-wrap; }
     table {
         border-width: 1px;
         border-collapse: collapse;
         border-style: solid;
-        border-color: " + Nheko.colors.text + ";
-        background-color: " + Nheko.colors.alternateBase + ";
+        border-color: " + palette.text + ";
+        background-color: " + palette.alternateBase + ";
     }
     table th,
     table td {
@@ -36,11 +36,11 @@ MatrixText {
     blockquote { margin-left: 1em; }
     " + (!Settings.mobileMode ? "span[data-mx-spoiler] {
         color: transparent;
-        background-color: " + Nheko.colors.text + ";
+        background-color: " + palette.text + ";
     }" : "") +  // TODO(Nico): Figure out how to support mobile
     "</style>
     " + formatted.replace(/<del>/g, "<s>").replace(/<\/del>/g, "</s>").replace(/<strike>/g, "<s>").replace(/<\/strike>/g, "</s>")
-    width: parent.width
+    width: parent?.width ?? 0
     height: !keepFullText ? Math.round(Math.min(timelineView.height / 8, implicitHeight)) : implicitHeight
     clip: !keepFullText
     selectByMouse: !Settings.mobileMode && !isReply
diff --git a/resources/qml/device-verification/DeviceVerification.qml b/resources/qml/device-verification/DeviceVerification.qml
index d44fd9cf..afc6fd0a 100644
--- a/resources/qml/device-verification/DeviceVerification.qml
+++ b/resources/qml/device-verification/DeviceVerification.qml
@@ -15,8 +15,7 @@ ApplicationWindow {
     onClosing: VerificationManager.removeVerificationFlow(flow)
     title: stack.currentItem ? (stack.currentItem.title_ || "") : ""
     modality: Qt.NonModal
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     //height: stack.currentItem.implicitHeight
     minimumHeight: stack.currentItem.implicitHeight + 2 * Nheko.paddingLarge
     height: stack.currentItem.implicitHeight + 2 * Nheko.paddingMedium
@@ -25,7 +24,7 @@ ApplicationWindow {
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
     background: Rectangle {
-        color: Nheko.colors.window
+        color: palette.window
     }
 
 
diff --git a/resources/qml/device-verification/DigitVerification.qml b/resources/qml/device-verification/DigitVerification.qml
index 10ba4c55..33cc59f4 100644
--- a/resources/qml/device-verification/DigitVerification.qml
+++ b/resources/qml/device-verification/DigitVerification.qml
@@ -17,7 +17,7 @@ ColumnLayout {
         Layout.fillWidth: true
         wrapMode: Text.Wrap
         text: qsTr("Please verify the following digits. You should see the same numbers on both sides. If they differ, please press 'They do not match!' to abort verification!")
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
@@ -28,19 +28,19 @@ ColumnLayout {
         Label {
             font.pixelSize: Qt.application.font.pixelSize * 2
             text: flow.sasList[0]
-            color: Nheko.colors.text
+            color: palette.text
         }
 
         Label {
             font.pixelSize: Qt.application.font.pixelSize * 2
             text: flow.sasList[1]
-            color: Nheko.colors.text
+            color: palette.text
         }
 
         Label {
             font.pixelSize: Qt.application.font.pixelSize * 2
             text: flow.sasList[2]
-            color: Nheko.colors.text
+            color: palette.text
         }
 
     }
diff --git a/resources/qml/device-verification/EmojiVerification.qml b/resources/qml/device-verification/EmojiVerification.qml
index a6f6ff09..0ee279cd 100644
--- a/resources/qml/device-verification/EmojiVerification.qml
+++ b/resources/qml/device-verification/EmojiVerification.qml
@@ -17,7 +17,7 @@ ColumnLayout {
         Layout.fillWidth: true
         wrapMode: Text.Wrap
         text: qsTr("Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press 'They do not match!' to abort verification!")
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
@@ -373,13 +373,13 @@ ColumnLayout {
                         text: col.emoji.emoji
                         font.pixelSize: Qt.application.font.pixelSize * 2
                         font.family: Settings.emojiFont
-                        color: Nheko.colors.text
+                        color: palette.text
                     }
 
                     Label {
                         Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
                         text: col.emoji.description
-                        color: Nheko.colors.text
+                        color: palette.text
                     }
 
                 }
@@ -396,7 +396,7 @@ ColumnLayout {
         Layout.fillWidth: true
         wrapMode: Text.Wrap
         text: qsTr("The displayed emoji might look different in different clients if a different font is used. Similarly they might be translated into different languages. Nonetheless they should depict one of 64 different objects or animals. For example a lion and a cat are different, but a cat is the same even if one client just shows a cat face, while another client shows a full cat body.")
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
diff --git a/resources/qml/device-verification/Failed.qml b/resources/qml/device-verification/Failed.qml
index fe514df0..5847894b 100644
--- a/resources/qml/device-verification/Failed.qml
+++ b/resources/qml/device-verification/Failed.qml
@@ -35,7 +35,7 @@ ColumnLayout {
                 return qsTr("Unknown verification error.");
             }
         }
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
diff --git a/resources/qml/device-verification/NewVerificationRequest.qml b/resources/qml/device-verification/NewVerificationRequest.qml
index 84bee834..9a9ab703 100644
--- a/resources/qml/device-verification/NewVerificationRequest.qml
+++ b/resources/qml/device-verification/NewVerificationRequest.qml
@@ -36,7 +36,7 @@ ColumnLayout {
                     return qsTr("Your device (%1) has requested to be verified.").arg(flow.deviceId);
             }
         }
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
diff --git a/resources/qml/device-verification/Success.qml b/resources/qml/device-verification/Success.qml
index 4e7bd5d1..4b60a5a3 100644
--- a/resources/qml/device-verification/Success.qml
+++ b/resources/qml/device-verification/Success.qml
@@ -19,7 +19,7 @@ ColumnLayout {
         Layout.fillWidth: true
         wrapMode: Text.Wrap
         text: qsTr("Verification successful! Both sides verified their devices!")
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
diff --git a/resources/qml/device-verification/Waiting.qml b/resources/qml/device-verification/Waiting.qml
index a7e68ae9..5b45fc7c 100644
--- a/resources/qml/device-verification/Waiting.qml
+++ b/resources/qml/device-verification/Waiting.qml
@@ -30,14 +30,14 @@ ColumnLayout {
                     return "";
             }
         }
-        color: Nheko.colors.text
+        color: palette.text
         verticalAlignment: Text.AlignVCenter
     }
 
     Item { Layout.fillHeight: true; }
     Spinner {
         Layout.alignment: Qt.AlignHCenter
-        foreground: Nheko.colors.mid
+        foreground: palette.mid
     }
     Item { Layout.fillHeight: true; }
 
diff --git a/resources/qml/dialogs/AliasEditor.qml b/resources/qml/dialogs/AliasEditor.qml
index 8a79f7d2..32efff22 100644
--- a/resources/qml/dialogs/AliasEditor.qml
+++ b/resources/qml/dialogs/AliasEditor.qml
@@ -41,7 +41,7 @@ ApplicationWindow {
             font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
             Layout.fillWidth: true
             Layout.fillHeight: false
-            color: Nheko.colors.text
+            color: palette.text
             Layout.bottomMargin: Nheko.paddingMedium
         }
 
@@ -69,7 +69,7 @@ ApplicationWindow {
                 Text {
                     Layout.fillWidth: true
                     text: model.name
-                    color: model.isPublished ? Nheko.colors.text : Nheko.theme.error
+                    color: model.isPublished ? palette.text : Nheko.theme.error
                     textFormat: Text.PlainText
                 }
 
@@ -78,8 +78,8 @@ ApplicationWindow {
                     Layout.margins: 2
                     image: ":/icons/icons/ui/star.svg"
                     hoverEnabled: true
-                    buttonTextColor: model.isCanonical ? Nheko.colors.highlight : Nheko.colors.text
-                    highlightColor: editingModel.canAdvertize ? Nheko.colors.highlight : buttonTextColor
+                    buttonTextColor: model.isCanonical ? palette.highlight : palette.text
+                    highlightColor: editingModel.canAdvertize ? palette.highlight : buttonTextColor
 
                     ToolTip.visible: hovered
                     ToolTip.text: model.isCanonical ? qsTr("Primary alias") : qsTr("Make primary alias")
@@ -92,8 +92,8 @@ ApplicationWindow {
                     Layout.margins: 2
                     image: ":/icons/icons/ui/building-shop.svg"
                     hoverEnabled: true
-                    buttonTextColor: model.isAdvertized ? Nheko.colors.highlight : Nheko.colors.text
-                    highlightColor: editingModel.canAdvertize ? Nheko.colors.highlight : buttonTextColor
+                    buttonTextColor: model.isAdvertized ? palette.highlight : palette.text
+                    highlightColor: editingModel.canAdvertize ? palette.highlight : buttonTextColor
 
                     ToolTip.visible: hovered
                     ToolTip.text: qsTr("Advertise as an alias in this room")
@@ -106,7 +106,7 @@ ApplicationWindow {
                     Layout.margins: 2
                     image: ":/icons/icons/ui/room-directory.svg"
                     hoverEnabled: true
-                    buttonTextColor: model.isPublished ? Nheko.colors.highlight : Nheko.colors.text
+                    buttonTextColor: model.isPublished ? palette.highlight : palette.text
 
                     ToolTip.visible: hovered
                     ToolTip.text: qsTr("Publish in room directory")
@@ -139,7 +139,7 @@ ApplicationWindow {
                 Layout.fillWidth: true
                 selectByMouse: true
                 font.pixelSize: fontMetrics.font.pixelSize
-                color: Nheko.colors.text
+                color: palette.text
                 placeholderText: qsTr("#new-alias:server.tld")
 
                 Component.onCompleted: forceActiveFocus()
diff --git a/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml b/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml
index d93f1f18..94ecf651 100644
--- a/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml
+++ b/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml
@@ -20,8 +20,7 @@ ApplicationWindow {
     minimumHeight: 450
     width: 450
     height: 680
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
     title: qsTr("Allowed rooms settings")
@@ -42,7 +41,7 @@ ApplicationWindow {
             font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
             Layout.fillWidth: true
             Layout.fillHeight: false
-            color: Nheko.colors.text
+            color: palette.text
             Layout.bottomMargin: Nheko.paddingMedium
         }
 
@@ -72,14 +71,14 @@ ApplicationWindow {
                     Text {
                         Layout.fillWidth: true
                         text: model.name
-                        color: Nheko.colors.text
+                        color: palette.text
                         textFormat: Text.PlainText
                     }
 
                     Text {
                         Layout.fillWidth: true
                         text: model.isParent ? qsTr("Parent community") : qsTr("Other room")
-                        color: Nheko.colors.buttonText
+                        color: palette.buttonText
                         textFormat: Text.PlainText
                     }
                 }
@@ -122,7 +121,7 @@ ApplicationWindow {
 
                 placeholderText: qsTr("Enter additional rooms not in the list yet...")
 
-                color: Nheko.colors.text
+                color: palette.text
                 onTextEdited: {
                     roomCompleter.completer.searchString = text;
                 }
diff --git a/resources/qml/dialogs/ConfirmJoinRoomDialog.qml b/resources/qml/dialogs/ConfirmJoinRoomDialog.qml
index b37630c8..a3fb9831 100644
--- a/resources/qml/dialogs/ConfirmJoinRoomDialog.qml
+++ b/resources/qml/dialogs/ConfirmJoinRoomDialog.qml
@@ -19,8 +19,7 @@ ApplicationWindow {
     title: summary.isSpace ? qsTr("Confirm community join") : qsTr("Confirm room join")
     modality: Qt.WindowModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     width: 350
     height: content.implicitHeight + Nheko.paddingLarge + footer.implicitHeight
 
@@ -48,7 +47,7 @@ ApplicationWindow {
         Spinner {
             Layout.alignment: Qt.AlignHCenter
             visible: !summary.isLoaded
-            foreground: Nheko.colors.mid
+            foreground: palette.mid
             running: !summary.isLoaded
         }
 
@@ -57,7 +56,7 @@ ApplicationWindow {
             textFormat: TextEdit.RichText
             text: summary.roomName
             font.pixelSize: fontMetrics.font.pixelSize * 2
-            color: Nheko.colors.text
+            color: palette.text
 
             Layout.alignment: Qt.AlignHCenter
             Layout.fillWidth: true
@@ -70,7 +69,7 @@ ApplicationWindow {
             textFormat: TextEdit.RichText
             text: summary.roomid
             font.pixelSize: fontMetrics.font.pixelSize * 0.8
-            color: Nheko.colors.text
+            color: palette.text
 
             Layout.alignment: Qt.AlignHCenter
             Layout.fillWidth: true
@@ -96,7 +95,7 @@ ApplicationWindow {
             readOnly: true
             textFormat: TextEdit.RichText
             text: summary.roomTopic
-            color: Nheko.colors.text
+            color: palette.text
 
             Layout.alignment: Qt.AlignHCenter
             Layout.fillWidth: true
@@ -109,7 +108,7 @@ ApplicationWindow {
             id: promptLabel
 
             text: summary.isKnockOnly ? qsTr("This room can't be joined directly. You can, however, knock on the room and room members can accept or decline this join request. You can additionally provide a reason for them to let you in below:") : qsTr("Do you want to join this room? You can optionally add a reason below:")
-            color: Nheko.colors.text
+            color: palette.text
             Layout.fillWidth: true
             horizontalAlignment: Text.AlignHCenter
             wrapMode: Text.Wrap
diff --git a/resources/qml/dialogs/CreateDirect.qml b/resources/qml/dialogs/CreateDirect.qml
index 4ce568bb..75013970 100644
--- a/resources/qml/dialogs/CreateDirect.qml
+++ b/resources/qml/dialogs/CreateDirect.qml
@@ -55,14 +55,14 @@ ApplicationWindow {
             Label {
                 Layout.fillWidth: true
                 text: profile? profile.displayName : ""
-                color: TimelineManager.userColor(userID.text, Nheko.colors.window)
+                color: TimelineManager.userColor(userID.text, palette.window)
                 font.pointSize: fontMetrics.font.pointSize
             }
 
             Label {
                 Layout.fillWidth: true
                 text: userID.text
-                color: Nheko.colors.buttonText
+                color: palette.buttonText
                 font.pointSize: fontMetrics.font.pointSize * 0.9
             }
         }
@@ -89,7 +89,7 @@ ApplicationWindow {
                 Layout.fillWidth: true
                 Layout.alignment: Qt.AlignLeft
                 text: qsTr("Encryption")
-                color: Nheko.colors.text
+                color: palette.text
             }
             ToggleButton {
                 Layout.alignment: Qt.AlignRight
diff --git a/resources/qml/dialogs/CreateRoom.qml b/resources/qml/dialogs/CreateRoom.qml
index cb198bb8..2164ba50 100644
--- a/resources/qml/dialogs/CreateRoom.qml
+++ b/resources/qml/dialogs/CreateRoom.qml
@@ -64,7 +64,7 @@ ApplicationWindow {
             Label {
                 Layout.preferredWidth: implicitWidth
                 text: "#"
-                color: Nheko.colors.text
+                color: palette.text
             }
             MatrixTextField {
                 id: newRoomAlias
@@ -75,14 +75,14 @@ ApplicationWindow {
                 Layout.preferredWidth: implicitWidth
                 property string userName: userInfoGrid.profile.userid
                 text: userName.substring(userName.indexOf(":"))
-                color: Nheko.colors.text
+                color: palette.text
             }
         }
         Label {
             Layout.preferredWidth: implicitWidth
             Layout.alignment: Qt.AlignLeft
             text: qsTr("Public")
-            color: Nheko.colors.text
+            color: palette.text
             HoverHandler {
                 id: privateHover
             }
@@ -101,7 +101,7 @@ ApplicationWindow {
             Layout.preferredWidth: implicitWidth
             Layout.alignment: Qt.AlignLeft
             text: qsTr("Trusted")
-            color: Nheko.colors.text
+            color: palette.text
             HoverHandler {
                 id: trustedHover
             }
@@ -122,7 +122,7 @@ ApplicationWindow {
             Layout.preferredWidth: implicitWidth
             Layout.alignment: Qt.AlignLeft
             text: qsTr("Encryption")
-            color: Nheko.colors.text
+            color: palette.text
             HoverHandler {
                 id: encryptionHover
             }
diff --git a/resources/qml/dialogs/ImagePackEditorDialog.qml b/resources/qml/dialogs/ImagePackEditorDialog.qml
index 4f30e78a..9e848150 100644
--- a/resources/qml/dialogs/ImagePackEditorDialog.qml
+++ b/resources/qml/dialogs/ImagePackEditorDialog.qml
@@ -22,8 +22,7 @@ ApplicationWindow {
     title: qsTr("Editing image pack")
     height: 600
     width: 600
-    palette: Nheko.colors
-    color: Nheko.colors.base
+    color: palette.base
     modality: Qt.WindowModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
@@ -73,13 +72,12 @@ ApplicationWindow {
                         anchors.verticalCenter: parent.verticalCenter
                         height: parent.height - Nheko.paddingSmall * 2
                         width: 3
-                        color: Nheko.colors.highlight
+                        color: palette.highlight
                     }
 
                 }
 
                 footer: Button {
-                    palette: Nheko.colors
                     onClicked: addFilesDialog.open()
                     width: ListView.view.width
                     text: qsTr("Add images")
@@ -100,11 +98,11 @@ ApplicationWindow {
                 delegate: AvatarListTile {
                     id: packItem
 
-                    property color background: Nheko.colors.window
-                    property color importantText: Nheko.colors.text
-                    property color unimportantText: Nheko.colors.buttonText
-                    property color bubbleBackground: Nheko.colors.highlight
-                    property color bubbleText: Nheko.colors.highlightedText
+                    property color background: palette.window
+                    property color importantText: palette.text
+                    property color unimportantText: palette.buttonText
+                    property color bubbleBackground: palette.highlight
+                    property color bubbleText: palette.highlightedText
                     required property string shortCode
                     required property string url
                     required property string body
@@ -129,7 +127,7 @@ ApplicationWindow {
             id: packinfoC
 
             Rectangle {
-                color: Nheko.colors.window
+                color: palette.window
 
                 GridLayout {
                     anchors.fill: parent
diff --git a/resources/qml/dialogs/ImagePackSettingsDialog.qml b/resources/qml/dialogs/ImagePackSettingsDialog.qml
index 76d84a07..31a34c94 100644
--- a/resources/qml/dialogs/ImagePackSettingsDialog.qml
+++ b/resources/qml/dialogs/ImagePackSettingsDialog.qml
@@ -23,8 +23,7 @@ ApplicationWindow {
     title: qsTr("Image pack settings")
     height: 600
     width: 800
-    palette: Nheko.colors
-    color: Nheko.colors.base
+    color: palette.base
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
@@ -64,7 +63,6 @@ ApplicationWindow {
 
                 footer: ColumnLayout {
                     Button {
-                        palette: Nheko.colors
                         onClicked: {
                             var dialog = packEditor.createObject(timelineRoot, {
                                 "imagePack": packlist.newPack(false)
@@ -78,7 +76,6 @@ ApplicationWindow {
                     }
 
                     Button {
-                        palette: Nheko.colors
                         onClicked: {
                             var dialog = packEditor.createObject(timelineRoot, {
                                 "imagePack": packlist.newPack(true)
@@ -96,11 +93,11 @@ ApplicationWindow {
                 delegate: AvatarListTile {
                     id: packItem
 
-                    property color background: Nheko.colors.window
-                    property color importantText: Nheko.colors.text
-                    property color unimportantText: Nheko.colors.buttonText
-                    property color bubbleBackground: Nheko.colors.highlight
-                    property color bubbleText: Nheko.colors.highlightedText
+                    property color background: palette.window
+                    property color importantText: palette.text
+                    property color unimportantText: palette.buttonText
+                    property color bubbleBackground: palette.highlight
+                    property color bubbleText: palette.highlightedText
                     required property string displayName
                     required property bool fromAccountData
                     required property bool fromCurrentRoom
@@ -135,7 +132,7 @@ ApplicationWindow {
             id: packinfoC
 
             Rectangle {
-                color: Nheko.colors.window
+                color: palette.window
 
                 ColumnLayout {
                     id: packinfo
@@ -243,7 +240,7 @@ ApplicationWindow {
 
                             background: Rectangle {
                                 anchors.fill: parent
-                                color: hovered ? Nheko.colors.highlight : 'transparent'
+                                color: hovered ? palette.highlight : 'transparent'
                                 radius: 5
                             }
 
diff --git a/resources/qml/dialogs/InputDialog.qml b/resources/qml/dialogs/InputDialog.qml
index a4ca1683..49becc67 100644
--- a/resources/qml/dialogs/InputDialog.qml
+++ b/resources/qml/dialogs/InputDialog.qml
@@ -37,7 +37,7 @@ ApplicationWindow {
         Label {
             id: promptLabel
 
-            color: Nheko.colors.text
+            color: palette.text
         }
 
         MatrixTextField {
diff --git a/resources/qml/dialogs/InviteDialog.qml b/resources/qml/dialogs/InviteDialog.qml
index b142818d..f5d467db 100644
--- a/resources/qml/dialogs/InviteDialog.qml
+++ b/resources/qml/dialogs/InviteDialog.qml
@@ -40,8 +40,7 @@ ApplicationWindow {
     title: qsTr("Invite users to %1").arg(invitees.room.plainRoomName)
     height: 380
     width: 340
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
     Shortcut {
@@ -74,12 +73,12 @@ ApplicationWindow {
                         anchors.centerIn: parent
                         id: inviteeUserid
                         text: model.displayName != "" ? model.displayName : model.userid
-                        color: inviteeButton.hovered ? Nheko.colors.highlightedText: Nheko.colors.text
+                        color: inviteeButton.hovered ? palette.highlightedText: palette.text
                         maximumLineCount: 1
                     }
                     background: Rectangle {
-                        border.color: Nheko.colors.text
-                        color: inviteeButton.hovered ? Nheko.colors.highlight : Nheko.colors.window
+                        border.color: palette.text
+                        color: inviteeButton.hovered ? palette.highlight : palette.window
                         border.width: 1
                         radius: inviteeButton.height / 2
                     }
@@ -90,7 +89,7 @@ ApplicationWindow {
         Label {
             text: qsTr("Search user")
             Layout.fillWidth: true
-            color: Nheko.colors.text
+            color: palette.text
         }
         RowLayout {
             spacing: Nheko.paddingMedium
@@ -100,7 +99,7 @@ ApplicationWindow {
 
                 property bool isValidMxid: text.match("@.+?:.{3,}")
 
-                backgroundColor: Nheko.colors.window
+                backgroundColor: palette.window
                 placeholderText: qsTr("@joe:matrix.org", "Example user id. The name 'joe' can be localized however you want.")
                 Layout.fillWidth: true
                 onAccepted: {
@@ -158,7 +157,7 @@ ApplicationWindow {
                 avatarUrl: profile? profile.avatarUrl : ""
                 userid: inviteeEntry.text
                 onClicked: addInvite(inviteeEntry.text, displayName, avatarUrl)
-                bgColor: del3.hovered ? Nheko.colors.dark : inviteDialogRoot.color
+                bgColor: del3.hovered ? palette.dark : inviteDialogRoot.color
             }
             ListView {
                 visible: !inviteeEntry.isValidMxid
@@ -175,7 +174,7 @@ ApplicationWindow {
                     userid: model.userid
                     avatarUrl: model.avatarUrl
                     onClicked: addInvite(userid, displayName, avatarUrl)
-                    bgColor: del2.hovered ? Nheko.colors.dark : inviteDialogRoot.color
+                    bgColor: del2.hovered ? palette.dark : inviteDialogRoot.color
                 }
             }
             Rectangle {
@@ -202,7 +201,7 @@ ApplicationWindow {
                     userid: model.mxid
                     avatarUrl: model.avatarUrl
                     displayName: model.displayName
-                    bgColor: del.hovered ? Nheko.colors.dark : inviteDialogRoot.color
+                    bgColor: del.hovered ? palette.dark : inviteDialogRoot.color
                     ImageButton {
                         anchors.right: parent.right
                         anchors.rightMargin: Nheko.paddingSmall
diff --git a/resources/qml/dialogs/JoinRoomDialog.qml b/resources/qml/dialogs/JoinRoomDialog.qml
index 57c7bad8..0974325a 100644
--- a/resources/qml/dialogs/JoinRoomDialog.qml
+++ b/resources/qml/dialogs/JoinRoomDialog.qml
@@ -14,8 +14,7 @@ ApplicationWindow {
     title: qsTr("Join room")
     modality: Qt.WindowModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     width: 350
     height: fontMetrics.lineSpacing * 7
 
@@ -33,7 +32,7 @@ ApplicationWindow {
             id: promptLabel
 
             text: qsTr("Room ID or alias")
-            color: Nheko.colors.text
+            color: palette.text
         }
 
         MatrixTextField {
diff --git a/resources/qml/dialogs/PhoneNumberInputDialog.qml b/resources/qml/dialogs/PhoneNumberInputDialog.qml
index f7719800..f1b8eef8 100644
--- a/resources/qml/dialogs/PhoneNumberInputDialog.qml
+++ b/resources/qml/dialogs/PhoneNumberInputDialog.qml
@@ -31,7 +31,7 @@ ApplicationWindow {
             id: promptLabel
 
             Layout.columnSpan: 2
-            color: Nheko.colors.text
+            color: palette.text
         }
 
         ComboBox {
diff --git a/resources/qml/dialogs/PowerLevelEditor.qml b/resources/qml/dialogs/PowerLevelEditor.qml
index 7125c712..9fc9ee15 100644
--- a/resources/qml/dialogs/PowerLevelEditor.qml
+++ b/resources/qml/dialogs/PowerLevelEditor.qml
@@ -41,14 +41,13 @@ ApplicationWindow {
             font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
             Layout.fillWidth: true
             Layout.fillHeight: false
-            color: Nheko.colors.text
+            color: palette.text
             Layout.bottomMargin: Nheko.paddingMedium
         }
 
         TabBar {
             id: bar
             width: parent.width
-            palette: Nheko.colors
 
             NhekoTabButton {
                 text: qsTr("Roles")
@@ -60,7 +59,7 @@ ApplicationWindow {
         Rectangle {
             Layout.fillWidth: true
             Layout.fillHeight: true
-            color: Nheko.colors.alternateBase
+            color: palette.alternateBase
             border.width: 1
             border.color: Nheko.theme.separator
 
@@ -78,7 +77,7 @@ ApplicationWindow {
                         font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
                         Layout.fillWidth: true
                         Layout.fillHeight: false
-                        color: Nheko.colors.text
+                        color: palette.text
                     }
 
                     ReorderableListview {
@@ -91,7 +90,7 @@ ApplicationWindow {
                             Column {
                                 Layout.fillWidth: true
 
-                                Text { visible: model.isType; text: model.displayName; color: Nheko.colors.text}
+                                Text { visible: model.isType; text: model.displayName; color: palette.text}
                                 Text {
                                     visible: !model.isType;
                                     text: {
@@ -104,7 +103,7 @@ ApplicationWindow {
                                         else
                                         return qsTr("Custom (%1)").arg(model.powerlevel)
                                     }
-                                    color: Nheko.colors.text
+                                    color: palette.text
                                 }
                             }
 
@@ -137,7 +136,7 @@ ApplicationWindow {
                             z: 5
                             visible: false
 
-                            color: Nheko.colors.text
+                            color: palette.text
 
                             Keys.onPressed: {
                                 if (typeEntry.text.includes('.') && event.matches(StandardKey.InsertParagraphSeparator)) {
@@ -166,7 +165,7 @@ ApplicationWindow {
 
                             anchors.fill: parent
                             visible: false
-                            color: Nheko.colors.alternateBase
+                            color: palette.alternateBase
 
                             RowLayout {
                                 spacing: Nheko.paddingMedium
@@ -238,7 +237,7 @@ ApplicationWindow {
 
                                 width: parent.width
                                 //font.pixelSize: Math.ceil(quickSwitcher.textHeight * 0.6)
-                                color: Nheko.colors.text
+                                color: palette.text
                                 onTextEdited: {
                                     userCompleter.completer.searchString = text;
                                 }
@@ -318,11 +317,11 @@ ApplicationWindow {
                                     if (model.isUser)
                                     return model.avatarUrl.replace("mxc://", "image://MxcImage/")
                                     else if (editingModel.adminLevel >= model.powerlevel)
-                                    return "image://colorimage/:/icons/icons/ui/ribbon_star.svg?" + Nheko.colors.buttonText;
+                                    return "image://colorimage/:/icons/icons/ui/ribbon_star.svg?" + palette.buttonText;
                                     else if (editingModel.moderatorLevel >= model.powerlevel)
-                                    return "image://colorimage/:/icons/icons/ui/ribbon.svg?" + Nheko.colors.buttonText;
+                                    return "image://colorimage/:/icons/icons/ui/ribbon.svg?" + palette.buttonText;
                                     else
-                                    return "image://colorimage/:/icons/icons/ui/person.svg?" + Nheko.colors.buttonText;
+                                    return "image://colorimage/:/icons/icons/ui/person.svg?" + palette.buttonText;
                                 }
                                 displayName: model.displayName
                                 enabled: false
@@ -330,8 +329,8 @@ ApplicationWindow {
                             Column {
                                 Layout.fillWidth: true
 
-                                Text { visible: model.isUser; text: model.displayName; color: Nheko.colors.text}
-                                Text { visible: model.isUser; text: model.mxid; color: Nheko.colors.text}
+                                Text { visible: model.isUser; text: model.displayName; color: palette.text}
+                                Text { visible: model.isUser; text: model.mxid; color: palette.text}
                                 Text {
                                     visible: !model.isUser;
                                     text: {
@@ -342,7 +341,7 @@ ApplicationWindow {
                                         else
                                         return qsTr("Custom (%1)").arg(model.powerlevel)
                                     }
-                                    color: Nheko.colors.text
+                                    color: palette.text
                                 }
                             }
 
diff --git a/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml b/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml
index e66f92a2..3f816143 100644
--- a/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml
+++ b/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml
@@ -21,8 +21,7 @@ ApplicationWindow {
     minimumHeight: 450
     width: 450
     height: 680
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
     title: qsTr("Apply permission changes")
@@ -43,7 +42,7 @@ ApplicationWindow {
             font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
             Layout.fillWidth: true
             Layout.fillHeight: false
-            color: Nheko.colors.text
+            color: palette.text
             Layout.bottomMargin: Nheko.paddingMedium
         }
 
@@ -55,7 +54,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Apply permissions recursively")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ToggleButton {
@@ -67,7 +66,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Overwrite exisiting modifications in rooms")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ToggleButton {
@@ -103,7 +102,7 @@ ApplicationWindow {
                     Text {
                         Layout.fillWidth: true
                         text: model.displayName
-                        color: Nheko.colors.text
+                        color: palette.text
                         textFormat: Text.PlainText
                         elide: Text.ElideRight
                     }
@@ -117,7 +116,7 @@ ApplicationWindow {
                             return qsTr("Permissions synchronized with community")
                         }
                         elide: Text.ElideRight
-                        color: Nheko.colors.buttonText
+                        color: palette.buttonText
                         textFormat: Text.PlainText
                     }
                 }
diff --git a/resources/qml/dialogs/RawMessageDialog.qml b/resources/qml/dialogs/RawMessageDialog.qml
index ef7159cb..a27d988e 100644
--- a/resources/qml/dialogs/RawMessageDialog.qml
+++ b/resources/qml/dialogs/RawMessageDialog.qml
@@ -13,8 +13,7 @@ ApplicationWindow {
 
     height: 420
     width: 420
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
     Shortcut {
@@ -25,14 +24,13 @@ ApplicationWindow {
     ScrollView {
         anchors.margins: Nheko.paddingMedium
         anchors.fill: parent
-        palette: Nheko.colors
         padding: Nheko.paddingMedium
 
         TextArea {
             id: rawMessageView
 
             font: Nheko.monospaceFont()
-            color: Nheko.colors.text
+            color: palette.text
             readOnly: true
             selectByMouse: !Settings.mobileMode
             textFormat: Text.PlainText
@@ -40,7 +38,7 @@ ApplicationWindow {
             anchors.fill: parent
 
             background: Rectangle {
-                color: Nheko.colors.base
+                color: palette.base
             }
 
         }
diff --git a/resources/qml/dialogs/ReadReceipts.qml b/resources/qml/dialogs/ReadReceipts.qml
index 3d23a5fc..83b8b8af 100644
--- a/resources/qml/dialogs/ReadReceipts.qml
+++ b/resources/qml/dialogs/ReadReceipts.qml
@@ -18,8 +18,7 @@ ApplicationWindow {
     width: 340
     minimumHeight: 380
     minimumWidth: headerTitle.width + 2 * Nheko.paddingMedium
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
     Shortcut {
@@ -35,14 +34,13 @@ ApplicationWindow {
         Label {
             id: headerTitle
 
-            color: Nheko.colors.text
+            color: palette.text
             Layout.alignment: Qt.AlignCenter
             text: qsTr("Read receipts")
             font.pointSize: fontMetrics.font.pointSize * 1.5
         }
 
         ScrollView {
-            palette: Nheko.colors
             padding: Nheko.paddingMedium
             ScrollBar.horizontal.visible: false
             Layout.fillHeight: true
@@ -67,7 +65,7 @@ ApplicationWindow {
                     ToolTip.visible: hovered
                     ToolTip.text: model.mxid
                     background: Rectangle {
-                        color: del.hovered ? Nheko.colors.dark : readReceiptsRoot.color
+                        color: del.hovered ? palette.dark : readReceiptsRoot.color
                     }
 
                     RowLayout {
@@ -94,7 +92,7 @@ ApplicationWindow {
 
                             ElidedLabel {
                                 text: model.displayName
-                                color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window)
+                                color: TimelineManager.userColor(model ? model.mxid : "", palette.window)
                                 font.pointSize: fontMetrics.font.pointSize
                                 elideWidth: del.width - Nheko.paddingMedium - avatar.width
                                 Layout.fillWidth: true
@@ -102,7 +100,7 @@ ApplicationWindow {
 
                             ElidedLabel {
                                 text: model.timestamp
-                                color: Nheko.colors.buttonText
+                                color: palette.buttonText
                                 font.pointSize: fontMetrics.font.pointSize * 0.9
                                 elideWidth: del.width - Nheko.paddingMedium - avatar.width
                                 Layout.fillWidth: true
diff --git a/resources/qml/dialogs/RoomDirectory.qml b/resources/qml/dialogs/RoomDirectory.qml
index 85de9b45..29adb9be 100644
--- a/resources/qml/dialogs/RoomDirectory.qml
+++ b/resources/qml/dialogs/RoomDirectory.qml
@@ -18,8 +18,7 @@ ApplicationWindow {
     minimumHeight: 340
     height: 420
     width: 650
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
     title: qsTr("Explore Public Rooms")
@@ -43,9 +42,9 @@ ApplicationWindow {
         delegate: Rectangle {
             id: roomDirDelegate
 
-            property color background: Nheko.colors.window
-            property color importantText: Nheko.colors.text
-            property color unimportantText: Nheko.colors.buttonText
+            property color background: palette.window
+            property color importantText: palette.text
+            property color unimportantText: palette.buttonText
             property int avatarSize: fontMetrics.height * 3.2
 
             color: background
@@ -143,7 +142,7 @@ ApplicationWindow {
                 anchors.centerIn: parent
                 anchors.margins: Nheko.paddingLarge
                 running: visible
-                foreground: Nheko.colors.mid
+                foreground: palette.mid
             }
 
         }
@@ -164,7 +163,7 @@ ApplicationWindow {
             Layout.fillWidth: true
             selectByMouse: true
             font.pixelSize: fontMetrics.font.pixelSize
-            color: Nheko.colors.text
+            color: palette.text
             placeholderText: qsTr("Search for public rooms")
             onTextChanged: searchTimer.restart()
 
@@ -176,7 +175,7 @@ ApplicationWindow {
 
             Layout.minimumWidth: 0.3 * header.width
             Layout.maximumWidth: 0.3 * header.width
-            color: Nheko.colors.text
+            color: palette.text
             placeholderText: qsTr("Choose custom homeserver")
             onTextChanged: publicRooms.setMatrixServer(text)
         }
diff --git a/resources/qml/dialogs/RoomMembers.qml b/resources/qml/dialogs/RoomMembers.qml
index 1cfbe077..4952a0a9 100644
--- a/resources/qml/dialogs/RoomMembers.qml
+++ b/resources/qml/dialogs/RoomMembers.qml
@@ -20,8 +20,7 @@ ApplicationWindow {
     height: 650
     width: 420
     minimumHeight: 420
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
 
     Shortcut {
@@ -77,7 +76,7 @@ ApplicationWindow {
 
             Label {
                 text: qsTr("Sort by: ")
-                color: Nheko.colors.text
+                color: palette.text
             }
 
             ComboBox {
@@ -94,7 +93,6 @@ ApplicationWindow {
         }
 
         ScrollView {
-            palette: Nheko.colors
             padding: Nheko.paddingMedium
             ScrollBar.horizontal.visible: false
             Layout.fillHeight: true
@@ -123,7 +121,7 @@ ApplicationWindow {
                     height: memberLayout.implicitHeight + Nheko.paddingSmall * 2
                     hoverEnabled: true
                     background: Rectangle {
-                        color: del.hovered ? Nheko.colors.dark : roomMembersRoot.color
+                        color: del.hovered ? palette.dark : roomMembersRoot.color
                     }
 
                     RowLayout {
@@ -158,7 +156,7 @@ ApplicationWindow {
 
                             ElidedLabel {
                                 fullText: model.mxid
-                                color: del.hovered ? Nheko.colors.brightText : Nheko.colors.buttonText
+                                color: del.hovered ? palette.brightText : palette.buttonText
                                 font.pixelSize: Math.ceil(fontMetrics.font.pixelSize * 0.9)
                                 elideWidth: del.width - Nheko.paddingMedium * 2 - avatar.width - encryptInd.width
                                 Layout.fillWidth: true
@@ -184,7 +182,7 @@ ApplicationWindow {
                             Layout.preferredHeight: 16
                             sourceSize.width: width
                             sourceSize.height: height
-                            source: sourceUrl + (ma.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
+                            source: sourceUrl + (ma.hovered ? palette.highlight : palette.buttonText)
                             ToolTip.visible: ma.hovered
                             ToolTip.text: {
                                 if (isAdmin)
diff --git a/resources/qml/dialogs/RoomSettings.qml b/resources/qml/dialogs/RoomSettings.qml
index 845f4d7a..6bc24058 100644
--- a/resources/qml/dialogs/RoomSettings.qml
+++ b/resources/qml/dialogs/RoomSettings.qml
@@ -20,8 +20,7 @@ ApplicationWindow {
     minimumHeight: 450
     width: 450
     height: 680
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
     title: qsTr("Room Settings")
@@ -79,7 +78,7 @@ ApplicationWindow {
             Spinner {
                 Layout.alignment: Qt.AlignHCenter
                 visible: roomSettings.isLoading
-                foreground: Nheko.colors.mid
+                foreground: palette.mid
                 running: roomSettings.isLoading
             }
 
@@ -130,7 +129,7 @@ ApplicationWindow {
                 textFormat: isNameEditingAllowed ? TextEdit.PlainText : TextEdit.RichText
                 text: isNameEditingAllowed ? roomSettings.plainRoomName : roomSettings.roomName
                 font.pixelSize: fontMetrics.font.pixelSize * 2
-                color: Nheko.colors.text
+                color: palette.text
 
                 Layout.alignment: Qt.AlignHCenter
                 Layout.maximumWidth: parent.width - (Nheko.paddingSmall * 2) - nameChangeButton.anchors.leftMargin - (nameChangeButton.width * 2)
@@ -178,7 +177,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("%n member(s)", "", roomSettings.memberCount)
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ImageButton {
@@ -213,7 +212,7 @@ ApplicationWindow {
                 wrapMode: TextEdit.WordWrap
                 background: null
                 selectByMouse: !Settings.mobileMode
-                color: Nheko.colors.text
+                color: palette.text
                 horizontalAlignment: TextEdit.AlignHCenter
                 onLinkActivated: Nheko.openLink(link)
 
@@ -263,7 +262,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("SETTINGS")
                     font.bold: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 Item {
@@ -273,7 +272,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Notifications")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ComboBox {
@@ -289,7 +288,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Anyone can join")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ToggleButton {
@@ -303,7 +302,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Allow knocking")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                     visible: knockingButton.visible
                 }
 
@@ -322,7 +321,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Allow joining via other rooms")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                     visible: restrictedButton.visible
                 }
 
@@ -341,7 +340,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Rooms to join via")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                     visible: allowedRoomsButton.visible
                 }
 
@@ -360,7 +359,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("Allow guests to join")
                     Layout.fillWidth: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ToggleButton {
@@ -383,7 +382,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Encryption")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 ToggleButton {
@@ -422,7 +421,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Permission")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 Button {
@@ -434,7 +433,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Aliases")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 Button {
@@ -446,7 +445,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Sticker & Emote Settings")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 Button {
@@ -458,7 +457,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Hidden events")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 HiddenEventsDialog {
@@ -487,7 +486,7 @@ ApplicationWindow {
                 Label {
                     text: qsTr("INFO")
                     font.bold: true
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 Item {
@@ -496,7 +495,7 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Internal ID")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 AbstractButton { // AbstractButton does not allow setting text color
@@ -507,7 +506,7 @@ ApplicationWindow {
                         id: idLabel
                         text: roomSettings.roomId
                         font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8)
-                        color: Nheko.colors.text
+                        color: palette.text
                         width: parent.width
                         horizontalAlignment: Text.AlignRight
                         wrapMode: Text.WrapAnywhere
@@ -531,14 +530,14 @@ ApplicationWindow {
 
                 Label {
                     text: qsTr("Room Version")
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
                 Label {
                     text: roomSettings.roomVersion
                     font.pixelSize: fontMetrics.font.pixelSize
                     Layout.alignment: Qt.AlignRight
-                    color: Nheko.colors.text
+                    color: palette.text
                 }
 
             }
diff --git a/resources/qml/dialogs/UserProfile.qml b/resources/qml/dialogs/UserProfile.qml
index 95800746..dae43caa 100644
--- a/resources/qml/dialogs/UserProfile.qml
+++ b/resources/qml/dialogs/UserProfile.qml
@@ -22,8 +22,7 @@ ApplicationWindow {
     width: 420
     minimumWidth: 150
     minimumHeight: 150
-    palette: Nheko.colors
-    color: Nheko.colors.window
+    color: palette.window
     title: profile.isGlobalUserProfile ? qsTr("Global User Profile") : qsTr("Room User Profile")
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
@@ -89,7 +88,7 @@ ApplicationWindow {
                 Layout.alignment: Qt.AlignHCenter
                 running: profile.isLoading
                 visible: profile.isLoading
-                foreground: Nheko.colors.mid
+                foreground: palette.mid
             }
 
             Text {
@@ -137,7 +136,7 @@ ApplicationWindow {
                 readOnly: !isUsernameEditingAllowed
                 text: profile.displayName
                 font.pixelSize: 20
-                color: TimelineManager.userColor(profile.userid, Nheko.colors.window)
+                color: TimelineManager.userColor(profile.userid, palette.window)
                 font.bold: true
                 Layout.alignment: Qt.AlignHCenter
                 Layout.maximumWidth: parent.width - (Nheko.paddingSmall * 2) - usernameChangeButton.anchors.leftMargin - (usernameChangeButton.width * 2)
@@ -315,7 +314,6 @@ ApplicationWindow {
 
                 onCurrentIndexChanged: devicelist.selectedTab = currentIndex
 
-                palette: Nheko.colors
 
                 NhekoTabButton {
                     text: qsTr("Devices")
@@ -354,7 +352,7 @@ ApplicationWindow {
                             Layout.alignment: Qt.AlignLeft
                             elide: Text.ElideRight
                             font.bold: true
-                            color: Nheko.colors.text
+                            color: palette.text
                             text: deviceId
                         }
 
@@ -400,7 +398,7 @@ ApplicationWindow {
 
                             readOnly: !deviceNameRow.isEditingAllowed
                             text: deviceName
-                            color: Nheko.colors.text
+                            color: palette.text
                             Layout.alignment: Qt.AlignLeft
                             Layout.fillWidth: true
                             selectByMouse: true
@@ -435,7 +433,7 @@ ApplicationWindow {
                         Layout.fillWidth: true
                         Layout.alignment: Qt.AlignLeft
                         elide: Text.ElideRight
-                        color: Nheko.colors.text
+                        color: palette.text
                         text: qsTr("Last seen %1 from %2").arg(new Date(lastTs).toLocaleString(Locale.ShortFormat)).arg(lastIp ? lastIp : "???")
                     }
 
@@ -504,7 +502,7 @@ ApplicationWindow {
 
                 ElidedLabel {
                     Layout.alignment: Qt.AlignVCenter
-                    color: Nheko.colors.text
+                    color: palette.text
                     Layout.fillWidth: true
                     elideWidth: width
                     fullText: roomName
@@ -527,7 +525,7 @@ ApplicationWindow {
 
             background: Rectangle {
                 anchors.fill: parent
-                color: Nheko.colors.window
+                color: palette.window
             }
 
         }
diff --git a/resources/qml/emoji/StickerPicker.qml b/resources/qml/emoji/StickerPicker.qml
index 9a5cd6d1..b1623697 100644
--- a/resources/qml/emoji/StickerPicker.qml
+++ b/resources/qml/emoji/StickerPicker.qml
@@ -13,14 +13,13 @@ Menu {
     id: stickerPopup
 
     property var callback
-    property var colors
     property string roomid
     property alias model: gridView.model
     required property bool emoji
     property var textArea
-    property real highlightHue: Nheko.colors.highlight.hslHue
-    property real highlightSat: Nheko.colors.highlight.hslSaturation
-    property real highlightLight: Nheko.colors.highlight.hslLightness
+    property real highlightHue: palette.highlight.hslHue
+    property real highlightSat: palette.highlight.hslSaturation
+    property real highlightLight: palette.highlight.hslLightness
     readonly property int stickerDim: emoji ? 48 : 128
     readonly property int stickerDimPad: stickerDim + Nheko.paddingSmall
     readonly property int stickersPerRow: emoji ? 7 : 3
@@ -44,7 +43,7 @@ Menu {
     width: sidebarAvatarSize + Nheko.paddingSmall + stickersPerRow * stickerDimPad + 20
 
     Rectangle {
-        color: Nheko.colors.window
+        color: palette.window
         height: columnView.implicitHeight + Nheko.paddingSmall*2
         width: sidebarAvatarSize + Nheko.paddingSmall + stickersPerRow * stickerDimPad + 20
 
@@ -66,10 +65,8 @@ Menu {
                 Layout.preferredWidth: stickersPerRow * stickerDimPad + 20 - Nheko.paddingSmall
                 Layout.row: 0
                 Layout.column: 1
-                palette: Nheko.colors
                 background: null
-                placeholderTextColor: Nheko.colors.buttonText
-                color: Nheko.colors.text
+                placeholderTextColor: palette.buttonText
                 placeholderText: qsTr("Search")
                 selectByMouse: true
                 rightPadding: clearSearch.width
@@ -125,7 +122,7 @@ Menu {
                 section.delegate: Rectangle {
                     width: gridView.width
                     height: childrenRect.height
-                    color: Nheko.colors.alternateBase
+                    color: palette.alternateBase
 
                     required property string section
 
@@ -133,7 +130,6 @@ Menu {
                         anchors.left: parent.left
                         anchors.right: parent.right
                         text: parent.section
-                        color: Nheko.colors.text
                         font.bold: true
                     }
                 }
@@ -196,7 +192,6 @@ Menu {
                                         font.family: Settings.emojiFont
                                         font.pixelSize: 36
                                         text: del.modelData.unicode.replace('\ufe0f', '')
-                                        color: Nheko.colors.text
                                     }
                                 }
 
@@ -213,7 +208,7 @@ Menu {
 
                             background: Rectangle {
                                 anchors.fill: parent
-                                color: hovered ? Nheko.colors.highlight : 'transparent'
+                                color: hovered ? palette.highlight : 'transparent'
                                 radius: 5
                             }
 
diff --git a/resources/qml/pages/LoginPage.qml b/resources/qml/pages/LoginPage.qml
index 4273617f..9bf4e97e 100644
--- a/resources/qml/pages/LoginPage.qml
+++ b/resources/qml/pages/LoginPage.qml
@@ -25,7 +25,6 @@ Item {
         id: scroll
 
         clip: false
-        palette: Nheko.colors
         ScrollBar.horizontal.visible: false
         anchors.left: parent.left
         anchors.right: parent.right
@@ -71,7 +70,7 @@ Item {
 
                     visible: running
                     running: login.lookingUpHs
-                    foreground: Nheko.colors.mid
+                    foreground: palette.mid
                 }
             }
 
@@ -127,7 +126,7 @@ Item {
 
                     visible: running
                     running: login.loggingIn
-                    foreground: Nheko.colors.mid
+                    foreground: palette.mid
                 }
             }
 
diff --git a/resources/qml/pages/RegisterPage.qml b/resources/qml/pages/RegisterPage.qml
index 8536a254..c1bc5310 100644
--- a/resources/qml/pages/RegisterPage.qml
+++ b/resources/qml/pages/RegisterPage.qml
@@ -25,7 +25,6 @@ Item {
         id: scroll
 
         clip: false
-        palette: Nheko.colors
         ScrollBar.horizontal.visible: false
         anchors.left: parent.left
         anchors.right: parent.right
@@ -70,7 +69,7 @@ Item {
 
                     visible: running
                     running: regis.lookingUpHs
-                    foreground: Nheko.colors.mid
+                    foreground: palette.mid
                 }
             }
 
@@ -102,7 +101,7 @@ Item {
 
                     visible: running
                     running: regis.lookingUpUsername
-                    foreground: Nheko.colors.mid
+                    foreground: palette.mid
                 }
 
                 Image {
@@ -178,7 +177,7 @@ Item {
 
                     visible: running
                     running: regis.registering
-                    foreground: Nheko.colors.mid
+                    foreground: palette.mid
                 }
             }
 
diff --git a/resources/qml/pages/UserSettingsPage.qml b/resources/qml/pages/UserSettingsPage.qml
index 5c2ebf5f..08581ac5 100644
--- a/resources/qml/pages/UserSettingsPage.qml
+++ b/resources/qml/pages/UserSettingsPage.qml
@@ -16,12 +16,11 @@ Rectangle {
 
     property int collapsePoint: 600
     property bool collapsed: width < collapsePoint
-    color: Nheko.colors.window
+    color: palette.window
 
     ScrollView {
         id: scroll
 
-        palette: Nheko.colors
         ScrollBar.horizontal.visible: false
         anchors.fill: parent
         anchors.topMargin: (collapsed? backButton.height : 0)+Nheko.paddingLarge
@@ -51,7 +50,7 @@ Rectangle {
                     Label {
                         Layout.alignment: Qt.AlignLeft
                         Layout.fillWidth: true
-                        color: Nheko.colors.text
+                        color: palette.text
                         text: model.name
                         //Layout.column: 0
                         Layout.columnSpan: (model.type == UserSettingsModel.SectionTitle && !userSettingsDialog.collapsed) ? 2 : 1
@@ -159,7 +158,7 @@ Rectangle {
                         DelegateChoice {
                             roleValue: UserSettingsModel.ReadOnlyText
                             TextEdit {
-                                color: Nheko.colors.text
+                                color: palette.text
                                 text: model.value
                                 readOnly: true
                                 selectByMouse: !Settings.mobileMode
@@ -176,7 +175,7 @@ Rectangle {
                                     anchors.top: parent.top
                                     anchors.left: parent.left
                                     anchors.right: parent.right
-                                    color: Nheko.colors.buttonText
+                                    color: palette.buttonText
                                     height: 1
                                 }
                             }
diff --git a/resources/qml/pages/WelcomePage.qml b/resources/qml/pages/WelcomePage.qml
index 6555cc29..3acdc18f 100644
--- a/resources/qml/pages/WelcomePage.qml
+++ b/resources/qml/pages/WelcomePage.qml
@@ -28,7 +28,7 @@ ColumnLayout {
         Layout.alignment: Qt.AlignHCenter
         Layout.fillWidth: true
         text: qsTr("Welcome to nheko! The desktop client for the Matrix protocol.")
-        color: Nheko.colors.text
+        color: palette.text
         font.pointSize: fontMetrics.font.pointSize*2
         wrapMode: Text.Wrap
         horizontalAlignment: Text.AlignHCenter
@@ -38,7 +38,7 @@ ColumnLayout {
         Layout.alignment: Qt.AlignHCenter
         Layout.fillWidth: true
         text: qsTr("Enjoy your stay!")
-        color: Nheko.colors.text
+        color: palette.text
         font.pointSize: fontMetrics.font.pointSize*1.5
         wrapMode: Text.Wrap
         horizontalAlignment: Text.AlignHCenter
@@ -86,7 +86,7 @@ ColumnLayout {
             Layout.alignment: Qt.AlignLeft
             Layout.margins: Nheko.paddingLarge
             text: qsTr("Reduce animations")
-            color: Nheko.colors.text
+            color: palette.text
 
             HoverHandler {
                 id: hovered
diff --git a/resources/qml/ui/NhekoSlider.qml b/resources/qml/ui/NhekoSlider.qml
index 724e6e48..5e3a77d8 100644
--- a/resources/qml/ui/NhekoSlider.qml
+++ b/resources/qml/ui/NhekoSlider.qml
@@ -9,7 +9,7 @@ import im.nheko 1.0
 Slider {
     id: control
 
-    property color progressColor: Nheko.colors.highlight
+    property color progressColor: palette.highlight
     property bool alwaysShowSlider: true
     property int sliderRadius: 16
 
@@ -25,7 +25,7 @@ Slider {
         width: control.availableWidth - handle.width
         height: implicitHeight
         radius: height / 2
-        color: Nheko.colors.buttonText
+        color: palette.buttonText
 
         Rectangle {
             width: control.visualPosition * parent.width
diff --git a/resources/qml/ui/Ripple.qml b/resources/qml/ui/Ripple.qml
index 73d8520f..911b88cf 100644
--- a/resources/qml/ui/Ripple.qml
+++ b/resources/qml/ui/Ripple.qml
@@ -20,7 +20,7 @@ Item {
     PointHandler {
         id: ph
 
-        onGrabChanged: {
+        onGrabChanged: (_, point) => {
             circle.centerX = point.position.x
             circle.centerY = point.position.y
         }
diff --git a/resources/qml/ui/Snackbar.qml b/resources/qml/ui/Snackbar.qml
index 051db70d..b3530522 100644
--- a/resources/qml/ui/Snackbar.qml
+++ b/resources/qml/ui/Snackbar.qml
@@ -45,7 +45,7 @@ Popup {
     padding: Nheko.paddingLarge
 
     contentItem: Label {
-        color: Nheko.colors.light
+        color: palette.light
         width: Math.max(Overlay.overlay? Overlay.overlay.width/2 : 0, 400)
         text: snackbar.currentMessage
         font.bold: true
@@ -53,7 +53,7 @@ Popup {
 
     background: Rectangle {
         radius: Nheko.paddingLarge
-        color: Nheko.colors.dark
+        color: palette.dark
         opacity: 0.8
     }
 
diff --git a/resources/qml/ui/media/MediaControls.qml b/resources/qml/ui/media/MediaControls.qml
index f1cb7ca1..a48f15ea 100644
--- a/resources/qml/ui/media/MediaControls.qml
+++ b/resources/qml/ui/media/MediaControls.qml
@@ -50,7 +50,7 @@ Rectangle {
     }
 
     color: {
-        var wc = Nheko.colors.alternateBase;
+        var wc = palette.alternateBase;
         return Qt.rgba(wc.r, wc.g, wc.b, 0.5);
     }
     opacity: control.shouldShowControls ? 1 : 0
@@ -95,7 +95,7 @@ Rectangle {
                 id: playbackStateImage
 
                 Layout.alignment: Qt.AlignLeft
-                buttonTextColor: Nheko.colors.text
+                buttonTextColor: palette.text
                 Layout.preferredHeight: 24
                 Layout.preferredWidth: 24
                 image: {
@@ -115,7 +115,7 @@ Rectangle {
                 id: volumeButton
 
                 Layout.alignment: Qt.AlignLeft
-                buttonTextColor: Nheko.colors.text
+                buttonTextColor: palette.text
                 Layout.preferredHeight: 24
                 Layout.preferredWidth: 24
                 image: {
@@ -214,7 +214,7 @@ Rectangle {
             Label {
                 Layout.alignment: Qt.AlignRight
                 text: (!control.mediaLoaded ? "-- " : durationToString(control.positionValue)) + " / " + durationToString(control.duration)
-                color: Nheko.colors.text
+                color: palette.text
             }
 
             Item {
diff --git a/resources/qml/voip/CallDevices.qml b/resources/qml/voip/CallDevices.qml
index 5a1792c9..d4c554dc 100644
--- a/resources/qml/voip/CallDevices.qml
+++ b/resources/qml/voip/CallDevices.qml
@@ -9,7 +9,6 @@ import im.nheko 1.0
 
 Popup {
     modal: true
-    palette: Nheko.colors
     // only set the anchors on Qt 5.12 or higher
     // see https://doc.qt.io/qt-5/qml-qtquick-controls2-popup.html#anchors.centerIn-prop
     Component.onCompleted: {
@@ -31,7 +30,7 @@ Popup {
                 Image {
                     Layout.preferredWidth: 22
                     Layout.preferredHeight: 22
-                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + Nheko.colors.windowText
+                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + palette.windowText
                 }
 
                 ComboBox {
@@ -49,7 +48,7 @@ Popup {
                 Image {
                     Layout.preferredWidth: 22
                     Layout.preferredHeight: 22
-                    source: "image://colorimage/:/icons/icons/ui/video-call.svg?" + Nheko.colors.windowText
+                    source: "image://colorimage/:/icons/icons/ui/video-call.svg?" + palette.windowText
                 }
 
                 ComboBox {
@@ -81,8 +80,8 @@ Popup {
     }
 
     background: Rectangle {
-        color: Nheko.colors.window
-        border.color: Nheko.colors.windowText
+        color: palette.window
+        border.color: palette.windowText
     }
 
 }
diff --git a/resources/qml/voip/CallInvite.qml b/resources/qml/voip/CallInvite.qml
index 8ffe9892..25aa0818 100644
--- a/resources/qml/voip/CallInvite.qml
+++ b/resources/qml/voip/CallInvite.qml
@@ -14,7 +14,6 @@ Popup {
     closePolicy: Popup.NoAutoClose
     width: parent.width
     height: parent.height
-    palette: Nheko.colors
 
     Component {
         id: deviceError
@@ -45,7 +44,7 @@ Popup {
             Layout.fillWidth: true
             text: CallManager.callPartyDisplayName
             font.pointSize: fontMetrics.font.pointSize * 2
-            color: Nheko.colors.windowText
+            color: palette.windowText
             horizontalAlignment: Text.AlignHCenter
         }
 
@@ -68,14 +67,14 @@ Popup {
                 Layout.alignment: Qt.AlignCenter
                 Layout.preferredWidth: callInv.height / 10
                 Layout.preferredHeight: callInv.height / 10
-                source: "image://colorimage/" + image + "?" + Nheko.colors.windowText
+                source: "image://colorimage/" + image + "?" + palette.windowText
             }
 
             Label {
                 Layout.alignment: Qt.AlignCenter
                 text: CallManager.callType == CallType.VIDEO ? qsTr("Video Call") : qsTr("Voice Call")
                 font.pointSize: fontMetrics.font.pointSize * 2
-                color: Nheko.colors.windowText
+                color: palette.windowText
             }
 
         }
@@ -94,7 +93,7 @@ Popup {
                 Image {
                     Layout.preferredWidth: deviceCombos.imageSize
                     Layout.preferredHeight: deviceCombos.imageSize
-                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + Nheko.colors.windowText
+                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + palette.windowText
                 }
 
                 ComboBox {
@@ -113,7 +112,7 @@ Popup {
                 Image {
                     Layout.preferredWidth: deviceCombos.imageSize
                     Layout.preferredHeight: deviceCombos.imageSize
-                    source: "image://colorimage/:/icons/icons/ui/video.svg?" + Nheko.colors.windowText
+                    source: "image://colorimage/:/icons/icons/ui/video.svg?" + palette.windowText
                 }
 
                 ComboBox {
@@ -201,8 +200,8 @@ Popup {
     }
 
     background: Rectangle {
-        color: Nheko.colors.window
-        border.color: Nheko.colors.windowText
+        color: palette.window
+        border.color: palette.windowText
     }
 
 }
diff --git a/resources/qml/voip/CallInviteBar.qml b/resources/qml/voip/CallInviteBar.qml
index 4eaff020..3c7426cc 100644
--- a/resources/qml/voip/CallInviteBar.qml
+++ b/resources/qml/voip/CallInviteBar.qml
@@ -90,7 +90,6 @@ Rectangle {
             Layout.rightMargin: 4
             icon.source: CallManager.callType == CallType.VIDEO ? "qrc:/icons/icons/ui/video.svg" : "qrc:/icons/icons/ui/place-call.svg"
             text: qsTr("Accept")
-            palette: Nheko.colors
             onClicked: {
                 if (CallManager.mics.length == 0) {
                     var dialog = deviceError.createObject(timelineRoot, {
@@ -126,7 +125,6 @@ Rectangle {
             Layout.rightMargin: 16
             icon.source: "qrc:/icons/icons/ui/end-call.svg"
             text: qsTr("Decline")
-            palette: Nheko.colors
             onClicked: {
                 CallManager.rejectInvite();
             }
diff --git a/resources/qml/voip/DeviceError.qml b/resources/qml/voip/DeviceError.qml
index 9328e385..afb70b7f 100644
--- a/resources/qml/voip/DeviceError.qml
+++ b/resources/qml/voip/DeviceError.qml
@@ -24,19 +24,19 @@ Popup {
         Image {
             Layout.preferredWidth: 16
             Layout.preferredHeight: 16
-            source: "image://colorimage/" + image + "?" + Nheko.colors.windowText
+            source: "image://colorimage/" + image + "?" + palette.windowText
         }
 
         Label {
             text: errorString
-            color: Nheko.colors.windowText
+            color: palette.windowText
         }
 
     }
 
     background: Rectangle {
-        color: Nheko.colors.window
-        border.color: Nheko.colors.windowText
+        color: palette.window
+        border.color: palette.windowText
     }
 
 }
diff --git a/resources/qml/voip/PlaceCall.qml b/resources/qml/voip/PlaceCall.qml
index c7a64342..5d9387c3 100644
--- a/resources/qml/voip/PlaceCall.qml
+++ b/resources/qml/voip/PlaceCall.qml
@@ -17,7 +17,6 @@ Popup {
             anchors.centerIn = parent;
 
     }
-    palette: Nheko.colors
 
     Component {
         id: deviceError
@@ -38,7 +37,7 @@ Popup {
 
             Label {
                 text: qsTr("Place a call to %1?").arg(room.roomName)
-                color: Nheko.colors.windowText
+                color: palette.windowText
             }
 
             Item {
@@ -138,7 +137,7 @@ Popup {
                 Image {
                     Layout.preferredWidth: 22
                     Layout.preferredHeight: 22
-                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + Nheko.colors.windowText
+                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + palette.windowText
                 }
 
                 ComboBox {
@@ -159,7 +158,7 @@ Popup {
                 Image {
                     Layout.preferredWidth: 22
                     Layout.preferredHeight: 22
-                    source: "image://colorimage/:/icons/icons/ui/video.svg?" + Nheko.colors.windowText
+                    source: "image://colorimage/:/icons/icons/ui/video.svg?" + palette.windowText
                 }
 
                 ComboBox {
@@ -176,8 +175,8 @@ Popup {
     }
 
     background: Rectangle {
-        color: Nheko.colors.window
-        border.color: Nheko.colors.windowText
+        color: palette.window
+        border.color: palette.windowText
     }
 
 }
diff --git a/resources/qml/voip/ScreenShare.qml b/resources/qml/voip/ScreenShare.qml
index 1a82a5ce..ce998299 100644
--- a/resources/qml/voip/ScreenShare.qml
+++ b/resources/qml/voip/ScreenShare.qml
@@ -19,7 +19,6 @@ Popup {
     Component.onDestruction: {
         CallManager.closeScreenShare();
     }
-    palette: Nheko.colors
 
     ColumnLayout {
         Label {
@@ -29,7 +28,7 @@ Popup {
             Layout.rightMargin: 8
             Layout.alignment: Qt.AlignLeft
             text: qsTr("Share desktop with %1?").arg(room.roomName)
-            color: Nheko.colors.windowText
+            color: palette.windowText
         }
 
         RowLayout {
@@ -40,7 +39,7 @@ Popup {
             Label {
             Layout.alignment: Qt.AlignLeft
             text: qsTr("Method:")
-            color: Nheko.colors.windowText
+            color: palette.windowText
             }
 
           ComboBox {
@@ -60,7 +59,7 @@ Popup {
             Label {
                 Layout.alignment: Qt.AlignLeft
                 text: qsTr("Window:")
-                color: Nheko.colors.windowText
+                color: palette.windowText
             }
 
             ComboBox {
@@ -91,7 +90,7 @@ Popup {
             Label {
                 Layout.alignment: Qt.AlignLeft
                 text: qsTr("Frame rate:")
-                color: Nheko.colors.windowText
+                color: palette.windowText
             }
 
             ComboBox {
@@ -191,8 +190,8 @@ Popup {
     }
 
     background: Rectangle {
-        color: Nheko.colors.window
-        border.color: Nheko.colors.windowText
+        color: palette.window
+        border.color: palette.windowText
     }
 
 }