diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
index 9dadcec95a3ca096c6eb30e589f44526bcebd9ae..f954dbfacf5c56c886f4782dd05ac9dfcb7571ce 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
@@ -126,7 +126,7 @@ class QuasselNotificationBackend @Inject constructor(
                                 Message_Type.Notice).toInt(),
                 0
               ) {
-                processMessages(session, *it.toTypedArray())
+                processMessages(session, false, *it.toTypedArray())
                 false
               }
           }
@@ -140,7 +140,7 @@ class QuasselNotificationBackend @Inject constructor(
                                 Message_Type.Notice).toInt(),
                 Message_Flag.of(Message_Flag.Highlight).toInt()
               ) {
-                processMessages(session, *it.toTypedArray())
+                processMessages(session, false, *it.toTypedArray())
                 false
               }
             }
@@ -150,6 +150,15 @@ class QuasselNotificationBackend @Inject constructor(
           }
         }
       }
+
+      // Cleanup
+      val removedBuffers = database.notifications().buffers().minus(buffers.map(BufferInfo::bufferId))
+      for (removedBuffer in removedBuffers) {
+        database.notifications().markRead(removedBuffer, MsgId.MAX_VALUE)
+      }
+
+      // Update notifications to have actions
+      showConnectedNotifications()
     }
   }
 
@@ -178,7 +187,7 @@ class QuasselNotificationBackend @Inject constructor(
   }
 
   @Synchronized
-  override fun processMessages(session: Session, vararg messages: Message) {
+  override fun processMessages(session: Session, show: Boolean, vararg messages: Message) {
     val now = Instant.now()
     val results = messages.filter {
       val level = it.bufferInfo.type.let {
@@ -229,18 +238,33 @@ class QuasselNotificationBackend @Inject constructor(
       )
     }
     database.notifications().save(*results.toTypedArray())
-    executor.schedule(
-      {
-        results.map(QuasselDatabase.NotificationData::bufferId).distinct()
-          .forEach(this::showNotification)
-      },
-      session.lag.value * 2,
-      TimeUnit.MILLISECONDS
-    )
+    if (show) {
+      executor.schedule(
+        {
+          results.map(QuasselDatabase.NotificationData::bufferId).distinct().forEach { buffer ->
+            this.showNotification(buffer)
+          }
+        },
+        session.lag.value * 2,
+        TimeUnit.MILLISECONDS
+      )
+    }
+  }
+
+  fun showConnectedNotifications() {
+    database.notifications().buffers().forEach { buffer ->
+      this.showNotification(buffer, true)
+    }
+  }
+
+  fun showDisconnectedNotifications() {
+    database.notifications().buffers().forEach { buffer ->
+      this.showNotification(buffer, false)
+    }
   }
 
   @Synchronized
-  private fun showNotification(buffer: BufferId) {
+  private fun showNotification(buffer: BufferId, isConnected: Boolean = true) {
     val data = database.notifications().all(buffer)
     data.lastOrNull()?.let {
       // Only send a loud notification if it has any new messages
@@ -310,7 +334,7 @@ class QuasselNotificationBackend @Inject constructor(
         )
       }
       val notification = notificationHandler.notificationMessage(
-        notificationSettings, bufferInfo, notificationData, isLoud
+        notificationSettings, bufferInfo, notificationData, isLoud, isConnected
       )
       notificationHandler.notify(notification)
     } ?: notificationHandler.remove(buffer)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index f6d7af6fc0ab95cf67cc8b34eb4eb8affea14868..a2b53fbd56338177b87941e2fc31f12eb4df16b4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -366,6 +366,7 @@ class QuasselService : DaggerLifecycleService(),
 
           if (it == ConnectionState.CLOSED) {
             scheduleReconnect()
+            notificationBackend.showDisconnectedNotifications()
           }
         }
       })
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
index 6ee03952e188359d9a02e1d5fae30e1cd86365b5..27add767ee29f60a51b33f4b10877048db1ad853 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
@@ -108,7 +108,8 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
   }
 
   fun notificationMessage(notificationSettings: NotificationSettings, bufferInfo: BufferInfo,
-                          notifications: List<NotificationMessage>, isLoud: Boolean): Handle {
+                          notifications: List<NotificationMessage>, isLoud: Boolean,
+                          isConnected: Boolean): Handle {
     val pendingIntentOpen = PendingIntent.getActivity(
       context.applicationContext,
       System.currentTimeMillis().toInt(),
@@ -198,15 +199,17 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
                     }
                   }
       )
-      .addAction(0, translatedLocale.getString(R.string.label_mark_read), markReadPendingIntent)
-      .letIf(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-        it.addAction(
-          NotificationCompat.Action.Builder(
-            0,
-            translatedLocale.getString(R.string.label_reply),
-            replyPendingIntent
-          ).addRemoteInput(remoteInput).build()
-        )
+      .letIf(isConnected) {
+        it.addAction(0, translatedLocale.getString(R.string.label_mark_read), markReadPendingIntent)
+          .letIf(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            it.addAction(
+              NotificationCompat.Action.Builder(
+                0,
+                translatedLocale.getString(R.string.label_reply),
+                replyPendingIntent
+              ).addRemoteInput(remoteInput).build()
+            )
+          }
       }
       .setWhen(notifications.last().time.toEpochMilli())
       .apply {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
index a3ab7adc7384247fa1da112c609a3b42c4a8a00c..fb1dbf08117c23fa5c03eeb68a97f0b4bc9353d9 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
@@ -60,7 +60,7 @@ class RpcHandler(
   override fun displayMsg(message: Message) {
     session.bufferSyncer.bufferInfoUpdated(message.bufferInfo)
     backlogStorage.storeMessages(session, message)
-    notificationManager?.processMessages(session, message)
+    notificationManager?.processMessages(session, true, message)
   }
 
   override fun createIdentity(identity: Identity, additional: QVariantMap) =
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt
index 982505d80b3859373b9ddb720c0c3c3b62a8961f..128a270fe3935df5e2186981bf9785523edc46f5 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/NotificationManager.kt
@@ -25,6 +25,6 @@ import de.kuschku.libquassel.protocol.MsgId
 
 interface NotificationManager {
   fun init(session: Session)
-  fun processMessages(session: Session, vararg messages: Message)
+  fun processMessages(session: Session, show: Boolean, vararg messages: Message)
   fun clear(buffer: BufferId, lastRead: MsgId = MsgId.MAX_VALUE)
 }
diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
index aff4e8abaa37b2374cd93a7f219a70ddb57c9534..0ecccd20a093721eb08b6378d3dcde8cc22663c7 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -216,6 +216,9 @@ abstract class QuasselDatabase : RoomDatabase() {
     @Insert(onConflict = OnConflictStrategy.IGNORE)
     fun save(vararg entities: NotificationData)
 
+    @Query("SELECT DISTINCT bufferId FROM notification")
+    fun buffers(): List<BufferId>
+
     @Query("SELECT * FROM notification ORDER BY time ASC")
     fun all(): List<NotificationData>