diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
index 1782a6ceb140bbf2a43498805fe559e2681a06f3..82ae8a74feac97838fa8cd4f07e059b741dfcb5d 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
@@ -47,8 +47,8 @@ implements OnClickListener, DatabaseListener {
 	@Inject private DatabaseComponent db;
 	@Inject @DatabaseExecutor private Executor dbExecutor;
 
-	private ContactId contactId = null;
 	private ConversationAdapter adapter = null;
+	private volatile ContactId contactId = null;
 
 	@Override
 	public void onCreate(Bundle state) {
@@ -125,7 +125,7 @@ implements OnClickListener, DatabaseListener {
 					serviceConnection.waitForStartup();
 					// Load the message headers from the database
 					Collection<PrivateMessageHeader> headers =
-							db.getPrivateMessageHeaders();
+							db.getPrivateMessageHeaders(contactId);
 					if(LOG.isLoggable(INFO))
 						LOG.info("Loaded " + headers.size() + " headers");
 					// Update the conversation
@@ -147,8 +147,7 @@ implements OnClickListener, DatabaseListener {
 		runOnUiThread(new Runnable() {
 			public void run() {
 				adapter.clear();
-				for(PrivateMessageHeader h : headers)
-					if(h.getContactId().equals(contactId)) adapter.add(h);
+				for(PrivateMessageHeader h : headers) adapter.add(h);
 				adapter.sort(AscendingHeaderComparator.INSTANCE);
 			}
 		});
diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java b/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java
index 6720b08dd7c683b6f5c71c465ddee6283fe59877..67c6c629b724593b71423efa56107ace831f40a3 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java
@@ -56,7 +56,7 @@ implements OnItemClickListener {
 
 		TextView date = new TextView(ctx);
 		date.setTextSize(14);
-		date.setPadding(5, 0, 10, 0);
+		date.setPadding(10, 0, 10, 0);
 		long then = item.getTimestamp(), now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT));
 		layout.addView(date);
diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
index 9188d61770359bd36a30c8e69fbf261fdb639c2f..f09c7dabed6c714a23b804c9a0286079085d36e7 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
@@ -112,20 +112,20 @@ implements OnClickListener, DatabaseListener {
 						ContactId contactId = db.addContact("Carol");
 						// Insert some fake messages to and from the contact
 						Message m = messageFactory.createPrivateMessage(null,
-								"First message's subject is quite long to test"
-								+ " line wrapping and stuff like that",
+								"First message's subject is short",
 								"First message's body".getBytes("UTF-8"));
 						db.addLocalPrivateMessage(m, contactId);
 						db.setReadFlag(m.getId(), true);
 						db.setStarredFlag(m.getId(), true);
 						Thread.sleep(1000);
 						m = messageFactory.createPrivateMessage(m.getId(),
-								"Second message's subject is short",
+								"Second message's subject is also short",
 								"Second message's body".getBytes("UTF-8"));
 						db.receiveMessage(contactId, m);
 						Thread.sleep(1000);
 						m = messageFactory.createPrivateMessage(m.getId(),
-								"Third message's subject is also short",
+								"Third message's subject is quite long to test"
+								+ " line wrapping and exciting stuff like that",
 								"Third message's body".getBytes("UTF-8"));
 						db.addLocalPrivateMessage(m, contactId);
 						db.setReadFlag(m.getId(), true);
diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListAdapter.java b/briar-android/src/net/sf/briar/android/messages/ConversationListAdapter.java
index 50a8a574a0084419cc82f1178bbee5a57084072e..234af5266ebee97f2c156057edc33287b35062b7 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationListAdapter.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationListAdapter.java
@@ -53,7 +53,6 @@ implements OnItemClickListener {
 				WRAP_CONTENT, 1));
 		innerLayout.setOrientation(VERTICAL);
 		innerLayout.setGravity(LEFT);
-		innerLayout.setPadding(0, 5, 0, 5);
 
 		TextView name = new TextView(ctx);
 		name.setTextSize(18);
@@ -69,7 +68,7 @@ implements OnItemClickListener {
 
 		TextView date = new TextView(ctx);
 		date.setTextSize(14);
-		date.setPadding(5, 0, 10, 0);
+		date.setPadding(10, 0, 10, 0);
 		long then = item.getTimestamp(), now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT));
 		layout.addView(date);
diff --git a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
index e301eea38b74887faaad1d49fd56565516090cca..b930322fb4e59ec2b8424d7d9603c114cc4a8432 100644
--- a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
+++ b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
@@ -174,6 +174,13 @@ public interface DatabaseComponent {
 	Collection<PrivateMessageHeader> getPrivateMessageHeaders()
 			throws DbException;
 
+	/**
+	 * Returns the headers of all private messages to or from the given
+	 * contact.
+	 */
+	Collection<PrivateMessageHeader> getPrivateMessageHeaders(ContactId c)
+			throws DbException;
+
 	/** Returns the user's rating for the given author. */
 	Rating getRating(AuthorId a) throws DbException;
 
diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java
index 9faecae8e9e114a23064196f795be65f23493d98..97df26ac6e48387952bc523d8b909f842d67eb89 100644
--- a/briar-core/src/net/sf/briar/db/Database.java
+++ b/briar-core/src/net/sf/briar/db/Database.java
@@ -278,6 +278,15 @@ interface Database<T> {
 	Collection<PrivateMessageHeader> getPrivateMessageHeaders(T txn)
 			throws DbException;
 
+	/**
+	 * Returns the headers of all private messages to or from the given
+	 * contact.
+	 * <p>
+	 * Locking: message read.
+	 */
+	Collection<PrivateMessageHeader> getPrivateMessageHeaders(T txn,
+			ContactId c) throws DbException;
+
 	/**
 	 * Returns the IDs of all messages signed by the given author.
 	 * <p>
diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
index 5bace6d58e418693b89de16bc4ab80f0b6930ceb..299f52bd4e425961973e452e606bd14baefc12c5 100644
--- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
@@ -946,6 +946,25 @@ DatabaseCleaner.Callback {
 		}
 	}
 
+	public Collection<PrivateMessageHeader> getPrivateMessageHeaders(
+			ContactId c) throws DbException {
+		messageLock.readLock().lock();
+		try {
+			T txn = db.startTransaction();
+			try {
+				Collection<PrivateMessageHeader> headers =
+						db.getPrivateMessageHeaders(txn, c);
+				db.commitTransaction(txn);
+				return headers;
+			} catch(DbException e) {
+				db.abortTransaction(txn);
+				throw e;
+			}
+		} finally {
+			messageLock.readLock().unlock();
+		}
+	}
+
 	public Rating getRating(AuthorId a) throws DbException {
 		ratingLock.readLock().lock();
 		try {
diff --git a/briar-core/src/net/sf/briar/db/JdbcDatabase.java b/briar-core/src/net/sf/briar/db/JdbcDatabase.java
index e7611872fe7535a5e63b3bcc7cc1e80fee75ce71..45ec3fd7f32854c477796ad9c9f3f7970e84907d 100644
--- a/briar-core/src/net/sf/briar/db/JdbcDatabase.java
+++ b/briar-core/src/net/sf/briar/db/JdbcDatabase.java
@@ -1302,6 +1302,45 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
+	public Collection<PrivateMessageHeader> getPrivateMessageHeaders(
+			Connection txn, ContactId c) throws DbException {
+		PreparedStatement ps = null;
+		ResultSet rs = null;
+		try {
+			String sql = "SELECT m.messageId, parentId, subject, timestamp,"
+					+ " read, starred, seen"
+					+ " FROM messages AS m"
+					+ " JOIN statuses AS s"
+					+ " ON m.messageId = s.messageId"
+					+ " AND m.contactId = s.contactId"
+					+ " WHERE m.contactId = ? AND groupId IS NULL";
+			ps = txn.prepareStatement(sql);
+			ps.setInt(1, c.getInt());
+			rs = ps.executeQuery();
+			List<PrivateMessageHeader> headers =
+					new ArrayList<PrivateMessageHeader>();
+			while(rs.next()) {
+				MessageId id = new MessageId(rs.getBytes(1));
+				byte[] b = rs.getBytes(2);
+				MessageId parent = b == null ? null : new MessageId(b);
+				String subject = rs.getString(3);
+				long timestamp = rs.getLong(4);
+				boolean read = rs.getBoolean(5);
+				boolean starred = rs.getBoolean(6);
+				boolean seen = rs.getBoolean(7);
+				headers.add(new PrivateMessageHeader(id, parent, subject,
+						timestamp, read, starred, c, !seen));
+			}
+			rs.close();
+			ps.close();
+			return Collections.unmodifiableList(headers);
+		} catch(SQLException e) {
+			tryToClose(rs);
+			tryToClose(ps);
+			throw new DbException(e);
+		}
+	}
+
 	public Collection<MessageId> getMessagesByAuthor(Connection txn, AuthorId a)
 			throws DbException {
 		PreparedStatement ps = null;