diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt
index 06ac23d5b0..d40bd4b225 100644
--- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt
+++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt
@@ -46,22 +46,45 @@ internal interface CacheableTimelineEventFactory : TimelineEventFactory {
  * It handles decryption, extracting additional data around an event as sender data and relation.
  */
 internal class SimpleTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor,
-                                                              private val relationExtractor: EventRelationExtractor
+                                                              private val relationExtractor: EventRelationExtractor,
+                                                              private val cryptoService: CryptoService
 ) : TimelineEventFactory {
+
     override fun create(eventEntity: EventEntity, realm: Realm): TimelineEvent {
         val senderRoomMember = roomMemberExtractor.extractFrom(eventEntity, realm)
         val relations = relationExtractor.extractFrom(eventEntity, realm)
+
+        val event = eventEntity.asDomain()
+        if (event.getClearType() == EventType.ENCRYPTED) {
+            handleEncryptedEvent(event)
+        }
+
+        val isUniqueDisplayName = RoomMembers(realm, eventEntity.roomId).isUniqueDisplayName(senderRoomMember?.displayName)
+
         return TimelineEvent(
-                eventEntity.asDomain(),
+                event,
                 eventEntity.localId,
                 eventEntity.displayIndex,
                 senderRoomMember?.displayName,
-                /* TODO Rebase */ true,
+                isUniqueDisplayName,
                 senderRoomMember?.avatarUrl,
                 eventEntity.sendState,
                 relations
         )
     }
+
+    private fun handleEncryptedEvent(event: Event) {
+        Timber.v("Encrypted event: try to decrypt ${event.eventId}")
+        try {
+            val result = cryptoService.decryptEvent(event, UUID.randomUUID().toString())
+            event.setClearData(result)
+        } catch (failure: Throwable) {
+            Timber.e(failure, "Encrypted event: decryption failed")
+            if (failure is MXDecryptionException) {
+                event.setCryptoError(failure.cryptoError)
+            }
+        }
+    }
 }
 
 internal class InMemoryTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor,
@@ -125,6 +148,7 @@ internal class InMemoryTimelineEventFactory @Inject constructor(private val room
 
     override fun clear() {
         senderCache.clear()
+        decryptionCache.clear()
     }
 
     private data class SenderData(
diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt
index 6095089ae5..1d32ae3a41 100644
--- a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt
+++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt
@@ -45,11 +45,11 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte
         val latestEvent = roomSummary.latestEvent
         if (latestEvent != null) {
             val date = latestEvent.root.localDateTime()
-            val currentData = DateProvider.currentLocalDateTime()
-            val isSameDay = date.toLocalDate() == currentData.toLocalDate()
-            latestFormattedEvent = if (latestEvent.root.type == EventType.MESSAGE) {
+            val currentDate = DateProvider.currentLocalDateTime()
+            val isSameDay = date.toLocalDate() == currentDate.toLocalDate()
+            latestFormattedEvent = if (latestEvent.root.getClearType() == EventType.MESSAGE) {
                 val senderName = latestEvent.senderName() ?: latestEvent.root.senderId
-                val content = latestEvent.root.content?.toModel<MessageContent>()
+                val content = latestEvent.root.getClearContent()?.toModel<MessageContent>()
                 val message = content?.body ?: ""
                 if (roomSummary.isDirect.not() && senderName != null) {
                     span {