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 c223b4edeeb456fd57acba49ad367d8e8b41b1f7..2a4310464029221148384483a8ba59c73b6adf7d 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
@@ -59,31 +59,42 @@ class MessageAdapter(
   }
 
   override fun getItemViewType(position: Int) = getItem(position)?.let {
-    viewType(Message_Flags.of(it.content.type), Message_Flags.of(it.content.flag))
+    viewType(Message_Flags.of(it.content.type),
+             Message_Flags.of(it.content.flag),
+             it.content.followUp)
   } ?: 0
 
-  private fun viewType(type: Message_Types, flags: Message_Flags) =
-    if (flags.hasFlag(Message_Flag.Highlight)) {
-      -type.value
-    } else {
-      type.value
-    }
+  private fun viewType(type: Message_Types, flags: Message_Flags, followUp: Boolean) =
+    type.value or
+      (if (flags.hasFlag(Message_Flag.Highlight)) MASK_HIGHLIGHT else 0x00) or
+      (if (followUp) MASK_FOLLOWUP else 0x00)
 
   override fun getItemId(position: Int): Long {
     return getItem(position)?.content?.messageId?.toLong() ?: 0L
   }
 
   private fun messageType(viewType: Int): Message_Type? =
-    Message_Type.of(Math.abs(viewType)).enabledValues().firstOrNull()
+    Message_Type.of(viewType and MASK_TYPE).enabledValues().firstOrNull()
+
+  private fun hasHiglight(viewType: Int) = viewType and MASK_HIGHLIGHT != 0
 
-  private fun hasHiglight(viewType: Int) = viewType < 0
+  private fun isFollowUp(viewType: Int) = viewType and MASK_FOLLOWUP != 0
+
+  companion object {
+    const val SHIFT_HIGHLIGHT = 32 - 1
+    const val SHIFT_FOLLOWUP = SHIFT_HIGHLIGHT - 1
+    const val MASK_HIGHLIGHT = 0x01 shl SHIFT_HIGHLIGHT
+    const val MASK_FOLLOWUP = 0x01 shl SHIFT_FOLLOWUP
+    const val MASK_TYPE = 0xFFFF
+  }
 
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuasselMessageViewHolder {
     val messageType = messageType(viewType)
     val hasHighlight = hasHiglight(viewType)
+    val isFollowUp = isFollowUp(viewType)
     val viewHolder = QuasselMessageViewHolder(
       LayoutInflater.from(parent.context).inflate(
-        messageRenderer.layout(messageType, hasHighlight),
+        messageRenderer.layout(messageType, hasHighlight, isFollowUp),
         parent,
         false
       ),
@@ -91,7 +102,7 @@ class MessageAdapter(
       selectionListener,
       expansionListener
     )
-    messageRenderer.init(viewHolder, messageType, hasHighlight)
+    messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp)
     return viewHolder
   }
 
@@ -119,6 +130,10 @@ class MessageAdapter(
     @JvmField
     var avatar: ImageView? = null
 
+    @BindView(R.id.avatar_container)
+    @JvmField
+    var avatarContainer: View? = null
+
     @BindView(R.id.avatar_placeholder)
     @JvmField
     var avatarPlaceholder: Space? = null
@@ -184,11 +199,6 @@ 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/MessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
index 5ebf18cea402a93e81b93e3bcf73fc6aff86c479..185bc59e2acef0b5c80ebfda6dd6e4d92009e9b3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
@@ -8,7 +8,7 @@ import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage
 
 interface MessageRenderer {
   @LayoutRes
-  fun layout(type: Message_Type?, hasHighlight: Boolean): Int
+  fun layout(type: Message_Type?, hasHighlight: Boolean, isFollowUp: Boolean): Int
 
   fun bind(holder: MessageAdapter.QuasselMessageViewHolder, message: FormattedMessage,
            original: QuasselDatabase.DatabaseMessage)
@@ -17,7 +17,8 @@ interface MessageRenderer {
 
   fun init(viewHolder: MessageAdapter.QuasselMessageViewHolder,
            messageType: Message_Type?,
-           hasHighlight: Boolean) {
+           hasHighlight: Boolean,
+           isFollowUp: Boolean) {
   }
 }
 
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 ce748f8832f986e42b048d56b6029673c9e2e4de..105c4ed2bcbac82c1e46591ed54804fbfb5c8804 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
@@ -56,7 +56,8 @@ class QuasselMessageRenderer @Inject constructor(
 
   private val zoneId = ZoneId.systemDefault()
 
-  override fun layout(type: Message_Type?, hasHighlight: Boolean) = when (type) {
+  override fun layout(type: Message_Type?, hasHighlight: Boolean,
+                      isFollowUp: Boolean) = when (type) {
     Notice    -> R.layout.widget_chatmessage_notice
     Server    -> R.layout.widget_chatmessage_server
     Error     -> R.layout.widget_chatmessage_error
@@ -70,7 +71,8 @@ class QuasselMessageRenderer @Inject constructor(
 
   override fun init(viewHolder: MessageAdapter.QuasselMessageViewHolder,
                     messageType: Message_Type?,
-                    hasHighlight: Boolean) {
+                    hasHighlight: Boolean,
+                    isFollowUp: Boolean) {
     if (hasHighlight) {
       viewHolder.itemView.context.theme.styledAttributes(
         R.attr.colorForegroundHighlight, R.attr.colorBackgroundHighlight,
@@ -95,10 +97,11 @@ class QuasselMessageRenderer @Inject constructor(
       viewHolder.combined?.typeface = if (viewHolder.combined?.typeface?.isItalic == true) monospaceItalic else Typeface.MONOSPACE
     }
 
-    viewHolder.avatar?.visibleIf(messageSettings.showAvatars || true)
-    viewHolder.avatarPlaceholder?.visibleIf(messageSettings.showAvatars || true)
+    viewHolder.avatar?.visibleIf(!isFollowUp)
+    viewHolder.avatarContainer?.visibleIf(messageSettings.showAvatars)
+    viewHolder.avatarPlaceholder?.visibleIf(messageSettings.showAvatars)
     val separateLine = viewHolder.content != null && viewHolder.name != null && messageSettings.nicksOnNewLine
-    viewHolder.name?.visibleIf(separateLine)
+    viewHolder.name?.visibleIf(separateLine && !isFollowUp)
     viewHolder.content?.visibleIf(separateLine)
     viewHolder.combined?.visibleIf(!separateLine)
 
@@ -161,7 +164,6 @@ 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 946c39fc1d07cccc5d84d58a240a6a0754ede2c9..f0761655b6b2dcc291b21db18cb55dacc7d57e7f 100644
--- a/app/src/main/res/layout/widget_chatmessage_plain.xml
+++ b/app/src/main/res/layout/widget_chatmessage_plain.xml
@@ -30,6 +30,7 @@
       tools:text="@sample/messages.json/data/time" />
 
     <FrameLayout
+      android:id="@+id/avatar_container"
       android:layout_width="@dimen/avatar_size"
       android:layout_height="wrap_content"
       android:layout_marginBottom="@dimen/message_vertical"
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 1d67cdc48cbbca0cd9a577f939b01ecdc0683a00..9193f53bf50c47d05ea39fb444f9b17c5ecf0f2e 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -69,8 +69,9 @@
 
     <SwitchPreference
       android:defaultValue="false"
-      android:dependency="@string/preference_nicks_on_new_line_summary"
-      android:key="@string/preference_show_avatars_key" />
+      android:dependency="@string/preference_nicks_on_new_line_key"
+      android:key="@string/preference_show_avatars_key"
+      android:title="@string/preference_show_avatars_title" />
 
     <SwitchPreference
       android:defaultValue="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 40b3984ebfd7d6b301664f895bc37f8ff0ed9e8e..df1f595d5ef0443e315bbc7528901f0285182764 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -212,16 +212,21 @@ FROM
       sender,
       senderPrefixes,
       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
+      (SELECT 1
+       FROM
+         (SELECT *
+          FROM message m
+          WHERE m.messageId < message.messageId
+                AND bufferId = ?
+                AND type & ~? > 0
+          ORDER BY m.messageId
+            DESC
+          LIMIT 1) t
+       WHERE t.sender = message.sender
+             AND strftime('%s', date(datetime(t.time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000 =
+                 strftime('%s', date(datetime(message.time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000
+             AND t.type = message.type
+      ) = 1 AS followUp
     FROM message
     WHERE bufferId = ?
           AND type & ~? > 0
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 2ae1319a6032ee8101e6ec0569bdb28f758f07c7..fd7c7865b90276fd6f68e6822a7d4cf57709874c 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,7 +10,6 @@ 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