diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
index fe5e21becf4eb1e251ced2e92f6ff93ea55cc8b9..e6c3e77b40d1c9ed05a8df0e3aa2c2fbd0644892 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
@@ -231,6 +231,21 @@ class MessageListFragment : ServiceBoundFragment() {
         }
       })
 
+    fun processMessages(list: List<QuasselDatabase.DatabaseMessage>, selected: Set<MsgId>,
+                        expanded: Set<MsgId>, markerLine: MsgId?): List<DisplayMessage> {
+      var previous: QuasselDatabase.DatabaseMessage? = null
+      return list.asReversed().map {
+        it.followUp = previous?.sender == it.sender
+        previous = it
+        DisplayMessage(
+          content = it,
+          isSelected = selected.contains(it.messageId),
+          isExpanded = expanded.contains(it.messageId),
+          isMarkerLine = markerLine == it.messageId
+        )
+      }.asReversed()
+    }
+
     val data = combineLatest(viewModel.buffer,
                              viewModel.selectedMessages,
                              viewModel.expandedMessages,
@@ -238,13 +253,8 @@ class MessageListFragment : ServiceBoundFragment() {
       .toLiveData().switchMapNotNull { (buffer, selected, expanded, markerLine) ->
         database.filtered().listen(accountId, buffer).switchMapNotNull { filtered ->
           LivePagedListBuilder(
-            database.message().findByBufferIdPagedWithDayChange(buffer, filtered).map {
-              DisplayMessage(
-                content = it,
-                isSelected = selected.contains(it.messageId),
-                isExpanded = expanded.contains(it.messageId),
-                isMarkerLine = markerLine.orNull() == it.messageId
-              )
+            database.message().findByBufferIdPagedWithDayChange(buffer, filtered).mapByPage {
+              processMessages(it, selected.keys, expanded, markerLine.orNull())
             },
             PagedList.Config.Builder()
               .setPageSize(backlogSettings.pageSize)
diff --git a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
index bd816b7425de117ca78c00fa2265892333bd529e..8d7514cb88f3ef8f90f70eb589d6c9c311c251f6 100644
--- a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
@@ -54,4 +54,4 @@ class ConnectionUnitTest {
     }, user to pass, {}, {})
     session.join()
   }
-}
\ No newline at end of file
+}
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 df1f595d5ef0443e315bbc7528901f0285182764..a72a63436ab5a7f722a6cf6678026996ac7397f7 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -201,6 +201,44 @@ fun QuasselDatabase.MessageDao.clearMessages(
 fun QuasselDatabase.MessageDao.findByBufferIdPagedWithDayChange(bufferId: Int, type: Int) =
   this.findMessagesRawPaged(SimpleSQLiteQuery("""
 SELECT t.*
+FROM
+  (
+    SELECT
+      messageId,
+      time,
+      type,
+      flag,
+      bufferId,
+      sender,
+      senderPrefixes,
+      content,
+      followUp
+    FROM message
+    WHERE bufferId = ?
+          AND type & ~? > 0
+    UNION ALL
+    SELECT DISTINCT
+      strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * -1000 AS messageId,
+      strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000  AS time,
+      8192                                                                                 AS type,
+      0                                                                                    AS flag,
+      ?                                                                                    AS bufferId,
+      ''                                                                                   AS sender,
+      ''                                                                                   AS senderPrefixes,
+      ''                                                                                   AS content,
+      0                                                                                    AS followUp
+    FROM message
+    WHERE bufferId = ?
+          AND type & ~? > 0
+  ) t
+ORDER BY TIME
+  DESC, messageId
+  DESC
+  """, arrayOf(bufferId, type, bufferId, bufferId, type)))
+
+fun QuasselDatabase.MessageDao.findByBufferIdPagedWithDayChangeSlow(bufferId: Int, type: Int) =
+  this.findMessagesRawPaged(SimpleSQLiteQuery("""
+SELECT t.*
 FROM
   (
     SELECT
@@ -248,4 +286,4 @@ FROM
 ORDER BY TIME
   DESC, messageId
   DESC
-  """, arrayOf(bufferId, type, bufferId, type, bufferId, bufferId, type)))
\ No newline at end of file
+  """, arrayOf(bufferId, type, bufferId, type, bufferId, bufferId, type)))
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
index 4d3b89ce7f6625293463b438473e57bebf649fd6..93e54b3353c6be7782cb1204324bb07a3941c39c 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -37,7 +37,7 @@ class QuasselViewModel : ViewModel() {
     return result.isNotEmpty()
   }
 
-  val expandedMessages = BehaviorSubject.createDefault(emptyList<MsgId>())
+  val expandedMessages = BehaviorSubject.createDefault(emptySet<MsgId>())
 
   val buffer = BehaviorSubject.createDefault(-1)
   val buffer_liveData = buffer.toLiveData()