diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index eab3a2c91e18e1e07780db31aa3baf4cfb9cc259..75eb3e9125cc927f4470e4b462d3412e1ebed6ee 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -69,6 +69,7 @@
 			android:name=".android.contact.ConversationActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
+			android:windowSoftInputMode="stateHidden"
 		    android:parentActivityName=".android.contact.ContactListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
index 15d5dbcbba006d3151287c2af4531609bc67c3ba..87db736da1e0691cb1ae6659ccc241ee64276084 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
@@ -126,8 +126,7 @@ ConnectionListener {
 									db.getInboxMessageHeaders(c.getId());
 							displayContact(c, lastConnected, inbox, headers);
 						} catch(NoSuchContactException e) {
-							if(LOG.isLoggable(INFO))
-								LOG.info("Contact removed");
+							// Continue
 						}
 					}
 					long duration = System.currentTimeMillis() - now;
@@ -251,7 +250,6 @@ ConnectionListener {
 						LOG.info("Partial load took " + duration + " ms");
 					updateItem(c, headers);
 				} catch(NoSuchContactException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Contact removed");
 					removeItem(c);
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 930193ce07d86e1e9cb385de477bac1fc990a64e..189d88d44f6195c90b9d895d48b546c1700a5c15 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -1,15 +1,23 @@
 package org.briarproject.android.contact;
 
-import static android.view.Gravity.CENTER_HORIZONTAL;
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
+import static android.view.inputmethod.InputMethodManager.HIDE_IMPLICIT_ONLY;
+import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
+import static android.widget.Toast.LENGTH_SHORT;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
+import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
 
+import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -29,31 +37,41 @@ import org.briarproject.android.util.ListLoadingProgressBar;
 import org.briarproject.api.AuthorId;
 import org.briarproject.api.ContactId;
 import org.briarproject.api.android.DatabaseUiExecutor;
+import org.briarproject.api.crypto.CryptoExecutor;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.MessageHeader;
 import org.briarproject.api.db.NoSuchContactException;
 import org.briarproject.api.db.NoSuchMessageException;
+import org.briarproject.api.db.NoSuchSubscriptionException;
 import org.briarproject.api.event.ContactRemovedEvent;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.MessageExpiredEvent;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.messaging.Group;
 import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.messaging.Message;
+import org.briarproject.api.messaging.MessageFactory;
 import org.briarproject.api.messaging.MessageId;
+import org.briarproject.util.StringUtils;
 
 import android.content.Intent;
 import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
+import android.text.InputType;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
+import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.ListView;
+import android.widget.Toast;
 
 public class ConversationActivity extends BriarActivity
 implements EventListener, OnClickListener, OnItemClickListener {
@@ -62,18 +80,23 @@ implements EventListener, OnClickListener, OnItemClickListener {
 	private static final Logger LOG =
 			Logger.getLogger(ConversationActivity.class.getName());
 
+	@Inject @CryptoExecutor private Executor cryptoExecutor;
 	private Map<MessageId, byte[]> bodyCache = new HashMap<MessageId, byte[]>();
 	private String contactName = null;
 	private ConversationAdapter adapter = null;
 	private ListView list = null;
 	private ListLoadingProgressBar loading = null;
+	private EditText content = null;
+	private ImageButton sendButton = null;
 
 	// Fields that are accessed from background threads must be volatile
 	@Inject private volatile DatabaseComponent db;
 	@Inject @DatabaseUiExecutor private volatile Executor dbUiExecutor;
 	@Inject private volatile LifecycleManager lifecycleManager;
+	@Inject private volatile MessageFactory messageFactory;
 	private volatile ContactId contactId = null;
 	private volatile GroupId groupId = null;
+	private volatile Group group = null;
 	private volatile AuthorId localAuthorId = null;
 
 	@Override
@@ -97,7 +120,6 @@ implements EventListener, OnClickListener, OnItemClickListener {
 		LinearLayout layout = new LinearLayout(this);
 		layout.setLayoutParams(MATCH_MATCH);
 		layout.setOrientation(VERTICAL);
-		layout.setGravity(CENTER_HORIZONTAL);
 
 		adapter = new ConversationAdapter(this);
 		list = new ListView(this);
@@ -111,20 +133,35 @@ implements EventListener, OnClickListener, OnItemClickListener {
 		list.setDividerHeight(LayoutUtils.getSeparatorWidth(this));
 		list.setAdapter(adapter);
 		list.setOnItemClickListener(this);
+		list.setVisibility(GONE);
 		layout.addView(list);
 
 		// Show a progress bar while the list is loading
-		list.setVisibility(GONE);
 		loading = new ListLoadingProgressBar(this);
 		layout.addView(loading);
 
 		layout.addView(new HorizontalBorder(this));
 
-		ImageButton composeButton = new ImageButton(this);
-		composeButton.setBackgroundResource(0);
-		composeButton.setImageResource(R.drawable.content_new_email);
-		composeButton.setOnClickListener(this);
-		layout.addView(composeButton);
+		LinearLayout footer = new LinearLayout(this);
+		footer.setLayoutParams(MATCH_WRAP);
+		footer.setOrientation(HORIZONTAL);
+
+		content = new EditText(this);
+		content.setId(1);
+		content.setLayoutParams(WRAP_WRAP_1);
+		int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE
+				| TYPE_TEXT_FLAG_CAP_SENTENCES;
+		content.setInputType(inputType);
+		footer.addView(content);
+
+		sendButton = new ImageButton(this);
+		sendButton.setId(2);
+		sendButton.setBackgroundResource(0);
+		sendButton.setImageResource(R.drawable.social_send_now);
+		sendButton.setEnabled(false); // Enabled after loading the group
+		sendButton.setOnClickListener(this);
+		footer.addView(sendButton);
+		layout.addView(footer);
 
 		setContentView(layout);
 	}
@@ -133,10 +170,10 @@ implements EventListener, OnClickListener, OnItemClickListener {
 	public void onResume() {
 		super.onResume();
 		db.addListener(this);
-		loadHeaders();
+		loadHeadersAndGroup();
 	}
 
-	private void loadHeaders() {
+	private void loadHeadersAndGroup() {
 		dbUiExecutor.execute(new Runnable() {
 			public void run() {
 				try {
@@ -144,12 +181,14 @@ implements EventListener, OnClickListener, OnItemClickListener {
 					long now = System.currentTimeMillis();
 					Collection<MessageHeader> headers =
 							db.getInboxMessageHeaders(contactId);
+					group = db.getGroup(groupId);
 					long duration = System.currentTimeMillis() - now;
 					if(LOG.isLoggable(INFO))
-						LOG.info("Loading headers took " + duration + " ms");
+						LOG.info("Load took " + duration + " ms");
 					displayHeaders(headers);
 				} catch(NoSuchContactException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Contact removed");
+					finishOnUiThread();
+				} catch(NoSuchSubscriptionException e) {
 					finishOnUiThread();
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
@@ -168,6 +207,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 			public void run() {
 				list.setVisibility(VISIBLE);
 				loading.setVisibility(GONE);
+				sendButton.setEnabled(true);
 				adapter.clear();
 				for(MessageHeader h : headers) {
 					ConversationItem item = new ConversationItem(h);
@@ -196,7 +236,6 @@ implements EventListener, OnClickListener, OnItemClickListener {
 						LOG.info("Loading message took " + duration + " ms");
 					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
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
@@ -297,20 +336,67 @@ implements EventListener, OnClickListener, OnItemClickListener {
 			GroupId g = ((MessageAddedEvent) e).getGroup().getId();
 			if(g.equals(groupId)) {
 				if(LOG.isLoggable(INFO)) LOG.info("Message added, reloading");
-				loadHeaders();
+				loadHeadersAndGroup();
 			}
 		} else if(e instanceof MessageExpiredEvent) {
 			if(LOG.isLoggable(INFO)) LOG.info("Message expired, reloading");
-			loadHeaders();
+			loadHeadersAndGroup();
 		}
 	}
 
 	public void onClick(View view) {
-		Intent i = new Intent(this, WritePrivateMessageActivity.class);
-		i.putExtra("briar.CONTACT_NAME", contactName);
-		i.putExtra("briar.GROUP_ID", groupId.getBytes());
-		i.putExtra("briar.LOCAL_AUTHOR_ID", localAuthorId.getBytes());
-		startActivity(i);
+		// Don't use an earlier timestamp than the newest message
+		long timestamp = System.currentTimeMillis();
+		int count = adapter.getCount();
+		for(int i = 0; i < count; i++) {
+			long time = adapter.getItem(i).getHeader().getTimestamp() + 1;
+			if(time > timestamp) timestamp = time;
+		}
+		byte[] body = StringUtils.toUtf8(content.getText().toString());
+		createMessage(body, timestamp);
+		Toast.makeText(this, R.string.message_sent_toast, LENGTH_SHORT).show();
+		content.setText("");
+		// Hide the soft keyboard
+		Object o = getSystemService(INPUT_METHOD_SERVICE);
+		((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0);
+	}
+
+	private void createMessage(final byte[] body, final long timestamp) {
+		cryptoExecutor.execute(new Runnable() {
+			public void run() {
+				try {
+					Message m = messageFactory.createAnonymousMessage(null,
+							group, "text/plain", timestamp, body);
+					storeMessage(m);
+				} catch(GeneralSecurityException e) {
+					throw new RuntimeException(e);
+				} catch(IOException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		});
+	}
+
+	private void storeMessage(final Message m) {
+		dbUiExecutor.execute(new Runnable() {
+			public void run() {
+				try {
+					lifecycleManager.waitForDatabase();
+					long now = System.currentTimeMillis();
+					db.addLocalMessage(m);
+					long duration = System.currentTimeMillis() - now;
+					if(LOG.isLoggable(INFO))
+						LOG.info("Storing message took " + duration + " ms");
+				} catch(DbException e) {
+					if(LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				} catch(InterruptedException e) {
+					if(LOG.isLoggable(INFO))
+						LOG.info("Interrupted while waiting for database");
+					Thread.currentThread().interrupt();
+				}
+			}
+		});
 	}
 
 	public void onItemClick(AdapterView<?> parent, View view, int position,
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index d0c2aa1c5ba98f5415b0fdfbbc9901a0e1c40761..4d7c3b1a3190d16c173827757c6442ebe45c8c44 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -47,8 +47,6 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 		Context ctx = getContext();
 		Resources res = ctx.getResources();
 
-		RelativeLayout layout = new RelativeLayout(ctx);
-
 		int background;
 		if(header.isRead()) background = res.getColor(R.color.read_background);
 		else background = res.getColor(R.color.unread_background);
@@ -82,6 +80,7 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 		ImageView bubble = new ImageView(ctx);
 		bubble.setId(3);
 
+		RelativeLayout layout = new RelativeLayout(ctx);
 		if(header.isLocal()) {
 			Drawable d;
 			if(header.isRead())
@@ -89,19 +88,19 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 			else d = res.getDrawable(R.drawable.bubble_unread_right);
 			bubble.setImageDrawable(d);
 			layout.setPadding(d.getIntrinsicWidth(), 0, 0, 0);
+			// Bubble tip and date at the top right, content below
 			date.setGravity(RIGHT);
-			// Bubble point at the top right, date on top, content below
 			RelativeLayout.LayoutParams topRight =
-					CommonLayoutParams.wrapWrap();
+					CommonLayoutParams.relative();
 			topRight.addRule(ALIGN_PARENT_TOP);
 			topRight.addRule(ALIGN_PARENT_RIGHT);
 			layout.addView(bubble, topRight);
-			RelativeLayout.LayoutParams leftOf = CommonLayoutParams.wrapWrap();
+			RelativeLayout.LayoutParams leftOf = CommonLayoutParams.relative();
 			leftOf.addRule(ALIGN_PARENT_TOP);
 			leftOf.addRule(ALIGN_PARENT_LEFT);
 			leftOf.addRule(LEFT_OF, 3);
 			layout.addView(date, leftOf);
-			RelativeLayout.LayoutParams below = CommonLayoutParams.wrapWrap();
+			RelativeLayout.LayoutParams below = CommonLayoutParams.relative();
 			below.addRule(ALIGN_PARENT_LEFT);
 			below.addRule(LEFT_OF, 3);
 			below.addRule(BELOW, 1);
@@ -113,24 +112,23 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 			else d = res.getDrawable(R.drawable.bubble_unread_left);
 			bubble.setImageDrawable(d);
 			layout.setPadding(0, 0, d.getIntrinsicWidth(), 0);
+			// Bubble tip and date at the top left, content below
 			date.setGravity(LEFT);
-			// Bubble point at the top left, date on top, content below
-			RelativeLayout.LayoutParams topLeft = CommonLayoutParams.wrapWrap();
+			RelativeLayout.LayoutParams topLeft = CommonLayoutParams.relative();
 			topLeft.addRule(ALIGN_PARENT_TOP);
 			topLeft.addRule(ALIGN_PARENT_LEFT);
 			layout.addView(bubble, topLeft);
-			RelativeLayout.LayoutParams rightOf = CommonLayoutParams.wrapWrap();
+			RelativeLayout.LayoutParams rightOf = CommonLayoutParams.relative();
 			rightOf.addRule(ALIGN_PARENT_TOP);
 			rightOf.addRule(ALIGN_PARENT_RIGHT);
 			rightOf.addRule(RIGHT_OF, 3);
 			layout.addView(date, rightOf);
-			RelativeLayout.LayoutParams below = CommonLayoutParams.wrapWrap();
+			RelativeLayout.LayoutParams below = CommonLayoutParams.relative();
 			below.addRule(ALIGN_PARENT_RIGHT);
 			below.addRule(RIGHT_OF, 3);
 			below.addRule(BELOW, 1);
 			layout.addView(content, below);
 		}
-
 		return layout;
 	}
 }
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
index 4bf4e31d9983777ba4194463ecf76de7d4bf5468..57d00c6e32a39b4baf947b38bfa4cc1bfdf65c41 100644
--- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
@@ -233,7 +233,6 @@ implements OnClickListener {
 						}
 					});
 				} catch(NoSuchMessageException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Message removed");
 					finishOnUiThread();
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
index b04b8a5905e10dc31927d2d496eceaafc16479fd..c8249d40bd357ad0aa3cc2aad39166b6f66a1501 100644
--- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
@@ -59,6 +59,7 @@ implements OnClickListener {
 	private static final Logger LOG =
 			Logger.getLogger(WritePrivateMessageActivity.class.getName());
 
+	@Inject @CryptoExecutor private Executor cryptoExecutor;
 	private TextView from = null, to = null;
 	private ImageButton sendButton = null;
 	private EditText content = null;
@@ -67,7 +68,6 @@ implements OnClickListener {
 	@Inject private volatile DatabaseComponent db;
 	@Inject @DatabaseUiExecutor private volatile Executor dbUiExecutor;
 	@Inject private volatile LifecycleManager lifecycleManager;
-	@Inject @CryptoExecutor private volatile Executor cryptoExecutor;
 	@Inject private volatile MessageFactory messageFactory;
 	private volatile String contactName = null;
 	private volatile GroupId groupId = null;
@@ -108,7 +108,7 @@ implements OnClickListener {
 		from.setEllipsize(END);
 		from.setPadding(pad, pad, pad, pad);
 		from.setText(R.string.from);
-		RelativeLayout.LayoutParams leftOf = CommonLayoutParams.wrapWrap();
+		RelativeLayout.LayoutParams leftOf = CommonLayoutParams.relative();
 		leftOf.addRule(ALIGN_PARENT_LEFT);
 		leftOf.addRule(CENTER_VERTICAL);
 		leftOf.addRule(LEFT_OF, 2);
@@ -120,7 +120,7 @@ implements OnClickListener {
 		sendButton.setImageResource(R.drawable.social_send_now);
 		sendButton.setEnabled(false); // Enabled after loading the group
 		sendButton.setOnClickListener(this);
-		RelativeLayout.LayoutParams right = CommonLayoutParams.wrapWrap();
+		RelativeLayout.LayoutParams right = CommonLayoutParams.relative();
 		right.addRule(ALIGN_PARENT_RIGHT);
 		right.addRule(CENTER_VERTICAL);
 		header.addView(sendButton, right);
@@ -148,7 +148,7 @@ implements OnClickListener {
 	@Override
 	public void onResume() {
 		super.onResume();
-		loadAuthorAndGroup();
+		if(localAuthor == null || group == null) loadAuthorAndGroup();
 	}
 
 	private void loadAuthorAndGroup() {
@@ -191,7 +191,6 @@ implements OnClickListener {
 	}
 
 	public void onClick(View view) {
-		if(localAuthor == null) throw new IllegalStateException();
 		createMessage(StringUtils.toUtf8(content.getText().toString()));
 		Toast.makeText(this, R.string.message_sent_toast, LENGTH_LONG).show();
 		finish();
@@ -203,16 +202,15 @@ implements OnClickListener {
 				// Don't use an earlier timestamp than the parent
 				long time = System.currentTimeMillis();
 				time = Math.max(time, timestamp + 1);
-				Message m;
 				try {
-					m = messageFactory.createAnonymousMessage(parentId, group,
-							"text/plain", time, body);
+					Message m = messageFactory.createAnonymousMessage(parentId,
+							group, "text/plain", time, body);
+					storeMessage(m);
 				} catch(GeneralSecurityException e) {
 					throw new RuntimeException(e);
 				} catch(IOException e) {
 					throw new RuntimeException(e);
 				}
-				storeMessage(m);
 			}
 		});
 	}
diff --git a/briar-android/src/org/briarproject/android/groups/GroupActivity.java b/briar-android/src/org/briarproject/android/groups/GroupActivity.java
index 8f14857a0ef8bf43a8555d1582a8e1f72fe6c3d9..0a363c8f581ea8d33edc562bea528e36190c09f3 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupActivity.java
@@ -131,7 +131,6 @@ OnClickListener, OnItemClickListener {
 						LOG.info("Load took " + duration + " ms");
 					displayHeaders(headers);
 				} catch(NoSuchSubscriptionException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Subscription removed");
 					finishOnUiThread();
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
@@ -178,7 +177,6 @@ OnClickListener, OnItemClickListener {
 						LOG.info("Loading message took " + duration + " ms");
 					displayMessage(h.getId(), body);
 				} catch(NoSuchMessageException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Message expired");
 					// The item will be removed when we get the event
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/groups/GroupListActivity.java b/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
index 0951f8c62273457e2b9df76f141f03d410c7f39d..959793b6632fec61dd993db3ba52211dcbeb347e 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
@@ -143,8 +143,7 @@ implements EventListener, OnClickListener, OnItemClickListener {
 										db.getMessageHeaders(g.getId());
 								displayHeaders(g, headers);
 							} catch(NoSuchSubscriptionException e) {
-								if(LOG.isLoggable(INFO))
-									LOG.info("Subscription removed");
+								// Continue
 							}
 						} else {
 							available++;
@@ -279,7 +278,6 @@ implements EventListener, OnClickListener, OnItemClickListener {
 						LOG.info("Partial load took " + duration + " ms");
 					displayHeaders(g, headers);
 				} catch(NoSuchSubscriptionException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Subscription removed");
 					removeGroup(g.getId());
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java b/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java
index 6118588c9d4b4efdfc8a16c21d29f67df97ef716..7178f879a4923a784df37946f303c973d154df1c 100644
--- a/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java
@@ -230,7 +230,6 @@ implements OnClickListener {
 						}
 					});
 				} catch(NoSuchMessageException e) {
-					if(LOG.isLoggable(INFO)) LOG.info("Message removed");
 					finishOnUiThread();
 				} catch(DbException e) {
 					if(LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java b/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java
index b822d48e69e362c5ac657007a70ac2601b0e74e8..d78bb46029c0e0e67d2a100c2b6e294741de096e 100644
--- a/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java
@@ -119,7 +119,7 @@ implements OnItemSelectedListener, OnClickListener {
 		from.setTextSize(18);
 		from.setPadding(pad, pad, 0, pad);
 		from.setText(R.string.from);
-		RelativeLayout.LayoutParams left = CommonLayoutParams.wrapWrap();
+		RelativeLayout.LayoutParams left = CommonLayoutParams.relative();
 		left.addRule(ALIGN_PARENT_LEFT);
 		left.addRule(CENTER_VERTICAL);
 		header.addView(from, left);
@@ -129,7 +129,7 @@ implements OnItemSelectedListener, OnClickListener {
 		spinner.setId(2);
 		spinner.setAdapter(adapter);
 		spinner.setOnItemSelectedListener(this);
-		RelativeLayout.LayoutParams between = CommonLayoutParams.wrapWrap();
+		RelativeLayout.LayoutParams between = CommonLayoutParams.relative();
 		between.addRule(CENTER_VERTICAL);
 		between.addRule(RIGHT_OF, 1);
 		between.addRule(LEFT_OF, 3);
@@ -141,7 +141,7 @@ implements OnItemSelectedListener, OnClickListener {
 		sendButton.setImageResource(R.drawable.social_send_now);
 		sendButton.setEnabled(false); // Enabled after loading the group
 		sendButton.setOnClickListener(this);
-		RelativeLayout.LayoutParams right = CommonLayoutParams.wrapWrap();
+		RelativeLayout.LayoutParams right = CommonLayoutParams.relative();
 		right.addRule(ALIGN_PARENT_RIGHT);
 		right.addRule(CENTER_VERTICAL);
 		header.addView(sendButton, right);
diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java
index bf49325a4bb791ad18b20db40af2c49660023a0c..40e55ce8ab1cb5a4cc3a8cf91e309eaf68f9d7c8 100644
--- a/briar-android/src/org/briarproject/android/util/AuthorView.java
+++ b/briar-android/src/org/briarproject/android/util/AuthorView.java
@@ -28,7 +28,7 @@ public class AuthorView extends RelativeLayout {
 		nameView.setPadding(pad, pad, pad, pad);
 		if(name == null) nameView.setText(R.string.anonymous);
 		else nameView.setText(name);
-		LayoutParams leftOf = CommonLayoutParams.wrapWrap();
+		LayoutParams leftOf = CommonLayoutParams.relative();
 		leftOf.addRule(ALIGN_PARENT_LEFT);
 		leftOf.addRule(CENTER_VERTICAL);
 		leftOf.addRule(LEFT_OF, 2);
@@ -51,7 +51,7 @@ public class AuthorView extends RelativeLayout {
 			statusView.setImageResource(R.drawable.identity_verified);
 			break;
 		}
-		LayoutParams right = CommonLayoutParams.wrapWrap();
+		LayoutParams right = CommonLayoutParams.relative();
 		right.addRule(ALIGN_PARENT_RIGHT);
 		right.addRule(CENTER_VERTICAL);
 		addView(statusView, right);
diff --git a/briar-android/src/org/briarproject/android/util/CommonLayoutParams.java b/briar-android/src/org/briarproject/android/util/CommonLayoutParams.java
index 23ac065d420a821cb88e3d54c2a2e39abc21849e..cf735c6b41d8c8b75816b4f2e49814d93d9363d2 100644
--- a/briar-android/src/org/briarproject/android/util/CommonLayoutParams.java
+++ b/briar-android/src/org/briarproject/android/util/CommonLayoutParams.java
@@ -23,7 +23,7 @@ public class CommonLayoutParams {
 	public static final LinearLayout.LayoutParams WRAP_WRAP_1 =
 			new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, 1);
 
-	public static RelativeLayout.LayoutParams wrapWrap() {
+	public static RelativeLayout.LayoutParams relative() {
 		return new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
 	}
 }
diff --git a/briar-android/src/org/briarproject/android/util/LayoutUtils.java b/briar-android/src/org/briarproject/android/util/LayoutUtils.java
index cef095e2374816580f35c509277100c0e4b740d8..52b1ed994537e6c67bcd012cb80d2d2dba8af1a2 100644
--- a/briar-android/src/org/briarproject/android/util/LayoutUtils.java
+++ b/briar-android/src/org/briarproject/android/util/LayoutUtils.java
@@ -10,7 +10,7 @@ public class LayoutUtils {
 	public static int getSeparatorWidth(Context ctx) {
 		DisplayMetrics metrics = getDisplayMetrics(ctx);
 		int percent = Math.max(metrics.widthPixels, metrics.heightPixels) / 100;
-		return Math.max(2, percent - 6);
+		return Math.max(2, percent - 7);
 	}
 
 	public static int getPadding(Context ctx) {