diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt
index 67d488f269cadbe761b59cb1605b17cbf3a88262..8a3f6fb4313e750ff4fb983fc6739658de52b952 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt
@@ -12,12 +12,13 @@ data class DisplayMessage(
 ) {
   data class Tag(
     val id: MsgId,
+    val isFollowUp: Boolean,
     val isSelected: Boolean,
     val isExpanded: Boolean,
     val isMarkerLine: Boolean
   )
 
-  val tag = Tag(content.messageId, isSelected, isExpanded, isMarkerLine)
+  val tag = Tag(content.messageId, content.followUp, isSelected, isExpanded, isMarkerLine)
   val avatarUrl = content.sender.let {
     Regex("[us]id(\\d+)").matchEntire(HostmaskHelper.user(it))?.groupValues?.lastOrNull()?.let {
       "https://www.irccloud.com/avatar-redirect/$it"
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
index 14f411ac93199f065563485a4069f6f33039d1a9..c223b4edeeb456fd57acba49ad367d8e8b41b1f7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
@@ -184,6 +184,11 @@ class MessageAdapter(
 
       this.itemView.isSelected = message.isSelected
 
+      if (message.isFollowUp) {
+        name?.visibility = View.GONE
+        avatar?.visibility = View.GONE
+      }
+
       avatar?.let { avatarView ->
         GlideApp.with(itemView)
           .load(message.avatarUrl)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
index 99aadeed13b6d5c44f3c37aee7889b89bb210ba4..ce748f8832f986e42b048d56b6029673c9e2e4de 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
@@ -161,6 +161,7 @@ class QuasselMessageRenderer @Inject constructor(
           combined = SpanFormatter.format("%s: %s", nick, content),
           avatarUrl = message.avatarUrl,
           fallbackDrawable = TextDrawable.builder().buildRound(initial, senderColor),
+          isFollowUp = message.content.followUp,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml
index 73b01707bd896d6beaaa33c76c6da1645124c71c..946c39fc1d07cccc5d84d58a240a6a0754ede2c9 100644
--- a/app/src/main/res/layout/widget_chatmessage_plain.xml
+++ b/app/src/main/res/layout/widget_chatmessage_plain.xml
@@ -29,15 +29,20 @@
       android:typeface="monospace"
       tools:text="@sample/messages.json/data/time" />
 
-    <ImageView
-      android:id="@+id/avatar"
-      android:layout_width="40dp"
-      android:layout_height="40dp"
+    <FrameLayout
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="wrap_content"
       android:layout_marginBottom="@dimen/message_vertical"
       android:layout_marginEnd="@dimen/message_horizontal"
       android:layout_marginRight="@dimen/message_horizontal"
-      android:layout_marginTop="@dimen/message_vertical"
-      android:visibility="gone" />
+      android:layout_marginTop="@dimen/message_vertical">
+
+      <ImageView
+        android:id="@+id/avatar"
+        android:layout_width="@dimen/avatar_size"
+        android:layout_height="@dimen/avatar_size"
+        android:visibility="gone" />
+    </FrameLayout>
 
     <LinearLayout
       android:layout_width="0dip"
diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt
index f058902d30ae83cbd82b0389536243fef2350562..7ee165112f725703a92fdf3c16ac4783965331d6 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt
@@ -29,7 +29,8 @@ class QuasselBacklogStorage(private val db: QuasselDatabase) : BacklogStorage {
           bufferId = message.bufferInfo.bufferId,
           sender = message.sender,
           senderPrefixes = message.senderPrefixes,
-          content = message.content
+          content = message.content,
+          followUp = false
         )
       )
     }
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 4a302cadbcd021fe5ada329eee6a0d760e9f046f..40b3984ebfd7d6b301664f895bc37f8ff0ed9e8e 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -17,7 +17,7 @@ import de.kuschku.quasseldroid.persistence.QuasselDatabase.Filtered
 import io.reactivex.Flowable
 import org.threeten.bp.Instant
 
-@Database(entities = [DatabaseMessage::class, Filtered::class], version = 3)
+@Database(entities = [DatabaseMessage::class, Filtered::class], version = 4)
 @TypeConverters(DatabaseMessage.MessageTypeConverters::class)
 abstract class QuasselDatabase : RoomDatabase() {
   abstract fun message(): MessageDao
@@ -32,7 +32,8 @@ abstract class QuasselDatabase : RoomDatabase() {
     var bufferId: Int,
     var sender: String,
     var senderPrefixes: String,
-    var content: String
+    var content: String,
+    var followUp: Boolean
   ) {
     class MessageTypeConverters {
       @TypeConverter
@@ -169,7 +170,15 @@ abstract class QuasselDatabase : RoomDatabase() {
                     "CREATE TABLE filtered(bufferId INTEGER, accountId INTEGER, filtered INTEGER, PRIMARY KEY(accountId, bufferId));"
                   )
                 }
-              }).build()
+              },
+              object : Migration(3, 4) {
+                override fun migrate(database: SupportSQLiteDatabase) {
+                  database.execSQL(
+                    "ALTER TABLE message ADD followUp INT DEFAULT 0 NOT NULL;"
+                  )
+                }
+              }
+            ).build()
           }
         }
       }
@@ -202,7 +211,17 @@ FROM
       bufferId,
       sender,
       senderPrefixes,
-      content
+      content,
+      sender = coalesce((SELECT sender
+                         FROM message m
+                         WHERE m.messageId < message.messageId
+                               AND bufferId = ?
+                               AND type & ~? > 0
+                               AND date(datetime(m.time / 1000, 'unixepoch', 'localtime')) =
+                                   date(datetime(message.time / 1000, 'unixepoch', 'localtime'))
+                         ORDER BY m.messageId
+                           DESC
+                         LIMIT 1), 0) AS followUp
     FROM message
     WHERE bufferId = ?
           AND type & ~? > 0
@@ -210,15 +229,18 @@ FROM
     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
+      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)))
\ No newline at end of file
+ORDER BY TIME
+  DESC, messageId
+  DESC
+  """, arrayOf(bufferId, type, bufferId, type, bufferId, bufferId, type)))
\ No newline at end of file
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt
index fd7c7865b90276fd6f68e6822a7d4cf57709874c..2ae1319a6032ee8101e6ec0569bdb28f758f07c7 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt
@@ -10,6 +10,7 @@ class FormattedMessage(
   val combined: CharSequence,
   val fallbackDrawable: Drawable? = null,
   val avatarUrl: String? = null,
+  val isFollowUp: Boolean = false,
   val isSelected: Boolean,
   val isExpanded: Boolean,
   val isMarkerLine: Boolean