diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt
deleted file mode 100644
index a94a594e4784676cc58446f8106fc6a219f008f8..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2018 Janne Koschinski
- * Copyright (c) 2018 The Quassel Project
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3 as published
- * by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package de.kuschku.quasseldroid.ui.chat.messages
-
-import android.graphics.Canvas
-import android.graphics.Rect
-import android.support.v7.widget.RecyclerView
-import android.util.TypedValue
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import de.kuschku.quasseldroid.R
-import org.threeten.bp.ZoneId
-import org.threeten.bp.format.DateTimeFormatter
-import org.threeten.bp.format.FormatStyle
-import org.threeten.bp.temporal.ChronoUnit
-
-class DayChangeItemDecoration(
-  private val adapter: MessageAdapter,
-  private val textSize: Int
-) :
-  RecyclerView.ItemDecoration() {
-  private val dayChangeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
-  private val bounds = Rect()
-
-  override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
-    c.save()
-    val left: Int
-    val right: Int
-    if (parent.clipToPadding) {
-      left = parent.paddingLeft
-      right = parent.width - parent.paddingRight
-      c.clipRect(left, parent.paddingTop, right, parent.height - parent.paddingBottom)
-    } else {
-      left = 0
-      right = parent.width
-    }
-
-    val childCount = parent.childCount
-    for (i in 0 until childCount) {
-      val child = parent.getChildAt(i)
-      if (child.getTag(R.id.tag_daychange) == true) {
-        parent.getDecoratedBoundsWithMargins(child, bounds)
-        val bottom = bounds.bottom + Math.round(child.translationY)
-        val top = bounds.top + Math.round(child.translationY)
-        val layout = child.getTag(R.id.tag_daychange_layout) as View
-        c.save()
-        c.clipRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat())
-        c.translate(left.toFloat(), top.toFloat())
-        layout.draw(c)
-        c.restore()
-      }
-    }
-    c.restore()
-  }
-
-  private fun fixLayoutSize(view: View, parent: ViewGroup) {
-    val widthSpec = View.MeasureSpec.makeMeasureSpec(
-      parent.width,
-      View.MeasureSpec.EXACTLY
-    )
-    val heightSpec = View.MeasureSpec.makeMeasureSpec(
-      parent.height,
-      View.MeasureSpec.UNSPECIFIED
-    )
-
-    val childWidthSpec = ViewGroup.getChildMeasureSpec(
-      widthSpec,
-      parent.paddingLeft + parent.paddingRight,
-      view.layoutParams.width
-    )
-    val childHeightSpec = ViewGroup.getChildMeasureSpec(
-      heightSpec,
-      parent.paddingTop + parent.paddingBottom,
-      view.layoutParams.height
-    )
-
-    view.measure(childWidthSpec, childHeightSpec)
-    view.layout(0, 0, view.measuredWidth, view.measuredHeight)
-  }
-
-  override fun getItemOffsets(outRect: Rect, v: View, parent: RecyclerView,
-                              state: RecyclerView.State) {
-    adapter[parent.getChildAdapterPosition(v)]?.let {
-      if (it.hasDayChange) {
-        if (v.getTag(R.id.tag_daychange_layout) == null) {
-          val layout = LayoutInflater.from(parent.context).inflate(
-            R.layout.widget_chatmessage_daychange, parent, false
-          )
-          val content = layout.findViewById<TextView>(R.id.combined)
-          content?.text = dayChangeFormatter.format(
-            it.content.time.atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS)
-          )
-          content?.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize.toFloat())
-          fixLayoutSize(layout, parent)
-
-          v.setTag(R.id.tag_daychange_layout, layout)
-          v.setTag(R.id.tag_daychange_content, content)
-        }
-        v.setTag(R.id.tag_daychange, true)
-        val layout = v.getTag(R.id.tag_daychange_layout) as View
-        outRect.set(0, layout.measuredHeight, 0, 0)
-      } else {
-        v.setTag(R.id.tag_daychange, false)
-      }
-    }
-  }
-}
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 7e5716d4fd46d10d549f78092fb12d7ced180650..2593a6037a6974a3584a7570c40f221a4e91e418 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
@@ -19,6 +19,7 @@
 
 package de.kuschku.quasseldroid.ui.chat.messages
 
+import android.annotation.SuppressLint
 import android.arch.paging.PagedListAdapter
 import android.support.v7.util.DiffUtil
 import android.support.v7.widget.RecyclerView
@@ -38,6 +39,7 @@ import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.util.helper.getOrPut
 import de.kuschku.quasseldroid.util.helper.loadAvatars
+import de.kuschku.quasseldroid.util.helper.visibleIf
 import de.kuschku.quasseldroid.util.ui.BetterLinkMovementMethod
 import de.kuschku.quasseldroid.util.ui.DoubleClickHelper
 import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage
@@ -161,6 +163,7 @@ class MessageAdapter @Inject constructor(
     null
   }
 
+  @SuppressLint("ClickableViewAccessibility")
   class QuasselMessageViewHolder(
     itemView: View,
     clickListener: ((FormattedMessage) -> Unit)? = null,
@@ -169,6 +172,18 @@ class MessageAdapter @Inject constructor(
     expansionListener: ((QuasselDatabase.MessageData) -> Unit)? = null,
     movementMethod: BetterLinkMovementMethod
   ) : RecyclerView.ViewHolder(itemView) {
+    @BindView(R.id.daychange_container)
+    @JvmField
+    var daychangeContainer: View? = null
+
+    @BindView(R.id.daychange)
+    @JvmField
+    var daychange: TextView? = null
+
+    @BindView(R.id.message_container)
+    @JvmField
+    var messageContainer: View? = null
+
     @BindView(R.id.time_left)
     @JvmField
     var timeLeft: TextView? = null
@@ -199,31 +214,23 @@ class MessageAdapter @Inject constructor(
 
     private var message: FormattedMessage? = null
     private var original: QuasselDatabase.MessageData? = null
-    private var selectable: Boolean = false
-    private var clickable: Boolean = false
 
     private val localClickListener = View.OnClickListener {
-      if (clickable) {
-        message?.let {
-          clickListener?.invoke(it)
-        }
+      message?.let {
+        clickListener?.invoke(it)
       }
     }
 
     private val localLongClickListener = View.OnLongClickListener {
-      if (selectable) {
-        message?.let {
-          longClickListener?.invoke(it)
-        }
+      message?.let {
+        longClickListener?.invoke(it)
       }
       true
     }
 
-    private val localDoubleClickListener = {
-      if (clickable) {
-        original?.let {
-          doubleClickListener?.invoke(it)
-        }
+    private val localDoubleClickListener: () -> Unit = {
+      original?.let {
+        doubleClickListener?.invoke(it)
       }
     }
 
@@ -232,20 +239,17 @@ class MessageAdapter @Inject constructor(
       content?.movementMethod = movementMethod
       combined?.movementMethod = movementMethod
 
-      itemView.setOnClickListener(localClickListener)
-      itemView.setOnLongClickListener(localLongClickListener)
-      itemView.setOnTouchListener(DoubleClickHelper(itemView).apply {
+      messageContainer?.setOnClickListener(localClickListener)
+      messageContainer?.setOnLongClickListener(localLongClickListener)
+      messageContainer?.setOnTouchListener(DoubleClickHelper(itemView).apply {
         this.doubleClickListener = localDoubleClickListener
       })
     }
 
     fun bind(message: FormattedMessage, original: QuasselDatabase.MessageData,
-             selectable: Boolean = true, clickable: Boolean = true,
-             messageSettings: MessageSettings) {
+             hasDayChange: Boolean, messageSettings: MessageSettings) {
       this.message = message
       this.original = original
-      this.selectable = selectable
-      this.clickable = clickable
 
       timeLeft?.text = message.time
       timeRight?.text = message.time
@@ -254,7 +258,10 @@ class MessageAdapter @Inject constructor(
       content?.text = message.content
       combined?.text = message.combined
 
-      this.itemView.isSelected = message.isSelected
+      this.messageContainer?.isSelected = message.isSelected
+
+      if (hasDayChange) daychange?.text = message.dayChange
+      daychangeContainer?.visibleIf(hasDayChange)
 
       avatar?.loadAvatars(message.avatarUrls,
                           message.fallbackDrawable,
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 13f2fd7873e313d1176b3f423655949828d013f0..465453b10004a260249a31e1daf6203db25c31af 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
@@ -420,7 +420,6 @@ class MessageListFragment : ServiceBoundFragment() {
     val preloader = RecyclerViewPreloader(Glide.with(this), preloadModelProvider, sizeProvider, 10)
 
     messageList.addOnScrollListener(preloader)
-    messageList.addItemDecoration(DayChangeItemDecoration(adapter, messageSettings.textSize))
     messageList.addItemDecoration(MarkerLineItemDecoration(
       adapter, requireContext(), R.dimen.markerline_height, R.attr.colorMarkerLine
     ))
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 4b80ab9b43376aa2516591749bdb810122f94b3b..c5805a0a141524be59f3ab29723502c8971d47e2 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
@@ -48,6 +48,7 @@ import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage
 import org.threeten.bp.ZoneId
 import org.threeten.bp.format.DateTimeFormatter
 import org.threeten.bp.format.FormatStyle
+import org.threeten.bp.temporal.ChronoUnit
 import javax.inject.Inject
 import kotlin.math.roundToInt
 
@@ -183,9 +184,10 @@ class QuasselMessageRenderer @Inject constructor(
 
   override fun bind(holder: MessageAdapter.QuasselMessageViewHolder, message: FormattedMessage,
                     original: QuasselDatabase.MessageData) =
-    original.type.hasFlag(DayChange).let { isDayChange ->
-      holder.bind(message, original, !isDayChange, !isDayChange, messageSettings)
-    }
+    holder.bind(message,
+                original,
+                hasDayChange = message.hasDayChange,
+                messageSettings = messageSettings)
 
   override fun render(context: Context, message: DisplayMessage): FormattedMessage {
     val avatarSize = TypedValue.applyDimension(
@@ -225,6 +227,7 @@ class QuasselMessageRenderer @Inject constructor(
         FormattedMessage(
           id = message.content.messageId,
           time = timeFormatter.format(message.content.time.atZone(zoneId)),
+          dayChange = formatDayChange(message),
           name = nick,
           content = content,
           combined = SpannableStringBuilder().apply {
@@ -238,6 +241,7 @@ class QuasselMessageRenderer @Inject constructor(
             if (messageSettings.squareAvatars) it.buildRect(initial, senderColor)
             else it.buildRound(initial, senderColor)
           },
+          hasDayChange = message.hasDayChange,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
@@ -246,12 +250,14 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Action       -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = SpanFormatter.format(
           context.getString(R.string.message_format_action),
           contentFormatter.formatPrefix(message.content.senderPrefixes),
           contentFormatter.formatNick(message.content.sender, self, highlight, false),
           contentFormatter.formatContent(message.content.content, highlight)
         ),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -259,12 +265,14 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Notice       -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = SpanFormatter.format(
           context.getString(R.string.message_format_notice),
           contentFormatter.formatPrefix(message.content.senderPrefixes),
           contentFormatter.formatNick(message.content.sender, self, highlight, false),
           contentFormatter.formatContent(message.content.content, highlight)
         ),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -274,6 +282,7 @@ class QuasselMessageRenderer @Inject constructor(
         FormattedMessage(
           id = message.content.messageId,
           time = timeFormatter.format(message.content.time.atZone(zoneId)),
+          dayChange = formatDayChange(message),
           combined = if (nickSelf) {
             SpanFormatter.format(
               context.getString(R.string.message_format_nick_self),
@@ -289,6 +298,7 @@ class QuasselMessageRenderer @Inject constructor(
               contentFormatter.formatNick(message.content.content, nickSelf, highlight, false)
             )
           },
+          hasDayChange = message.hasDayChange,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
@@ -297,12 +307,14 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Mode         -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = SpanFormatter.format(
           context.getString(R.string.message_format_mode),
           message.content.content,
           contentFormatter.formatPrefix(message.content.senderPrefixes),
           contentFormatter.formatNick(message.content.sender, self, highlight, false)
         ),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -310,6 +322,7 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Join         -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = SpanFormatter.format(
           context.getString(R.string.message_format_join),
           contentFormatter.formatPrefix(message.content.senderPrefixes),
@@ -319,6 +332,7 @@ class QuasselMessageRenderer @Inject constructor(
                                       messageSettings.showHostmaskActions),
           message.content.content
         ),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -326,6 +340,7 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Part         -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = if (message.content.content.isBlank()) {
           SpanFormatter.format(
             context.getString(R.string.message_format_part_1),
@@ -346,6 +361,7 @@ class QuasselMessageRenderer @Inject constructor(
             contentFormatter.formatContent(message.content.content, highlight)
           )
         },
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -353,6 +369,7 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Quit         -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = if (message.content.content.isBlank()) {
           SpanFormatter.format(
             context.getString(R.string.message_format_quit_1),
@@ -373,6 +390,7 @@ class QuasselMessageRenderer @Inject constructor(
             contentFormatter.formatContent(message.content.content, highlight)
           )
         },
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -382,6 +400,7 @@ class QuasselMessageRenderer @Inject constructor(
         FormattedMessage(
           id = message.content.messageId,
           time = timeFormatter.format(message.content.time.atZone(zoneId)),
+          dayChange = formatDayChange(message),
           combined = if (reason.isBlank()) {
             SpanFormatter.format(
               context.getString(R.string.message_format_kick_1),
@@ -404,6 +423,7 @@ class QuasselMessageRenderer @Inject constructor(
               contentFormatter.formatContent(reason, highlight)
             )
           },
+          hasDayChange = message.hasDayChange,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
@@ -414,6 +434,7 @@ class QuasselMessageRenderer @Inject constructor(
         FormattedMessage(
           id = message.content.messageId,
           time = timeFormatter.format(message.content.time.atZone(zoneId)),
+          dayChange = formatDayChange(message),
           combined = if (reason.isBlank()) {
             SpanFormatter.format(
               context.getString(R.string.message_format_kill_1),
@@ -436,6 +457,7 @@ class QuasselMessageRenderer @Inject constructor(
               contentFormatter.formatContent(reason, highlight)
             )
           },
+          hasDayChange = message.hasDayChange,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
@@ -448,9 +470,11 @@ class QuasselMessageRenderer @Inject constructor(
         FormattedMessage(
           id = message.content.messageId,
           time = timeFormatter.format(message.content.time.atZone(zoneId)),
+          dayChange = formatDayChange(message),
           combined = context.resources.getQuantityString(
             R.plurals.message_netsplit_join, usersAffected, server1, server2, usersAffected
           ),
+          hasDayChange = message.hasDayChange,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
@@ -460,25 +484,27 @@ class QuasselMessageRenderer @Inject constructor(
         val split = message.content.content.split("#:#")
         val (server1, server2) = split.last().split(' ')
         val usersAffected = split.size - 1
-        val it = FormattedMessage(
+        FormattedMessage(
           id = message.content.messageId,
           time = timeFormatter.format(message.content.time.atZone(zoneId)),
+          dayChange = formatDayChange(message),
           combined = context.resources.getQuantityString(
             R.plurals.message_netsplit_quit, usersAffected, server1, server2, usersAffected
           ),
+          hasDayChange = message.hasDayChange,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
         )
-        println("hi")
-        it
       }
       Message_Type.Server,
       Message_Type.Info,
       Message_Type.Error        -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = contentFormatter.formatContent(message.content.content, highlight),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -486,7 +512,9 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Topic        -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = contentFormatter.formatContent(message.content.content, highlight),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -494,7 +522,9 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.DayChange    -> FormattedMessage(
         id = message.content.messageId,
         time = "",
+        dayChange = formatDayChange(message),
         combined = dateFormatter.format(message.content.time.atZone(zoneId)),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = false,
         isExpanded = false,
         isSelected = false
@@ -503,6 +533,7 @@ class QuasselMessageRenderer @Inject constructor(
       else                      -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
+        dayChange = formatDayChange(message),
         combined = SpanFormatter.format(
           "[%d] %s%s: %s",
           message.content.type.toInt(),
@@ -513,10 +544,16 @@ class QuasselMessageRenderer @Inject constructor(
                                       messageSettings.showHostmaskActions),
           message.content.content
         ),
+        hasDayChange = message.hasDayChange,
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
       )
     }
   }
+
+  private fun formatDayChange(
+    message: DisplayMessage) =
+    if (message.hasDayChange) dateFormatter.format(message.content.time.atZone(zoneId).truncatedTo(
+      ChronoUnit.DAYS)) else null
 }
diff --git a/app/src/main/res/layout/widget_chatmessage_action.xml b/app/src/main/res/layout/widget_chatmessage_action.xml
index 273af4dee05972de41ef27658864064d31e1340d..19bfb06f2a49b2a5daa3ad557af87a2ef3c7d354 100644
--- a/app/src/main/res/layout/widget_chatmessage_action.xml
+++ b/app/src/main/res/layout/widget_chatmessage_action.xml
@@ -21,56 +21,66 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?attr/backgroundMenuItem"
-  android:orientation="horizontal"
-  android:paddingBottom="@dimen/message_vertical"
-  android:paddingEnd="@dimen/message_horizontal"
-  android:paddingLeft="@dimen/message_horizontal"
-  android:paddingRight="@dimen/message_horizontal"
-  android:paddingStart="@dimen/message_horizontal"
-  android:paddingTop="@dimen/message_vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall">
+  android:orientation="vertical"
+  tools:showIn="@layout/fragment_messages">
 
-  <TextView
-    android:id="@+id/time_left"
-    android:layout_width="wrap_content"
+  <include layout="@layout/widget_chatmessage_daychange" />
+
+  <LinearLayout
+    android:id="@+id/message_container"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace"
-    tools:text="@sample/messages.json/data/time" />
+    android:background="?attr/backgroundMenuItem"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/message_vertical"
+    android:paddingEnd="@dimen/message_horizontal"
+    android:paddingLeft="@dimen/message_horizontal"
+    android:paddingRight="@dimen/message_horizontal"
+    android:paddingStart="@dimen/message_horizontal"
+    android:paddingTop="@dimen/message_vertical"
+    android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
-  <Space
-    android:id="@+id/avatar_placeholder"
-    android:layout_width="@dimen/avatar_size"
-    android:layout_height="match_parent"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:visibility="gone" />
+    <TextView
+      android:id="@+id/time_left"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:typeface="monospace"
+      tools:text="@sample/messages.json/data/time" />
 
-  <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-    android:id="@+id/combined"
-    style="@style/Widget.RtlConformTextView"
-    android:layout_width="0dip"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:textColor="?attr/colorForegroundAction"
-    android:textStyle="italic"
-    tools:text="@sample/messages.json/data/message" />
+    <Space
+      android:id="@+id/avatar_placeholder"
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="match_parent"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:visibility="gone" />
 
-  <TextView
-    android:id="@+id/time_right"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginLeft="@dimen/message_horizontal"
-    android:layout_marginStart="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:textStyle="italic"
-    android:visibility="gone"
-    tools:text="@sample/messages.json/data/time"
-    tools:textSize="11.9sp"
-    tools:visibility="visible" />
+    <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+      android:id="@+id/combined"
+      style="@style/Widget.RtlConformTextView"
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:textColor="?attr/colorForegroundAction"
+      android:textStyle="italic"
+      tools:text="@sample/messages.json/data/message" />
+
+    <TextView
+      android:id="@+id/time_right"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginLeft="@dimen/message_horizontal"
+      android:layout_marginStart="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:textStyle="italic"
+      android:visibility="gone"
+      tools:text="@sample/messages.json/data/time"
+      tools:textSize="11.9sp"
+      tools:visibility="visible" />
+  </LinearLayout>
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_daychange.xml b/app/src/main/res/layout/widget_chatmessage_daychange.xml
index 810e18d5ebb889c19510798dd0fa534f35aa7cc1..4f79b695539827461d21ff01c962da6768312839 100644
--- a/app/src/main/res/layout/widget_chatmessage_daychange.xml
+++ b/app/src/main/res/layout/widget_chatmessage_daychange.xml
@@ -19,6 +19,7 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
+  android:id="@+id/daychange_container"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="?attr/backgroundMenuItem"
@@ -42,7 +43,7 @@
     android:paddingTop="@dimen/message_vertical_daychange">
 
     <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-      android:id="@+id/combined"
+      android:id="@+id/daychange"
       style="@style/Widget.RtlConformTextView"
       android:layout_width="0dip"
       android:layout_height="wrap_content"
diff --git a/app/src/main/res/layout/widget_chatmessage_error.xml b/app/src/main/res/layout/widget_chatmessage_error.xml
index 36d0a2c9bad685784bca9901c6c855d9eede9ccf..10e125844210c533f48f5938a6fe5ffb43411e2d 100644
--- a/app/src/main/res/layout/widget_chatmessage_error.xml
+++ b/app/src/main/res/layout/widget_chatmessage_error.xml
@@ -21,55 +21,65 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?attr/backgroundMenuItem"
-  android:orientation="horizontal"
-  android:paddingBottom="@dimen/message_vertical"
-  android:paddingEnd="@dimen/message_horizontal"
-  android:paddingLeft="@dimen/message_horizontal"
-  android:paddingRight="@dimen/message_horizontal"
-  android:paddingStart="@dimen/message_horizontal"
-  android:paddingTop="@dimen/message_vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall">
+  android:orientation="vertical"
+  tools:showIn="@layout/fragment_messages">
 
-  <TextView
-    android:id="@+id/time_left"
-    android:layout_width="wrap_content"
+  <include layout="@layout/widget_chatmessage_daychange" />
+
+  <LinearLayout
+    android:id="@+id/message_container"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace"
-    tools:text="@sample/messages.json/data/time" />
+    android:background="?attr/backgroundMenuItem"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/message_vertical"
+    android:paddingEnd="@dimen/message_horizontal"
+    android:paddingLeft="@dimen/message_horizontal"
+    android:paddingRight="@dimen/message_horizontal"
+    android:paddingStart="@dimen/message_horizontal"
+    android:paddingTop="@dimen/message_vertical"
+    android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
-  <Space
-    android:id="@+id/avatar_placeholder"
-    android:layout_width="@dimen/avatar_size"
-    android:layout_height="match_parent"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:visibility="gone" />
+    <TextView
+      android:id="@+id/time_left"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:typeface="monospace"
+      tools:text="@sample/messages.json/data/time" />
 
-  <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-    android:id="@+id/combined"
-    style="@style/Widget.RtlConformTextView"
-    android:layout_width="0dip"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:textColor="?attr/colorForegroundError"
-    tools:text="@sample/messages.json/data/message" />
+    <Space
+      android:id="@+id/avatar_placeholder"
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="match_parent"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:visibility="gone" />
 
-  <TextView
-    android:id="@+id/time_right"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginLeft="@dimen/message_horizontal"
-    android:layout_marginStart="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:textStyle="italic"
-    android:visibility="gone"
-    tools:text="@sample/messages.json/data/time"
-    tools:textSize="11.9sp"
-    tools:visibility="visible" />
+    <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+      android:id="@+id/combined"
+      style="@style/Widget.RtlConformTextView"
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:textColor="?attr/colorForegroundError"
+      tools:text="@sample/messages.json/data/message" />
+
+    <TextView
+      android:id="@+id/time_right"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginLeft="@dimen/message_horizontal"
+      android:layout_marginStart="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:textStyle="italic"
+      android:visibility="gone"
+      tools:text="@sample/messages.json/data/time"
+      tools:textSize="11.9sp"
+      tools:visibility="visible" />
+  </LinearLayout>
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_info.xml b/app/src/main/res/layout/widget_chatmessage_info.xml
index 29b60b282e07c977283e38ebd78ac18adf945a6d..6942d08c32a3ea3541135794923a99956280473c 100644
--- a/app/src/main/res/layout/widget_chatmessage_info.xml
+++ b/app/src/main/res/layout/widget_chatmessage_info.xml
@@ -21,56 +21,66 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?attr/backgroundMenuItem"
-  android:orientation="horizontal"
-  android:paddingBottom="@dimen/message_vertical"
-  android:paddingEnd="@dimen/message_horizontal"
-  android:paddingLeft="@dimen/message_horizontal"
-  android:paddingRight="@dimen/message_horizontal"
-  android:paddingStart="@dimen/message_horizontal"
-  android:paddingTop="@dimen/message_vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall">
+  android:orientation="vertical"
+  tools:showIn="@layout/fragment_messages">
 
-  <TextView
-    android:id="@+id/time_left"
-    android:layout_width="wrap_content"
+  <include layout="@layout/widget_chatmessage_daychange" />
+
+  <LinearLayout
+    android:id="@+id/message_container"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace"
-    tools:text="@sample/messages.json/data/time" />
+    android:background="?attr/backgroundMenuItem"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/message_vertical"
+    android:paddingEnd="@dimen/message_horizontal"
+    android:paddingLeft="@dimen/message_horizontal"
+    android:paddingRight="@dimen/message_horizontal"
+    android:paddingStart="@dimen/message_horizontal"
+    android:paddingTop="@dimen/message_vertical"
+    android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
-  <Space
-    android:id="@+id/avatar_placeholder"
-    android:layout_width="@dimen/avatar_size"
-    android:layout_height="match_parent"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:visibility="gone" />
+    <TextView
+      android:id="@+id/time_left"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:typeface="monospace"
+      tools:text="@sample/messages.json/data/time" />
 
-  <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-    android:id="@+id/combined"
-    style="@style/Widget.RtlConformTextView"
-    android:layout_width="0dip"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:textStyle="italic"
-    tools:text="@sample/messages.json/data/message" />
+    <Space
+      android:id="@+id/avatar_placeholder"
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="match_parent"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:visibility="gone" />
 
-  <TextView
-    android:id="@+id/time_right"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginLeft="@dimen/message_horizontal"
-    android:layout_marginStart="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:textStyle="italic"
-    android:visibility="gone"
-    tools:text="@sample/messages.json/data/time"
-    tools:textSize="11.9sp"
-    tools:visibility="visible" />
+    <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+      android:id="@+id/combined"
+      style="@style/Widget.RtlConformTextView"
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:textStyle="italic"
+      tools:text="@sample/messages.json/data/message" />
+
+    <TextView
+      android:id="@+id/time_right"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginLeft="@dimen/message_horizontal"
+      android:layout_marginStart="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:textStyle="italic"
+      android:visibility="gone"
+      tools:text="@sample/messages.json/data/time"
+      tools:textSize="11.9sp"
+      tools:visibility="visible" />
+  </LinearLayout>
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_notice.xml b/app/src/main/res/layout/widget_chatmessage_notice.xml
index 0e0f13bf1dc6c059f38daf2953c08013582c1a5b..f54b355181c2fd8c9d342dff90b4a3b73948cf69 100644
--- a/app/src/main/res/layout/widget_chatmessage_notice.xml
+++ b/app/src/main/res/layout/widget_chatmessage_notice.xml
@@ -21,55 +21,65 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?attr/backgroundMenuItem"
-  android:orientation="horizontal"
-  android:paddingBottom="@dimen/message_vertical"
-  android:paddingEnd="@dimen/message_horizontal"
-  android:paddingLeft="@dimen/message_horizontal"
-  android:paddingRight="@dimen/message_horizontal"
-  android:paddingStart="@dimen/message_horizontal"
-  android:paddingTop="@dimen/message_vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall">
+  android:orientation="vertical"
+  tools:showIn="@layout/fragment_messages">
 
-  <TextView
-    android:id="@+id/time_left"
-    android:layout_width="wrap_content"
+  <include layout="@layout/widget_chatmessage_daychange" />
+
+  <LinearLayout
+    android:id="@+id/message_container"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace"
-    tools:text="@sample/messages.json/data/time" />
+    android:background="?attr/backgroundMenuItem"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/message_vertical"
+    android:paddingEnd="@dimen/message_horizontal"
+    android:paddingLeft="@dimen/message_horizontal"
+    android:paddingRight="@dimen/message_horizontal"
+    android:paddingStart="@dimen/message_horizontal"
+    android:paddingTop="@dimen/message_vertical"
+    android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
-  <Space
-    android:id="@+id/avatar_placeholder"
-    android:layout_width="@dimen/avatar_size"
-    android:layout_height="match_parent"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:visibility="gone" />
+    <TextView
+      android:id="@+id/time_left"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:typeface="monospace"
+      tools:text="@sample/messages.json/data/time" />
 
-  <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-    android:id="@+id/combined"
-    style="@style/Widget.RtlConformTextView"
-    android:layout_width="0dip"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:textColor="?attr/colorForegroundNotice"
-    tools:text="@sample/messages.json/data/message" />
+    <Space
+      android:id="@+id/avatar_placeholder"
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="match_parent"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:visibility="gone" />
 
-  <TextView
-    android:id="@+id/time_right"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginLeft="@dimen/message_horizontal"
-    android:layout_marginStart="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:textStyle="italic"
-    android:visibility="gone"
-    tools:text="@sample/messages.json/data/time"
-    tools:textSize="11.9sp"
-    tools:visibility="visible" />
+    <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+      android:id="@+id/combined"
+      style="@style/Widget.RtlConformTextView"
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:textColor="?attr/colorForegroundNotice"
+      tools:text="@sample/messages.json/data/message" />
+
+    <TextView
+      android:id="@+id/time_right"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginLeft="@dimen/message_horizontal"
+      android:layout_marginStart="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:textStyle="italic"
+      android:visibility="gone"
+      tools:text="@sample/messages.json/data/time"
+      tools:textSize="11.9sp"
+      tools:visibility="visible" />
+  </LinearLayout>
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml
index 775c5a37535283a96e613dcfd49e46142eb73bd9..41e70526a9804595e3699d2e549a87c6a4047df7 100644
--- a/app/src/main/res/layout/widget_chatmessage_plain.xml
+++ b/app/src/main/res/layout/widget_chatmessage_plain.xml
@@ -21,133 +21,143 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?attr/backgroundMenuItem"
-  android:orientation="horizontal"
-  android:paddingBottom="@dimen/message_vertical"
-  android:paddingEnd="@dimen/message_horizontal"
-  android:paddingLeft="@dimen/message_horizontal"
-  android:paddingRight="@dimen/message_horizontal"
-  android:paddingStart="@dimen/message_horizontal"
-  android:paddingTop="@dimen/message_vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
+  android:orientation="vertical"
   tools:showIn="@layout/fragment_messages">
 
-  <TextView
-    android:id="@+id/time_left"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace"
-    tools:text="@sample/messages.json/data/time"
-    tools:visibility="gone" />
-
-  <FrameLayout
-    android:id="@+id/avatar_container"
-    android:layout_width="@dimen/avatar_size"
-    android:layout_height="@dimen/avatar_size"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:visibility="gone"
-    tools:visibility="visible">
-
-    <ImageView
-      android:id="@+id/avatar"
-      android:layout_width="match_parent"
-      android:layout_height="match_parent"
-      android:contentDescription="@string/label_avatar"
-      tools:src="@tools:sample/avatars" />
-  </FrameLayout>
+  <include layout="@layout/widget_chatmessage_daychange" />
 
   <LinearLayout
+    android:id="@+id/message_container"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="fill_vertical"
-    android:orientation="vertical">
-
-    <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content">
-
-      <TextView
-        android:id="@+id/name"
-        style="@style/Widget.RtlConformTextView"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
-        android:ellipsize="marquee"
-        android:singleLine="true"
-        android:textColor="?attr/colorForeground"
-        android:visibility="gone"
-        tools:text="@sample/messages.json/data/sender"
-        tools:visibility="visible" />
-
-      <Space
-        android:layout_width="4dp"
-        android:layout_height="0dip" />
-
-      <TextView
-        android:id="@+id/realname"
-        style="@style/Widget.RtlConformTextView"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
-        android:ellipsize="marquee"
-        android:singleLine="true"
-        android:textColor="?attr/colorForegroundSecondary"
-        android:visibility="gone"
-        tools:text="@sample/messages.json/data/sender"
-        tools:visibility="visible" />
-    </LinearLayout>
+    android:background="?attr/backgroundMenuItem"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/message_vertical"
+    android:paddingEnd="@dimen/message_horizontal"
+    android:paddingLeft="@dimen/message_horizontal"
+    android:paddingRight="@dimen/message_horizontal"
+    android:paddingStart="@dimen/message_horizontal"
+    android:paddingTop="@dimen/message_vertical"
+    android:textAppearance="?android:attr/textAppearanceListItemSmall">
+
+    <TextView
+      android:id="@+id/time_left"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:typeface="monospace"
+      tools:text="@sample/messages.json/data/time"
+      tools:visibility="gone" />
+
+    <FrameLayout
+      android:id="@+id/avatar_container"
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="@dimen/avatar_size"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:visibility="gone"
+      tools:visibility="visible">
+
+      <ImageView
+        android:id="@+id/avatar"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:contentDescription="@string/label_avatar"
+        tools:src="@tools:sample/avatars" />
+    </FrameLayout>
 
     <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:layout_gravity="center_vertical|fill_horizontal"
-      android:orientation="horizontal">
+      android:layout_gravity="fill_vertical"
+      android:orientation="vertical">
 
       <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="vertical">
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
 
-        <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-          android:id="@+id/content"
+        <TextView
+          android:id="@+id/name"
           style="@style/Widget.RtlConformTextView"
-          android:layout_width="match_parent"
+          android:layout_width="wrap_content"
           android:layout_height="wrap_content"
+          android:layout_gravity="center_vertical"
+          android:ellipsize="marquee"
+          android:singleLine="true"
           android:textColor="?attr/colorForeground"
           android:visibility="gone"
-          tools:text="@sample/messages.json/data/content"
+          tools:text="@sample/messages.json/data/sender"
           tools:visibility="visible" />
 
-        <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-          android:id="@+id/combined"
+        <Space
+          android:layout_width="4dp"
+          android:layout_height="0dip" />
+
+        <TextView
+          android:id="@+id/realname"
           style="@style/Widget.RtlConformTextView"
-          android:layout_width="match_parent"
+          android:layout_width="wrap_content"
           android:layout_height="wrap_content"
-          android:textColor="?attr/colorForeground"
-          tools:text="@sample/messages.json/data/message"
-          tools:visibility="gone" />
-
+          android:layout_gravity="center_vertical"
+          android:ellipsize="marquee"
+          android:singleLine="true"
+          android:textColor="?attr/colorForegroundSecondary"
+          android:visibility="gone"
+          tools:text="@sample/messages.json/data/sender"
+          tools:visibility="visible" />
       </LinearLayout>
 
-      <TextView
-        android:id="@+id/time_right"
-        android:layout_width="wrap_content"
+      <LinearLayout
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_gravity="top"
-        android:layout_marginLeft="@dimen/message_horizontal"
-        android:layout_marginStart="@dimen/message_horizontal"
-        android:textColor="?attr/colorForegroundSecondary"
-        android:textStyle="italic"
-        android:visibility="gone"
-        tools:text="@sample/messages.json/data/time"
-        tools:textSize="11.9sp"
-        tools:visibility="visible" />
+        android:layout_gravity="center_vertical|fill_horizontal"
+        android:orientation="horizontal">
+
+        <LinearLayout
+          android:layout_width="0dip"
+          android:layout_height="wrap_content"
+          android:layout_weight="1"
+          android:orientation="vertical">
+
+          <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+            android:id="@+id/content"
+            style="@style/Widget.RtlConformTextView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textColor="?attr/colorForeground"
+            android:visibility="gone"
+            tools:text="@sample/messages.json/data/content"
+            tools:visibility="visible" />
+
+          <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+            android:id="@+id/combined"
+            style="@style/Widget.RtlConformTextView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textColor="?attr/colorForeground"
+            tools:text="@sample/messages.json/data/message"
+            tools:visibility="gone" />
+
+        </LinearLayout>
+
+        <TextView
+          android:id="@+id/time_right"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_gravity="top"
+          android:layout_marginLeft="@dimen/message_horizontal"
+          android:layout_marginStart="@dimen/message_horizontal"
+          android:textColor="?attr/colorForegroundSecondary"
+          android:textStyle="italic"
+          android:visibility="gone"
+          tools:text="@sample/messages.json/data/time"
+          tools:textSize="11.9sp"
+          tools:visibility="visible" />
+      </LinearLayout>
     </LinearLayout>
   </LinearLayout>
+
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_server.xml b/app/src/main/res/layout/widget_chatmessage_server.xml
index fb0ef16e226786d4529fb6ff64502ca6961e526e..bda613b2a35a80ef8e5cbdf377db51138582e9d1 100644
--- a/app/src/main/res/layout/widget_chatmessage_server.xml
+++ b/app/src/main/res/layout/widget_chatmessage_server.xml
@@ -21,55 +21,65 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?attr/backgroundMenuItem"
-  android:orientation="horizontal"
-  android:paddingBottom="@dimen/message_vertical"
-  android:paddingEnd="@dimen/message_horizontal"
-  android:paddingLeft="@dimen/message_horizontal"
-  android:paddingRight="@dimen/message_horizontal"
-  android:paddingStart="@dimen/message_horizontal"
-  android:paddingTop="@dimen/message_vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall">
+  android:orientation="vertical"
+  tools:showIn="@layout/fragment_messages">
 
-  <TextView
-    android:id="@+id/time_left"
-    android:layout_width="wrap_content"
+  <include layout="@layout/widget_chatmessage_daychange" />
+
+  <LinearLayout
+    android:id="@+id/message_container"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace"
-    tools:text="@sample/messages.json/data/time" />
+    android:background="?attr/backgroundMenuItem"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/message_vertical"
+    android:paddingEnd="@dimen/message_horizontal"
+    android:paddingLeft="@dimen/message_horizontal"
+    android:paddingRight="@dimen/message_horizontal"
+    android:paddingStart="@dimen/message_horizontal"
+    android:paddingTop="@dimen/message_vertical"
+    android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
-  <Space
-    android:id="@+id/avatar_placeholder"
-    android:layout_width="@dimen/avatar_size"
-    android:layout_height="match_parent"
-    android:layout_marginEnd="@dimen/message_horizontal"
-    android:layout_marginRight="@dimen/message_horizontal"
-    android:visibility="gone" />
+    <TextView
+      android:id="@+id/time_left"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:typeface="monospace"
+      tools:text="@sample/messages.json/data/time" />
 
-  <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
-    android:id="@+id/combined"
-    style="@style/Widget.RtlConformTextView"
-    android:layout_width="0dip"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:textColor="?attr/colorForegroundSecondary"
-    tools:text="@sample/messages.json/data/message" />
+    <Space
+      android:id="@+id/avatar_placeholder"
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="match_parent"
+      android:layout_marginEnd="@dimen/message_horizontal"
+      android:layout_marginRight="@dimen/message_horizontal"
+      android:visibility="gone" />
 
-  <TextView
-    android:id="@+id/time_right"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top"
-    android:layout_marginLeft="@dimen/message_horizontal"
-    android:layout_marginStart="@dimen/message_horizontal"
-    android:textColor="?attr/colorForegroundSecondary"
-    android:textStyle="italic"
-    android:visibility="gone"
-    tools:text="@sample/messages.json/data/time"
-    tools:textSize="11.9sp"
-    tools:visibility="visible" />
+    <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView
+      android:id="@+id/combined"
+      style="@style/Widget.RtlConformTextView"
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:textColor="?attr/colorForegroundSecondary"
+      tools:text="@sample/messages.json/data/message" />
+
+    <TextView
+      android:id="@+id/time_right"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_gravity="top"
+      android:layout_marginLeft="@dimen/message_horizontal"
+      android:layout_marginStart="@dimen/message_horizontal"
+      android:textColor="?attr/colorForegroundSecondary"
+      android:textStyle="italic"
+      android:visibility="gone"
+      tools:text="@sample/messages.json/data/time"
+      tools:textSize="11.9sp"
+      tools:visibility="visible" />
+  </LinearLayout>
 </LinearLayout>
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 2a9088b19f339ec62ab24751dfdf417116c5dcb5..11f28b43c9ae06416bc7c95f067fad37566d60df 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
@@ -25,12 +25,14 @@ import de.kuschku.libquassel.protocol.MsgId
 class FormattedMessage(
   val id: MsgId,
   val time: CharSequence,
+  val dayChange: CharSequence? = null,
   val name: CharSequence? = null,
   val content: CharSequence? = null,
   val combined: CharSequence,
   val fallbackDrawable: Drawable? = null,
   val realName: CharSequence? = null,
   val avatarUrls: List<Avatar> = emptyList(),
+  val hasDayChange: Boolean,
   val isSelected: Boolean,
   val isExpanded: Boolean,
   val isMarkerLine: Boolean