diff --git a/briar-android/src/org/briarproject/android/ActivityComponent.java b/briar-android/src/org/briarproject/android/ActivityComponent.java
index e350683529b7ce312f9a673e36cc15ffcd48b579..6db54c450adc88c6f0753bfd4cd65621b587a8d8 100644
--- a/briar-android/src/org/briarproject/android/ActivityComponent.java
+++ b/briar-android/src/org/briarproject/android/ActivityComponent.java
@@ -33,17 +33,19 @@ import org.briarproject.android.privategroup.creation.CreateGroupActivity;
 import org.briarproject.android.privategroup.creation.CreateGroupFragment;
 import org.briarproject.android.privategroup.creation.CreateGroupMessageFragment;
 import org.briarproject.android.privategroup.creation.GroupInviteActivity;
+import org.briarproject.android.privategroup.creation.GroupInviteFragment;
 import org.briarproject.android.privategroup.invitation.GroupInvitationActivity;
 import org.briarproject.android.privategroup.list.GroupListFragment;
 import org.briarproject.android.privategroup.memberlist.GroupMemberListActivity;
 import org.briarproject.android.sharing.BlogInvitationActivity;
 import org.briarproject.android.sharing.BlogSharingStatusActivity;
-import org.briarproject.android.contactselection.ContactSelectorFragment;
 import org.briarproject.android.sharing.ForumInvitationActivity;
 import org.briarproject.android.sharing.ForumSharingStatusActivity;
 import org.briarproject.android.sharing.ShareBlogActivity;
+import org.briarproject.android.sharing.ShareBlogFragment;
 import org.briarproject.android.sharing.ShareBlogMessageFragment;
 import org.briarproject.android.sharing.ShareForumActivity;
+import org.briarproject.android.sharing.ShareForumFragment;
 import org.briarproject.android.sharing.ShareForumMessageFragment;
 import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
 import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel;
@@ -142,6 +144,8 @@ public interface ActivityComponent {
 
 	void inject(GroupListFragment fragment);
 
+	void inject(GroupInviteFragment fragment);
+
 	void inject(ForumListFragment fragment);
 
 	void inject(FeedFragment fragment);
@@ -152,10 +156,12 @@ public interface ActivityComponent {
 
 	void inject(ContactChooserFragment fragment);
 
-	void inject(ContactSelectorFragment fragment);
+	void inject(ShareForumFragment fragment);
 
 	void inject(ShareForumMessageFragment fragment);
 
+	void inject(ShareBlogFragment fragment);
+
 	void inject(ShareBlogMessageFragment fragment);
 
 	void inject(IntroductionMessageFragment fragment);
diff --git a/briar-android/src/org/briarproject/android/BaseActivity.java b/briar-android/src/org/briarproject/android/BaseActivity.java
index a144adb9e7e969d9b12b55acdf2cc8177fbb4d2b..daa5bf4668b9667228ec08798c5d5e07e280b7e0 100644
--- a/briar-android/src/org/briarproject/android/BaseActivity.java
+++ b/briar-android/src/org/briarproject/android/BaseActivity.java
@@ -2,6 +2,7 @@ package org.briarproject.android;
 
 import android.os.Bundle;
 import android.os.IBinder;
+import android.support.annotation.Nullable;
 import android.support.v7.app.AppCompatActivity;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
@@ -31,7 +32,7 @@ public abstract class BaseActivity extends AppCompatActivity
 	}
 
 	@Override
-	public void onCreate(Bundle savedInstanceState) {
+	public void onCreate(@Nullable Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 
 		if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE);
diff --git a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java
index 8134d5d941eddb8f0524cf5d5be7736e2170bbc2..ae3af6cd7d4fb424b6a947da8afcd42a01daedb3 100644
--- a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java
+++ b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java
@@ -5,10 +5,12 @@ import android.content.Context;
 import org.briarproject.android.contact.BaseContactListAdapter;
 import org.briarproject.android.contact.ContactItemViewHolder;
 import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
+@NotNullByDefault
 public abstract class BaseContactSelectorAdapter<I extends SelectableContactItem, H extends ContactItemViewHolder<I>>
 		extends BaseContactListAdapter<I, H> {
 
diff --git a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java
index 2f9c91c6f8d640dad93ee34042afa6ef987b1c3d..7d093b82adc96de3e8036db11135ec1b3aafbe24 100644
--- a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java
+++ b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java
@@ -19,6 +19,8 @@ import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.android.view.BriarRecyclerView;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.ArrayList;
@@ -29,22 +31,22 @@ import static org.briarproject.android.contactselection.ContactSelectorActivity.
 import static org.briarproject.android.contactselection.ContactSelectorActivity.getContactsFromIntegers;
 import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public abstract class BaseContactSelectorFragment<I extends SelectableContactItem, H extends ContactItemViewHolder<I>>
 		extends BaseFragment
 		implements OnContactClickListener<I> {
 
 	protected BriarRecyclerView list;
 	protected BaseContactSelectorAdapter<I, H> adapter;
-	protected Collection<ContactId> selectedContacts;
+	protected Collection<ContactId> selectedContacts = new ArrayList<>();
 	protected ContactSelectorListener<I> listener;
 
 	private GroupId groupId;
-	private ContactSelectorController<I> controller;
 
 	@Override
 	public void onAttach(Context context) {
 		super.onAttach(context);
-		//noinspection unchecked
 		listener = (ContactSelectorListener<I>) context;
 	}
 
@@ -60,8 +62,9 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 
 	@Override
 	@CallSuper
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container,
+			@Nullable Bundle savedInstanceState) {
 
 		View contentView = inflater.inflate(R.layout.list, container, false);
 
@@ -87,7 +90,6 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 	@Override
 	public void onStart() {
 		super.onStart();
-		controller = listener.getController();
 		loadContacts(selectedContacts);
 	}
 
@@ -115,10 +117,10 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 		onSelectionChanged();
 	}
 
-	private void loadContacts(@Nullable final Collection<ContactId> selection) {
-		controller.loadContacts(groupId, selection,
+	private void loadContacts(final Collection<ContactId> selection) {
+		getController().loadContacts(groupId, selection,
 				new UiResultExceptionHandler<Collection<I>, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(Collection<I> contacts) {
 						if (contacts.isEmpty()) list.showData();
@@ -128,11 +130,14 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 
 					@Override
 					public void onExceptionUi(DbException exception) {
-
+						// TODO error handling
+						finish();
 					}
 				});
 	}
 
 	protected abstract void onSelectionChanged();
 
+	protected abstract ContactSelectorController<I> getController();
+
 }
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java
index 1a84cf43fd3c28798d139072de3609e7da9b35ad..48ce9aaf5692e1cd53e86592b0b5f757b58d2c33 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java
@@ -2,18 +2,23 @@ package org.briarproject.android.contactselection;
 
 import android.os.Bundle;
 import android.support.annotation.CallSuper;
+import android.support.annotation.Nullable;
 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.ContactId;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public abstract class ContactSelectorActivity<I extends SelectableContactItem>
 		extends BriarActivity
 		implements BaseFragmentListener, ContactSelectorListener<I> {
@@ -25,7 +30,7 @@ public abstract class ContactSelectorActivity<I extends SelectableContactItem>
 	protected Collection<ContactId> contacts;
 
 	@Override
-	public void onCreate(Bundle bundle) {
+	public void onCreate(@Nullable Bundle bundle) {
 		super.onCreate(bundle);
 
 		setContentView(R.layout.activity_fragment_container);
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorAdapter.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorAdapter.java
index 360521011261267ae2bd8078b6356c81ce693830..1b681679d15c5deeaf1843f4abac4b0443a4233f 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorAdapter.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorAdapter.java
@@ -6,7 +6,9 @@ import android.view.View;
 import android.view.ViewGroup;
 
 import org.briarproject.R;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 
+@NotNullByDefault
 public class ContactSelectorAdapter extends
 		BaseContactSelectorAdapter<SelectableContactItem, SelectableContactHolder> {
 
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorController.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorController.java
index 6ae4465290e00e4d57b01d853e8c5dbf6a717e45..e0d9cac7abca56232560cd8004791b37d8000fa4 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorController.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorController.java
@@ -1,19 +1,19 @@
 package org.briarproject.android.contactselection;
 
-import android.support.annotation.Nullable;
-
 import org.briarproject.android.controller.DbController;
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
 
+@NotNullByDefault
 public interface ContactSelectorController<I extends SelectableContactItem>
 		extends DbController {
 
-	void loadContacts(GroupId g, @Nullable Collection<ContactId> selection,
+	void loadContacts(GroupId g, Collection<ContactId> selection,
 			ResultExceptionHandler<Collection<I>, DbException> handler);
 
 }
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java
index ce12b5b9925fadc3aa76c7b682f0dec19c7b0a16..e9f45bf71899f235dc8b8af73b01da12c207b3ec 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java
@@ -8,22 +8,26 @@ import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
-import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
+import javax.annotation.concurrent.Immutable;
+
 import static java.util.logging.Level.WARNING;
 
+@Immutable
+@NotNullByDefault
 public abstract class ContactSelectorControllerImpl<I extends SelectableContactItem>
 		extends DbControllerImpl
 		implements ContactSelectorController<I> {
 
-	protected static final Logger LOG =
-			Logger.getLogger("ContactSelectorController");
+	private static final Logger LOG =
+			Logger.getLogger(ContactSelectorControllerImpl.class.getName());
 
 	private final ContactManager contactManager;
 
@@ -35,7 +39,7 @@ public abstract class ContactSelectorControllerImpl<I extends SelectableContactI
 
 	@Override
 	public void loadContacts(final GroupId g,
-			@Nullable final Collection<ContactId> selection,
+			final Collection<ContactId> selection,
 			final ResultExceptionHandler<Collection<I>, DbException> handler) {
 		runOnDbThread(new Runnable() {
 			@Override
@@ -44,8 +48,8 @@ public abstract class ContactSelectorControllerImpl<I extends SelectableContactI
 					Collection<I> contacts = new ArrayList<>();
 					for (Contact c : contactManager.getActiveContacts()) {
 						// was this contact already selected?
-						boolean selected = isSelected(c, selection != null &&
-								selection.contains(c.getId()));
+						boolean selected =
+								isSelected(c, selection.contains(c.getId()));
 						// can this contact be selected?
 						boolean disabled = isDisabled(g, c);
 						contacts.add(getItem(c, selected, disabled));
@@ -61,7 +65,8 @@ public abstract class ContactSelectorControllerImpl<I extends SelectableContactI
 	}
 
 	@DatabaseExecutor
-	protected abstract boolean isSelected(Contact c, boolean wasSelected);
+	protected abstract boolean isSelected(Contact c, boolean wasSelected)
+			throws DbException;
 
 	@DatabaseExecutor
 	protected abstract boolean isDisabled(GroupId g, Contact c)
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java
index b766b95e7a4605e93f21b42e8ed336a56a1f8f4b..7da47a25da8a224fd54b449dc908b8ee35e8539b 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java
@@ -9,13 +9,14 @@ import android.view.View;
 import android.view.ViewGroup;
 
 import org.briarproject.R;
-import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
-import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.jetbrains.annotations.Nullable;
 
-import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
-
-public class ContactSelectorFragment extends
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public abstract class ContactSelectorFragment extends
 		BaseContactSelectorFragment<SelectableContactItem, SelectableContactHolder>
 		implements OnContactClickListener<SelectableContactItem> {
 
@@ -23,22 +24,10 @@ public class ContactSelectorFragment extends
 
 	private Menu menu;
 
-	public static ContactSelectorFragment newInstance(GroupId groupId) {
-		Bundle args = new Bundle();
-		args.putByteArray(GROUP_ID, groupId.getBytes());
-		ContactSelectorFragment fragment = new ContactSelectorFragment();
-		fragment.setArguments(args);
-		return fragment;
-	}
-
 	@Override
-	public void injectFragment(ActivityComponent component) {
-		component.inject(this);
-	}
-
-	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container,
+			@Nullable Bundle savedInstanceState) {
 		View contentView =
 				super.onCreateView(inflater, container, savedInstanceState);
 		adapter = new ContactSelectorAdapter(getActivity(), this);
@@ -67,11 +56,6 @@ public class ContactSelectorFragment extends
 		}
 	}
 
-	@Override
-	public String getUniqueTag() {
-		return TAG;
-	}
-
 	@Override
 	protected void onSelectionChanged() {
 		if (menu == null) return;
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java
index fa8bc3d7891ddf889df74597e808ca7570037220..93f91dbc7754576094c8a28bc13067f100737373 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java
@@ -4,14 +4,14 @@ import android.support.annotation.UiThread;
 
 import org.briarproject.android.DestroyableContext;
 import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 
 import java.util.Collection;
 
+@NotNullByDefault
 interface ContactSelectorListener<I extends SelectableContactItem>
 		extends DestroyableContext {
 
-	ContactSelectorController<I> getController();
-
 	@UiThread
 	void contactsSelected(Collection<ContactId> contacts);
 
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java b/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java
index 8359cfe91722ed59b08f21908df673cf3b9c50d2..791866f2ad2b9377540d66c7e567b5277ba9657f 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java
@@ -8,6 +8,8 @@ import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
@@ -16,6 +18,8 @@ import javax.inject.Inject;
 
 import static org.briarproject.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public abstract class BaseGroupInviteActivity
 		extends ContactSelectorActivity<SelectableContactItem>
 		implements MessageFragmentListener {
@@ -23,11 +27,6 @@ public abstract class BaseGroupInviteActivity
 	@Inject
 	CreateGroupController controller;
 
-	@Override
-	public ContactSelectorController<SelectableContactItem> getController() {
-		return controller;
-	}
-
 	@Override
 	public void contactsSelected(Collection<ContactId> contacts) {
 		super.contactsSelected(contacts);
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java
index 5b571fe4a78ac89a93a939f0d2a6ec5dd70fc9bb..c1cffdde040d65b3ddb2a5683b723bffbeeb3b5c 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java
@@ -67,8 +67,8 @@ public class CreateGroupActivity extends BaseGroupInviteActivity implements
 
 	private void switchToContactSelectorFragment(GroupId g) {
 		setTitle(R.string.groups_invite_members);
-		ContactSelectorFragment fragment =
-				ContactSelectorFragment.newInstance(g);
+		GroupInviteFragment fragment =
+				GroupInviteFragment.newInstance(g);
 		getSupportFragmentManager().beginTransaction()
 				.setCustomAnimations(android.R.anim.fade_in,
 						android.R.anim.fade_out,
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java
index a0a849c7c0b96d264212e31cebda1c2be2ddff7a..42a514e96e18e6a0ca0817f2421d7bd6de929ec2 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java
@@ -131,7 +131,8 @@ public class CreateGroupControllerImpl
 	}
 
 	@Override
-	protected boolean isSelected(Contact c, boolean wasSelected) {
+	protected boolean isSelected(Contact c, boolean wasSelected)
+			throws DbException {
 		return wasSelected;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java
index d4b225cfca0f7c18fdc42061228cc49339ca5e0e..c9614f9cf63885e8a2d7ec117755ed0f17241534 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java
@@ -27,8 +27,8 @@ public class GroupInviteActivity extends BaseGroupInviteActivity
 		groupId = new GroupId(g);
 
 		if (bundle == null) {
-			ContactSelectorFragment fragment =
-					ContactSelectorFragment.newInstance(groupId);
+			GroupInviteFragment fragment =
+					GroupInviteFragment.newInstance(groupId);
 			getSupportFragmentManager().beginTransaction()
 					.replace(R.id.fragmentContainer, fragment)
 					.commit();
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d97d5fd629a88fab77e15eba65ddf21e941bac3
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java
@@ -0,0 +1,49 @@
+package org.briarproject.android.privategroup.creation;
+
+import android.os.Bundle;
+
+import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.contactselection.ContactSelectorController;
+import org.briarproject.android.contactselection.ContactSelectorFragment;
+import org.briarproject.android.contactselection.SelectableContactItem;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.api.sync.GroupId;
+
+import javax.inject.Inject;
+
+import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
+
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public class GroupInviteFragment extends ContactSelectorFragment {
+
+	public static final String TAG = GroupInviteFragment.class.getName();
+
+	@Inject
+	CreateGroupController controller;
+
+	public static GroupInviteFragment newInstance(GroupId groupId) {
+		Bundle args = new Bundle();
+		args.putByteArray(GROUP_ID, groupId.getBytes());
+		GroupInviteFragment fragment = new GroupInviteFragment();
+		fragment.setArguments(args);
+		return fragment;
+	}
+
+	@Override
+	public void injectFragment(ActivityComponent component) {
+		component.inject(this);
+	}
+
+	@Override
+	protected ContactSelectorController<SelectableContactItem> getController() {
+		return controller;
+	}
+
+	@Override
+	public String getUniqueTag() {
+		return TAG;
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java
index 54227624f436ad02c75e5b525f67b1441dc6a6f6..68fc03bc85d7c6463145541af00010d81822bb54 100644
--- a/briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java
@@ -2,7 +2,6 @@ package org.briarproject.android.sharing;
 
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
 import org.briarproject.api.blogs.Blog;
-import org.briarproject.api.blogs.BlogManager;
 import org.briarproject.api.blogs.BlogSharingManager;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.db.DatabaseExecutor;
@@ -22,19 +21,18 @@ import javax.inject.Inject;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.api.blogs.BlogManager.CLIENT_ID;
 
+
 public class BlogInvitationControllerImpl
 		extends InvitationControllerImpl<SharingInvitationItem>
 		implements BlogInvitationController {
 
-	private final BlogManager blogManager;
 	private final BlogSharingManager blogSharingManager;
 
 	@Inject
 	BlogInvitationControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
-			BlogManager blogManager, BlogSharingManager blogSharingManager) {
+			BlogSharingManager blogSharingManager) {
 		super(dbExecutor, lifecycleManager, eventBus);
-		this.blogManager = blogManager;
 		this.blogSharingManager = blogSharingManager;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java
index ef563492753dba0152ff53b9c0708591fc0f9d95..5f2d255cdb0cc2bea5c7290f48abf22333ebe267 100644
--- a/briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java
@@ -8,7 +8,6 @@ import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.ForumInvitationReceivedEvent;
 import org.briarproject.api.forum.Forum;
-import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.forum.ForumSharingManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.sharing.SharingInvitationItem;
@@ -26,16 +25,13 @@ public class ForumInvitationControllerImpl
 		extends InvitationControllerImpl<SharingInvitationItem>
 		implements ForumInvitationController {
 
-	private final ForumManager forumManager;
 	private final ForumSharingManager forumSharingManager;
 
 	@Inject
 	ForumInvitationControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
-			ForumManager forumManager,
 			ForumSharingManager forumSharingManager) {
 		super(dbExecutor, lifecycleManager, eventBus);
-		this.forumManager = forumManager;
 		this.forumSharingManager = forumSharingManager;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
index 53d93628eb587761bb3f5c624b187947ab7747f1..8f72fcb83a705241ce42e2a445f8b4d282c93126 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
@@ -10,31 +10,28 @@ import org.briarproject.android.contactselection.ContactSelectorFragment;
 import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener;
 import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Collection;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public abstract class ShareActivity
 		extends ContactSelectorActivity<SelectableContactItem>
 		implements MessageFragmentListener {
 
 	@Override
-	public void onCreate(Bundle bundle) {
+	public void onCreate(@Nullable Bundle bundle) {
 		super.onCreate(bundle);
 
 		Intent i = getIntent();
 		byte[] b = i.getByteArrayExtra(GROUP_ID);
 		if (b == null) throw new IllegalStateException("No GroupId");
 		groupId = new GroupId(b);
-
-		if (bundle == null) {
-			ContactSelectorFragment contactSelectorFragment =
-					ContactSelectorFragment.newInstance(groupId);
-			getSupportFragmentManager().beginTransaction()
-					.add(R.id.fragmentContainer, contactSelectorFragment)
-					.commit();
-		}
 	}
 
 	@UiThread
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
index ffd218a381a273597ed5df99091f646307883c5b..7152d9d2b37e4a5ee898eeea52c506e86263a91f 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
@@ -1,14 +1,16 @@
 package org.briarproject.android.sharing;
 
+import android.os.Bundle;
 import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.contactselection.ContactSelectorController;
-import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Collection;
 
@@ -17,6 +19,8 @@ import javax.inject.Inject;
 import static android.widget.Toast.LENGTH_SHORT;
 import static org.briarproject.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class ShareBlogActivity extends ShareActivity {
 
 	@Inject
@@ -33,8 +37,15 @@ public class ShareBlogActivity extends ShareActivity {
 	}
 
 	@Override
-	public ContactSelectorController<SelectableContactItem> getController() {
-		return controller;
+	public void onCreate(@Nullable Bundle bundle) {
+		super.onCreate(bundle);
+
+		if (bundle == null) {
+			ShareBlogFragment fragment = ShareBlogFragment.newInstance(groupId);
+			getSupportFragmentManager().beginTransaction()
+					.add(R.id.fragmentContainer, fragment)
+					.commit();
+		}
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java
index 0955989972db18ae28fb9bf68fdf849e310fe85c..35e28da6916cf9ab2d6517a34f4e667be48a5dcc 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java
@@ -9,20 +9,30 @@ import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.db.NoSuchContactException;
+import org.briarproject.api.db.NoSuchGroupException;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
 import java.util.concurrent.Executor;
+import java.util.logging.Logger;
 
+import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
 
+@Immutable
+@NotNullByDefault
 public class ShareBlogControllerImpl
 		extends ContactSelectorControllerImpl<SelectableContactItem>
 		implements ShareBlogController {
 
+	private final static Logger LOG =
+			Logger.getLogger(ShareBlogControllerImpl.class.getName());
+
 	private final BlogSharingManager blogSharingManager;
 
 	@Inject
@@ -36,7 +46,8 @@ public class ShareBlogControllerImpl
 	}
 
 	@Override
-	protected boolean isSelected(Contact c, boolean wasSelected) {
+	protected boolean isSelected(Contact c, boolean wasSelected)
+			throws DbException {
 		return wasSelected;
 	}
 
@@ -60,7 +71,12 @@ public class ShareBlogControllerImpl
 			public void run() {
 				try {
 					for (ContactId c : contacts) {
-						blogSharingManager.sendInvitation(g, c, msg);
+						try {
+							blogSharingManager.sendInvitation(g, c, msg);
+						} catch (NoSuchContactException | NoSuchGroupException e) {
+							if (LOG.isLoggable(WARNING))
+								LOG.log(WARNING, e.toString(), e);
+						}
 					}
 				} catch (DbException e) {
 					if (LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..f575643f20b8bb6cc5cd7a74a03f74d5896b6cc2
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java
@@ -0,0 +1,49 @@
+package org.briarproject.android.sharing;
+
+import android.os.Bundle;
+
+import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.contactselection.ContactSelectorController;
+import org.briarproject.android.contactselection.ContactSelectorFragment;
+import org.briarproject.android.contactselection.SelectableContactItem;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.api.sync.GroupId;
+
+import javax.inject.Inject;
+
+import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
+
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public class ShareBlogFragment extends ContactSelectorFragment {
+
+	public static final String TAG = ShareBlogFragment.class.getName();
+
+	@Inject
+	ShareBlogController controller;
+
+	public static ShareBlogFragment newInstance(GroupId groupId) {
+		Bundle args = new Bundle();
+		args.putByteArray(GROUP_ID, groupId.getBytes());
+		ShareBlogFragment fragment = new ShareBlogFragment();
+		fragment.setArguments(args);
+		return fragment;
+	}
+
+	@Override
+	public void injectFragment(ActivityComponent component) {
+		component.inject(this);
+	}
+
+	@Override
+	protected ContactSelectorController<SelectableContactItem> getController() {
+		return controller;
+	}
+
+	@Override
+	public String getUniqueTag() {
+		return TAG;
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
index 16133e3cfca2cbfd223c81b6b1d5f0665293138f..7904902d3e531ed405896a5977561939b3826e01 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
@@ -5,11 +5,12 @@ import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.contactselection.ContactSelectorController;
-import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Collection;
 
@@ -18,6 +19,8 @@ import javax.inject.Inject;
 import static android.widget.Toast.LENGTH_SHORT;
 import static org.briarproject.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class ShareForumActivity extends ShareActivity {
 
 	@Inject
@@ -34,13 +37,16 @@ public class ShareForumActivity extends ShareActivity {
 	}
 
 	@Override
-	public ContactSelectorController<SelectableContactItem> getController() {
-		return controller;
-	}
-
-	@Override
-	public void onCreate(Bundle bundle) {
+	public void onCreate(@Nullable Bundle bundle) {
 		super.onCreate(bundle);
+
+		if (bundle == null) {
+			ShareForumFragment fragment =
+					ShareForumFragment.newInstance(groupId);
+			getSupportFragmentManager().beginTransaction()
+					.add(R.id.fragmentContainer, fragment)
+					.commit();
+		}
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java
index e4bf4a5559d117eeb2cece5e634be171101c686a..715250dac7c01aef4c03c3051143ab456f134878 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java
@@ -8,21 +8,31 @@ import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.db.NoSuchContactException;
+import org.briarproject.api.db.NoSuchGroupException;
 import org.briarproject.api.forum.ForumSharingManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
 import java.util.concurrent.Executor;
+import java.util.logging.Logger;
 
+import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
 
+@Immutable
+@NotNullByDefault
 public class ShareForumControllerImpl
 		extends ContactSelectorControllerImpl<SelectableContactItem>
 		implements ShareForumController {
 
+	private final static Logger LOG =
+			Logger.getLogger(ShareForumControllerImpl.class.getName());
+
 	private final ForumSharingManager forumSharingManager;
 
 	@Inject
@@ -36,7 +46,8 @@ public class ShareForumControllerImpl
 	}
 
 	@Override
-	protected boolean isSelected(Contact c, boolean wasSelected) {
+	protected boolean isSelected(Contact c, boolean wasSelected)
+			throws DbException {
 		return wasSelected;
 	}
 
@@ -60,7 +71,12 @@ public class ShareForumControllerImpl
 			public void run() {
 				try {
 					for (ContactId c : contacts) {
-						forumSharingManager.sendInvitation(g, c, msg);
+						try {
+							forumSharingManager.sendInvitation(g, c, msg);
+						} catch (NoSuchContactException | NoSuchGroupException e) {
+							if (LOG.isLoggable(WARNING))
+								LOG.log(WARNING, e.toString(), e);
+						}
 					}
 				} catch (DbException e) {
 					if (LOG.isLoggable(WARNING))
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..4133e5ed71e610ef7aefb814d22c3761f76c2ff1
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java
@@ -0,0 +1,49 @@
+package org.briarproject.android.sharing;
+
+import android.os.Bundle;
+
+import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.contactselection.ContactSelectorController;
+import org.briarproject.android.contactselection.ContactSelectorFragment;
+import org.briarproject.android.contactselection.SelectableContactItem;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.api.sync.GroupId;
+
+import javax.inject.Inject;
+
+import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
+
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public class ShareForumFragment extends ContactSelectorFragment {
+
+	public static final String TAG = ShareForumFragment.class.getName();
+
+	@Inject
+	ShareForumController controller;
+
+	public static ShareForumFragment newInstance(GroupId groupId) {
+		Bundle args = new Bundle();
+		args.putByteArray(GROUP_ID, groupId.getBytes());
+		ShareForumFragment fragment = new ShareForumFragment();
+		fragment.setArguments(args);
+		return fragment;
+	}
+
+	@Override
+	public void injectFragment(ActivityComponent component) {
+		component.inject(this);
+	}
+
+	@Override
+	protected ContactSelectorController<SelectableContactItem> getController() {
+		return controller;
+	}
+
+	@Override
+	public String getUniqueTag() {
+		return TAG;
+	}
+
+}