diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0184736b797d025288c51ee394e5be83d6affc2f..c94de58c59e943a4e0f3cd0e4439683bb4812df6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,6 +30,7 @@
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
   <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />
   <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
 
   <application
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 6f6d74131ae067244f09a6e34de347f8785bce7d..2a314bbba09d7902eeae455ec00aa24069c16a14 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -23,13 +23,19 @@ import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
 import android.content.SharedPreferences
+import android.content.pm.ServiceInfo
+import android.os.Build
 import android.text.SpannableString
 import androidx.core.app.RemoteInput
-import androidx.lifecycle.Observer
 import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
 import de.kuschku.libquassel.connection.ConnectionState
 import de.kuschku.libquassel.connection.SocketAddress
-import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.BufferId
+import de.kuschku.libquassel.protocol.ClientData
+import de.kuschku.libquassel.protocol.MsgId
+import de.kuschku.libquassel.protocol.Protocol
+import de.kuschku.libquassel.protocol.Protocol_Feature
+import de.kuschku.libquassel.protocol.Protocol_Features
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager
@@ -38,7 +44,6 @@ import de.kuschku.libquassel.session.Session
 import de.kuschku.libquassel.session.SessionManager
 import de.kuschku.libquassel.session.manager.ConnectionInfo
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
-import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.ERROR
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO
 import de.kuschku.libquassel.util.helper.clampOf
 import de.kuschku.libquassel.util.helper.value
@@ -48,7 +53,11 @@ import de.kuschku.quasseldroid.BuildConfig
 import de.kuschku.quasseldroid.Keys
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.defaults.Defaults
-import de.kuschku.quasseldroid.persistence.dao.*
+import de.kuschku.quasseldroid.persistence.dao.buffers
+import de.kuschku.quasseldroid.persistence.dao.clear
+import de.kuschku.quasseldroid.persistence.dao.findById
+import de.kuschku.quasseldroid.persistence.dao.markHidden
+import de.kuschku.quasseldroid.persistence.dao.markReadNormal
 import de.kuschku.quasseldroid.persistence.db.AccountDatabase
 import de.kuschku.quasseldroid.persistence.db.QuasselDatabase
 import de.kuschku.quasseldroid.persistence.util.AccountId
@@ -62,7 +71,11 @@ import de.kuschku.quasseldroid.ssl.custom.QuasselCertificateManager
 import de.kuschku.quasseldroid.ssl.custom.QuasselHostnameManager
 import de.kuschku.quasseldroid.util.backport.DaggerLifecycleService
 import de.kuschku.quasseldroid.util.compatibility.AndroidHandlerService
-import de.kuschku.quasseldroid.util.helper.*
+import de.kuschku.quasseldroid.util.helper.editApply
+import de.kuschku.quasseldroid.util.helper.editCommit
+import de.kuschku.quasseldroid.util.helper.lineSequence
+import de.kuschku.quasseldroid.util.helper.sharedPreferences
+import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer
 import de.kuschku.quasseldroid.util.ui.LocaleHelper
 import io.reactivex.subjects.BehaviorSubject
@@ -161,10 +174,26 @@ class QuasselService : DaggerLifecycleService(),
       val notificationHandle = notificationManager.notificationBackground()
       this.notificationHandle = notificationHandle
       updateNotification(notificationHandle, rawProgress)
-      startForeground(notificationHandle.id, notificationHandle.builder.build())
+      if (Build.VERSION.SDK_INT >= 34) {
+        startForeground(
+          notificationHandle.id,
+          notificationHandle.builder.build(),
+          ServiceInfo.FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
+        )
+      } else {
+        startForeground(
+          notificationHandle.id,
+          notificationHandle.builder.build()
+        )
+      }
     } else {
       this.notificationHandle = null
-      stopForeground(true)
+      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+        stopForeground(STOP_FOREGROUND_REMOVE)
+      } else {
+        @Suppress("DEPRECATION")
+        stopForeground(true)
+      }
     }
   }
 
@@ -333,9 +362,9 @@ class QuasselService : DaggerLifecycleService(),
                 .filter { it }
                 .map { network }
             }.firstElement()
-        }.toLiveData().observe(this, Observer {
+        }.toLiveData().observe(this) {
           it?.requestConnect()
-        })
+        }
       }
     }
 
@@ -401,7 +430,7 @@ class QuasselService : DaggerLifecycleService(),
       supportedProtocols = listOf(Protocol.Datastream)
     )
 
-    sessionManager.connectionProgress.toLiveData().observe(this, Observer {
+    sessionManager.connectionProgress.toLiveData().observe(this) {
       if (this.progress.first != it?.first && it?.first == ConnectionState.CONNECTED) {
         handlerService.backend {
           database.message().clearMessages()
@@ -414,12 +443,12 @@ class QuasselService : DaggerLifecycleService(),
         updateNotification(handle, rawProgress)
         notificationManager.notify(handle)
       }
-    })
+    }
 
     ReactiveNetwork
       .observeNetworkConnectivity(applicationContext)
       .toLiveData()
-      .observe(this, Observer { connectivity ->
+      .observe(this) { connectivity ->
         if (!connectionSettings.ignoreNetworkChanges) {
           log(INFO, "QuasselService", "Connectivity changed: $connectivity")
           handlerService.backend {
@@ -430,13 +459,12 @@ class QuasselService : DaggerLifecycleService(),
             )
           }
         }
-      })
+      }
 
     sessionManager.state
       .distinctUntilChanged()
       .toLiveData()
-      .observe(
-        this, Observer {
+      .observe(this) {
         handlerService.backend {
           if (it == ConnectionState.HANDSHAKE) {
             backoff = BACKOFF_MIN
@@ -447,7 +475,7 @@ class QuasselService : DaggerLifecycleService(),
             notificationBackend.showDisconnectedNotifications()
           }
         }
-      })
+      }
 
     sharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE) {
       registerOnSharedPreferenceChangeListener(this@QuasselService)
@@ -512,7 +540,7 @@ class QuasselService : DaggerLifecycleService(),
 
     // Cleanup deleted buffers from cache
 
-    val buffers = session.bufferSyncer.bufferInfos().map(BufferInfo::bufferId)
+    val buffers = session.bufferSyncer.bufferInfos().map(BufferInfo::bufferId).toSet()
 
     val deletedBuffersMessage = database.message().buffers().toSet() - buffers
     log(INFO, "QuasselService", "Buffers deleted from message storage: $deletedBuffersMessage")