diff --git a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java
index bb26a29ad7b8ec01ac7cd28b9e489938b5404f70..6616fe87caf06145b74429535c7393fbc20b231a 100644
--- a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java
@@ -12,7 +12,6 @@ import org.briarproject.R;
 import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.android.view.LargeTextInputView;
 import org.briarproject.android.view.TextInputView.TextInputListener;
-import org.briarproject.util.StringUtils;
 
 import static org.briarproject.api.sharing.SharingConstants.MAX_INVITATION_MESSAGE_LENGTH;
 import static org.briarproject.util.StringUtils.truncateUtf8;
@@ -78,7 +77,10 @@ abstract class BaseMessageFragment extends BaseFragment
 		message.hideSoftKeyboard();
 
 		msg = truncateUtf8(msg, MAX_INVITATION_MESSAGE_LENGTH);
-		listener.onButtonClick(msg);
+		if(!listener.onButtonClick(msg)) {
+			message.setSendButtonEnabled(true);
+			message.showSoftKeyboard();
+		}
 	}
 
 	public interface MessageFragmentListener {
@@ -87,7 +89,8 @@ abstract class BaseMessageFragment extends BaseFragment
 
 		void setTitle(@StringRes int titleRes);
 
-		void onButtonClick(String message);
+		/** Returns true when the button click has been consumed. */
+		boolean onButtonClick(String message);
 
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..793353de59dbec5aebac7b0dcd5fa1745692f926
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java
@@ -0,0 +1,92 @@
+package org.briarproject.android.sharing;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.CallSuper;
+import android.support.annotation.UiThread;
+
+import org.briarproject.R;
+import org.briarproject.android.BriarActivity;
+import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.db.DbException;
+import org.briarproject.api.sync.GroupId;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public abstract class ContactSelectorActivity extends BriarActivity implements
+		BaseFragmentListener, ContactSelectorListener {
+
+	final static String CONTACTS = "contacts";
+
+	protected volatile GroupId groupId;
+	protected volatile Collection<ContactId> contacts;
+
+	@Override
+	public void onCreate(Bundle bundle) {
+		super.onCreate(bundle);
+
+		setContentView(R.layout.activity_fragment_container);
+
+		if (bundle != null) {
+			ArrayList<Integer> intContacts =
+					bundle.getIntegerArrayList(CONTACTS);
+			if (intContacts != null) {
+				contacts = getContactsFromIntegers(intContacts);
+			}
+		}
+	}
+
+	@Override
+	public void onSaveInstanceState(Bundle outState) {
+		super.onSaveInstanceState(outState);
+		if (contacts != null) {
+			outState.putIntegerArrayList(CONTACTS,
+					getContactsFromIds(contacts));
+		}
+	}
+
+	@CallSuper
+	@UiThread
+	@Override
+	public void contactsSelected(GroupId groupId,
+			Collection<ContactId> contacts) {
+		this.groupId = groupId;
+		this.contacts = contacts;
+	}
+
+	/**
+	 * This must only be called from a DbThread
+	 */
+	public abstract boolean isDisabled(GroupId groupId, Contact c)
+			throws DbException;
+
+	static ArrayList<Integer> getContactsFromIds(
+			Collection<ContactId> contacts) {
+		// transform ContactIds to Integers so they can be added to a bundle
+		ArrayList<Integer> intContacts = new ArrayList<>(contacts.size());
+		for (ContactId contactId : contacts) {
+			intContacts.add(contactId.getInt());
+		}
+		return intContacts;
+	}
+
+	static Collection<ContactId> getContactsFromIntegers(
+			ArrayList<Integer> intContacts) {
+		// turn contact integers from a bundle back to ContactIds
+		List<ContactId> contacts = new ArrayList<>(intContacts.size());
+		for (Integer c : intContacts) {
+			contacts.add(new ContactId(c));
+		}
+		return contacts;
+	}
+
+	@Override
+	public void onFragmentCreated(String tag) {
+
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
index 85c1cbc2d135caffc04df531b87771f9387d14e8..81241e603eb8006b3aa903758815100cffbbcaa1 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
@@ -7,38 +7,27 @@ import android.support.annotation.UiThread;
 import android.widget.Toast;
 
 import org.briarproject.R;
-import org.briarproject.android.BriarActivity;
-import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
 import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener;
-import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.sync.GroupId;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import java.util.logging.Logger;
 
 import static android.widget.Toast.LENGTH_SHORT;
 import static java.util.logging.Level.WARNING;
 
-public abstract class ShareActivity extends BriarActivity implements
-		BaseFragmentListener, ContactSelectorListener, MessageFragmentListener {
+public abstract class ShareActivity extends ContactSelectorActivity implements
+		MessageFragmentListener {
 
 	private final static Logger LOG =
 			Logger.getLogger(ShareActivity.class.getName());
-	final static String CONTACTS = "contacts";
-
-	private volatile GroupId groupId;
-	private volatile Collection<ContactId> contacts;
 
 	@Override
 	public void onCreate(Bundle bundle) {
 		super.onCreate(bundle);
 
-		setContentView(R.layout.activity_fragment_container);
-
 		Intent i = getIntent();
 		byte[] b = i.getByteArrayExtra(GROUP_ID);
 		if (b == null) throw new IllegalStateException("No GroupId");
@@ -50,21 +39,6 @@ public abstract class ShareActivity extends BriarActivity implements
 			getSupportFragmentManager().beginTransaction()
 					.add(R.id.fragmentContainer, contactSelectorFragment)
 					.commit();
-		} else {
-			ArrayList<Integer> intContacts =
-					bundle.getIntegerArrayList(CONTACTS);
-			if (intContacts != null) {
-				contacts = getContactsFromIntegers(intContacts);
-			}
-		}
-	}
-
-	@Override
-	public void onSaveInstanceState(Bundle outState) {
-		super.onSaveInstanceState(outState);
-		if (contacts != null) {
-			outState.putIntegerArrayList(CONTACTS,
-					getContactsFromIds(contacts));
 		}
 	}
 
@@ -72,11 +46,9 @@ public abstract class ShareActivity extends BriarActivity implements
 	@Override
 	public void contactsSelected(GroupId groupId,
 			Collection<ContactId> contacts) {
-		this.groupId = groupId;
-		this.contacts = contacts;
+		super.contactsSelected(groupId, contacts);
 
 		BaseMessageFragment messageFragment = getMessageFragment();
-
 		getSupportFragmentManager().beginTransaction()
 				.setCustomAnimations(android.R.anim.fade_in,
 						android.R.anim.fade_out,
@@ -90,38 +62,13 @@ public abstract class ShareActivity extends BriarActivity implements
 
 	abstract BaseMessageFragment getMessageFragment();
 
-	/**
-	 * This must only be called from a DbThread
-	 */
-	public abstract boolean isDisabled(GroupId groupId, Contact c)
-			throws DbException;
-
-	static ArrayList<Integer> getContactsFromIds(
-			Collection<ContactId> contacts) {
-		// transform ContactIds to Integers so they can be added to a bundle
-		ArrayList<Integer> intContacts = new ArrayList<>(contacts.size());
-		for (ContactId contactId : contacts) {
-			intContacts.add(contactId.getInt());
-		}
-		return intContacts;
-	}
-
-	static Collection<ContactId> getContactsFromIntegers(
-			ArrayList<Integer> intContacts) {
-		// turn contact integers from a bundle back to ContactIds
-		List<ContactId> contacts = new ArrayList<>(intContacts.size());
-		for (Integer c : intContacts) {
-			contacts.add(new ContactId(c));
-		}
-		return contacts;
-	}
-
 	@UiThread
 	@Override
-	public void onButtonClick(String message) {
+	public boolean onButtonClick(String message) {
 		share(message);
 		setResult(RESULT_OK);
 		supportFinishAfterTransition();
+		return true;
 	}
 
 	private void share(final String msg) {
@@ -160,9 +107,4 @@ public abstract class ShareActivity extends BriarActivity implements
 
 	protected abstract @StringRes int getSharingError();
 
-	@Override
-	public void onFragmentCreated(String tag) {
-
-	}
-
 }