diff --git a/src/main/java/org/briarproject/briar/desktop/chat/ChatHistoryConversationVisitor.java b/src/main/java/org/briarproject/briar/desktop/chat/ChatHistoryConversationVisitor.java
deleted file mode 100644
index def7853ad30e88f39f14f623d869ffcfe06c8aae..0000000000000000000000000000000000000000
--- a/src/main/java/org/briarproject/briar/desktop/chat/ChatHistoryConversationVisitor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.briarproject.briar.desktop.chat;
-
-import org.briarproject.bramble.api.db.DbException;
-import org.briarproject.bramble.api.identity.Author;
-import org.briarproject.briar.api.blog.BlogInvitationRequest;
-import org.briarproject.briar.api.blog.BlogInvitationResponse;
-import org.briarproject.briar.api.conversation.ConversationMessageHeader;
-import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
-import org.briarproject.briar.api.forum.ForumInvitationRequest;
-import org.briarproject.briar.api.forum.ForumInvitationResponse;
-import org.briarproject.briar.api.introduction.IntroductionRequest;
-import org.briarproject.briar.api.introduction.IntroductionResponse;
-import org.briarproject.briar.api.messaging.MessagingManager;
-import org.briarproject.briar.api.messaging.PrivateMessageHeader;
-import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
-import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ChatHistoryConversationVisitor
-        implements ConversationMessageVisitor<Void> {
-
-    final static Logger logger = LoggerFactory.getLogger(ChatHistoryConversationVisitor.class);
-
-    private Chat chat;
-    private MessagingManager messagingManager;
-
-    public ChatHistoryConversationVisitor(Chat chat, MessagingManager messagingManager) {
-        this.chat = chat;
-        this.messagingManager = messagingManager;
-    }
-
-    void appendMessage(ConversationMessageHeader header) {
-        try {
-            String messageText = messagingManager.getMessageText(header.getId());
-            chat.appendMessage(header.isLocal(), header.getTimestamp(), messageText);
-        } catch (DbException e) {
-            logger.warn("Error while getting message text", e);
-        }
-    }
-
-    @Override
-    public Void visitPrivateMessageHeader(PrivateMessageHeader h) {
-        appendMessage(h);
-        return null;
-    }
-
-    @Override
-    public Void visitBlogInvitationRequest(BlogInvitationRequest r) {
-        return null;
-    }
-
-    @Override
-    public Void visitBlogInvitationResponse(BlogInvitationResponse r) {
-        return null;
-    }
-
-    @Override
-    public Void visitForumInvitationRequest(ForumInvitationRequest r) {
-        return null;
-    }
-
-    @Override
-    public Void visitForumInvitationResponse(ForumInvitationResponse r) {
-        return null;
-    }
-
-    @Override
-    public Void visitGroupInvitationRequest(GroupInvitationRequest r) {
-        return null;
-    }
-
-    @Override
-    public Void visitGroupInvitationResponse(GroupInvitationResponse r) {
-        return null;
-    }
-
-    @Override
-    public Void visitIntroductionRequest(IntroductionRequest r) {
-        Author nameable = r.getNameable();
-        chat.appendMessage(r.isLocal(), r.getTimestamp(), String.format(
-                "You received an introduction request! Username: %s, Message: %s",
-                r.getName(), r.getText()));
-        if (!r.wasAnswered()) {
-            chat.appendMessage(r.isLocal(), r.getTimestamp(),
-                    "Do you accept the invitation?");
-            // TODO chat.appendYesNoButtons(r);
-        }
-        return null;
-    }
-
-    @Override
-    public Void visitIntroductionResponse(IntroductionResponse r) {
-        if (r.wasAccepted()) {
-            chat.appendMessage(r.isLocal(), r.getTimestamp(),
-                    "You accepted the request");
-        } else {
-            chat.appendMessage(r.isLocal(), r.getTimestamp(),
-                    "You declined the request");
-        }
-        return null;
-    }
-
-}
diff --git a/src/main/java/org/briarproject/briar/desktop/chat/ConversationMessageHeaderComparator.java b/src/main/java/org/briarproject/briar/desktop/chat/ConversationMessageHeaderComparator.java
deleted file mode 100644
index beace82b0d24eaeb39dfc97daa09148ca632efb3..0000000000000000000000000000000000000000
--- a/src/main/java/org/briarproject/briar/desktop/chat/ConversationMessageHeaderComparator.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.briarproject.briar.desktop.chat;
-
-import org.briarproject.briar.api.conversation.ConversationMessageHeader;
-
-import java.util.Comparator;
-
-public class ConversationMessageHeaderComparator
-        implements Comparator<ConversationMessageHeader> {
-
-    @Override
-    public int compare(ConversationMessageHeader h1,
-                       ConversationMessageHeader h2) {
-        return Long.compare(h1.getTimestamp(), h2.getTimestamp());
-    }
-
-}
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/chat/ChatHistoryConversationVisitor.kt b/src/main/kotlin/org/briarproject/briar/desktop/chat/ChatHistoryConversationVisitor.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1983c8a8705aa223a05bb178e461c2afea2b1e0d
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/chat/ChatHistoryConversationVisitor.kt
@@ -0,0 +1,98 @@
+package org.briarproject.briar.desktop.chat
+
+import org.briarproject.bramble.api.db.DbException
+import org.briarproject.briar.api.blog.BlogInvitationRequest
+import org.briarproject.briar.api.blog.BlogInvitationResponse
+import org.briarproject.briar.api.conversation.ConversationMessageHeader
+import org.briarproject.briar.api.conversation.ConversationMessageVisitor
+import org.briarproject.briar.api.forum.ForumInvitationRequest
+import org.briarproject.briar.api.forum.ForumInvitationResponse
+import org.briarproject.briar.api.introduction.IntroductionRequest
+import org.briarproject.briar.api.introduction.IntroductionResponse
+import org.briarproject.briar.api.messaging.MessagingManager
+import org.briarproject.briar.api.messaging.PrivateMessageHeader
+import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
+import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse
+import org.slf4j.LoggerFactory
+
+class ChatHistoryConversationVisitor(
+    private val chat: Chat,
+    private val messagingManager: MessagingManager
+) :
+    ConversationMessageVisitor<Void?> {
+
+    companion object {
+        val logger = LoggerFactory.getLogger(ChatHistoryConversationVisitor::class.java)
+    }
+
+    fun appendMessage(header: ConversationMessageHeader) {
+        try {
+            val messageText = messagingManager.getMessageText(header.id)
+            chat.appendMessage(header.isLocal, header.timestamp, messageText)
+        } catch (e: DbException) {
+            logger.warn("Error while getting message text", e)
+        }
+    }
+
+    override fun visitPrivateMessageHeader(h: PrivateMessageHeader): Void? {
+        appendMessage(h)
+        return null
+    }
+
+    override fun visitBlogInvitationRequest(r: BlogInvitationRequest): Void? {
+        return null
+    }
+
+    override fun visitBlogInvitationResponse(r: BlogInvitationResponse): Void? {
+        return null
+    }
+
+    override fun visitForumInvitationRequest(r: ForumInvitationRequest): Void? {
+        return null
+    }
+
+    override fun visitForumInvitationResponse(r: ForumInvitationResponse): Void? {
+        return null
+    }
+
+    override fun visitGroupInvitationRequest(r: GroupInvitationRequest): Void? {
+        return null
+    }
+
+    override fun visitGroupInvitationResponse(r: GroupInvitationResponse): Void? {
+        return null
+    }
+
+    override fun visitIntroductionRequest(r: IntroductionRequest): Void? {
+        chat.appendMessage(
+            r.isLocal, r.timestamp, String.format(
+                "You received an introduction request! Username: %s, Message: %s",
+                r.name, r.text
+            )
+        )
+        if (!r.wasAnswered()) {
+            chat.appendMessage(
+                r.isLocal, r.timestamp,
+                "Do you accept the invitation?"
+            )
+            // TODO chat.appendYesNoButtons(r);
+        }
+        return null
+    }
+
+    override fun visitIntroductionResponse(r: IntroductionResponse): Void? {
+        if (r.wasAccepted()) {
+            chat.appendMessage(
+                r.isLocal, r.timestamp,
+                "You accepted the request"
+            )
+        } else {
+            chat.appendMessage(
+                r.isLocal, r.timestamp,
+                "You declined the request"
+            )
+        }
+        return null
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/chat/ConversationMessageHeaderComparator.kt b/src/main/kotlin/org/briarproject/briar/desktop/chat/ConversationMessageHeaderComparator.kt
new file mode 100644
index 0000000000000000000000000000000000000000..32205bfb2d0fa0ce569563d8c8f1b6cf8834e9bb
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/chat/ConversationMessageHeaderComparator.kt
@@ -0,0 +1,14 @@
+package org.briarproject.briar.desktop.chat
+
+import org.briarproject.briar.api.conversation.ConversationMessageHeader
+
+class ConversationMessageHeaderComparator : Comparator<ConversationMessageHeader> {
+
+    override fun compare(
+        h1: ConversationMessageHeader,
+        h2: ConversationMessageHeader
+    ): Int {
+        return h1.timestamp.compareTo(h2.timestamp)
+    }
+
+}
\ No newline at end of file