diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index 668b89f24c7d53ba5952a10a365e2a1fa07e58b2..7e8006f8f049ac505841726b175497c48c479090 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -123,7 +123,7 @@
 		</activity>
 
 		<activity
-			android:name=".android.privategroup.invitation.GroupInvitationsActivity"
+			android:name=".android.privategroup.invitation.GroupInvitationActivity"
 			android:label="@string/groups_invitations_title"
 			android:parentActivityName=".android.NavDrawerActivity">
 			<meta-data
@@ -133,7 +133,7 @@
 		</activity>
 
 		<activity
-			android:name=".android.sharing.ForumInvitationsActivity"
+			android:name=".android.sharing.ForumInvitationActivity"
 			android:label="@string/forum_invitations_title"
 			android:parentActivityName=".android.NavDrawerActivity">
 			<meta-data
@@ -143,7 +143,7 @@
 		</activity>
 
 		<activity
-			android:name=".android.sharing.BlogInvitationsActivity"
+			android:name=".android.sharing.BlogInvitationActivity"
 			android:label="@string/blogs_sharing_invitations_title"
 			android:parentActivityName=".android.contact.ConversationActivity">
 			<meta-data
@@ -175,7 +175,7 @@
 		</activity>
 
 		<activity
-			android:name=".android.sharing.ForumShareActivity"
+			android:name=".android.sharing.ShareForumActivity"
 			android:label="@string/activity_share_toolbar_header"
 			android:parentActivityName=".android.forum.ForumActivity"
 			android:windowSoftInputMode="adjustResize|stateHidden">
@@ -186,7 +186,7 @@
 		</activity>
 
 		<activity
-			android:name=".android.sharing.BlogShareActivity"
+			android:name=".android.sharing.ShareBlogActivity"
 			android:label="@string/activity_share_toolbar_header"
 			android:parentActivityName=".android.blogs.BlogActivity"
 			android:windowSoftInputMode="adjustResize|stateHidden">
diff --git a/briar-android/src/org/briarproject/android/ActivityComponent.java b/briar-android/src/org/briarproject/android/ActivityComponent.java
index ef81325fcad3e5a8018a8cce27193e9011d38495..0a7776b09e0b06731f864f51c48d138b606d1987 100644
--- a/briar-android/src/org/briarproject/android/ActivityComponent.java
+++ b/briar-android/src/org/briarproject/android/ActivityComponent.java
@@ -33,16 +33,16 @@ import org.briarproject.android.privategroup.creation.CreateGroupFragment;
 import org.briarproject.android.privategroup.conversation.GroupActivity;
 import org.briarproject.android.privategroup.creation.CreateGroupMessageFragment;
 import org.briarproject.android.privategroup.list.GroupListFragment;
-import org.briarproject.android.privategroup.invitation.GroupInvitationsActivity;
-import org.briarproject.android.sharing.BlogShareActivity;
+import org.briarproject.android.privategroup.invitation.GroupInvitationActivity;
+import org.briarproject.android.sharing.ShareBlogActivity;
 import org.briarproject.android.sharing.BlogSharingStatusActivity;
 import org.briarproject.android.sharing.ContactSelectorFragment;
-import org.briarproject.android.sharing.BlogInvitationsActivity;
-import org.briarproject.android.sharing.ForumInvitationsActivity;
-import org.briarproject.android.sharing.ForumShareMessageFragment;
+import org.briarproject.android.sharing.BlogInvitationActivity;
+import org.briarproject.android.sharing.ForumInvitationActivity;
+import org.briarproject.android.sharing.ShareForumActivity;
+import org.briarproject.android.sharing.ShareForumMessageFragment;
 import org.briarproject.android.sharing.ForumSharingStatusActivity;
-import org.briarproject.android.sharing.BlogShareMessageFragment;
-import org.briarproject.android.sharing.ForumShareActivity;
+import org.briarproject.android.sharing.ShareBlogMessageFragment;
 import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
 import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel;
 
@@ -73,19 +73,19 @@ public interface ActivityComponent {
 
 	void inject(ConversationActivity activity);
 
-	void inject(ForumInvitationsActivity activity);
+	void inject(ForumInvitationActivity activity);
 
-	void inject(BlogInvitationsActivity activity);
+	void inject(BlogInvitationActivity activity);
 
 	void inject(CreateGroupActivity activity);
 	void inject(GroupActivity activity);
-	void inject(GroupInvitationsActivity activity);
+	void inject(GroupInvitationActivity activity);
 
 	void inject(CreateForumActivity activity);
 
-	void inject(ForumShareActivity activity);
+	void inject(ShareForumActivity activity);
 
-	void inject(BlogShareActivity activity);
+	void inject(ShareBlogActivity activity);
 
 	void inject(ForumSharingStatusActivity activity);
 
@@ -133,8 +133,8 @@ public interface ActivityComponent {
 	void inject(ShowQrCodeFragment fragment);
 	void inject(ContactChooserFragment fragment);
 	void inject(ContactSelectorFragment fragment);
-	void inject(ForumShareMessageFragment fragment);
-	void inject(BlogShareMessageFragment fragment);
+	void inject(ShareForumMessageFragment fragment);
+	void inject(ShareBlogMessageFragment fragment);
 	void inject(IntroductionMessageFragment fragment);
 
 }
diff --git a/briar-android/src/org/briarproject/android/ActivityModule.java b/briar-android/src/org/briarproject/android/ActivityModule.java
index da179e4b60026bb2dccc60d5b4905bf8c3cf9b90..174a5c94668a193735716965d889c99644626b21 100644
--- a/briar-android/src/org/briarproject/android/ActivityModule.java
+++ b/briar-android/src/org/briarproject/android/ActivityModule.java
@@ -25,14 +25,14 @@ import org.briarproject.android.privategroup.conversation.GroupController;
 import org.briarproject.android.privategroup.conversation.GroupControllerImpl;
 import org.briarproject.android.privategroup.creation.CreateGroupController;
 import org.briarproject.android.privategroup.creation.CreateGroupControllerImpl;
-import org.briarproject.android.privategroup.invitation.GroupInvitationsController;
-import org.briarproject.android.privategroup.invitation.GroupInvitationsControllerImpl;
+import org.briarproject.android.privategroup.invitation.GroupInvitationController;
+import org.briarproject.android.privategroup.invitation.GroupInvitationControllerImpl;
 import org.briarproject.android.privategroup.list.GroupListController;
 import org.briarproject.android.privategroup.list.GroupListControllerImpl;
-import org.briarproject.android.sharing.BlogInvitationsController;
-import org.briarproject.android.sharing.BlogInvitationsControllerImpl;
-import org.briarproject.android.sharing.ForumInvitationsController;
-import org.briarproject.android.sharing.ForumInvitationsControllerImpl;
+import org.briarproject.android.sharing.BlogInvitationController;
+import org.briarproject.android.sharing.BlogInvitationControllerImpl;
+import org.briarproject.android.sharing.ForumInvitationController;
+import org.briarproject.android.sharing.ForumInvitationControllerImpl;
 
 import dagger.Module;
 import dagger.Provides;
@@ -125,9 +125,9 @@ public class ActivityModule {
 
 	@ActivityScope
 	@Provides
-	protected GroupInvitationsController provideInvitationsGroupController(
-			GroupInvitationsControllerImpl invitationsGroupController) {
-		return invitationsGroupController;
+	protected GroupInvitationController provideInvitationGroupController(
+			GroupInvitationControllerImpl groupInvitationController) {
+		return groupInvitationController;
 	}
 
 	@ActivityScope
@@ -140,18 +140,18 @@ public class ActivityModule {
 
 	@ActivityScope
 	@Provides
-	protected ForumInvitationsController provideInvitationsForumController(
-			ForumInvitationsControllerImpl invitationsForumController) {
-		activity.addLifecycleController(invitationsForumController);
-		return invitationsForumController;
+	protected ForumInvitationController provideInvitationForumController(
+			ForumInvitationControllerImpl forumInvitationController) {
+		activity.addLifecycleController(forumInvitationController);
+		return forumInvitationController;
 	}
 
 	@ActivityScope
 	@Provides
-	protected BlogInvitationsController provideInvitationsBlogController(
-			BlogInvitationsControllerImpl invitationsBlogController) {
-		activity.addLifecycleController(invitationsBlogController);
-		return invitationsBlogController;
+	protected BlogInvitationController provideInvitationBlogController(
+			BlogInvitationControllerImpl blogInvitationController) {
+		activity.addLifecycleController(blogInvitationController);
+		return blogInvitationController;
 	}
 
 	@ActivityScope
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
index 9627bf22a1357daf25065055541517564bf55223..ac8e2816609e4719333ca6c0c4e6ffe2cb62ae6d 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
@@ -23,7 +23,7 @@ import org.briarproject.android.blogs.BaseController.OnBlogPostAddedListener;
 import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.fragment.BaseFragment;
-import org.briarproject.android.sharing.BlogShareActivity;
+import org.briarproject.android.sharing.ShareBlogActivity;
 import org.briarproject.android.sharing.BlogSharingStatusActivity;
 import org.briarproject.android.view.BriarRecyclerView;
 import org.briarproject.api.blogs.BlogPostHeader;
@@ -157,7 +157,7 @@ public class BlogFragment extends BaseFragment implements
 						options.toBundle());
 				return true;
 			case R.id.action_blog_share:
-				Intent i2 = new Intent(getActivity(), BlogShareActivity.class);
+				Intent i2 = new Intent(getActivity(), ShareBlogActivity.class);
 				i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
 				i2.putExtra(GROUP_ID, groupId.getBytes());
 				startActivityForResult(i2, REQUEST_SHARE, options.toBundle());
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListItem.java b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
index d764266380f5043389798a7ac5abe864abc5e43f..e9c9e568b2e9c8853d0a17020ac7e4bf754ae646 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
@@ -6,7 +6,9 @@ import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.GroupId;
 import org.jetbrains.annotations.NotNull;
 
-// This class is NOT thread-safe
+import javax.annotation.concurrent.NotThreadSafe;
+
+@NotThreadSafe
 public class ContactListItem {
 
 	private final Contact contact;
@@ -32,8 +34,7 @@ public class ContactListItem {
 		empty = empty && message == null;
 		if (message != null) {
 			if (message.getTime() > timestamp) timestamp = message.getTime();
-			if (message instanceof ConversationInItem &&
-					!((ConversationInItem) message).isRead())
+			if (!message.isRead())
 				unread++;
 		}
 	}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index bbb93f8f6366c21518ed0cc5bf073114a72f7c24..7bd1dfc45fad34d51221a1c5186b6520b4348803 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -497,9 +497,9 @@ public class ConversationActivity extends BriarActivity
 
 	private void markMessagesRead() {
 		Map<MessageId, GroupId> unread = new HashMap<>();
-		SparseArray<ConversationInItem> list = adapter.getIncomingMessages();
+		SparseArray<ConversationItem> list = adapter.getIncomingMessages();
 		for (int i = 0; i < list.size(); i++) {
-			ConversationInItem item = list.valueAt(i);
+			ConversationItem item = list.valueAt(i);
 			if (!item.isRead())
 				unread.put(item.getId(), item.getGroupId());
 		}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index e368fa029b10dc0dfd2868b09ec760b92e89e74b..6798ff7d0a450fa60a98db863eee3a8f2c4eae5b 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -27,19 +27,7 @@ class ConversationAdapter
 	@Override
 	public int getItemViewType(int position) {
 		ConversationItem item = items.get(position);
-		if (item instanceof ConversationRequestItem) {
-			return R.layout.list_item_conversation_request;
-		} else if (item instanceof ConversationNoticeOutItem) {
-			return R.layout.list_item_conversation_notice_out;
-		} else if (item instanceof ConversationNoticeInItem) {
-			return R.layout.list_item_conversation_notice_in;
-		} else if (item instanceof ConversationMessageOutItem) {
-			return R.layout.list_item_conversation_msg_out;
-		} else if (item instanceof ConversationMessageInItem) {
-			return R.layout.list_item_conversation_msg_in;
-		} else {
-			throw new IllegalArgumentException("Unknown ConversationItem");
-		}
+		return item.getLayout();
 	}
 
 	@Override
@@ -104,13 +92,13 @@ class ConversationAdapter
 		}
 	}
 
-	SparseArray<ConversationInItem> getIncomingMessages() {
-		SparseArray<ConversationInItem> messages = new SparseArray<>();
+	SparseArray<ConversationItem> getIncomingMessages() {
+		SparseArray<ConversationItem> messages = new SparseArray<>();
 
 		for (int i = 0; i < items.size(); i++) {
 			ConversationItem item = items.get(i);
-			if (item instanceof ConversationInItem) {
-				messages.put(i, (ConversationInItem) item);
+			if (item.isIncoming()) {
+				messages.put(i, item);
 			}
 		}
 		return messages;
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationInItem.java
deleted file mode 100644
index 3d3ab2a1b3d337c6732b6d6f6f43f4e3d9360a73..0000000000000000000000000000000000000000
--- a/briar-android/src/org/briarproject/android/contact/ConversationInItem.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.briarproject.android.contact;
-
-import org.briarproject.api.nullsafety.NotNullByDefault;
-import org.briarproject.api.sync.GroupId;
-import org.briarproject.api.sync.MessageId;
-import org.jetbrains.annotations.Nullable;
-
-import javax.annotation.concurrent.NotThreadSafe;
-
-@NotThreadSafe
-@NotNullByDefault
-abstract class ConversationInItem extends ConversationItem {
-
-	private boolean read;
-
-	ConversationInItem(MessageId id, GroupId groupId, @Nullable String text,
-			long time, boolean read) {
-		super(id, groupId, text, time);
-
-		this.read = read;
-	}
-
-	public boolean isRead() {
-		return read;
-	}
-
-	public void setRead(boolean read) {
-		this.read = read;
-	}
-
-}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
index a192518186bd0d7384f2cc9a707fc381cf625ca7..1a2c118e24c751448772a42f5ea005317d8a2103 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
@@ -1,6 +1,7 @@
 package org.briarproject.android.contact;
 
 import android.content.Context;
+import android.support.annotation.LayoutRes;
 import android.support.annotation.StringRes;
 
 import org.briarproject.R;
@@ -37,13 +38,15 @@ abstract class ConversationItem {
 	final private MessageId id;
 	final private GroupId groupId;
 	final private long time;
+	private boolean read;
 
-	ConversationItem(MessageId id, GroupId groupId,
-			@Nullable String body, long time) {
+	ConversationItem(MessageId id, GroupId groupId, @Nullable String body,
+			long time, boolean read) {
 		this.id = id;
 		this.groupId = groupId;
 		this.body = body;
 		this.time = time;
+		this.read = read;
 	}
 
 	MessageId getId() {
@@ -67,6 +70,15 @@ abstract class ConversationItem {
 		return time;
 	}
 
+	public boolean isRead() {
+		return read;
+	}
+
+	abstract public boolean isIncoming();
+
+	@LayoutRes
+	abstract public int getLayout();
+
 	static ConversationItem from(PrivateMessageHeader h) {
 		if (h.isLocal()) {
 			return new ConversationMessageOutItem(h);
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java
index cb25f27614b243913e72a8c5b42aa96eb02bf031..23d8571366e27d46c2838e05c04d2cb796c078cc 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java
@@ -1,5 +1,8 @@
 package org.briarproject.android.contact;
 
+import android.support.annotation.LayoutRes;
+
+import org.briarproject.R;
 import org.briarproject.api.messaging.PrivateMessageHeader;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 
@@ -7,10 +10,21 @@ import javax.annotation.concurrent.NotThreadSafe;
 
 @NotThreadSafe
 @NotNullByDefault
-class ConversationMessageInItem extends ConversationInItem {
+class ConversationMessageInItem extends ConversationItem {
 
 	ConversationMessageInItem(PrivateMessageHeader h) {
 		super(h.getId(), h.getGroupId(), null, h.getTimestamp(), h.isRead());
 	}
 
+	@Override
+	public boolean isIncoming() {
+		return true;
+	}
+
+	@LayoutRes
+	@Override
+	public int getLayout() {
+		return R.layout.list_item_conversation_msg_in;
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java b/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java
index 5091fc1ab3aa2cf58fb213a14abe21264ebe931f..ee2d1a11b95884cb5b4aad0c117a46146b91dbec 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java
@@ -1,5 +1,8 @@
 package org.briarproject.android.contact;
 
+import android.support.annotation.LayoutRes;
+
+import org.briarproject.R;
 import org.briarproject.api.messaging.PrivateMessageHeader;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 
@@ -14,4 +17,10 @@ class ConversationMessageOutItem extends ConversationOutItem {
 				h.isSeen());
 	}
 
+	@LayoutRes
+	@Override
+	public int getLayout() {
+		return R.layout.list_item_conversation_msg_out;
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationNoticeInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationNoticeInItem.java
index df377d2d77eab2f230f4db1411d788b59516acc8..0e70e66312ee213190994e40c67a7f7cef2f9c56 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationNoticeInItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationNoticeInItem.java
@@ -1,5 +1,8 @@
 package org.briarproject.android.contact;
 
+import android.support.annotation.LayoutRes;
+
+import org.briarproject.R;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
@@ -9,7 +12,7 @@ import javax.annotation.concurrent.NotThreadSafe;
 
 @NotThreadSafe
 @NotNullByDefault
-class ConversationNoticeInItem extends ConversationInItem {
+class ConversationNoticeInItem extends ConversationItem {
 
 	@Nullable
 	private final String msgText;
@@ -26,4 +29,15 @@ class ConversationNoticeInItem extends ConversationInItem {
 		return msgText;
 	}
 
+	@Override
+	public boolean isIncoming() {
+		return true;
+	}
+
+	@LayoutRes
+	@Override
+	public int getLayout() {
+		return R.layout.list_item_conversation_notice_in;
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationNoticeOutItem.java b/briar-android/src/org/briarproject/android/contact/ConversationNoticeOutItem.java
index 19ab79c64a159947be001c71edfd5325a11c7cbb..78cddf3a766ea7a3402fa0ca1262001c7e93e56b 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationNoticeOutItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationNoticeOutItem.java
@@ -1,5 +1,8 @@
 package org.briarproject.android.contact;
 
+import android.support.annotation.LayoutRes;
+
+import org.briarproject.R;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
@@ -26,4 +29,10 @@ class ConversationNoticeOutItem extends ConversationOutItem {
 		return msgText;
 	}
 
+	@LayoutRes
+	@Override
+	public int getLayout() {
+		return R.layout.list_item_conversation_notice_out;
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationOutItem.java b/briar-android/src/org/briarproject/android/contact/ConversationOutItem.java
index f8cbaec23aad74e83426a539c01ca4481917f253..469f4b0f448fc5f6ad5610700cf308c00ee45b9a 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationOutItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationOutItem.java
@@ -15,7 +15,7 @@ abstract class ConversationOutItem extends ConversationItem {
 
 	ConversationOutItem(MessageId id, GroupId groupId, @Nullable String text,
 			long time, boolean sent, boolean seen) {
-		super(id, groupId, text, time);
+		super(id, groupId, text, time, true);
 
 		this.sent = sent;
 		this.seen = seen;
@@ -37,4 +37,9 @@ abstract class ConversationOutItem extends ConversationItem {
 		this.seen = seen;
 	}
 
+	@Override
+	public boolean isIncoming() {
+		return false;
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationRequestItem.java b/briar-android/src/org/briarproject/android/contact/ConversationRequestItem.java
index 2b8521f7f491d63c166bc84733f4ff3b8832645f..f0a1cb08b40fdd73c909bae2a0912fdde6ab3c6c 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationRequestItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationRequestItem.java
@@ -1,5 +1,8 @@
 package org.briarproject.android.contact;
 
+import android.support.annotation.LayoutRes;
+
+import org.briarproject.R;
 import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
@@ -43,4 +46,10 @@ class ConversationRequestItem extends ConversationNoticeInItem {
 		this.answered = answered;
 	}
 
+	@LayoutRes
+	@Override
+	public int getLayout() {
+		return R.layout.list_item_conversation_request;
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
index 70ac435ef9bcf10a7f0c648b9245cc47a8ee5ecd..307a7c5e158407d4a0cd173974607da181716181 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -18,7 +18,7 @@ import android.widget.Toast;
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
-import org.briarproject.android.sharing.ForumShareActivity;
+import org.briarproject.android.sharing.ShareForumActivity;
 import org.briarproject.android.sharing.ForumSharingStatusActivity;
 import org.briarproject.android.threaded.ThreadListActivity;
 import org.briarproject.android.threaded.ThreadListController;
@@ -107,7 +107,7 @@ public class ForumActivity extends
 				showTextInput(null);
 				return true;
 			case R.id.action_forum_share:
-				Intent i2 = new Intent(this, ForumShareActivity.class);
+				Intent i2 = new Intent(this, ShareForumActivity.class);
 				i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
 				i2.putExtra(GROUP_ID, groupId.getBytes());
 				ActivityCompat.startActivityForResult(this, i2,
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java
index 5fb34c4c2b794695f0e4fb2f5748f505f4f00a66..bb5d1eee0a231c2983aaa4c093c0ae0ac923519f 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java
@@ -18,7 +18,7 @@ import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.api.AndroidNotificationManager;
 import org.briarproject.android.fragment.BaseEventFragment;
-import org.briarproject.android.sharing.ForumInvitationsActivity;
+import org.briarproject.android.sharing.ForumInvitationActivity;
 import org.briarproject.android.view.BriarRecyclerView;
 import org.briarproject.api.clients.MessageTracker.GroupCount;
 import org.briarproject.api.db.DbException;
@@ -286,7 +286,7 @@ public class ForumListFragment extends BaseEventFragment implements
 	@Override
 	public void onClick(View view) {
 		// snackbar click
-		Intent i = new Intent(getContext(), ForumInvitationsActivity.class);
+		Intent i = new Intent(getContext(), ForumInvitationActivity.class);
 		startActivity(i);
 	}
 }
diff --git a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsActivity.java b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationActivity.java
similarity index 78%
rename from briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsActivity.java
rename to briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationActivity.java
index 97b8f5d3d9495254ea875b26acd01859870c5069..658a611d4d31856f7f82485d929438791b13acbf 100644
--- a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationActivity.java
@@ -4,19 +4,19 @@ import android.content.Context;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.sharing.InvitationActivity;
 import org.briarproject.android.sharing.InvitationAdapter;
-import org.briarproject.android.sharing.InvitationsActivity;
 import org.briarproject.api.privategroup.invitation.GroupInvitationItem;
 
 import javax.inject.Inject;
 
 import static org.briarproject.android.sharing.InvitationAdapter.InvitationClickListener;
 
-public class GroupInvitationsActivity
-		extends InvitationsActivity<GroupInvitationItem> {
+public class GroupInvitationActivity
+		extends InvitationActivity<GroupInvitationItem> {
 
 	@Inject
-	protected GroupInvitationsController controller;
+	protected GroupInvitationController controller;
 
 	@Override
 	public void injectActivity(ActivityComponent component) {
@@ -24,7 +24,7 @@ public class GroupInvitationsActivity
 	}
 
 	@Override
-	protected GroupInvitationsController getController() {
+	protected GroupInvitationController getController() {
 		return controller;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationController.java b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationController.java
new file mode 100644
index 0000000000000000000000000000000000000000..54318f31b2dc5b96e4852e1650d8cd27696e556b
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationController.java
@@ -0,0 +1,8 @@
+package org.briarproject.android.privategroup.invitation;
+
+import org.briarproject.android.sharing.InvitationController;
+import org.briarproject.api.privategroup.invitation.GroupInvitationItem;
+
+public interface GroupInvitationController
+		extends InvitationController<GroupInvitationItem> {
+}
diff --git a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java
similarity index 85%
rename from briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsControllerImpl.java
rename to briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java
index 4a78d4401ccabe8fe47b70b10b8153ee2947f06a..b48a8743774d67ac6b5f0195a95bceb4c375723d 100644
--- a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java
@@ -1,7 +1,7 @@
 package org.briarproject.android.privategroup.invitation;
 
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
-import org.briarproject.android.sharing.InvitationsControllerImpl;
+import org.briarproject.android.sharing.InvitationControllerImpl;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
@@ -22,15 +22,15 @@ import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
 
-public class GroupInvitationsControllerImpl
-		extends InvitationsControllerImpl<GroupInvitationItem>
-		implements GroupInvitationsController {
+public class GroupInvitationControllerImpl
+		extends InvitationControllerImpl<GroupInvitationItem>
+		implements GroupInvitationController {
 
 	private final PrivateGroupManager privateGroupManager;
 	private final GroupInvitationManager groupInvitationManager;
 
 	@Inject
-	GroupInvitationsControllerImpl(@DatabaseExecutor Executor dbExecutor,
+	GroupInvitationControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
 			PrivateGroupManager privateGroupManager,
 			GroupInvitationManager groupInvitationManager) {
@@ -50,7 +50,7 @@ public class GroupInvitationsControllerImpl
 	}
 
 	@Override
-	protected ClientId getClientId() {
+	protected ClientId getShareableClientId() {
 		return privateGroupManager.getClientId();
 	}
 
@@ -68,7 +68,7 @@ public class GroupInvitationsControllerImpl
 			@Override
 			public void run() {
 				try {
-					PrivateGroup g = (PrivateGroup) item.getShareable();
+					PrivateGroup g = item.getShareable();
 					Contact c = item.getCreator();
 					groupInvitationManager.respondToInvitation(g, c, accept);
 				} catch (DbException e) {
diff --git a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsController.java b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsController.java
deleted file mode 100644
index c50c805a19babc0be5e5072d8e0b86bd5e03fd53..0000000000000000000000000000000000000000
--- a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationsController.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.briarproject.android.privategroup.invitation;
-
-import org.briarproject.android.sharing.InvitationsController;
-import org.briarproject.api.privategroup.invitation.GroupInvitationItem;
-
-public interface GroupInvitationsController
-		extends InvitationsController<GroupInvitationItem> {
-}
diff --git a/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java b/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java
index b97d51bf57046191fc750a98ddf6912d150c1338..64727401dc37727b4b04e227267afaa6277924d0 100644
--- a/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java
+++ b/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java
@@ -21,7 +21,7 @@ import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.android.privategroup.creation.CreateGroupActivity;
-import org.briarproject.android.privategroup.invitation.GroupInvitationsActivity;
+import org.briarproject.android.privategroup.invitation.GroupInvitationActivity;
 import org.briarproject.android.privategroup.list.GroupListController.GroupListListener;
 import org.briarproject.android.privategroup.list.GroupViewHolder.OnGroupRemoveClickListener;
 import org.briarproject.android.view.BriarRecyclerView;
@@ -221,7 +221,7 @@ public class GroupListFragment extends BaseFragment implements
 	 */
 	@Override
 	public void onClick(View v) {
-		Intent i = new Intent(getContext(), GroupInvitationsActivity.class);
+		Intent i = new Intent(getContext(), GroupInvitationActivity.class);
 		ActivityOptionsCompat options =
 				makeCustomAnimation(getActivity(),
 						android.R.anim.slide_in_left,
diff --git a/briar-android/src/org/briarproject/android/sharing/BlogInvitationsActivity.java b/briar-android/src/org/briarproject/android/sharing/BlogInvitationActivity.java
similarity index 81%
rename from briar-android/src/org/briarproject/android/sharing/BlogInvitationsActivity.java
rename to briar-android/src/org/briarproject/android/sharing/BlogInvitationActivity.java
index 542c0be7a946dfad08ca7c83fe83bd07049c4a48..54ffa984dd6fdc812c3d646f890607158a61bca8 100644
--- a/briar-android/src/org/briarproject/android/sharing/BlogInvitationsActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/BlogInvitationActivity.java
@@ -10,11 +10,11 @@ import javax.inject.Inject;
 
 import static org.briarproject.android.sharing.InvitationAdapter.InvitationClickListener;
 
-public class BlogInvitationsActivity
-		extends InvitationsActivity<SharingInvitationItem> {
+public class BlogInvitationActivity
+		extends InvitationActivity<SharingInvitationItem> {
 
 	@Inject
-	BlogInvitationsController controller;
+	BlogInvitationController controller;
 
 	@Override
 	public void injectActivity(ActivityComponent component) {
@@ -22,7 +22,7 @@ public class BlogInvitationsActivity
 	}
 
 	@Override
-	protected InvitationsController<SharingInvitationItem> getController() {
+	protected InvitationController<SharingInvitationItem> getController() {
 		return controller;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/BlogInvitationsController.java b/briar-android/src/org/briarproject/android/sharing/BlogInvitationController.java
similarity index 51%
rename from briar-android/src/org/briarproject/android/sharing/BlogInvitationsController.java
rename to briar-android/src/org/briarproject/android/sharing/BlogInvitationController.java
index 057069c85be16210cb90b39b77a81bd8281e4396..ebd447369e9ea28e1a22be632729a546ddf29430 100644
--- a/briar-android/src/org/briarproject/android/sharing/BlogInvitationsController.java
+++ b/briar-android/src/org/briarproject/android/sharing/BlogInvitationController.java
@@ -2,6 +2,6 @@ package org.briarproject.android.sharing;
 
 import org.briarproject.api.sharing.SharingInvitationItem;
 
-public interface BlogInvitationsController
-		extends InvitationsController<SharingInvitationItem> {
+public interface BlogInvitationController
+		extends InvitationController<SharingInvitationItem> {
 }
diff --git a/briar-android/src/org/briarproject/android/sharing/BlogInvitationsControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java
similarity index 89%
rename from briar-android/src/org/briarproject/android/sharing/BlogInvitationsControllerImpl.java
rename to briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java
index 56e2a6ca1d0c35f0aa1d565e8d415153001984b3..49507b4f4036bf7d0bb7444266ed180482d0181b 100644
--- a/briar-android/src/org/briarproject/android/sharing/BlogInvitationsControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/BlogInvitationControllerImpl.java
@@ -21,15 +21,15 @@ import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
 
-public class BlogInvitationsControllerImpl
-		extends InvitationsControllerImpl<SharingInvitationItem>
-		implements BlogInvitationsController {
+public class BlogInvitationControllerImpl
+		extends InvitationControllerImpl<SharingInvitationItem>
+		implements BlogInvitationController {
 
 	private final BlogManager blogManager;
 	private final BlogSharingManager blogSharingManager;
 
 	@Inject
-	BlogInvitationsControllerImpl(@DatabaseExecutor Executor dbExecutor,
+	BlogInvitationControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
 			BlogManager blogManager, BlogSharingManager blogSharingManager) {
 		super(dbExecutor, lifecycleManager, eventBus);
@@ -48,7 +48,7 @@ public class BlogInvitationsControllerImpl
 	}
 
 	@Override
-	protected ClientId getClientId() {
+	protected ClientId getShareableClientId() {
 		return blogManager.getClientId();
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/ForumInvitationsActivity.java b/briar-android/src/org/briarproject/android/sharing/ForumInvitationActivity.java
similarity index 80%
rename from briar-android/src/org/briarproject/android/sharing/ForumInvitationsActivity.java
rename to briar-android/src/org/briarproject/android/sharing/ForumInvitationActivity.java
index fdba34c445e8fbba3bc12ccedf704b1a07e0d786..37dccd442617edd04b0d61e33bb26fdb216c7f3d 100644
--- a/briar-android/src/org/briarproject/android/sharing/ForumInvitationsActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ForumInvitationActivity.java
@@ -10,11 +10,11 @@ import javax.inject.Inject;
 
 import static org.briarproject.android.sharing.InvitationAdapter.InvitationClickListener;
 
-public class ForumInvitationsActivity
-		extends InvitationsActivity<SharingInvitationItem> {
+public class ForumInvitationActivity
+		extends InvitationActivity<SharingInvitationItem> {
 
 	@Inject
-	ForumInvitationsController controller;
+	ForumInvitationController controller;
 
 	@Override
 	public void injectActivity(ActivityComponent component) {
@@ -22,7 +22,7 @@ public class ForumInvitationsActivity
 	}
 
 	@Override
-	protected InvitationsController<SharingInvitationItem> getController() {
+	protected InvitationController<SharingInvitationItem> getController() {
 		return controller;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/ForumInvitationsController.java b/briar-android/src/org/briarproject/android/sharing/ForumInvitationController.java
similarity index 50%
rename from briar-android/src/org/briarproject/android/sharing/ForumInvitationsController.java
rename to briar-android/src/org/briarproject/android/sharing/ForumInvitationController.java
index 93470bb0d291978a286465ebcb83f0bf9b0be9d0..74ee19ee27f25a5ab6c0c0320861d3028378aa01 100644
--- a/briar-android/src/org/briarproject/android/sharing/ForumInvitationsController.java
+++ b/briar-android/src/org/briarproject/android/sharing/ForumInvitationController.java
@@ -2,6 +2,6 @@ package org.briarproject.android.sharing;
 
 import org.briarproject.api.sharing.SharingInvitationItem;
 
-public interface ForumInvitationsController
-		extends InvitationsController<SharingInvitationItem> {
+public interface ForumInvitationController
+		extends InvitationController<SharingInvitationItem> {
 }
diff --git a/briar-android/src/org/briarproject/android/sharing/ForumInvitationsControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java
similarity index 89%
rename from briar-android/src/org/briarproject/android/sharing/ForumInvitationsControllerImpl.java
rename to briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java
index 9bc371259f8944f396167d94e99a7867aa0db1bc..4418900b821007374e46e6aca24fe70364e19ba9 100644
--- a/briar-android/src/org/briarproject/android/sharing/ForumInvitationsControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/ForumInvitationControllerImpl.java
@@ -21,15 +21,15 @@ import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
 
-public class ForumInvitationsControllerImpl
-		extends InvitationsControllerImpl<SharingInvitationItem>
-		implements ForumInvitationsController {
+public class ForumInvitationControllerImpl
+		extends InvitationControllerImpl<SharingInvitationItem>
+		implements ForumInvitationController {
 
 	private final ForumManager forumManager;
 	private final ForumSharingManager forumSharingManager;
 
 	@Inject
-	ForumInvitationsControllerImpl(@DatabaseExecutor Executor dbExecutor,
+	ForumInvitationControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
 			ForumManager forumManager,
 			ForumSharingManager forumSharingManager) {
@@ -49,7 +49,7 @@ public class ForumInvitationsControllerImpl
 	}
 
 	@Override
-	protected ClientId getClientId() {
+	protected ClientId getShareableClientId() {
 		return forumManager.getClientId();
 	}
 
diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java b/briar-android/src/org/briarproject/android/sharing/InvitationActivity.java
similarity index 92%
rename from briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java
rename to briar-android/src/org/briarproject/android/sharing/InvitationActivity.java
index 59c134236fe82b3be5bfc504c9483321ba2897cb..5a17037134a6174dbdb114e118a8f01a47d38351 100644
--- a/briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/InvitationActivity.java
@@ -9,7 +9,7 @@ import android.widget.Toast;
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
-import org.briarproject.android.sharing.InvitationsController.InvitationListener;
+import org.briarproject.android.sharing.InvitationController.InvitationListener;
 import org.briarproject.android.view.BriarRecyclerView;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.sharing.InvitationItem;
@@ -20,12 +20,12 @@ import java.util.logging.Logger;
 import static android.widget.Toast.LENGTH_SHORT;
 import static org.briarproject.android.sharing.InvitationAdapter.InvitationClickListener;
 
-public abstract class InvitationsActivity<I extends InvitationItem>
+public abstract class InvitationActivity<I extends InvitationItem>
 		extends BriarActivity
 		implements InvitationListener, InvitationClickListener<I> {
 
 	protected static final Logger LOG =
-			Logger.getLogger(InvitationsActivity.class.getName());
+			Logger.getLogger(InvitationActivity.class.getName());
 
 	private InvitationAdapter<I, ?> adapter;
 	private BriarRecyclerView list;
@@ -96,7 +96,7 @@ public abstract class InvitationsActivity<I extends InvitationItem>
 				});
 	}
 
-	abstract protected InvitationsController<I> getController();
+	abstract protected InvitationController<I> getController();
 
 	protected void respondToInvitation(final I item,
 			final boolean accept) {
diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationsController.java b/briar-android/src/org/briarproject/android/sharing/InvitationController.java
similarity index 90%
rename from briar-android/src/org/briarproject/android/sharing/InvitationsController.java
rename to briar-android/src/org/briarproject/android/sharing/InvitationController.java
index 91576dfdf814ffa886fe575500ead2305d93413a..5ea5c88e362d7ca84d6338e7e01bab1cd60592d4 100644
--- a/briar-android/src/org/briarproject/android/sharing/InvitationsController.java
+++ b/briar-android/src/org/briarproject/android/sharing/InvitationController.java
@@ -7,7 +7,7 @@ import org.briarproject.api.sharing.InvitationItem;
 
 import java.util.Collection;
 
-public interface InvitationsController<I extends InvitationItem>
+public interface InvitationController<I extends InvitationItem>
 		extends ActivityLifecycleController {
 
 	void loadInvitations(boolean clear,
diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationsControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/InvitationControllerImpl.java
similarity index 87%
rename from briar-android/src/org/briarproject/android/sharing/InvitationsControllerImpl.java
rename to briar-android/src/org/briarproject/android/sharing/InvitationControllerImpl.java
index 5fcace519adf4ecaa3376f8e82eb3054ec751109..b1b52aca58da293c7fe0a19fc9b488fe9a4242d2 100644
--- a/briar-android/src/org/briarproject/android/sharing/InvitationsControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/InvitationControllerImpl.java
@@ -25,17 +25,17 @@ import java.util.logging.Logger;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 
-public abstract class InvitationsControllerImpl<I extends InvitationItem>
+public abstract class InvitationControllerImpl<I extends InvitationItem>
 		extends DbControllerImpl
-		implements InvitationsController<I>, EventListener {
+		implements InvitationController<I>, EventListener {
 
 	protected static final Logger LOG =
-			Logger.getLogger(InvitationsControllerImpl.class.getName());
+			Logger.getLogger(InvitationControllerImpl.class.getName());
 
 	private final EventBus eventBus;
 	protected InvitationListener listener;
 
-	public InvitationsControllerImpl(@DatabaseExecutor Executor dbExecutor,
+	public InvitationControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus) {
 		super(dbExecutor, lifecycleManager);
 		this.eventBus = eventBus;
@@ -70,21 +70,21 @@ public abstract class InvitationsControllerImpl<I extends InvitationItem>
 		} else if (e instanceof GroupAddedEvent) {
 			GroupAddedEvent g = (GroupAddedEvent) e;
 			ClientId cId = g.getGroup().getClientId();
-			if (cId.equals(getClientId())) {
+			if (cId.equals(getShareableClientId())) {
 				LOG.info("Group added, reloading");
 				listener.loadInvitations(false);
 			}
 		} else if (e instanceof GroupRemovedEvent) {
 			GroupRemovedEvent g = (GroupRemovedEvent) e;
 			ClientId cId = g.getGroup().getClientId();
-			if (cId.equals(getClientId())) {
+			if (cId.equals(getShareableClientId())) {
 				LOG.info("Group removed, reloading");
-				listener.loadInvitations(true);
+				listener.loadInvitations(false);
 			}
 		}
 	}
 
-	protected abstract ClientId getClientId();
+	protected abstract ClientId getShareableClientId();
 
 	@Override
 	public void loadInvitations(final boolean clear,
diff --git a/briar-android/src/org/briarproject/android/sharing/BlogShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
similarity index 92%
rename from briar-android/src/org/briarproject/android/sharing/BlogShareActivity.java
rename to briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
index d885c24b578c5e889ea286e5eed8b23624fe09e2..7d5cdeef3e63ae5e211dc9dabbe283bafd0f654f 100644
--- a/briar-android/src/org/briarproject/android/sharing/BlogShareActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
@@ -12,7 +12,7 @@ import javax.inject.Inject;
 
 import static org.briarproject.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
 
-public class BlogShareActivity extends ShareActivity {
+public class ShareBlogActivity extends ShareActivity {
 
 	// Fields that are accessed from background threads must be volatile
 	@Inject
@@ -20,7 +20,7 @@ public class BlogShareActivity extends ShareActivity {
 
 	@Override
 	BaseMessageFragment getMessageFragment() {
-		return BlogShareMessageFragment.newInstance();
+		return ShareBlogMessageFragment.newInstance();
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/sharing/BlogShareMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java
similarity index 80%
rename from briar-android/src/org/briarproject/android/sharing/BlogShareMessageFragment.java
rename to briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java
index 507ea17a2c3eeb766859a50f5631e369e6b6cb7b..ccee4d8fecb028dcbf9e2ec970fd2115f7e5c2af 100644
--- a/briar-android/src/org/briarproject/android/sharing/BlogShareMessageFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java
@@ -9,12 +9,12 @@ import android.view.ViewGroup;
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
 
-public class BlogShareMessageFragment extends BaseMessageFragment {
+public class ShareBlogMessageFragment extends BaseMessageFragment {
 
-	public final static String TAG = BlogShareMessageFragment.class.getName();
+	public final static String TAG = ShareBlogMessageFragment.class.getName();
 
-	public static BlogShareMessageFragment newInstance() {
-		return new BlogShareMessageFragment();
+	public static ShareBlogMessageFragment newInstance() {
+		return new ShareBlogMessageFragment();
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/sharing/ForumShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
similarity index 92%
rename from briar-android/src/org/briarproject/android/sharing/ForumShareActivity.java
rename to briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
index 598d3b3dcc1b379c731c4eb5549abe9f2e821119..492e3615b23b4903a61d433d04779170e7e557f4 100644
--- a/briar-android/src/org/briarproject/android/sharing/ForumShareActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
@@ -12,7 +12,7 @@ import javax.inject.Inject;
 
 import static org.briarproject.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
 
-public class ForumShareActivity extends ShareActivity {
+public class ShareForumActivity extends ShareActivity {
 
 	// Fields that are accessed from background threads must be volatile
 	@Inject
@@ -20,7 +20,7 @@ public class ForumShareActivity extends ShareActivity {
 
 	@Override
 	BaseMessageFragment getMessageFragment() {
-		return ForumShareMessageFragment.newInstance();
+		return ShareForumMessageFragment.newInstance();
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/sharing/ForumShareMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java
similarity index 79%
rename from briar-android/src/org/briarproject/android/sharing/ForumShareMessageFragment.java
rename to briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java
index 56f6b6d9ad5fd3a9616e665a39b0ec5a42529a94..a3faeb630de35101d606b194260be9aa3971c100 100644
--- a/briar-android/src/org/briarproject/android/sharing/ForumShareMessageFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java
@@ -9,12 +9,12 @@ import android.view.ViewGroup;
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
 
-public class ForumShareMessageFragment extends BaseMessageFragment {
+public class ShareForumMessageFragment extends BaseMessageFragment {
 
-	public final static String TAG = ForumShareMessageFragment.class.getName();
+	public final static String TAG = ShareForumMessageFragment.class.getName();
 
-	public static ForumShareMessageFragment newInstance() {
-		return new ForumShareMessageFragment();
+	public static ShareForumMessageFragment newInstance() {
+		return new ShareForumMessageFragment();
 	}
 
 	@Override
diff --git a/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java
index f42b8886fb5b8be0e4df09c44ff8d69daea6d059..c8244a39248f621d4a829002afb232eed4f7208c 100644
--- a/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java
@@ -3,12 +3,13 @@ package org.briarproject.api.event;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.forum.ForumInvitationRequest;
 import org.briarproject.api.privategroup.PrivateGroup;
+import org.briarproject.api.privategroup.invitation.GroupInvitationRequest;
 
 public class GroupInvitationReceivedEvent extends
 		InvitationRequestReceivedEvent<PrivateGroup> {
 
 	public GroupInvitationReceivedEvent(PrivateGroup group, ContactId contactId,
-			ForumInvitationRequest request) {
+			GroupInvitationRequest request) {
 		super(group, contactId, request);
 	}
 
diff --git a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationItem.java b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationItem.java
index 16688b37c7ec3f118805913d1f398f5a0bfb7ac2..5cb23afee77575127930ea215d866d8179995fd9 100644
--- a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationItem.java
+++ b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationItem.java
@@ -2,18 +2,18 @@ package org.briarproject.api.privategroup.invitation;
 
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.nullsafety.NotNullByDefault;
+import org.briarproject.api.privategroup.PrivateGroup;
 import org.briarproject.api.sharing.InvitationItem;
-import org.briarproject.api.sharing.Shareable;
 
 import javax.annotation.concurrent.Immutable;
 
 @Immutable
 @NotNullByDefault
-public class GroupInvitationItem extends InvitationItem {
+public class GroupInvitationItem extends InvitationItem<PrivateGroup> {
 
 	private final Contact creator;
 
-	public GroupInvitationItem(Shareable shareable, boolean subscribed,
+	public GroupInvitationItem(PrivateGroup shareable, boolean subscribed,
 			Contact creator) {
 		super(shareable, subscribed);
 
diff --git a/briar-api/src/org/briarproject/api/sharing/InvitationItem.java b/briar-api/src/org/briarproject/api/sharing/InvitationItem.java
index 423edf3b32b8e4e1f8b129f1d498adedd6901283..c81a4730d87bd00faf9acab6e481f0fcfbc325ec 100644
--- a/briar-api/src/org/briarproject/api/sharing/InvitationItem.java
+++ b/briar-api/src/org/briarproject/api/sharing/InvitationItem.java
@@ -4,21 +4,20 @@ import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 
 import javax.annotation.concurrent.Immutable;
-import javax.annotation.concurrent.ThreadSafe;
 
 @Immutable
 @NotNullByDefault
-public abstract class InvitationItem {
+public abstract class InvitationItem<S extends Shareable> {
 
-	private final Shareable shareable;
+	private final S shareable;
 	private final boolean subscribed;
 
-	public InvitationItem(Shareable shareable, boolean subscribed) {
+	public InvitationItem(S shareable, boolean subscribed) {
 		this.shareable = shareable;
 		this.subscribed = subscribed;
 	}
 
-	public Shareable getShareable() {
+	public S getShareable() {
 		return shareable;
 	}
 
diff --git a/briar-api/src/org/briarproject/api/sharing/SharingInvitationItem.java b/briar-api/src/org/briarproject/api/sharing/SharingInvitationItem.java
index ddbc3cba45ca1fd3f4c9b57b3f5cc508db2e31f7..04b69f49e9cd4a65be8afd3805edcd42069a03f0 100644
--- a/briar-api/src/org/briarproject/api/sharing/SharingInvitationItem.java
+++ b/briar-api/src/org/briarproject/api/sharing/SharingInvitationItem.java
@@ -9,7 +9,7 @@ import javax.annotation.concurrent.Immutable;
 
 @Immutable
 @NotNullByDefault
-public class SharingInvitationItem extends InvitationItem {
+public class SharingInvitationItem extends InvitationItem<Shareable> {
 
 	private final Collection<Contact> newSharers;