diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
index 29618666a31b89e010c632849e1332d90c9c8fa3..de2d26119794712fd402afd096cf4651af952835 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
@@ -75,6 +75,11 @@ fun ConversationScreen(
                 )
             },
             content = { padding ->
+                if (viewModel.loadingMessages.value) {
+                    Loader()
+                    return@Scaffold
+                }
+
                 LazyColumn(
                     state = scrollState,
                     // reverseLayout to display most recent message (index 0) at the bottom
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
index f716ff85ca8d57db78ecdfeffd69ecbc4473a03a..7bad51e4e63a783bff1a785dd8d060758bbe1aa0 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt
@@ -73,6 +73,7 @@ constructor(
     private val _contactId = mutableStateOf<ContactId?>(null)
     private val _contactItem = mutableStateOf<ContactItem?>(null)
     private val _messages = mutableStateListOf<ConversationItem>()
+    private val _loadingMessages = mutableStateOf(false)
 
     private val _newMessage = mutableStateOf("")
 
@@ -80,6 +81,7 @@ constructor(
 
     val contactItem = _contactItem.asState()
     val messages = _messages.asList()
+    val loadingMessages = _loadingMessages.asState()
 
     val newMessage = _newMessage.asState()
 
@@ -201,6 +203,7 @@ constructor(
     }
 
     private fun loadMessages(txn: Transaction, contact: ContactItem) {
+        _loadingMessages.value = true
         try {
             var start = LogUtils.now()
             val headers = conversationManager.getMessageHeaders(txn, contact.idWrapper.contactId)
@@ -215,6 +218,8 @@ constructor(
         } catch (e: NoSuchContactException) {
             // todo: handle this properly
             LOG.warn(e) {}
+        } finally {
+            _loadingMessages.value = false
         }
     }
 
@@ -306,11 +311,12 @@ constructor(
     }
 
     fun deleteAllMessages() = runOnDbThread {
+        _loadingMessages.value = true
         try {
             val result = conversationManager.deleteAllMessages(_contactId.value!!)
             reloadConversationAfterDeletingMessages(result)
         } finally {
-            // todo:
+            _loadingMessages.value = false
         }
     }