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 55ce7e475e4be45387a7a0508a623ead4c50f3ec..b6dfc879989b9d9fc4b25f2afd42cff7e3cf79e0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -29,6 +29,7 @@ import de.kuschku.libquassel.connection.ConnectionState
 import de.kuschku.libquassel.connection.HostnameVerifier
 import de.kuschku.libquassel.connection.SocketAddress
 import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager
 import de.kuschku.libquassel.session.Backend
@@ -436,6 +437,30 @@ class QuasselService : DaggerLifecycleService(),
         }.toVariantMap()
       )
     }
+
+    // Cleanup deleted buffers from cache
+
+    val buffers = session.bufferSyncer.bufferInfos().map(BufferInfo::bufferId)
+
+    val deletedBuffersMessage = database.message().buffers().toSet() - buffers
+    log(INFO, "QuasselService", "Buffers deleted from message storage: $deletedBuffersMessage")
+    for (deletedBuffer in deletedBuffersMessage) {
+      database.message().clearMessages(deletedBuffer)
+    }
+
+    val deletedBuffersFiltered = database.filtered().buffers(accountId).toSet() - buffers
+    log(INFO, "QuasselService", "Buffers deleted from filtered storage: $deletedBuffersFiltered")
+    for (deletedBuffer in deletedBuffersFiltered) {
+      database.filtered().clear(accountId, deletedBuffer)
+    }
+
+    val deletedBuffersNotifications = database.notifications().buffers().toSet() - buffers
+    log(INFO,
+        "QuasselService",
+        "Buffers deleted from notification storage: $deletedBuffersNotifications")
+    for (deletedBuffer in deletedBuffersNotifications) {
+      database.notifications().markReadNormal(deletedBuffer)
+    }
   }
 
   companion object {
@@ -449,7 +474,7 @@ class QuasselService : DaggerLifecycleService(),
       disconnect: Boolean? = null,
       markRead: BufferId? = null,
       markReadMessage: MsgId? = null
-    ): ComponentName = context.startService(
+    ): ComponentName? = context.startService(
       intent(context, disconnect, markRead, markReadMessage)
     )
 
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 1a585d56765c34f36b3e300b5ced209e403cabb3..a8292ea0b4ed6422d351454b37b1c81f1af65c2e 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -62,6 +62,9 @@ abstract class QuasselDatabase : RoomDatabase() {
     @Query("SELECT * FROM message")
     fun all(): List<MessageData>
 
+    @Query("SELECT DISTINCT bufferId FROM message")
+    fun buffers(): List<BufferId>
+
     @Query("SELECT * FROM message WHERE messageId = :messageId")
     fun find(messageId: Int): MessageData?
 
@@ -119,6 +122,9 @@ abstract class QuasselDatabase : RoomDatabase() {
 
   @Dao
   interface FilteredDao {
+    @Query("SELECT DISTINCT bufferId FROM filtered WHERE accountId = :accountId")
+    fun buffers(accountId: Long): List<BufferId>
+
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun replace(vararg entities: Filtered)