diff --git a/briar-android/res/drawable-hdpi/navigation_next_item.png b/briar-android/res/drawable-hdpi/navigation_next_item.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6495b29cfe3acc6455414dd7edfd68926ba72c3
Binary files /dev/null and b/briar-android/res/drawable-hdpi/navigation_next_item.png differ
diff --git a/briar-android/res/drawable-hdpi/navigation_previous_item.png b/briar-android/res/drawable-hdpi/navigation_previous_item.png
new file mode 100644
index 0000000000000000000000000000000000000000..23778ae9b73517818c0c37b0e268a328385c3836
Binary files /dev/null and b/briar-android/res/drawable-hdpi/navigation_previous_item.png differ
diff --git a/briar-android/res/drawable-mdpi/navigation_next_item.png b/briar-android/res/drawable-mdpi/navigation_next_item.png
new file mode 100644
index 0000000000000000000000000000000000000000..88029a82d4f2d675e97b4f6b56643a5bd5a7e594
Binary files /dev/null and b/briar-android/res/drawable-mdpi/navigation_next_item.png differ
diff --git a/briar-android/res/drawable-mdpi/navigation_previous_item.png b/briar-android/res/drawable-mdpi/navigation_previous_item.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d19e3911e0d6d2098ad89121f3815b7fe50dc50
Binary files /dev/null and b/briar-android/res/drawable-mdpi/navigation_previous_item.png differ
diff --git a/briar-android/res/drawable-xhdpi/navigation_next_item.png b/briar-android/res/drawable-xhdpi/navigation_next_item.png
new file mode 100644
index 0000000000000000000000000000000000000000..c36e050a396805e66faad8c6488b75ab2e32fbf1
Binary files /dev/null and b/briar-android/res/drawable-xhdpi/navigation_next_item.png differ
diff --git a/briar-android/res/drawable-xhdpi/navigation_previous_item.png b/briar-android/res/drawable-xhdpi/navigation_previous_item.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf0b485f68107c7880f6340db12ecf16b4fb31fd
Binary files /dev/null and b/briar-android/res/drawable-xhdpi/navigation_previous_item.png differ
diff --git a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java
index 6fcea7483b7993b861d794c228cf078c7d9c933b..16638abbb1388e6dc9390158e0c5a773fb032b23 100644
--- a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java
+++ b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java
@@ -70,7 +70,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
 		layout.addView(list);
 
 		ImageButton addContactButton = new ImageButton(this);
-		addContactButton.setPadding(5, 5, 5, 5);
+		addContactButton.setPadding(10, 10, 10, 10);
 		addContactButton.setBackgroundResource(0);
 		addContactButton.setImageResource(R.drawable.social_add_person);
 		addContactButton.setOnClickListener(this);
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 f290dbc2d8d1697243dfd3a5604774951fba22bf..28bc3a3fd9bd9a67fb613bc76de3c005beec1300 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
@@ -82,7 +82,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
 		layout.addView(list);
 
 		ImageButton composeButton = new ImageButton(this);
-		composeButton.setPadding(5, 5, 5, 5);
+		composeButton.setPadding(10, 10, 10, 10);
 		composeButton.setBackgroundResource(0);
 		composeButton.setImageResource(R.drawable.content_new_email);
 		composeButton.setOnClickListener(this);
@@ -174,6 +174,10 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
 
 	public void onItemClick(AdapterView<?> parent, View view, int position,
 			long id) {
+		showMessage(position);
+	}
+
+	private void showMessage(int position) {
 		PrivateMessageHeader item = adapter.getItem(position);
 		Intent i = new Intent(this, ReadMessageActivity.class);
 		i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt());
@@ -181,7 +185,22 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
 		i.putExtra("net.sf.briar.MESSAGE_ID", item.getId().getBytes());
 		i.putExtra("net.sf.briar.CONTENT_TYPE", item.getContentType());
 		i.putExtra("net.sf.briar.TIMESTAMP", item.getTimestamp());
+		i.putExtra("net.sf.briar.FIRST", position == 0);
+		i.putExtra("net.sf.briar.LAST", position == adapter.getCount() - 1);
 		i.putExtra("net.sf.briar.STARRED", item.isStarred());
-		startActivity(i);
+		startActivityForResult(i, position);
+	}
+
+	@Override
+	public void onActivityResult(int request, int result, Intent data) {
+		if(result == ReadMessageActivity.RESULT_PREV) {
+			int position = request - 1;
+			if(position >= 0 && position < adapter.getCount())
+				showMessage(position);
+		} else if(result == ReadMessageActivity.RESULT_NEXT) {
+			int position = request + 1;
+			if(position >= 0 && position < adapter.getCount())
+				showMessage(position);
+		}
 	}
 }
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 32b8e73b17048f6a3961310c63e8e069d3057f47..ce1a77a086ea582c3e59ad5a59fb07490b206031 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
@@ -76,7 +76,7 @@ implements OnClickListener, DatabaseListener {
 		layout.addView(list);
 
 		ImageButton composeButton = new ImageButton(this);
-		composeButton.setPadding(5, 5, 5, 5);
+		composeButton.setPadding(10, 10, 10, 10);
 		composeButton.setBackgroundResource(0);
 		composeButton.setImageResource(R.drawable.content_new_email);
 		composeButton.setOnClickListener(this);
diff --git a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java
index c862c978c082586a366fdb374a65413660901bb8..29f6848ed23f20706df6c78394addceeabcac3d4 100644
--- a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java
@@ -40,6 +40,10 @@ import com.google.inject.Inject;
 public class ReadMessageActivity extends BriarActivity
 implements OnClickListener {
 
+	static final int RESULT_REPLY = RESULT_FIRST_USER;
+	static final int RESULT_PREV = RESULT_FIRST_USER + 1;
+	static final int RESULT_NEXT = RESULT_FIRST_USER + 2;
+
 	private static final Logger LOG =
 			Logger.getLogger(ReadMessageActivity.class.getName());
 
@@ -53,9 +57,10 @@ implements OnClickListener {
 	private ContactId contactId = null;
 	private String contactName = null;
 	private MessageId messageId = null;
-	private boolean starred, read;
-	private ImageButton replyButton = null, starButton = null;
-	private ImageButton readButton = null;
+	private boolean first, last, starred, read;
+	private ImageButton starButton = null, readButton = null;
+	private ImageButton prevButton = null, nextButton = null;
+	private ImageButton replyButton = null;
 	private TextView content = null;
 
 	@Override
@@ -75,6 +80,8 @@ implements OnClickListener {
 		if(contentType == null) throw new IllegalStateException();
 		long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1);
 		if(timestamp == -1) throw new IllegalStateException();
+		first = i.getBooleanExtra("net.sf.briar.FIRST", false);
+		last = i.getBooleanExtra("net.sf.briar.LAST", false);
 
 		if(state != null && bundleEncrypter.decrypt(state)) {
 			starred = state.getBoolean("net.sf.briar.STARRED");
@@ -154,16 +161,8 @@ implements OnClickListener {
 		footer.setOrientation(HORIZONTAL);
 		footer.setGravity(CENTER);
 
-		replyButton = new ImageButton(this);
-		replyButton.setPadding(5, 5, 5, 5);
-		replyButton.setBackgroundResource(0);
-		replyButton.setImageResource(R.drawable.social_reply);
-		replyButton.setOnClickListener(this);
-		footer.addView(replyButton);
-		layout.addView(footer);
-
 		starButton = new ImageButton(this);
-		starButton.setPadding(5, 5, 5, 5);
+		starButton.setPadding(10, 10, 10, 10);
 		starButton.setBackgroundResource(0);
 		if(starred) starButton.setImageResource(R.drawable.rating_important);
 		else starButton.setImageResource(R.drawable.rating_not_important);
@@ -171,13 +170,37 @@ implements OnClickListener {
 		footer.addView(starButton);
 
 		readButton = new ImageButton(this);
-		readButton.setPadding(5, 5, 5, 5);
+		readButton.setPadding(10, 10, 10, 10);
 		readButton.setBackgroundResource(0);
 		if(read) readButton.setImageResource(R.drawable.content_unread);
 		else readButton.setImageResource(R.drawable.content_read);
 		readButton.setOnClickListener(this);
 		footer.addView(readButton);
 
+		prevButton = new ImageButton(this);
+		prevButton.setPadding(10, 10, 10, 10);
+		prevButton.setBackgroundResource(0);
+		prevButton.setImageResource(R.drawable.navigation_previous_item);
+		prevButton.setOnClickListener(this);
+		prevButton.setEnabled(!first);
+		footer.addView(prevButton);
+
+		nextButton = new ImageButton(this);
+		nextButton.setPadding(10, 10, 10, 10);
+		nextButton.setBackgroundResource(0);
+		nextButton.setImageResource(R.drawable.navigation_next_item);
+		nextButton.setOnClickListener(this);
+		nextButton.setEnabled(!last);
+		footer.addView(nextButton);
+
+		replyButton = new ImageButton(this);
+		replyButton.setPadding(10, 10, 10, 10);
+		replyButton.setBackgroundResource(0);
+		replyButton.setImageResource(R.drawable.social_reply);
+		replyButton.setOnClickListener(this);
+		footer.addView(replyButton);
+		layout.addView(footer);
+
 		setContentView(layout);
 
 		// Bind to the service so we can wait for the DB to be opened
@@ -227,14 +250,7 @@ implements OnClickListener {
 	}
 
 	public void onClick(View view) {
-		if(view == replyButton) {
-			Intent i = new Intent(this, WriteMessageActivity.class);
-			i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt());
-			i.putExtra("net.sf.briar.CONTACT_NAME", contactName);
-			i.putExtra("net.sf.briar.PARENT_ID", messageId.getBytes());
-			startActivity(i);
-			finish();
-		} else if(view == starButton) {
+		if(view == starButton) {
 			final MessageId messageId = this.messageId;
 			final boolean starred = !this.starred;
 			dbExecutor.execute(new Runnable() {
@@ -280,6 +296,20 @@ implements OnClickListener {
 					}
 				}
 			});
+		} else if(view == prevButton) {
+			setResult(RESULT_PREV);
+			finish();
+		} else if(view == nextButton) {
+			setResult(RESULT_NEXT);
+			finish();
+		} else if(view == replyButton) {
+			Intent i = new Intent(this, WriteMessageActivity.class);
+			i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt());
+			i.putExtra("net.sf.briar.CONTACT_NAME", contactName);
+			i.putExtra("net.sf.briar.PARENT_ID", messageId.getBytes());
+			startActivity(i);
+			setResult(RESULT_REPLY);
+			finish();
 		}
 	}
 
diff --git a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java
index 078541da89c12bf41449eec57febc506d9a9dd8d..f5c7514bd10c6a451c45e21c4e47a978317ed4e8 100644
--- a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java
@@ -89,7 +89,7 @@ implements OnClickListener {
 		actionBar.addView(to);
 
 		ImageButton sendButton = new ImageButton(this);
-		sendButton.setPadding(5, 5, 5, 5);
+		sendButton.setPadding(10, 10, 10, 10);
 		sendButton.setBackgroundResource(0);
 		sendButton.setImageResource(R.drawable.social_send_now);
 		sendButton.setOnClickListener(this);