diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java
index 6cb17a40f2c90b776d718aecf968728ad2364d98..62131cb41ddbe081a3ce3dea326859a76ad6151f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java
@@ -6,7 +6,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.StringRes;
-import android.support.v7.app.ActionBar;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.Menu;
@@ -14,6 +13,7 @@ import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 
+import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.identity.LocalAuthor;
@@ -124,12 +124,6 @@ public class GroupActivity extends
 	@Override
 	protected void onNamedGroupLoaded(final PrivateGroup group) {
 		setTitle(group.getName());
-		// Created by
-		ActionBar actionBar = getSupportActionBar();
-		if (actionBar != null) {
-			actionBar.setSubtitle(getString(R.string.groups_created_by,
-					group.getCreator().getName()));
-		}
 		controller.loadLocalAuthor(
 				new UiResultExceptionHandler<LocalAuthor, DbException>(this) {
 					@Override
@@ -287,8 +281,13 @@ public class GroupActivity extends
 	}
 
 	@Override
-	public void onContactRelationshipRevealed(AuthorId memberId, Visibility v) {
+	public void onContactRelationshipRevealed(AuthorId memberId, ContactId c,
+			Visibility v) {
 		adapter.updateVisibility(memberId, v);
+
+		sharingController.add(c);
+		setToolbarSubTitle(sharingController.getTotalCount(),
+				sharingController.getOnlineCount());
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java
index c3e03c10313aa21b2eba3f5c48b5134df3715ea6..61817fcb4e52ee2e653c4639932748972e2b5535 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java
@@ -2,6 +2,7 @@ package org.briarproject.briar.android.privategroup.conversation;
 
 import android.support.annotation.UiThread;
 
+import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.identity.LocalAuthor;
@@ -23,7 +24,8 @@ public interface GroupController
 
 	interface GroupListener extends ThreadListListener<GroupMessageHeader> {
 		@UiThread
-		void onContactRelationshipRevealed(AuthorId memberId, Visibility v);
+		void onContactRelationshipRevealed(AuthorId memberId,
+				ContactId contactId, Visibility v);
 
 		@UiThread
 		void onGroupDissolved();
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java
index a34e0365eae96720e8ce3932491053493ce8f9e5..0c75305591d4220540a76c85683760b273b31d76 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java
@@ -18,6 +18,7 @@ import org.briarproject.briar.android.privategroup.conversation.GroupController.
 import org.briarproject.briar.android.threaded.ThreadListControllerImpl;
 import org.briarproject.briar.api.android.AndroidNotificationManager;
 import org.briarproject.briar.api.client.MessageTracker.GroupCount;
+import org.briarproject.briar.api.privategroup.GroupMember;
 import org.briarproject.briar.api.privategroup.GroupMessage;
 import org.briarproject.briar.api.privategroup.GroupMessageFactory;
 import org.briarproject.briar.api.privategroup.GroupMessageHeader;
@@ -26,8 +27,11 @@ import org.briarproject.briar.api.privategroup.PrivateGroup;
 import org.briarproject.briar.api.privategroup.PrivateGroupManager;
 import org.briarproject.briar.api.privategroup.event.ContactRelationshipRevealedEvent;
 import org.briarproject.briar.api.privategroup.event.GroupDissolvedEvent;
+import org.briarproject.briar.api.privategroup.event.GroupInvitationResponseReceivedEvent;
 import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent;
+import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
@@ -93,7 +97,20 @@ class GroupControllerImpl extends
 					@Override
 					public void run() {
 						listener.onContactRelationshipRevealed(c.getMemberId(),
-								c.getVisibility());
+								c.getContactId(), c.getVisibility());
+					}
+				});
+			}
+		} else if (e instanceof GroupInvitationResponseReceivedEvent) {
+			GroupInvitationResponseReceivedEvent g =
+					(GroupInvitationResponseReceivedEvent) e;
+			final GroupInvitationResponse r =
+					(GroupInvitationResponse) g.getResponse();
+			if (getGroupId().equals(r.getGroupId()) && r.wasAccepted()) {
+				listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+					@Override
+					public void run() {
+						listener.onInvitationAccepted(r.getContactId());
 					}
 				});
 			}
@@ -137,8 +154,26 @@ class GroupControllerImpl extends
 
 	@Override
 	public void loadSharingContacts(
-			ResultExceptionHandler<Collection<ContactId>, DbException> handler) {
-		// TODO
+			final ResultExceptionHandler<Collection<ContactId>, DbException> handler) {
+		runOnDbThread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					Collection<GroupMember> members =
+							privateGroupManager.getMembers(getGroupId());
+					Collection<ContactId> contactIds = new ArrayList<>();
+					for (GroupMember m : members) {
+						if (m.getContactId() != null)
+							contactIds.add(m.getContactId());
+					}
+					handler.onResult(contactIds);
+				} catch (DbException e) {
+					if (LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+					handler.onException(e);
+				}
+			}
+		});
 	}
 
 	@Override
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java
index 08fd42b3d8bc4dd8850903def3e601604a7757e6..31a2b2ee09024c97d1721730d973bbaeba05f2cb 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java
@@ -1,5 +1,6 @@
 package org.briarproject.briar.api.privategroup.event;
 
+import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.event.Event;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@@ -14,12 +15,14 @@ public class ContactRelationshipRevealedEvent extends Event {
 
 	private final GroupId groupId;
 	private final AuthorId memberId;
+	private final ContactId contactId;
 	private final Visibility visibility;
 
 	public ContactRelationshipRevealedEvent(GroupId groupId, AuthorId memberId,
-			Visibility visibility) {
+			ContactId contactId, Visibility visibility) {
 		this.groupId = groupId;
 		this.memberId = memberId;
+		this.contactId = contactId;
 		this.visibility = visibility;
 	}
 
@@ -31,6 +34,10 @@ public class ContactRelationshipRevealedEvent extends Event {
 		return memberId;
 	}
 
+	public ContactId getContactId() {
+		return contactId;
+	}
+
 	public Visibility getVisibility() {
 		return visibility;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java
index 1d1d03c8871070333f7c17402c7c59d2bf560ae7..cdaf0c928ad300024e752cf9aeff40e48cc3246c 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java
@@ -402,7 +402,7 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook
 		try {
 			Collection<GroupMember> members = new ArrayList<GroupMember>();
 			Map<Author, Visibility> authors = getMembers(txn, g);
-			LocalAuthor la = identityManager.getLocalAuthor();
+			LocalAuthor la = identityManager.getLocalAuthor(txn);
 			PrivateGroup privateGroup = getPrivateGroup(txn, g);
 			for (Entry<Author, Visibility> m : authors.entrySet()) {
 				Author a = m.getKey();
@@ -488,7 +488,10 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook
 		if (!foundMember) throw new ProtocolStateException();
 		if (changed) {
 			clientHelper.mergeGroupMetadata(txn, g, meta);
-			txn.attach(new ContactRelationshipRevealedEvent(g, a, v));
+			LocalAuthor la = identityManager.getLocalAuthor(txn);
+			ContactId c = contactManager.getContact(txn, a, la.getId()).getId();
+			Event e = new ContactRelationshipRevealedEvent(g, a, c, v);
+			txn.attach(e);
 		}
 	}
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java
index ef5f7e85f55499bac1f2467cb26e27ca021e5716..df59dbece6bf21f9e9855023f45dc242e9b745c6 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java
@@ -255,7 +255,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 			GroupInvitationMessage m, ContactId c, boolean accept) {
 		SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes());
 		return new GroupInvitationResponse(m.getId(), sessionId,
-				m.getContactGroupId(), c, accept, m.getTimestamp(), false,
+				m.getPrivateGroupId(), c, accept, m.getTimestamp(), false,
 				false, true, false);
 	}
 }
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
index 4c57e9aff3cee702725a981dcb60ffedd886ced4..87079ac5c28bfc5033dba87ddb23ca6411162d49 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
@@ -380,11 +380,11 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 					messages.add(parseInvitationRequest(txn, c, contactGroupId,
 							m, meta, status));
 				} else if (type == JOIN) {
-					messages.add(parseInvitationResponse(c, contactGroupId, m,
-							meta, status, true));
+					messages.add(
+							parseInvitationResponse(c, m, meta, status, true));
 				} else if (type == LEAVE) {
-					messages.add(parseInvitationResponse(c, contactGroupId, m,
-							meta, status, false));
+					messages.add(
+							parseInvitationResponse(c, m, meta, status, false));
 				}
 			}
 			db.commitTransaction(txn);
@@ -418,13 +418,13 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 	}
 
 	private GroupInvitationResponse parseInvitationResponse(ContactId c,
-			GroupId contactGroupId, MessageId m, MessageMetadata meta,
-			MessageStatus status, boolean accept)
-			throws DbException, FormatException {
+			MessageId m, MessageMetadata meta, MessageStatus status,
+			boolean accept) throws DbException, FormatException {
 		SessionId sessionId = getSessionId(meta.getPrivateGroupId());
-		return new GroupInvitationResponse(m, sessionId, contactGroupId, c,
-				accept, meta.getTimestamp(), meta.isLocal(), status.isSent(),
-				status.isSeen(), meta.isRead());
+		return new GroupInvitationResponse(m, sessionId,
+				meta.getPrivateGroupId(), c, accept, meta.getTimestamp(),
+				meta.isLocal(), status.isSent(), status.isSeen(),
+				meta.isRead());
 	}
 
 	@Override
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java
index 9646d1cf11a3219a51460d92e0e0870cbd6977f7..0d680b8b2c7dc5a3bef2255a1e19fb6bda42fadb 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java
@@ -441,6 +441,9 @@ public class PrivateGroupManagerIntegrationTest
 		Collection<GroupMember> members2 = groupManager2.getMembers(groupId0);
 		assertEquals(3, members2.size());
 
+		// 1 and 2 add each other
+		addContacts1And2();
+
 		// assert that contact relationship is not revealed initially
 		for (GroupMember m : members1) {
 			if (m.getAuthor().equals(author2)) {