diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index fd850d1a..826b544c 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -303,6 +303,8 @@ const addNewNotifications = (state, { dispatch, notifications, older, visibleNot
           setTimeout(notification.close.bind(notification), 5000)
         }
       }
+    } else if (notification.seen) {
+      state.notifications.idStore[notification.id].seen = true
     }
   })
 }
diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js
index b69ec643..3ecdae6a 100644
--- a/src/services/notifications_fetcher/notifications_fetcher.service.js
+++ b/src/services/notifications_fetcher/notifications_fetcher.service.js
@@ -16,7 +16,17 @@ const fetchAndUpdate = ({store, credentials, older = false}) => {
       args['until'] = timelineData.minId
     }
   } else {
-    args['since'] = timelineData.maxId
+    // load unread notifications repeadedly to provide consistency between browser tabs
+    const notifications = timelineData.data
+    const unread = notifications.filter(n => !n.seen).map(n => n.id)
+    if (!unread.length) {
+      args['since'] = timelineData.maxId
+    } else {
+      args['since'] = Math.min(...unread) - 1
+      if (timelineData.maxId !== Math.max(...unread)) {
+        args['until'] = Math.max(...unread, args['since'] + 20)
+      }
+    }
   }
 
   args['timeline'] = 'notifications'