diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index 13b4c82c6bc8f7bd6beff27950276115070c5858..35b5cac4f9f29edd4356bbb8f0e80d9d17d46861 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -77,6 +77,19 @@ ListView {
         }
     }
 
+    Connections {
+        target: TimelineManager
+        onFocusChanged: readTimer.running = TimelineManager.isWindowFocused
+    }
+
+    Timer {
+        id: readTimer
+
+        // force current read index to update
+        onTriggered: chat.model.setCurrentIndex(chat.model.currentIndex)
+        interval: 1000
+    }
+
     Component {
         id: sectionHeader
 
@@ -193,7 +206,7 @@ ListView {
         Connections {
             target: chat
             onMovementEnded: {
-                if (y + height + 2 * chat.spacing > chat.contentY + timelineRoot.height && y < chat.contentY + timelineRoot.height)
+                if (y + height + 2 * chat.spacing > chat.contentY + chat.height && y < chat.contentY + chat.height)
                     chat.model.currentIndex = index;
 
             }
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 0f35a290b756465141c662d5a1ba0e94bf9dfbd0..5c904932adff218171bad981ecc957d4593bc082 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -735,14 +735,14 @@ TimelineModel::updateLastMessage()
 void
 TimelineModel::setCurrentIndex(int index)
 {
-        if (!ChatPage::instance()->isActiveWindow())
-                return;
-
         auto oldIndex = idToIndex(currentId);
         currentId     = indexToId(index);
         if (index != oldIndex)
                 emit currentIndexChanged(index);
 
+        if (!ChatPage::instance()->isActiveWindow())
+                return;
+
         if (!currentId.startsWith("m")) {
                 auto oldReadIndex =
                   cache::getEventIndex(roomId().toStdString(), currentReadId.toStdString());