diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt
index 23465fbe37..a617ddb781 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt
@@ -3,22 +3,27 @@ package org.thoughtcrime.securesms.conversation.v2.messages
 import android.content.Context
 import android.content.res.Resources
 import android.graphics.Canvas
+import android.graphics.ColorFilter
 import android.graphics.Rect
 import android.graphics.drawable.ColorDrawable
+import android.os.AsyncTask
 import android.os.Build
 import android.os.Handler
 import android.os.Looper
 import android.util.AttributeSet
 import android.view.*
 import android.widget.LinearLayout
+import android.widget.RelativeLayout
 import androidx.core.content.ContextCompat
+import androidx.core.content.res.ResourcesCompat
 import androidx.core.view.isVisible
 import kotlinx.android.synthetic.main.view_visible_message.view.*
-import kotlinx.android.synthetic.main.view_visible_message.view.profilePictureView
 import network.loki.messenger.R
 import org.session.libsession.messaging.contacts.Contact.ContactContext
 import org.session.libsession.messaging.open_groups.OpenGroupAPIV2
 import org.session.libsession.utilities.ViewUtil
+import org.session.libsignal.utilities.ThreadUtils
+import org.thoughtcrime.securesms.ApplicationContext
 import org.thoughtcrime.securesms.database.DatabaseFactory
 import org.thoughtcrime.securesms.database.model.MessageRecord
 import org.thoughtcrime.securesms.loki.utilities.getColorWithID
@@ -135,6 +140,8 @@ class VisibleMessageView : LinearLayout {
         } else {
             messageStatusImageView.isVisible = false
         }
+        // Expiration timer
+        updateExpirationTimer(message)
         // Calculate max message bubble width
         var maxWidth = screenWidth - messageContentContainerLayoutParams.leftMargin - messageContentContainerLayoutParams.rightMargin
         if (profilePictureContainer.visibility != View.GONE) { maxWidth -= profilePictureContainer.width }
@@ -181,6 +188,37 @@ class VisibleMessageView : LinearLayout {
         }
     }
 
+    private fun updateExpirationTimer(message: MessageRecord) {
+        val expirationTimerViewLayoutParams = expirationTimerView.layoutParams as RelativeLayout.LayoutParams
+        val ruleToAdd = if (message.isOutgoing) RelativeLayout.ALIGN_PARENT_START else RelativeLayout.ALIGN_PARENT_END
+        val ruleToRemove = if (message.isOutgoing) RelativeLayout.ALIGN_PARENT_END else RelativeLayout.ALIGN_PARENT_START
+        expirationTimerViewLayoutParams.removeRule(ruleToRemove)
+        expirationTimerViewLayoutParams.addRule(ruleToAdd)
+        expirationTimerView.layoutParams = expirationTimerViewLayoutParams
+        if (message.expiresIn > 0 && !message.isPending) {
+            expirationTimerView.setColorFilter(ResourcesCompat.getColor(resources, R.color.text, context.theme))
+            expirationTimerView.isVisible = true
+            expirationTimerView.setPercentComplete(0.0f)
+            if (message.expireStarted > 0) {
+                expirationTimerView.setExpirationTime(message.expireStarted, message.expiresIn)
+                expirationTimerView.startAnimation()
+                if (message.expireStarted + message.expiresIn <= System.currentTimeMillis()) {
+                    ApplicationContext.getInstance(context).expiringMessageManager.checkSchedule()
+                }
+            } else if (!message.isOutgoing && !message.isMediaPending) {
+                ThreadUtils.queue {
+                    val expirationManager = ApplicationContext.getInstance(context).expiringMessageManager
+                    val id = message.getId()
+                    val mms = message.isMms
+                    if (mms) DatabaseFactory.getMmsDatabase(context).markExpireStarted(id) else DatabaseFactory.getSmsDatabase(context).markExpireStarted(id)
+                    expirationManager.scheduleDeletion(id, mms, message.expiresIn)
+                }
+            }
+        } else {
+            expirationTimerView.isVisible = false
+        }
+    }
+
     private fun handleIsSelectedChanged() {
         background = if (snIsSelected) {
             ColorDrawable(context.resources.getColorWithID(R.color.message_selected, context.theme))
diff --git a/app/src/main/res/layout/view_search_bottom_bar.xml b/app/src/main/res/layout/view_search_bottom_bar.xml
index bb0395d28e..2cb3299be1 100644
--- a/app/src/main/res/layout/view_search_bottom_bar.xml
+++ b/app/src/main/res/layout/view_search_bottom_bar.xml
@@ -5,7 +5,7 @@
     android:id="@+id/searchBottomBarConstraintLayout"
     android:layout_width="match_parent"
     android:layout_height="@dimen/input_bar_height"
-    android:background="@color/compose_view_background"
+    android:background="@color/input_bar_background"
     android:orientation="vertical">
 
     <View
diff --git a/app/src/main/res/layout/view_visible_message.xml b/app/src/main/res/layout/view_visible_message.xml
index 7148d07a05..b3d258c8ea 100644
--- a/app/src/main/res/layout/view_visible_message.xml
+++ b/app/src/main/res/layout/view_visible_message.xml
@@ -1,114 +1,126 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
+<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/dateBreakTextView"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:textColor="@color/text"
-        android:textSize="@dimen/very_small_font_size"
-        android:textStyle="bold"
-        android:gravity="center" />
+    android:layout_height="wrap_content">
 
     <LinearLayout
-        android:id="@+id/mainContainer"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:gravity="bottom">
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/dateBreakTextView"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:textColor="@color/text"
+            android:textSize="@dimen/very_small_font_size"
+            android:textStyle="bold"
+            android:gravity="center" />
 
         <LinearLayout
-            android:id="@+id/profilePictureContainer"
-            android:layout_width="wrap_content"
+            android:id="@+id/mainContainer"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="horizontal">
+            android:orientation="horizontal"
+            android:gravity="bottom">
 
-            <View
-                android:layout_width="12dp"
-                android:layout_height="0dp" />
-
-            <RelativeLayout
-                android:layout_width="26dp"
-                android:layout_height="32dp" >
-
-                <org.thoughtcrime.securesms.loki.views.ProfilePictureView
-                    android:id="@+id/profilePictureView"
-                    android:layout_width="@dimen/very_small_profile_picture_size"
-                    android:layout_height="@dimen/very_small_profile_picture_size"
-                    android:layout_marginTop="3dp" />
-
-                <ImageView
-                    android:id="@+id/moderatorIconImageView"
-                    android:layout_width="16dp"
-                    android:layout_height="16dp"
-                    android:src="@drawable/ic_crown"
-                    android:layout_alignParentEnd="true"
-                    android:layout_alignParentBottom="true" />
-
-            </RelativeLayout>
-
-            <View
-                android:layout_width="12dp"
-                android:layout_height="0dp" />
-
-        </LinearLayout>
-
-        <LinearLayout
-            android:id="@+id/messageContentContainer"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical">
-
-            <TextView
-                android:id="@+id/senderNameTextView"
+            <LinearLayout
+                android:id="@+id/profilePictureContainer"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginBottom="4dp"
-                android:layout_marginStart="12dp"
-                android:layout_marginEnd="12dp"
-                android:textColor="@color/text"
-                android:textStyle="bold"
-                android:maxLines="1"
-                android:ellipsize="end" />
+                android:orientation="horizontal">
 
-            <org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageContentView
-                android:id="@+id/messageContentView"
+                <View
+                    android:layout_width="12dp"
+                    android:layout_height="0dp" />
+
+                <RelativeLayout
+                    android:layout_width="26dp"
+                    android:layout_height="32dp" >
+
+                    <org.thoughtcrime.securesms.loki.views.ProfilePictureView
+                        android:id="@+id/profilePictureView"
+                        android:layout_width="@dimen/very_small_profile_picture_size"
+                        android:layout_height="@dimen/very_small_profile_picture_size"
+                        android:layout_marginTop="3dp" />
+
+                    <ImageView
+                        android:id="@+id/moderatorIconImageView"
+                        android:layout_width="16dp"
+                        android:layout_height="16dp"
+                        android:src="@drawable/ic_crown"
+                        android:layout_alignParentEnd="true"
+                        android:layout_alignParentBottom="true" />
+
+                </RelativeLayout>
+
+                <View
+                    android:layout_width="12dp"
+                    android:layout_height="0dp" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/messageContentContainer"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
-
-            <RelativeLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
 
                 <TextView
-                    android:id="@+id/messageTimestampTextView"
+                    android:id="@+id/senderNameTextView"
                     android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:layout_alignParentStart="true"
-                    android:layout_centerVertical="true"
-                    android:layout_marginStart="2dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="4dp"
+                    android:layout_marginStart="12dp"
+                    android:layout_marginEnd="12dp"
+                    android:textColor="@color/text"
+                    android:textStyle="bold"
                     android:maxLines="1"
-                    android:textSize="10dp" />
+                    android:ellipsize="end" />
 
-                <ImageView
-                    android:id="@+id/messageStatusImageView"
-                    android:layout_width="16dp"
-                    android:layout_height="16dp"
-                    android:layout_alignParentEnd="true"
-                    android:layout_centerVertical="true"
-                    android:layout_marginEnd="2dp"
-                    android:padding="2dp"
-                    android:src="@drawable/ic_delivery_status_sent" />
+                <org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageContentView
+                    android:id="@+id/messageContentView"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content" />
 
-            </RelativeLayout>
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+
+                    <TextView
+                        android:id="@+id/messageTimestampTextView"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_alignParentStart="true"
+                        android:layout_centerVertical="true"
+                        android:layout_marginStart="2dp"
+                        android:maxLines="1"
+                        android:textSize="10dp" />
+
+                    <ImageView
+                        android:id="@+id/messageStatusImageView"
+                        android:layout_width="16dp"
+                        android:layout_height="16dp"
+                        android:layout_alignParentEnd="true"
+                        android:layout_centerVertical="true"
+                        android:layout_marginEnd="2dp"
+                        android:padding="2dp"
+                        android:src="@drawable/ic_delivery_status_sent" />
+
+                </RelativeLayout>
+
+            </LinearLayout>
 
         </LinearLayout>
 
     </LinearLayout>
 
-</LinearLayout>
\ No newline at end of file
+    <org.thoughtcrime.securesms.conversation.v2.components.ExpirationTimerView
+        android:id="@+id/expirationTimerView"
+        android:layout_width="12dp"
+        android:layout_height="12dp"
+        android:layout_marginHorizontal="@dimen/medium_spacing"
+        android:layout_centerVertical="true" />
+
+</RelativeLayout>
\ No newline at end of file