diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/Database.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/Database.kt
index 32f4dc15574f91353d26bb0b8b8053afe69d6430..e108f9da656e355e7ef445cca88cde27ed214cc1 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/Database.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/Database.kt
@@ -29,6 +29,9 @@ interface Database : TransactionManager {
     @Throws(DbException::class)
     fun getContact(txn: Transaction, id: Int): Contact?
 
+    @Throws(DbException::class)
+    fun getContacts(txn: Transaction): List<Contact>
+
     @Throws(DbException::class)
     fun removeContact(txn: Transaction, id: Int)
 
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt
index 0a5fdd0b82d9e9673eb4867e3568c885e754b769..651263331b3c9c85bf447f1d22a93e188eaeab7c 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt
@@ -488,6 +488,33 @@ abstract class JdbcDatabase(private val dbTypes: DatabaseTypes, private val cloc
         }
     }
 
+    @Throws(DbException::class)
+    override fun getContacts(txn: Transaction): List<Contact> {
+        val contacts = ArrayList<Contact>()
+        val connection: Connection = txn.unbox()
+        var ps: PreparedStatement? = null
+        var rs: ResultSet? = null
+        try {
+            val sql = "SELECT contactId, token, inbox, outbox FROM contacts"
+            ps = connection.prepareStatement(sql)
+            rs = ps.executeQuery()
+            while (rs.next()) {
+                val id = rs.getInt(1)
+                val token = rs.getString(2)
+                val inboxId = rs.getString(3)
+                val outboxId = rs.getString(4)
+                contacts.add(Contact(id, token, inboxId, outboxId))
+            }
+            rs.close()
+            ps.close()
+            return contacts
+        } catch (e: SQLException) {
+            tryToClose(rs, LOG)
+            tryToClose(ps, LOG)
+            throw DbException(e)
+        }
+    }
+
     @Throws(DbException::class)
     override fun removeContact(txn: Transaction, id: Int) {
         val connection: Connection = txn.unbox()