diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/event/FilterAndStoreEventsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/event/FilterAndStoreEventsTask.kt
index aa836c8491..e6e169b9b4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/event/FilterAndStoreEventsTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/event/FilterAndStoreEventsTask.kt
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.session.room.event
 
 import com.zhuinden.monarchy.Monarchy
 import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.events.model.EventType
 import org.matrix.android.sdk.api.session.room.send.SendState
 import org.matrix.android.sdk.internal.crypto.EventDecryptor
 import org.matrix.android.sdk.internal.database.mapper.toEntity
@@ -48,7 +49,9 @@ internal class DefaultFilterAndStoreEventsTask @Inject constructor(
     override suspend fun execute(params: FilterAndStoreEventsTask.Params) {
         val filteredEvents = params.events
                 .map { decryptEventIfNeeded(it) }
-                .filter { params.filterPredicate(it) }
+                // we also filter in the encrypted events since it means there was decryption error for them
+                // and they may be decrypted later
+                .filter { params.filterPredicate(it) || it.getClearType() == EventType.ENCRYPTED }
 
         addMissingEventsInDB(params.roomId, filteredEvents)
     }