diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 9ab5490ca8f1c68e394ad200a6aa02f224c60598..92486abf3bd87f4e6a8982c4ceb6909747448989 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -43,5 +43,5 @@
 	<string name="messages_title">Messages</string>
 	<string name="message_from">From: %1$s</string>
 	<string name="compose_title">New Message</string>
-	<string name="message_to">To: %1$s</string>
+	<string name="message_to">To:</string>
 </resources>
diff --git a/briar-android/src/net/sf/briar/android/messages/ContactNameSpinnerAdapter.java b/briar-android/src/net/sf/briar/android/messages/ContactNameSpinnerAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..168d7aa81ee78d694e55999c3cd80df44597b5a9
--- /dev/null
+++ b/briar-android/src/net/sf/briar/android/messages/ContactNameSpinnerAdapter.java
@@ -0,0 +1,35 @@
+package net.sf.briar.android.messages;
+
+import java.util.ArrayList;
+
+import net.sf.briar.api.Contact;
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.SpinnerAdapter;
+import android.widget.TextView;
+
+class ContactNameSpinnerAdapter extends ArrayAdapter<Contact>
+implements SpinnerAdapter {
+
+	ContactNameSpinnerAdapter(Context context) {
+		super(context, android.R.layout.simple_spinner_item,
+				new ArrayList<Contact>());
+	}
+
+	@Override
+	public View getView(int position, View convertView, ViewGroup parent) {
+		TextView name = new TextView(getContext());
+		name.setTextSize(18);
+		name.setPadding(10, 10, 10, 10);
+		name.setText(getItem(position).getName());
+		return name;
+	}
+
+	@Override
+	public View getDropDownView(int position, View convertView,
+			ViewGroup parent) {
+		return getView(position, convertView, parent);
+	}
+}
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 5133f5cb065d2191b20d91f9cbbda8c73ff37ee6..ec063dfba0e22368be36b5979f53f9f6035518ef 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java
@@ -168,7 +168,6 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
 	public void onClick(View view) {
 		Intent i = new Intent(this, WriteMessageActivity.class);
 		i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt());
-		i.putExtra("net.sf.briar.CONTACT_NAME", contactName);
 		startActivity(i);
 	}
 
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 56045f7db5699532e0ecf5c06c6fa191ace2b4d4..296d7f95a17aa6f33cdeaa8aa0f55a3e67b22ce8 100644
--- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java
@@ -169,7 +169,7 @@ implements OnClickListener, DatabaseListener {
 	}
 
 	public void onClick(View view) {
-		// FIXME: Hook this button up to an activity
+		startActivity(new Intent(this, WriteMessageActivity.class));
 	}
 
 	public void eventOccurred(DatabaseEvent e) {
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 24a724da5605cf23d4692f3ad908081f0a2ed9a8..00adfb06e6047b32b9295e65c28256a32edd0dfb 100644
--- a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java
@@ -278,7 +278,6 @@ implements OnClickListener {
 		} 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);
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 4dc25a4580be768619e74275e30f6d5c9d34539c..fc54d5fb4b6abd5a6a5813d05dcef40268913eb3 100644
--- a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java
+++ b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java
@@ -8,6 +8,7 @@ import static java.util.logging.Level.WARNING;
 
 import java.io.IOException;
 import java.security.GeneralSecurityException;
+import java.util.Collection;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
@@ -16,6 +17,8 @@ import net.sf.briar.android.BriarActivity;
 import net.sf.briar.android.BriarService;
 import net.sf.briar.android.BriarService.BriarServiceConnection;
 import net.sf.briar.android.widgets.CommonLayoutParams;
+import net.sf.briar.android.widgets.HorizontalSpace;
+import net.sf.briar.api.Contact;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.android.BundleEncrypter;
 import net.sf.briar.api.db.DatabaseComponent;
@@ -29,15 +32,18 @@ import android.os.Bundle;
 import android.os.Parcelable;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemSelectedListener;
 import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
+import android.widget.Spinner;
 import android.widget.TextView;
 
 import com.google.inject.Inject;
 
 public class WriteMessageActivity extends BriarActivity
-implements OnClickListener {
+implements OnClickListener, OnItemSelectedListener {
 
 	private static final Logger LOG =
 			Logger.getLogger(WriteMessageActivity.class.getName());
@@ -51,8 +57,9 @@ implements OnClickListener {
 	@Inject private MessageFactory messageFactory;
 
 	private ContactId contactId = null;
-	private String contactName = null;
 	private MessageId parentId = null;
+	private ContactNameSpinnerAdapter adapter = null;
+	private ImageButton sendButton = null;
 	private EditText content = null;
 
 	@Override
@@ -61,10 +68,7 @@ implements OnClickListener {
 
 		Intent i = getIntent();
 		int cid = i.getIntExtra("net.sf.briar.CONTACT_ID", -1);
-		if(cid == -1) throw new IllegalStateException();
-		contactId = new ContactId(cid);
-		contactName = i.getStringExtra("net.sf.briar.CONTACT_NAME");
-		if(contactName == null) throw new IllegalStateException();
+		if(cid != -1) contactId = new ContactId(cid);
 		byte[] pid = i.getByteArrayExtra("net.sf.briar.PARENT_ID");
 		if(pid != null) parentId = new MessageId(pid);
 
@@ -78,17 +82,46 @@ implements OnClickListener {
 		actionBar.setGravity(CENTER_VERTICAL);
 
 		TextView to = new TextView(this);
-		// Give me all the unused width
-		to.setLayoutParams(CommonLayoutParams.WRAP_WRAP_1);
 		to.setTextSize(18);
 		to.setPadding(10, 10, 10, 10);
-		String format = getResources().getString(R.string.message_to);
-		to.setText(String.format(format, contactName));
+		to.setText(R.string.message_to);
 		actionBar.addView(to);
 
-		ImageButton sendButton = new ImageButton(this);
+		adapter = new ContactNameSpinnerAdapter(this);
+		final Spinner spinner = new Spinner(this);
+		spinner.setAdapter(adapter);
+		spinner.setOnItemSelectedListener(this);
+		dbExecutor.execute(new Runnable() {
+			public void run() {
+				try {
+					serviceConnection.waitForStartup();
+					final Collection<Contact> contacts = db.getContacts();
+					runOnUiThread(new Runnable() {
+						public void run() {
+							for(Contact c : contacts) {
+								if(c.getId().equals(contactId))
+									spinner.setSelection(adapter.getCount());
+								adapter.add(c);
+							}
+						}
+					});
+				} catch(DbException e) {
+					if(LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				} catch(InterruptedException e) {
+					LOG.info("Interrupted while waiting for service");
+					Thread.currentThread().interrupt();
+				}
+			}
+		});
+		actionBar.addView(spinner);
+
+		actionBar.addView(new HorizontalSpace(this));
+
+		sendButton = new ImageButton(this);
 		sendButton.setBackgroundResource(0);
 		sendButton.setImageResource(R.drawable.social_send_now);
+		sendButton.setEnabled(false);
 		sendButton.setOnClickListener(this);
 		actionBar.addView(sendButton);
 		layout.addView(actionBar);
@@ -122,6 +155,7 @@ implements OnClickListener {
 	}
 
 	public void onClick(View view) {
+		if(contactId == null) throw new IllegalStateException();
 		final Message m;
 		try {
 			byte[] body = content.getText().toString().getBytes("UTF-8");
@@ -150,4 +184,15 @@ implements OnClickListener {
 		});
 		finish();
 	}
+
+	public void onItemSelected(AdapterView<?> parent, View view, int position,
+			long id) {
+		contactId = adapter.getItem(position).getId();
+		sendButton.setEnabled(true);
+	}
+
+	public void onNothingSelected(AdapterView<?> parent) {
+		contactId = null;
+		sendButton.setEnabled(false);
+	}
 }