diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java
index f200702eff9f009f7dd4de94d7123dbcb459a1d7..ae666f691a3b53a0fe82a6d51770a719cd372914 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java
@@ -26,7 +26,7 @@ import org.briarproject.briar.api.blog.BlogSharingManager;
 import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent;
 import org.briarproject.briar.api.blog.event.BlogPostAddedEvent;
 import org.briarproject.briar.api.sharing.InvitationResponse;
-import org.briarproject.briar.api.sharing.event.ShareableLeftEvent;
+import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -110,10 +110,10 @@ class BlogControllerImpl extends BaseControllerImpl
 				LOG.info("Blog invitation accepted");
 				onBlogInvitationAccepted(b.getContactId());
 			}
-		} else if (e instanceof ShareableLeftEvent) {
-			ShareableLeftEvent s = (ShareableLeftEvent) e;
+		} else if (e instanceof ContactLeftShareableEvent) {
+			ContactLeftShareableEvent s = (ContactLeftShareableEvent) e;
 			if (s.getGroupId().equals(groupId)) {
-				LOG.info("Blog left");
+				LOG.info("Blog left by contact");
 				onBlogLeft(s.getContactId());
 			}
 		} else if (e instanceof GroupRemovedEvent) {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java
index 87afdfe5215fc03a33d92bfe309c610f8e7e98ad..700beee63ec11b0a12906576dd99d8385b173894 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java
@@ -18,7 +18,6 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
-@UiThread
 @NotNullByDefault
 public class SharingControllerImpl implements SharingController, EventListener {
 
@@ -26,8 +25,9 @@ public class SharingControllerImpl implements SharingController, EventListener {
 	private final ConnectionRegistry connectionRegistry;
 
 	@Nullable
-	private SharingListener listener;
-	private Set<ContactId> contacts = new HashSet<>();
+	private volatile SharingListener listener;
+	// only access on @UiThread
+	private final Set<ContactId> contacts = new HashSet<>();
 
 	@Inject
 	SharingControllerImpl(EventBus eventBus,
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/event/ShareableLeftEvent.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/event/ContactLeftShareableEvent.java
similarity index 82%
rename from briar-api/src/main/java/org/briarproject/briar/api/sharing/event/ShareableLeftEvent.java
rename to briar-api/src/main/java/org/briarproject/briar/api/sharing/event/ContactLeftShareableEvent.java
index 0548ea00283d0396475fee6a4b743ade416d1e98..69ffbab3c927f5ba52650bd113e05a719258ae0c 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/event/ShareableLeftEvent.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/event/ContactLeftShareableEvent.java
@@ -10,12 +10,12 @@ import javax.annotation.concurrent.Immutable;
 
 @Immutable
 @NotNullByDefault
-public class ShareableLeftEvent extends Event {
+public class ContactLeftShareableEvent extends Event {
 
 	private final GroupId groupId;
 	private final ContactId contactId;
 
-	public ShareableLeftEvent(GroupId groupId, ContactId contactId) {
+	public ContactLeftShareableEvent(GroupId groupId, ContactId contactId) {
 		this.groupId = groupId;
 		this.contactId = contactId;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
index ba56908d8fbbb930db15b30c43d29acc0170e175..68db4520d1254a3ef4633835cffebadb9d022990 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
@@ -258,7 +258,7 @@ class BlogSharingManagerImpl extends
 		@Override
 		public BlogInvitation build(BlogSharerSessionState localState,
 				long time) {
-			return new BlogInvitation(localState.getGroupId(),
+			return new BlogInvitation(localState.getContactGroupId(),
 					localState.getSessionId(), localState.getBlogAuthorName(),
 					localState.getBlogPublicKey(), time,
 					localState.getMessage());
@@ -338,7 +338,7 @@ class BlogSharingManagerImpl extends
 			ContactId contactId = localState.getContactId();
 			BlogInvitationRequest request =
 					new BlogInvitationRequest(localState.getInvitationId(),
-							localState.getSessionId(), localState.getGroupId(),
+							localState.getSessionId(), localState.getContactGroupId(),
 							contactId, blog.getAuthor().getName(), msg, true,
 							time, false, false, false, false);
 			return new BlogInvitationRequestReceivedEvent(blog, contactId,
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java
index 84363a7089f624a00897171b5c30613124531fb4..8d92552557fe96e2003be37a89ee89a32592ac7b 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java
@@ -191,7 +191,7 @@ class ForumSharingManagerImpl extends
 		@Override
 		public ForumInvitation build(ForumSharerSessionState localState,
 				long time) {
-			return new ForumInvitation(localState.getGroupId(),
+			return new ForumInvitation(localState.getContactGroupId(),
 					localState.getSessionId(), localState.getForumName(),
 					localState.getForumSalt(), time, localState.getMessage());
 		}
@@ -268,7 +268,7 @@ class ForumSharingManagerImpl extends
 			ContactId contactId = localState.getContactId();
 			ForumInvitationRequest request = new ForumInvitationRequest(
 					localState.getInvitationId(), localState.getSessionId(),
-					localState.getGroupId(), contactId, forum.getName(), msg,
+					localState.getContactGroupId(), contactId, forum.getName(), msg,
 					true, time, false, false, false, false);
 			return new ForumInvitationRequestReceivedEvent(forum, contactId,
 					request);
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/InviteeEngine.java b/briar-core/src/main/java/org/briarproject/briar/sharing/InviteeEngine.java
index a8a5a16fd62037089d01d65a9e5eb5c8ab8cc706..92a534da64ccaf1e6208023b9d0157d58319200f 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/InviteeEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/InviteeEngine.java
@@ -77,20 +77,20 @@ class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationRequest
 				if (action == InviteeSessionState.Action.LOCAL_ACCEPT) {
 					localState.setTask(TASK_ADD_SHARED_SHAREABLE);
 					msg = new SimpleMessage(SHARE_MSG_TYPE_ACCEPT,
-							localState.getGroupId(), localState.getSessionId(),
+							localState.getContactGroupId(), localState.getSessionId(),
 							clock.currentTimeMillis());
 				} else {
 					localState.setTask(
 							TASK_REMOVE_SHAREABLE_FROM_LIST_SHARED_WITH_US);
 					msg = new SimpleMessage(SHARE_MSG_TYPE_DECLINE,
-							localState.getGroupId(), localState.getSessionId(),
+							localState.getContactGroupId(), localState.getSessionId(),
 							clock.currentTimeMillis());
 				}
 				messages = Collections.singletonList(msg);
 				logLocalAction(currentState, localState, msg);
 			} else if (action == InviteeSessionState.Action.LOCAL_LEAVE) {
 				BaseMessage msg = new SimpleMessage(SHARE_MSG_TYPE_LEAVE,
-						localState.getGroupId(), localState.getSessionId(),
+						localState.getContactGroupId(), localState.getSessionId(),
 						clock.currentTimeMillis());
 				messages = Collections.singletonList(msg);
 				logLocalAction(currentState, localState, msg);
@@ -221,7 +221,7 @@ class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationRequest
 		}
 		localState.setState(InviteeSessionState.State.ERROR);
 		BaseMessage msg =
-				new SimpleMessage(SHARE_MSG_TYPE_ABORT, localState.getGroupId(),
+				new SimpleMessage(SHARE_MSG_TYPE_ABORT, localState.getContactGroupId(),
 						localState.getSessionId(), clock.currentTimeMillis());
 		List<BaseMessage> messages = Collections.singletonList(msg);
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharerEngine.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharerEngine.java
index 476580f915d64eef3784f178aa605c92067d1ca5..7d5b351834557775d4f7a634400a5f6514938813 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharerEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharerEngine.java
@@ -86,7 +86,7 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
 						.setTask(TASK_ADD_SHAREABLE_TO_LIST_TO_BE_SHARED_BY_US);
 			} else if (action == SharerSessionState.Action.LOCAL_LEAVE) {
 				BaseMessage msg = new SimpleMessage(SHARE_MSG_TYPE_LEAVE,
-						localState.getGroupId(), localState.getSessionId(),
+						localState.getContactGroupId(), localState.getSessionId(),
 						clock.currentTimeMillis());
 				messages = Collections.singletonList(msg);
 				logLocalAction(currentState, nextState, msg);
@@ -217,7 +217,7 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
 
 		localState.setState(SharerSessionState.State.ERROR);
 		BaseMessage msg = new SimpleMessage(SHARE_MSG_TYPE_ABORT,
-				localState.getGroupId(), localState.getSessionId(),
+				localState.getContactGroupId(), localState.getSessionId(),
 				clock.currentTimeMillis());
 		List<BaseMessage> messages = Collections.singletonList(msg);
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
index 95890062904c48cdad06f648a8ce4cb70c38d03d..44ba7496069dd9d22f0b02f4a2270de4f9ed53a8 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
@@ -39,7 +39,7 @@ import org.briarproject.briar.api.sharing.SharingInvitationItem;
 import org.briarproject.briar.api.sharing.SharingManager;
 import org.briarproject.briar.api.sharing.event.InvitationRequestReceivedEvent;
 import org.briarproject.briar.api.sharing.event.InvitationResponseReceivedEvent;
-import org.briarproject.briar.api.sharing.event.ShareableLeftEvent;
+import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent;
 import org.briarproject.briar.client.ConversationClientImpl;
 
 import java.io.IOException;
@@ -302,7 +302,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 			// track message
 			// TODO handle this properly without engine hacks (#376)
 			long time = update.toSend.get(0).getTime();
-			messageTracker.trackMessage(txn, localState.getGroupId(), time,
+			messageTracker.trackMessage(txn, localState.getContactGroupId(), time,
 					true);
 
 			db.commitTransaction(txn);
@@ -366,7 +366,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 		// track message
 		// TODO handle this properly without engine hacks (#376)
 		long time = update.toSend.get(0).getTime();
-		messageTracker.trackMessage(txn, localState.getGroupId(), time, true);
+		messageTracker.trackMessage(txn, localState.getContactGroupId(), time, true);
 	}
 
 	@Override
@@ -873,7 +873,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 		localState.setTask(-1);
 
 		// get group ID for later
-		GroupId groupId = localState.getGroupId();
+		GroupId groupId = localState.getContactGroupId();
 		// get contact ID for later
 		ContactId contactId = localState.getContactId();
 
@@ -899,13 +899,15 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 			db.setGroupVisibility(txn, contactId, f.getId(), INVISIBLE);
 			removeFromList(txn, groupId, SHARED_BY_US, f);
 			// broadcast event informing UI that contact has left the group
-			ShareableLeftEvent e = new ShareableLeftEvent(f.getId(), contactId);
+			ContactLeftShareableEvent
+					e = new ContactLeftShareableEvent(f.getId(), contactId);
 			txn.attach(e);
 		} else if (task == TASK_UNSHARE_SHAREABLE_SHARED_WITH_US) {
 			db.setGroupVisibility(txn, contactId, f.getId(), INVISIBLE);
 			removeFromList(txn, groupId, SHARED_WITH_US, f);
 			// broadcast event informing UI that contact has left the group
-			ShareableLeftEvent e = new ShareableLeftEvent(f.getId(), contactId);
+			ContactLeftShareableEvent
+					e = new ContactLeftShareableEvent(f.getId(), contactId);
 			txn.attach(e);
 		}
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingSessionState.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingSessionState.java
index 048d56a5841b86184aa3bfdb024430a0b4a359ee..791ca044618283be64260b81d10330f0a2f30c91 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingSessionState.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingSessionState.java
@@ -68,7 +68,7 @@ abstract class SharingSessionState {
 		BdfDictionary d = new BdfDictionary();
 		d.put(SESSION_ID, getSessionId());
 		d.put(STORAGE_ID, getStorageId());
-		d.put(GROUP_ID, getGroupId());
+		d.put(GROUP_ID, getContactGroupId());
 		d.put(CONTACT_ID, getContactId().getInt());
 		d.put(SHAREABLE_ID, getShareableId());
 
@@ -83,7 +83,7 @@ abstract class SharingSessionState {
 		return storageId;
 	}
 
-	public GroupId getGroupId() {
+	public GroupId getContactGroupId() {
 		return groupId;
 	}