diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 51e4770361a76e9b0e1d223e7e43608a7bcff616..6eb90413420abd211b0b4ecc0d5d109487b5288c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -34,7 +34,10 @@ import android.view.Menu
 import android.view.MenuItem
 import android.view.View
 import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.TextView
 import androidx.appcompat.app.ActionBarDrawerToggle
+import androidx.appcompat.widget.AppCompatImageView
 import androidx.appcompat.widget.Toolbar
 import androidx.core.content.pm.ShortcutInfoCompat
 import androidx.core.content.pm.ShortcutManagerCompat
@@ -92,6 +95,7 @@ import de.kuschku.quasseldroid.util.ui.MaterialContentLoadingProgressBar
 import de.kuschku.quasseldroid.util.ui.NickCountDrawable
 import de.kuschku.quasseldroid.viewmodel.EditorViewModel
 import de.kuschku.quasseldroid.viewmodel.data.BufferData
+import me.zhanghai.android.materialprogressbar.MaterialProgressBar
 import org.threeten.bp.Instant
 import org.threeten.bp.ZoneId
 import org.threeten.bp.format.DateTimeFormatter
@@ -110,6 +114,18 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
   @BindView(R.id.progress_bar)
   lateinit var progressBar: MaterialContentLoadingProgressBar
 
+  @BindView(R.id.connection_status)
+  lateinit var connectionStatusDisplay: LinearLayout
+
+  @BindView(R.id.connection_status_icon)
+  lateinit var connectionStatusDisplayIcon: AppCompatImageView
+
+  @BindView(R.id.connection_status_progress)
+  lateinit var connectionStatusDisplayProgress: MaterialProgressBar
+
+  @BindView(R.id.connection_status_text)
+  lateinit var connectionStatusDisplayText: TextView
+
   @BindView(R.id.autocomplete_list)
   lateinit var autoCompleteList: RecyclerView
 
@@ -571,23 +587,48 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     viewModel.connectionProgress.toLiveData().observe(this, Observer {
       val (state, progress, max) = it ?: Triple(ConnectionState.DISCONNECTED, 0, 0)
       when (state) {
-        ConnectionState.CONNECTED -> {
-          progressBar.visibility = View.INVISIBLE
-        }
         ConnectionState.DISCONNECTED,
-        ConnectionState.CLOSED    -> {
+        ConnectionState.CLOSED     -> {
           progressBar.visibility = View.INVISIBLE
+
+          connectionStatusDisplay.visibility = View.VISIBLE
+          connectionStatusDisplayText.text = getString(R.string.label_status_disconnected)
+          connectionStatusDisplayIcon.visibility = View.VISIBLE
+          connectionStatusDisplayProgress.visibility = View.GONE
         }
-        ConnectionState.INIT      -> {
+        ConnectionState.CONNECTING -> {
+          progressBar.visibility = View.VISIBLE
+          progressBar.isIndeterminate = true
+
+          connectionStatusDisplay.visibility = View.VISIBLE
+          connectionStatusDisplayText.text = getString(R.string.label_status_connecting)
+          connectionStatusDisplayIcon.visibility = View.GONE
+          connectionStatusDisplayProgress.visibility = View.VISIBLE
+        }
+        ConnectionState.HANDSHAKE  -> {
+          progressBar.visibility = View.VISIBLE
+          progressBar.isIndeterminate = true
+
+          connectionStatusDisplay.visibility = View.VISIBLE
+          connectionStatusDisplayText.text = getString(R.string.label_status_handshake)
+          connectionStatusDisplayIcon.visibility = View.GONE
+          connectionStatusDisplayProgress.visibility = View.VISIBLE
+        }
+        ConnectionState.INIT       -> {
           progressBar.visibility = View.VISIBLE
           // Show indeterminate when no progress has been made yet
           progressBar.isIndeterminate = progress == 0 || max == 0
           progressBar.progress = progress
           progressBar.max = max
+
+          connectionStatusDisplay.visibility = View.VISIBLE
+          connectionStatusDisplayText.text = getString(R.string.label_status_init)
+          connectionStatusDisplayIcon.visibility = View.GONE
+          connectionStatusDisplayProgress.visibility = View.VISIBLE
         }
-        else                      -> {
-          progressBar.visibility = View.VISIBLE
-          progressBar.isIndeterminate = true
+        ConnectionState.CONNECTED  -> {
+          progressBar.visibility = View.INVISIBLE
+          connectionStatusDisplay.visibility = View.GONE
         }
       }
     })
diff --git a/app/src/main/res/drawable/ic_disconnected.xml b/app/src/main/res/drawable/ic_disconnected.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9eae842ce3f489907eca6569ffa2de0ceeb466d0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_disconnected.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportWidth="24"
+  android:viewportHeight="24">
+  <path
+    android:fillColor="#000"
+    android:pathData="M19,17H21V9H19M19,21H21V19H19M1,21H17V7H21V1" />
+</vector>
diff --git a/app/src/main/res/layout-land/layout_main.xml b/app/src/main/res/layout-land/layout_main.xml
index 0759f57ef1ff192f26b905fed818ade65b6c211b..72cdad6a66a39a51730297b29f91dbff739a6772 100644
--- a/app/src/main/res/layout-land/layout_main.xml
+++ b/app/src/main/res/layout-land/layout_main.xml
@@ -32,13 +32,20 @@
 
     <include layout="@layout/layout_toolbar" />
 
-    <fragment
-      android:id="@+id/fragment_messages"
-      android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment"
+    <FrameLayout
       android:layout_width="match_parent"
-      android:layout_height="match_parent"
-      app:layout_behavior="@string/appbar_scrolling_view_behavior"
-      tools:layout="@layout/fragment_messages" />
+      android:layout_height="match_parent">
+
+      <fragment
+        android:id="@+id/fragment_messages"
+        android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior"
+        tools:layout="@layout/fragment_messages" />
+
+      <include layout="@layout/widget_connection_status" />
+    </FrameLayout>
 
     <androidx.recyclerview.widget.RecyclerView
       android:id="@+id/autocomplete_list"
diff --git a/app/src/main/res/layout-sw600dp-land/layout_main.xml b/app/src/main/res/layout-sw600dp-land/layout_main.xml
index 4f5b192987d9c3a1cd51ac2c8cd3182d770a14e6..61fe90495eb669e7a13d12da3b177b234b045817 100644
--- a/app/src/main/res/layout-sw600dp-land/layout_main.xml
+++ b/app/src/main/res/layout-sw600dp-land/layout_main.xml
@@ -38,13 +38,20 @@
       android:layout_marginBottom="?actionBarSize"
       android:orientation="vertical">
 
-      <fragment
-        android:id="@+id/fragment_messages"
-        android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment"
+      <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        app:layout_behavior="@string/appbar_scrolling_view_behavior"
-        tools:layout="@layout/fragment_messages" />
+        android:layout_height="match_parent">
+
+        <fragment
+          android:id="@+id/fragment_messages"
+          android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          app:layout_behavior="@string/appbar_scrolling_view_behavior"
+          tools:layout="@layout/fragment_messages" />
+
+        <include layout="@layout/widget_connection_status" />
+      </FrameLayout>
 
       <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/autocomplete_list"
diff --git a/app/src/main/res/layout/layout_main.xml b/app/src/main/res/layout/layout_main.xml
index bb80ce059ab4c49978dfbda03d6cd608897ca6e8..3149aea6de2f179c65f5f51968611bdaa4f2d982 100644
--- a/app/src/main/res/layout/layout_main.xml
+++ b/app/src/main/res/layout/layout_main.xml
@@ -38,12 +38,20 @@
       android:layout_marginBottom="?actionBarSize"
       android:orientation="vertical">
 
-      <fragment
-        android:id="@+id/fragment_messages"
-        android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment"
+      <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:layout="@layout/fragment_messages" />
+        android:layout_height="match_parent">
+
+        <fragment
+          android:id="@+id/fragment_messages"
+          android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          tools:layout="@layout/fragment_messages" />
+
+        <include layout="@layout/widget_connection_status" />
+
+      </FrameLayout>
 
       <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/autocomplete_list"
diff --git a/app/src/main/res/layout/widget_connection_status.xml b/app/src/main/res/layout/widget_connection_status.xml
new file mode 100644
index 0000000000000000000000000000000000000000..40b2c94ea51960a505522dbcab926b60db6976d2
--- /dev/null
+++ b/app/src/main/res/layout/widget_connection_status.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:id="@+id/connection_status"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?colorPrimaryDark"
+  android:minHeight="32dp"
+  android:paddingLeft="16dp"
+  android:paddingTop="6dp"
+  android:paddingRight="16dp"
+  android:paddingBottom="6dp"
+  android:visibility="gone"
+  tools:visibility="visible">
+
+  <androidx.appcompat.widget.AppCompatImageView
+    android:id="@+id/connection_status_icon"
+    android:layout_width="20dp"
+    android:layout_height="20dp"
+    app:srcCompat="@drawable/ic_disconnected"
+    app:tint="?colorTextPrimaryInverse" />
+
+  <me.zhanghai.android.materialprogressbar.MaterialProgressBar
+    android:id="@+id/connection_status_progress"
+    style="@style/Widget.MaterialProgressBar.ProgressBar"
+    android:layout_width="20dp"
+    android:layout_height="20dp"
+    android:indeterminate="true"
+    app:mpb_indeterminateTint="?colorTextPrimaryInverse" />
+
+  <TextView
+    android:id="@+id/connection_status_text"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginStart="16dp"
+    android:layout_marginLeft="16dp"
+    android:textColor="?colorTextPrimaryInverse"
+    tools:text="@string/label_status_connecting" />
+
+</LinearLayout>