diff --git a/resources/qml/PrivacyScreen.qml b/resources/qml/PrivacyScreen.qml
index 6ad2a5574683a2666c409ca8952acf55c451cb43..fb3818df39c6d21d2c60cfc10e473a8aa96d4eed 100644
--- a/resources/qml/PrivacyScreen.qml
+++ b/resources/qml/PrivacyScreen.qml
@@ -26,7 +26,7 @@ Item {
             }
         }
 
-        target: MainWindow
+        target: TimelineManager
     }
 
     Timer {
diff --git a/resources/qml/device-verification/DeviceVerification.qml b/resources/qml/device-verification/DeviceVerification.qml
index c00a0bdbae95c304607a5baf3c9c8dffc348748d..90dc9ac47a005911b84ab8eebc5ff0ac1e4d3700 100644
--- a/resources/qml/device-verification/DeviceVerification.qml
+++ b/resources/qml/device-verification/DeviceVerification.qml
@@ -21,7 +21,6 @@ ApplicationWindow {
     minimumHeight: stack.implicitHeight
     width: stack.implicitWidth
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(dialog)
 
     StackView {
         id: stack
diff --git a/resources/qml/dialogs/ImagePackEditorDialog.qml b/resources/qml/dialogs/ImagePackEditorDialog.qml
index 3ba04d9499d14edbff2d5f098538d71615965c9d..9c46a4908a0f63fe3b053a5fca5fef44236b2bd9 100644
--- a/resources/qml/dialogs/ImagePackEditorDialog.qml
+++ b/resources/qml/dialogs/ImagePackEditorDialog.qml
@@ -12,8 +12,6 @@ import QtQuick.Layouts 1.12
 import im.nheko 1.0
 
 ApplicationWindow {
-    //Component.onCompleted: Nheko.reparent(win)
-
     id: win
 
     property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
diff --git a/resources/qml/dialogs/ImagePackSettingsDialog.qml b/resources/qml/dialogs/ImagePackSettingsDialog.qml
index fa079855a7f6d53eadb0051831dd36d323863761..18c32c416ccdcb350ead52d9b2208e9094a3d60a 100644
--- a/resources/qml/dialogs/ImagePackSettingsDialog.qml
+++ b/resources/qml/dialogs/ImagePackSettingsDialog.qml
@@ -28,7 +28,6 @@ ApplicationWindow {
     color: Nheko.colors.base
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(win)
 
     Component {
         id: packEditor
diff --git a/resources/qml/dialogs/InputDialog.qml b/resources/qml/dialogs/InputDialog.qml
index 63ca3181888e74a7c1663d6b0b5362df512f898d..cf1474dc60a5cb712c2f4ab62b16262b4f566226 100644
--- a/resources/qml/dialogs/InputDialog.qml
+++ b/resources/qml/dialogs/InputDialog.qml
@@ -18,7 +18,6 @@ ApplicationWindow {
 
     modality: Qt.NonModal
     flags: Qt.Dialog
-    Component.onCompleted: Nheko.reparent(inputDialog)
     width: 350
     height: fontMetrics.lineSpacing * 7
 
diff --git a/resources/qml/dialogs/InviteDialog.qml b/resources/qml/dialogs/InviteDialog.qml
index 917bc8567e38aeaacadc38fedb87d1eb5d64cd44..e7dd4e3a2ecaf51470b29f60e08232d6b83b8e01 100644
--- a/resources/qml/dialogs/InviteDialog.qml
+++ b/resources/qml/dialogs/InviteDialog.qml
@@ -37,7 +37,6 @@ ApplicationWindow {
     palette: Nheko.colors
     color: Nheko.colors.window
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(inviteDialogRoot)
 
     Shortcut {
         sequence: "Ctrl+Enter"
diff --git a/resources/qml/dialogs/JoinRoomDialog.qml b/resources/qml/dialogs/JoinRoomDialog.qml
index 9ce6bcf15ecc7a50f5c2eba835dc11b213f9f705..e49f538d66c4cdf1603bfdc12faebe48a225e912 100644
--- a/resources/qml/dialogs/JoinRoomDialog.qml
+++ b/resources/qml/dialogs/JoinRoomDialog.qml
@@ -17,7 +17,6 @@ ApplicationWindow {
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
     palette: Nheko.colors
     color: Nheko.colors.window
-    Component.onCompleted: Nheko.reparent(joinRoomRoot)
     width: 350
     height: fontMetrics.lineSpacing * 7
 
diff --git a/resources/qml/dialogs/PhoneNumberInputDialog.qml b/resources/qml/dialogs/PhoneNumberInputDialog.qml
index 399b11d51cc62c7eaa683908dd8b722353361fff..9c36c98ff63cb38bf13174b7a256cf4fd512f254 100644
--- a/resources/qml/dialogs/PhoneNumberInputDialog.qml
+++ b/resources/qml/dialogs/PhoneNumberInputDialog.qml
@@ -19,7 +19,6 @@ ApplicationWindow {
 
     modality: Qt.NonModal
     flags: Qt.Dialog
-    Component.onCompleted: Nheko.reparent(inputDialog)
     width: 350
     height: fontMetrics.lineSpacing * 7
 
diff --git a/resources/qml/dialogs/RawMessageDialog.qml b/resources/qml/dialogs/RawMessageDialog.qml
index 34104394e1a4cc70aea1478b211507c908faec48..774b078bee63350360a1e36bb0fdac2ada9b14bd 100644
--- a/resources/qml/dialogs/RawMessageDialog.qml
+++ b/resources/qml/dialogs/RawMessageDialog.qml
@@ -17,7 +17,6 @@ ApplicationWindow {
     palette: Nheko.colors
     color: Nheko.colors.window
     flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(rawMessageRoot)
 
     Shortcut {
         sequence: StandardKey.Cancel
diff --git a/resources/qml/dialogs/ReadReceipts.qml b/resources/qml/dialogs/ReadReceipts.qml
index aced4374b201f562aa6019dd2b502094bd6e4ac6..da87996e07d7e49d4c90cad0857c194e7ddaa62b 100644
--- a/resources/qml/dialogs/ReadReceipts.qml
+++ b/resources/qml/dialogs/ReadReceipts.qml
@@ -22,7 +22,6 @@ ApplicationWindow {
     palette: Nheko.colors
     color: Nheko.colors.window
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(readReceiptsRoot)
 
     Shortcut {
         sequence: StandardKey.Cancel
diff --git a/resources/qml/dialogs/RoomDirectory.qml b/resources/qml/dialogs/RoomDirectory.qml
index f458ac51c034e6f2317fbb344b27bdebe879cee5..99da63bb7592c3ba587ed4ab46738c5095bf8323 100644
--- a/resources/qml/dialogs/RoomDirectory.qml
+++ b/resources/qml/dialogs/RoomDirectory.qml
@@ -22,7 +22,6 @@ ApplicationWindow {
     color: Nheko.colors.window
     modality: Qt.WindowModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(roomDirectoryWindow)
     title: qsTr("Explore Public Rooms")
 
     Shortcut {
diff --git a/resources/qml/dialogs/RoomMembers.qml b/resources/qml/dialogs/RoomMembers.qml
index 89cce4148af5dbe888cd5e7382e5b3e94ddc0e3e..55d5488bc046f60c2707b4808a0564511d9a3a59 100644
--- a/resources/qml/dialogs/RoomMembers.qml
+++ b/resources/qml/dialogs/RoomMembers.qml
@@ -24,7 +24,6 @@ ApplicationWindow {
     palette: Nheko.colors
     color: Nheko.colors.window
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(roomMembersRoot)
 
     Shortcut {
         sequence: StandardKey.Cancel
diff --git a/resources/qml/dialogs/RoomSettings.qml b/resources/qml/dialogs/RoomSettings.qml
index c9f2b1a133977f6564eb10f89302ea540fcbc33e..48d2e2b726958a44cd6e593a72bc9db236296590 100644
--- a/resources/qml/dialogs/RoomSettings.qml
+++ b/resources/qml/dialogs/RoomSettings.qml
@@ -23,7 +23,6 @@ ApplicationWindow {
     color: Nheko.colors.window
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(roomSettingsDialog)
     title: qsTr("Room Settings")
 
     Shortcut {
diff --git a/resources/qml/dialogs/UserProfile.qml b/resources/qml/dialogs/UserProfile.qml
index 29ce2c3feb8c0f83492756852d6db67878b96814..73c4e68bff379b191b81cfa747ae6c5e768954b5 100644
--- a/resources/qml/dialogs/UserProfile.qml
+++ b/resources/qml/dialogs/UserProfile.qml
@@ -13,9 +13,6 @@ import QtQuick.Window 2.13
 import im.nheko 1.0
 
 ApplicationWindow {
-    // this does not work in ApplicationWindow, just in Window
-    //transientParent: Nheko.mainwindow()
-
     id: userProfileDialog
 
     property var profile
@@ -29,7 +26,6 @@ ApplicationWindow {
     title: profile.isGlobalUserProfile ? qsTr("Global User Profile") : qsTr("Room User Profile")
     modality: Qt.NonModal
     flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    Component.onCompleted: Nheko.reparent(userProfileDialog)
 
     Shortcut {
         sequence: StandardKey.Cancel
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index fc90e6c71c4cf872863aa986ddea4f2818dbd1c1..f30e0466c06847fa71860a0c4d883214adfc2eb5 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -175,8 +175,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
             &ChatPage::initializeEmptyViews,
             view_manager_,
             &TimelineViewManager::initializeRoomlist);
-    connect(
-      this, &ChatPage::chatFocusChanged, view_manager_, &TimelineViewManager::chatFocusChanged);
     connect(this, &ChatPage::syncUI, this, [this](const mtx::responses::Sync &sync) {
         view_manager_->sync(sync);
 
diff --git a/src/ChatPage.h b/src/ChatPage.h
index 5e3b509df1fea2f5e79abfbe4ef7c89b613a0d79..4b7351a5e3a41a47d7e1cec6916d0054b386baca 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -143,7 +143,6 @@ signals:
     void retrievedPresence(const QString &statusMsg, mtx::presence::PresenceState state);
     void themeChanged();
     void decryptSidebarChanged();
-    void chatFocusChanged(const bool focused);
 
     //! Signals for device verificaiton
     void receivedDeviceVerificationAccept(const mtx::events::msg::KeyVerificationAccept &message);
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 5e7fe6ce94a83df4b82a0265dfcba2c1fcc50061..03a99b0f1e5e839a5550c003a42bb45e9d11958d 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -130,8 +130,6 @@ MainWindow::MainWindow(QWindow *parent)
 
     connect(chat_page_, SIGNAL(contentLoaded()), this, SLOT(removeOverlayProgressBar()));
 
-    connect(this, &MainWindow::focusChanged, chat_page_, &ChatPage::chatFocusChanged);
-
     // connect(login_page_, &LoginPage::loginOk, this, [this](const mtx::responses::Login &res) {
     //     http::client()->set_user(res.user_id);
     //     showChatPage();
@@ -342,10 +340,6 @@ MainWindow::event(QEvent *event)
 
     if (type == QEvent::Close) {
         closeEvent(static_cast<QCloseEvent *>(event));
-    } else if (type == QEvent::WindowActivate) {
-        emit focusChanged(true);
-    } else if (type == QEvent::WindowDeactivate) {
-        emit focusChanged(false);
     }
 
     return QQuickView::event(event);
diff --git a/src/MainWindow.h b/src/MainWindow.h
index 04311e12b1d528817ec286b0891883681f38e8c2..ea919f4d05074a520c1a08ae81f6ba2b1f1a9d74 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -91,7 +91,6 @@ private slots:
     virtual void setWindowTitle(int notificationCount);
 
 signals:
-    void focusChanged(const bool focused);
     void reload();
     void secretsChanged();
 
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index e769fa40ac6be6f753bc158baa1e9d99cd23402b..6b380f79ad7c17044200f43be8ad61f34c6ecc8f 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -1031,7 +1031,7 @@ TimelineModel::setCurrentIndex(int index)
     if (index != oldIndex)
         emit currentIndexChanged(index);
 
-    if (!MainWindow::instance()->isActive())
+    if (MainWindow::instance() != QGuiApplication::focusWindow())
         return;
 
     if (!currentId.startsWith('m')) {
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 5d2a44439fbe0de091c5f8e55568c1be591ae8f6..0abd102bef7bd1940e65e2c608e8d71345f67225 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -5,6 +5,7 @@
 
 #include "TimelineViewManager.h"
 
+#include <QApplication>
 #include <QDropEvent>
 #include <QFileDialog>
 #include <QMetaType>
@@ -157,6 +158,16 @@ TimelineViewManager::TimelineViewManager(CallManager *, ChatPage *parent)
         isInitialSync_ = true;
         emit initialSyncChanged(true);
     });
+    connect(qobject_cast<QApplication *>(QApplication::instance()),
+            &QApplication::focusWindowChanged,
+            this,
+            &TimelineViewManager::focusChanged);
+}
+
+bool
+TimelineViewManager::isWindowFocused() const
+{
+    return MainWindow::instance() == QApplication::focusWindow();
 }
 
 void
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 424d78d6ea76d36046ec8ecd8c7107f8014c25a9..9419f224177c77feaa31f79613f3dbf4a67dc3fb 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -41,8 +41,7 @@ class TimelineViewManager : public QObject
 
     Q_PROPERTY(
       bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged)
-    Q_PROPERTY(
-      bool isWindowFocused MEMBER isWindowFocused_ READ isWindowFocused NOTIFY focusChanged)
+    Q_PROPERTY(bool isWindowFocused READ isWindowFocused NOTIFY focusChanged)
 
 public:
     TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr);
@@ -54,7 +53,7 @@ public:
     void clearAll() { rooms_->clear(); }
 
     Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
-    bool isWindowFocused() const { return isWindowFocused_; }
+    bool isWindowFocused() const;
     Q_INVOKABLE void openImageOverlay(TimelineModel *room, QString mxcUrl, QString eventId);
     Q_INVOKABLE void openImagePackSettings(QString roomid);
     Q_INVOKABLE void saveMedia(QString mxcUrl);
@@ -93,11 +92,6 @@ public slots:
     void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
     void receivedSessionKey(const std::string &room_id, const std::string &session_id);
     void initializeRoomlist();
-    void chatFocusChanged(bool focused)
-    {
-        isWindowFocused_ = focused;
-        emit focusChanged();
-    }
 
     void showEvent(const QString &room_id, const QString &event_id);
 
@@ -117,7 +111,6 @@ public slots:
 
 private:
     bool isInitialSync_   = true;
-    bool isWindowFocused_ = false;
 
     RoomlistModel *rooms_          = nullptr;
     CommunitiesModel *communities_ = nullptr;