diff --git a/appveyor.yml b/appveyor.yml
index 0da894fdaebd19fb628f6efbc84f3272b7881cb9..4d23338d0c03c84b0b043077f4909c2cb6e15a6f 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -15,7 +15,7 @@ environment:
 
 
 cache:
-  - c:\hunter\
+  - c:\h\
   - build\_deps -> appveyor.yml
 
 build:
@@ -47,7 +47,7 @@ build_script:
 
     # Build nheko
     - cmake -G "Visual Studio 16 2019" -A x64 -H. -Bbuild
-      -DHUNTER_ROOT="C:\hunter"
+      -DHUNTER_ROOT="C:\h"
       -DHUNTER_ENABLED=ON -DBUILD_SHARED_LIBS=OFF -DUSE_BUNDLED_OPENSSL=ON
       -DCMAKE_BUILD_TYPE=Release -DHUNTER_CONFIGURATION_TYPES=Release
 
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 0f815f6fa71ad4e3f80a77d725d2e38f39d45198..a66b994a1b5432c8f51ebf9375645dd3d086c79a 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -28,11 +28,11 @@ Item {
 
     TapHandler {
         acceptedButtons: Qt.RightButton
-        onSingleTapped: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable, row)
+        onSingleTapped: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable)
     }
 
     TapHandler {
-        onLongPressed: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable, row)
+        onLongPressed: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable)
         onDoubleTapped: chat.model.reply = model.id
     }
 
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 02f6d5f49f5a78c7c17b3b95c0cb77a4c684046f..5732dc73af79a9f32ccf7c02b442e9a1142bebce 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -6,6 +6,7 @@ import "./delegates"
 import "./device-verification"
 import "./emoji"
 import "./voip"
+import Qt.labs.platform 1.1 as Platform
 import QtGraphicalEffects 1.0
 import QtQuick 2.9
 import QtQuick.Controls 2.3
@@ -89,7 +90,7 @@ Page {
         }
     }
 
-    Menu {
+    Platform.Menu {
         id: messageContextMenu
 
         property string eventId
@@ -102,67 +103,68 @@ Page {
             eventType = eventType_;
             isEncrypted = isEncrypted_;
             isEditable = isEditable_;
-            popup(showAt_);
+            if (showAt_)
+                open(showAt_);
+            else
+                open();
         }
 
-        modal: true
-
-        MenuItem {
+        Platform.MenuItem {
             text: qsTr("React")
-            onClicked: emojiPopup.show(messageContextMenu.parent, function(emoji) {
+            onTriggered: emojiPopup.show(messageContextMenu.parent, function(emoji) {
                 TimelineManager.queueReactionMessage(messageContextMenu.eventId, emoji);
             })
         }
 
-        MenuItem {
+        Platform.MenuItem {
             text: qsTr("Reply")
-            onClicked: TimelineManager.timeline.replyAction(messageContextMenu.eventId)
+            onTriggered: TimelineManager.timeline.replyAction(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             visible: messageContextMenu.isEditable
-            height: visible ? implicitHeight : 0
+            enabled: visible
             text: qsTr("Edit")
-            onClicked: TimelineManager.timeline.editAction(messageContextMenu.eventId)
+            onTriggered: TimelineManager.timeline.editAction(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             text: qsTr("Read receipts")
             onTriggered: TimelineManager.timeline.readReceiptsAction(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             text: qsTr("Mark as read")
         }
 
-        MenuItem {
+        Platform.MenuItem {
             text: qsTr("View raw message")
             onTriggered: TimelineManager.timeline.viewRawMessage(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             // TODO(Nico): Fix this still being iterated over, when using keyboard to select options
             visible: messageContextMenu.isEncrypted
-            height: visible ? implicitHeight : 0
+            enabled: visible
             text: qsTr("View decrypted raw message")
             onTriggered: TimelineManager.timeline.viewDecryptedRawMessage(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             text: qsTr("Remove message")
             onTriggered: TimelineManager.timeline.redactEvent(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
-            height: visible ? implicitHeight : 0
+            enabled: visible
             text: qsTr("Save as")
             onTriggered: TimelineManager.timeline.saveMedia(messageContextMenu.eventId)
         }
 
-        MenuItem {
+        Platform.MenuItem {
             visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
-            height: visible ? implicitHeight : 0
+            enabled: visible
             text: qsTr("Open in external program")
             onTriggered: TimelineManager.timeline.openMedia(messageContextMenu.eventId)
         }
diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
index 444a4572e5619e125c13ae6929ac65c688d415d5..048a76a1e3824fb78dc6eced49eea1b9c2c76229 100644
--- a/resources/qml/TopBar.qml
+++ b/resources/qml/TopBar.qml
@@ -2,8 +2,9 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import QtQuick 2.9
-import QtQuick.Controls 2.3
+import Qt.labs.platform 1.1 as Platform
+import QtQuick 2.12
+import QtQuick.Controls 2.12
 import QtQuick.Layouts 1.2
 import im.nheko 1.0
 
@@ -17,9 +18,8 @@ Rectangle {
     z: 3
     color: colors.window
 
-    MouseArea {
-        anchors.fill: parent
-        onClicked: TimelineManager.timeline.openRoomSettings()
+    TapHandler {
+        onSingleTapped: TimelineManager.timeline.openRoomSettings()
     }
 
     GridLayout {
@@ -70,9 +70,8 @@ Rectangle {
             maximumLineCount: 1
             elide: Text.ElideRight
 
-            MouseArea {
-                anchors.fill: parent
-                onClicked: TimelineManager.timeline.openRoomSettings()
+            TapHandler {
+                onSingleTapped: TimelineManager.timeline.openRoomSettings()
             }
 
         }
@@ -96,27 +95,27 @@ Rectangle {
             image: ":/icons/icons/ui/vertical-ellipsis.png"
             ToolTip.visible: hovered
             ToolTip.text: qsTr("Room options")
-            onClicked: roomOptionsMenu.popup(roomOptionsButton)
+            onClicked: roomOptionsMenu.open(roomOptionsButton)
 
-            Menu {
+            Platform.Menu {
                 id: roomOptionsMenu
 
-                MenuItem {
+                Platform.MenuItem {
                     text: qsTr("Invite users")
                     onTriggered: TimelineManager.openInviteUsersDialog()
                 }
 
-                MenuItem {
+                Platform.MenuItem {
                     text: qsTr("Members")
                     onTriggered: TimelineManager.openMemberListDialog()
                 }
 
-                MenuItem {
+                Platform.MenuItem {
                     text: qsTr("Leave room")
                     onTriggered: TimelineManager.openLeaveRoomDialog()
                 }
 
-                MenuItem {
+                Platform.MenuItem {
                     text: qsTr("Settings")
                     onTriggered: TimelineManager.timeline.openRoomSettings()
                 }