diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 9ac40c5eaf9caa1670fede2f5d11f353ec3dc09c..f466ff48ae9b2afb8c280d0f5c6d2f6dbdfb799b 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -160,35 +160,21 @@ implements EventListener, OnClickListener, OnItemClickListener {
 				list.setVisibility(VISIBLE);
 				loading.setVisibility(GONE);
 				adapter.clear();
-				for(MessageHeader h : headers)
-					adapter.add(new ConversationItem(h));
+				for(MessageHeader h : headers) {
+					ConversationItem item = new ConversationItem(h);
+					byte[] body = bodyCache.get(h.getId());
+					if(body == null) loadMessageBody(h);
+					else item.setBody(body);
+					adapter.add(item);
+				}
 				adapter.sort(ConversationItemComparator.INSTANCE);
 				adapter.notifyDataSetChanged();
-				expandMessages();
+				// Scroll to the bottom
+				list.setSelection(adapter.getCount() - 1);
 			}
 		});
 	}
 
-	private void expandMessages() {
-		// Expand unread messages and the last three messages
-		int count = adapter.getCount();
-		if(count == 0) return;
-		for(int i = 0; i < count; i++) {
-			ConversationItem item = adapter.getItem(i);
-			MessageHeader h = item.getHeader();
-			if(h.isRead() && i < count - 3) {
-				item.setExpanded(false);
-			} else {
-				item.setExpanded(true);
-				byte[] body = bodyCache.get(h.getId());
-				if(body == null) loadMessageBody(h);
-				else item.setBody(body);
-			}
-		}
-		// Scroll to the bottom
-		list.setSelection(count - 1);
-	}
-
 	private void loadMessageBody(final MessageHeader h) {
 		dbUiExecutor.execute(new Runnable() {
 			public void run() {
@@ -199,7 +185,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 					long duration = System.currentTimeMillis() - now;
 					if(LOG.isLoggable(INFO))
 						LOG.info("Loading message took " + duration + " ms");
-					displayMessage(h.getId(), body);
+					displayMessageBody(h.getId(), body);
 				} catch(NoSuchMessageException e) {
 					if(LOG.isLoggable(INFO)) LOG.info("Message expired");
 					// The item will be removed when we get the event
@@ -215,7 +201,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 		});
 	}
 
-	private void displayMessage(final MessageId m, final byte[] body) {
+	private void displayMessageBody(final MessageId m, final byte[] body) {
 		runOnUiThread(new Runnable() {
 			public void run() {
 				bodyCache.put(m, body);
@@ -224,10 +210,9 @@ implements EventListener, OnClickListener, OnItemClickListener {
 					ConversationItem item = adapter.getItem(i);
 					if(item.getHeader().getId().equals(m)) {
 						item.setBody(body);
-						if(item.isExpanded()) {
-							adapter.notifyDataSetChanged();
-							list.setSelection(count - 1);
-						}
+						adapter.notifyDataSetChanged();
+						// Scroll to the bottom
+						list.setSelection(count - 1);
 						return;
 					}
 				}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index ff514ef239694cc67554a7d8aad617dc54bc1023..0bf24a24f1d2e6fce892efd5011e282377712d14 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -43,48 +43,48 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 		Context ctx = getContext();
 		Resources res = ctx.getResources();
 
-		LinearLayout headerLayout = new LinearLayout(ctx);
-		headerLayout.setOrientation(HORIZONTAL);
-		headerLayout.setGravity(CENTER_VERTICAL);
+		LinearLayout layout = new LinearLayout(ctx);
+		layout.setOrientation(VERTICAL);
+		layout.setGravity(CENTER_HORIZONTAL);
 		int background;
 		if(header.isRead()) background = res.getColor(R.color.read_background);
 		else background = res.getColor(R.color.unread_background);
-		headerLayout.setBackgroundColor(background);
+		layout.setBackgroundColor(background);
+
+		LinearLayout headerLayout = new LinearLayout(ctx);
+		headerLayout.setOrientation(HORIZONTAL);
+		headerLayout.setGravity(CENTER_VERTICAL);
 
 		AuthorView authorView = new AuthorView(ctx);
 		authorView.setLayoutParams(WRAP_WRAP_1);
 		authorView.init(header.getAuthor().getName(), VERIFIED);
 		headerLayout.addView(authorView);
 
-		// FIXME: Factor this out into a TimestampView
 		TextView date = new TextView(ctx);
 		date.setTextSize(14);
 		date.setPadding(0, pad, pad, pad);
 		long then = header.getTimestamp(), now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT));
 		headerLayout.addView(date);
+		layout.addView(headerLayout);
 
-		if(!item.isExpanded() || item.getBody() == null) return headerLayout;
-
-		LinearLayout expanded = new LinearLayout(ctx);
-		expanded.setOrientation(VERTICAL);
-		expanded.setGravity(CENTER_HORIZONTAL);
-		expanded.setBackgroundColor(background);
-		expanded.addView(headerLayout);
-
-		if(header.getContentType().equals("text/plain")) {
+		if(item.getBody() == null) {
+			TextView ellipsis = new TextView(ctx);
+			ellipsis.setPadding(pad, 0, pad, pad);
+			ellipsis.setText("\u2026");
+			layout.addView(ellipsis);
+		} else if(header.getContentType().equals("text/plain")) {
 			TextView text = new TextView(ctx);
 			text.setPadding(pad, 0, pad, pad);
-			text.setBackgroundColor(background);
 			text.setText(StringUtils.fromUtf8(item.getBody()));
-			expanded.addView(text);
+			layout.addView(text);
 		} else {
 			ImageButton attachment = new ImageButton(ctx);
 			attachment.setPadding(pad, 0, pad, pad);
 			attachment.setImageResource(R.drawable.content_attachment);
-			expanded.addView(attachment);
+			layout.addView(attachment);
 		}
 
-		return expanded;
+		return layout;
 	}
 }
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
index 4050e01a8df13ce580710132c59c271a83d0ffa9..1982bb58ec9429431c30285b9e5fa612416ce8e1 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
@@ -6,12 +6,10 @@ import org.briarproject.api.db.MessageHeader;
 class ConversationItem {
 
 	private final MessageHeader header;
-	private boolean expanded;
 	private byte[] body;
 
 	ConversationItem(MessageHeader header) {
 		this.header = header;
-		expanded = false;
 		body = null;
 	}
 
@@ -19,14 +17,6 @@ class ConversationItem {
 		return header;
 	}
 
-	boolean isExpanded() {
-		return expanded;
-	}
-
-	void setExpanded(boolean expanded) {
-		this.expanded = expanded;
-	}
-
 	byte[] getBody() {
 		return body;
 	}