diff --git a/briar-gtk/briar_gtk/containers/private_chat.py b/briar-gtk/briar_gtk/containers/private_chat.py
index d0849510c0e9c3c25845ede5799f647c4eced058..a5db375ab94df010557b9a9fb2b0f4c0a5ade67b 100644
--- a/briar-gtk/briar_gtk/containers/private_chat.py
+++ b/briar-gtk/briar_gtk/containers/private_chat.py
@@ -42,6 +42,7 @@ class PrivateChatContainer(Container):
                 "timestamp": int(round(time.time() * 1000))
             })
         widget.set_text("")
+        GLib.idle_add(self._scroll_to_bottom)
 
     def _setup_view(self):
         self._add_from_resource(self.CONTAINER_UI)
@@ -63,13 +64,16 @@ class PrivateChatContainer(Container):
         messages_column.add(column)
         messages_column.show()
 
-        self.add(self.builder.get_object("messages_scroll"))
+        messages_scroll = self.builder.get_object("messages_scroll")
+        self._draw_signal_id = messages_scroll.connect("draw", self._on_message_scroll_draw)
+        self.add(messages_scroll)
 
         self.builder.connect_signals(self)
 
     def _load_content(self):
         private_chat = PrivateChat(APP().api, self._contact_id)
         messages_list = private_chat.get()
+        self._messages_count = len(messages_list)
         for message in messages_list:
             # Abusing idle_add function here because otherwise the message box
             # is too small and scrolling cuts out messages
@@ -82,3 +86,23 @@ class PrivateChatContainer(Container):
 
     def _add_message_async(self, message):
         GLib.idle_add(self._add_message, message)
+
+    def _on_message_scroll_draw(self, widget, cairo_context):
+        self._scroll_to_bottom()
+        if self._draw_signal_is_not_needed():
+            widget.disconnect(self._draw_signal_id)
+
+    def _scroll_to_bottom(self):
+        messages_scroll = self.builder.get_object("messages_scroll")
+        adjustment = messages_scroll.get_vadjustment()
+        adjustment.set_value(
+            adjustment.get_upper() - adjustment.get_page_size()
+        )
+
+    def _draw_signal_is_not_needed(self):
+        if self._messages_count == 0:
+            return True
+
+        messages_scroll = self.builder.get_object("messages_scroll")
+        adjustment = messages_scroll.get_vadjustment()
+        return adjustment.get_value() != 0