diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java
index 54f17282bc2b02d73f98e88f4d32447e5842f5c0..48a133462a55be0b081eb43b5091dc3622bf2e3f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java
@@ -49,8 +49,11 @@ import org.briarproject.bramble.util.StringUtils;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.activity.BriarActivity;
+import org.briarproject.briar.android.blog.BlogActivity;
 import org.briarproject.briar.android.contact.ConversationAdapter.ConversationListener;
+import org.briarproject.briar.android.forum.ForumActivity;
 import org.briarproject.briar.android.introduction.IntroductionActivity;
+import org.briarproject.briar.android.privategroup.conversation.GroupActivity;
 import org.briarproject.briar.android.view.BriarRecyclerView;
 import org.briarproject.briar.android.view.TextInputView;
 import org.briarproject.briar.android.view.TextInputView.TextInputListener;
@@ -850,6 +853,28 @@ public class ConversationActivity extends BriarActivity
 		});
 	}
 
+	@UiThread
+	@Override
+	public void open(ConversationRequestItem item) {
+		if (item.getRequestedGroupId() == null) return;
+		Intent i;
+		switch (item.getRequestType()) {
+			case FORUM:
+				i = new Intent(this, ForumActivity.class);
+				break;
+			case BLOG:
+				i = new Intent(this, BlogActivity.class);
+				break;
+			case GROUP:
+				i = new Intent(this, GroupActivity.class);
+				break;
+			default:
+				throw new IllegalArgumentException("Unknown Request Type");
+		}
+		i.putExtra(GROUP_ID, item.getRequestedGroupId().getBytes());
+		startActivity(i);
+	}
+
 	@DatabaseExecutor
 	private void respondToIntroductionRequest(SessionId sessionId,
 			boolean accept, long time) throws DbException, FormatException {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java
index b8f1bb78a7485f23046919959c4f983751ca27ca..b748a358c5078f551074bda21d898b30076b41d0 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java
@@ -139,6 +139,9 @@ class ConversationAdapter
 		void onItemVisible(ConversationItem item);
 
 		void respondToRequest(ConversationRequestItem item, boolean accept);
+
+		void open(ConversationRequestItem item);
+
 	}
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java
index faf43cf5e322b971a5e563f6bb978808b99cc305..56fdfa0588e0965a2ad08d6e318511ac4bbd7938 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java
@@ -101,9 +101,6 @@ abstract class ConversationItem {
 				text = ctx.getString(
 						R.string.introduction_request_answered_received,
 						contactName, ir.getName());
-				return new ConversationNoticeInItem(ir.getMessageId(),
-						ir.getGroupId(), text, ir.getMessage(), ir.getTimestamp(),
-						ir.isRead());
 			} else if (ir.contactExists()){
 				text = ctx.getString(
 						R.string.introduction_request_exists_received,
@@ -114,7 +111,7 @@ abstract class ConversationItem {
 			}
 			return new ConversationRequestItem(ir.getMessageId(),
 					ir.getGroupId(), INTRODUCTION, ir.getSessionId(), text,
-					ir.getMessage(), ir.getTimestamp(), ir.isRead(),
+					ir.getMessage(), ir.getTimestamp(), ir.isRead(), null,
 					ir.wasAnswered());
 		}
 	}
@@ -203,14 +200,10 @@ abstract class ConversationItem {
 			} else {
 				throw new IllegalArgumentException("Unknown InvitationRequest");
 			}
-			if (!ir.isAvailable()) {
-				return new ConversationNoticeInItem(ir.getId(), ir.getGroupId(),
-						text, ir.getMessage(), ir.getTimestamp(), ir.isRead());
-			}
 			return new ConversationRequestItem(ir.getId(),
 					ir.getGroupId(), type, ir.getSessionId(), text,
 					ir.getMessage(), ir.getTimestamp(), ir.isRead(),
-					!ir.isAvailable());
+					ir.getInvitedGroupId(), !ir.isAvailable());
 		}
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java
index 3dd8dd721baf0cb58ac5909a02a477d9b22dcacc..54203056f0d1c1ca1c74ead2d304115db23d69f1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java
@@ -17,6 +17,8 @@ class ConversationRequestItem extends ConversationNoticeInItem {
 
 	enum RequestType { INTRODUCTION, FORUM, BLOG, GROUP }
 
+	@Nullable
+	private final GroupId requestedGroupId;
 	private final RequestType requestType;
 	private final SessionId sessionId;
 	private boolean answered;
@@ -24,10 +26,11 @@ class ConversationRequestItem extends ConversationNoticeInItem {
 	ConversationRequestItem(MessageId id, GroupId groupId,
 			RequestType requestType, SessionId sessionId, String text,
 			@Nullable String msgText, long time, boolean read,
-			boolean answered) {
+			@Nullable GroupId requestedGroupId, boolean answered) {
 		super(id, groupId, text, msgText, time, read);
 		this.requestType = requestType;
 		this.sessionId = sessionId;
+		this.requestedGroupId = requestedGroupId;
 		this.answered = answered;
 	}
 
@@ -39,6 +42,11 @@ class ConversationRequestItem extends ConversationNoticeInItem {
 		return sessionId;
 	}
 
+	@Nullable
+	public GroupId getRequestedGroupId() {
+		return requestedGroupId;
+	}
+
 	boolean wasAnswered() {
 		return answered;
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java
index 663e0394d27faf6edc05603380b367a0cb78535a..e60ad04e920553915091a78669604bddb578dab3 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java
@@ -11,6 +11,7 @@ import org.briarproject.briar.android.contact.ConversationAdapter.ConversationLi
 
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
+import static org.briarproject.briar.android.contact.ConversationRequestItem.RequestType.INTRODUCTION;
 
 @UiThread
 @NotNullByDefault
@@ -32,11 +33,23 @@ class ConversationRequestViewHolder extends ConversationNoticeInViewHolder {
 		final ConversationRequestItem item =
 				(ConversationRequestItem) conversationItem;
 
-		if (item.wasAnswered()) {
+		if (item.getRequestType() == INTRODUCTION && item.wasAnswered()) {
 			acceptButton.setVisibility(GONE);
 			declineButton.setVisibility(GONE);
+		} else if (item.wasAnswered()) {
+			acceptButton.setVisibility(VISIBLE);
+			acceptButton.setText(R.string.open);
+			acceptButton.setOnClickListener(new OnClickListener() {
+				@Override
+				public void onClick(View v) {
+					item.setAnswered(true);
+					listener.open(item);
+				}
+			});
+			declineButton.setVisibility(GONE);
 		} else {
 			acceptButton.setVisibility(VISIBLE);
+			acceptButton.setText(R.string.accept);
 			acceptButton.setOnClickListener(new OnClickListener() {
 				@Override
 				public void onClick(View v) {
diff --git a/briar-android/src/main/res/layout/list_item_conversation_request.xml b/briar-android/src/main/res/layout/list_item_conversation_request.xml
index 3932e82e535394583f6956d405f60281d95df874..3d6388a1cea8d982ec0b7785a9651bc8dd70dc56 100644
--- a/briar-android/src/main/res/layout/list_item_conversation_request.xml
+++ b/briar-android/src/main/res/layout/list_item_conversation_request.xml
@@ -43,7 +43,7 @@
 			android:layout_height="wrap_content"
 			android:layout_alignEnd="@+id/text"
 			android:layout_alignRight="@+id/text"
-			android:layout_below="@+id/declineButton"
+			android:layout_below="@+id/acceptButton"
 			android:layout_marginTop="@dimen/message_bubble_timestamp_margin"
 			android:textColor="@color/private_message_date"
 			android:textSize="@dimen/text_size_tiny"
@@ -57,6 +57,7 @@
 			android:layout_alignEnd="@+id/text"
 			android:layout_alignRight="@+id/text"
 			android:layout_below="@+id/text"
+			android:layout_marginBottom="-10dp"
 			android:text="@string/accept"/>
 
 		<Button
@@ -64,8 +65,8 @@
 			style="@style/BriarButtonFlat.Negative"
 			android:layout_width="wrap_content"
 			android:layout_height="wrap_content"
-			android:layout_below="@+id/text"
-			android:layout_marginBottom="-15dp"
+			android:layout_alignBottom="@+id/acceptButton"
+			android:layout_alignTop="@+id/acceptButton"
 			android:layout_toLeftOf="@+id/acceptButton"
 			android:layout_toStartOf="@+id/acceptButton"
 			android:text="@string/decline"/>
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index f9fad4a278ff9781cd4b1398f6f299299a81f23f..a23ec94b1c7a309d1f6c6d0fbd754ab773eb08d9 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -77,6 +77,7 @@
 	<string name="offline">Offline</string>
 	<string name="send">Send</string>
 	<string name="allow">Allow</string>
+	<string name="open">Open</string>
 	<string name="no_data">No data</string>
 	<string name="ellipsis">…</string>
 	<string name="text_too_long">The entered text is too long</string>
@@ -182,8 +183,8 @@
 
 	<!-- Private Group Invitations -->
 	<string name="groups_invitations_title">Group Invitations</string>
-	<string name="groups_invitations_invitation_sent">You have invited %1$s to join the group "%2$s".</string>
-	<string name="groups_invitations_invitation_received">%1$s has invited you to join the group "%2$s".</string>
+	<string name="groups_invitations_invitation_sent">You have invited %1$s to join the group \"%2$s\".</string>
+	<string name="groups_invitations_invitation_received">%1$s has invited you to join the group \"%2$s\".</string>
 	<string name="groups_invitations_joined">Joined group</string>
 	<string name="groups_invitations_declined">Group invitation declined</string>
 	<plurals name="groups_invitations_open">
diff --git a/briar-android/src/main/res/values/styles.xml b/briar-android/src/main/res/values/styles.xml
index 6dfcf55af98cba83dcba6993421491a50f069811..99105713df16ed8960ba4da844601f6756b1af32 100644
--- a/briar-android/src/main/res/values/styles.xml
+++ b/briar-android/src/main/res/values/styles.xml
@@ -37,13 +37,11 @@
 	<style name="BriarButtonFlat.Negative" parent="Widget.AppCompat.Button.Borderless">
 		<item name="android:textColor">@color/briar_button_negative</item>
 		<item name="android:textSize">@dimen/text_size_medium</item>
-		<item name="android:padding">@dimen/margin_large</item>
 	</style>
 
 	<style name="BriarButtonFlat.Positive" parent="Widget.AppCompat.Button.Borderless">
 		<item name="android:textColor">@color/briar_button_positive</item>
 		<item name="android:textSize">@dimen/text_size_medium</item>
-		<item name="android:padding">@dimen/margin_large</item>
 	</style>
 
 	<style name="BriarButtonFlat.Positive.Tiny" parent="BriarButtonFlat.Positive">
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java
index 505a5a064b90d087e99d21c804da48e510ecc6d8..12b389134fd9613cc74d18f5426a95e9c60580a7 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java
@@ -16,11 +16,12 @@ public class BlogInvitationRequest extends InvitationRequest {
 
 	public BlogInvitationRequest(MessageId id, SessionId sessionId,
 			GroupId groupId, ContactId contactId, String blogAuthorName,
-			@Nullable String message, boolean available, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
+			@Nullable String message, @Nullable GroupId blogId,
+			boolean available, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
 
-		super(id, sessionId, groupId, contactId, message, available, time,
-				local, sent, seen, read);
+		super(id, sessionId, groupId, contactId, message, blogId, available,
+				time, local, sent, seen, read);
 		this.blogAuthorName = blogAuthorName;
 	}
 
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationResponse.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationResponse.java
index 664126aba9eb75a60dc35ae34394fefd974616e8..38a2e1680929bb1a532a111144161870868f1afb 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationResponse.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationResponse.java
@@ -11,11 +11,12 @@ import org.briarproject.briar.api.sharing.InvitationResponse;
 public class BlogInvitationResponse extends InvitationResponse {
 
 	public BlogInvitationResponse(MessageId id, SessionId sessionId,
-			GroupId groupId, ContactId contactId, boolean accept, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
+			GroupId groupId, ContactId contactId, GroupId blogId,
+			boolean accept, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
 
-		super(id, sessionId, groupId, contactId, accept, time, local, sent,
-				seen, read);
+		super(id, sessionId, groupId, contactId, blogId, accept, time, local,
+				sent, seen, read);
 	}
 
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java
index 25a544510d36f37d1f1bbd3f6f84e17ca4320d4a..ae45c67da4f94af8369a084d4bb5d2666ba21421 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java
@@ -17,12 +17,13 @@ public class ForumInvitationRequest extends InvitationRequest {
 	private final String forumName;
 
 	public ForumInvitationRequest(MessageId id, SessionId sessionId,
-			GroupId groupId, ContactId contactId, String forumName,
-			@Nullable String message, boolean available, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
+			GroupId groupId, ContactId contactId, GroupId forumId,
+			String forumName, @Nullable String message, boolean available,
+			long time, boolean local, boolean sent, boolean seen,
+			boolean read) {
 
-		super(id, sessionId, groupId, contactId, message, available, time,
-				local, sent, seen, read);
+		super(id, sessionId, groupId, contactId, message, forumId, available,
+				time, local, sent, seen, read);
 		this.forumName = forumName;
 	}
 
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationResponse.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationResponse.java
index 4d65cf1c4ed245da69c1a301afaaa704a135a09e..31eb8698ab8fff6fcd288b59b1f0e802b84915b0 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationResponse.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationResponse.java
@@ -14,11 +14,12 @@ import javax.annotation.concurrent.Immutable;
 public class ForumInvitationResponse extends InvitationResponse {
 
 	public ForumInvitationResponse(MessageId id, SessionId sessionId,
-			GroupId groupId, ContactId contactId, boolean accept, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
+			GroupId groupId, ContactId contactId, GroupId forumId,
+			boolean accept, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
 
-		super(id, sessionId, groupId, contactId, accept, time, local, sent,
-				seen, read);
+		super(id, sessionId, groupId, contactId, forumId, accept, time, local,
+				sent, seen, read);
 	}
 
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java
index bf8110c6b383521ece7f5d87242ac58f10ba6b95..7c379b04a0771606b116f89357e007026f2d8475 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java
@@ -20,10 +20,11 @@ public class GroupInvitationRequest extends InvitationRequest {
 
 	public GroupInvitationRequest(MessageId id, SessionId sessionId,
 			GroupId groupId, ContactId contactId, @Nullable String message,
-			String groupName, Author creator, boolean available, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
-		super(id, sessionId, groupId, contactId, message, available, time,
-				local, sent, seen, read);
+			GroupId privateGroupId, String groupName, Author creator,
+			boolean available, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
+		super(id, sessionId, groupId, contactId, message, privateGroupId,
+				available, time, local, sent, seen, read);
 		this.groupName = groupName;
 		this.creator = creator;
 	}
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationResponse.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationResponse.java
index 3a72271560354b27f707459ca6f7a4fd75f28690..2f89e1e85b7e6f8ba45811e65bb93c79393f26cb 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationResponse.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationResponse.java
@@ -14,9 +14,10 @@ import javax.annotation.concurrent.Immutable;
 public class GroupInvitationResponse extends InvitationResponse {
 
 	public GroupInvitationResponse(MessageId id, SessionId sessionId,
-			GroupId groupId, ContactId contactId, boolean accept, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
-		super(id, sessionId, groupId, contactId, accept, time, local, sent,
-				seen, read);
+			GroupId groupId, ContactId contactId, GroupId privateGroupId,
+			boolean accept, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
+		super(id, sessionId, groupId, contactId, privateGroupId, accept, time,
+				local, sent, seen, read);
 	}
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java
index 495e9d489c3bf507c874cc074331266e9082cfe4..5a7e39d4959e4b5b4d034f9ba4960272b10a3d6e 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java
@@ -7,6 +7,7 @@ import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.briar.api.client.BaseMessageHeader;
 import org.briarproject.briar.api.client.SessionId;
 
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 @Immutable
@@ -15,14 +16,17 @@ public abstract class InvitationMessage extends BaseMessageHeader {
 
 	private final SessionId sessionId;
 	private final ContactId contactId;
+	@Nullable
+	private final GroupId invitedGroupId;
 
 	public InvitationMessage(MessageId id, SessionId sessionId, GroupId groupId,
-			ContactId contactId, long time, boolean local, boolean sent,
-			boolean seen, boolean read) {
+			ContactId contactId, @Nullable GroupId invitedGroupId, long time,
+			boolean local, boolean sent, boolean seen, boolean read) {
 
 		super(id, groupId, time, local, read, sent, seen);
 		this.sessionId = sessionId;
 		this.contactId = contactId;
+		this.invitedGroupId = invitedGroupId;
 	}
 
 	public SessionId getSessionId() {
@@ -33,4 +37,9 @@ public abstract class InvitationMessage extends BaseMessageHeader {
 		return contactId;
 	}
 
+	@Nullable
+	public GroupId getInvitedGroupId() {
+		return invitedGroupId;
+	}
+
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java
index 9d961f9058754f2e9f39eb81a9247b9bdccd6717..b0a99e184b2e85362af758cb6e47d974658b59aa 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java
@@ -18,11 +18,12 @@ public abstract class InvitationRequest extends InvitationMessage {
 	private final boolean available;
 
 	public InvitationRequest(MessageId id, SessionId sessionId, GroupId groupId,
-			ContactId contactId, @Nullable String message, boolean available,
-			long time, boolean local, boolean sent, boolean seen,
-			boolean read) {
+			ContactId contactId, @Nullable String message,
+			@Nullable GroupId invitedGroupId, boolean available, long time,
+			boolean local, boolean sent, boolean seen, boolean read) {
 
-		super(id, sessionId, groupId, contactId, time, local, sent, seen, read);
+		super(id, sessionId, groupId, contactId, invitedGroupId, time, local,
+				sent, seen, read);
 		this.message = message;
 		this.available = available;
 	}
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java
index ce94524c5686f9bcfc1f3a8d411a747b5560c275..15051e3b80103f5b6ab82287c2ef58932c54469b 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.briar.api.client.SessionId;
 
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 @Immutable
@@ -15,10 +16,12 @@ public abstract class InvitationResponse extends InvitationMessage {
 	private final boolean accept;
 
 	public InvitationResponse(MessageId id, SessionId sessionId,
-			GroupId groupId, ContactId contactId, boolean accept, long time,
+			GroupId groupId, ContactId contactId,
+			@Nullable GroupId invitedGroupId, boolean accept, long time,
 			boolean local, boolean sent, boolean seen, boolean read) {
 
-		super(id, sessionId, groupId, contactId, time, local, sent, seen, read);
+		super(id, sessionId, groupId, contactId, invitedGroupId, time, local,
+				sent, seen, read);
 		this.accept = accept;
 	}
 
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 df59dbece6bf21f9e9855023f45dc242e9b745c6..312957b43193ff63bed4daffbcdab91c8a472ddf 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.getPrivateGroupId(), c, accept, m.getTimestamp(), false,
-				false, true, false);
+				m.getContactGroupId(), c, m.getPrivateGroupId(), 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 87079ac5c28bfc5033dba87ddb23ca6411162d49..645243f5c89ed01c24d5bbcc7ec91b32e2dbedcd 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
@@ -381,10 +381,12 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 							m, meta, status));
 				} else if (type == JOIN) {
 					messages.add(
-							parseInvitationResponse(c, m, meta, status, true));
+							parseInvitationResponse(c, contactGroupId, m, meta,
+									status, true));
 				} else if (type == LEAVE) {
 					messages.add(
-							parseInvitationResponse(c, m, meta, status, false));
+							parseInvitationResponse(c, contactGroupId, m, meta,
+									status, false));
 				}
 			}
 			db.commitTransaction(txn);
@@ -404,7 +406,8 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 		// Look up the invite message to get the details of the private group
 		InviteMessage invite = getInviteMessage(txn, m);
 		return new GroupInvitationRequest(m, sessionId, contactGroupId, c,
-				invite.getMessage(), invite.getGroupName(), invite.getCreator(),
+				invite.getMessage(), invite.getPrivateGroupId(),
+				invite.getGroupName(), invite.getCreator(),
 				meta.isAvailableToAnswer(), meta.getTimestamp(), meta.isLocal(),
 				status.isSent(), status.isSeen(), meta.isRead());
 	}
@@ -418,11 +421,12 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 	}
 
 	private GroupInvitationResponse parseInvitationResponse(ContactId c,
-			MessageId m, MessageMetadata meta, MessageStatus status,
-			boolean accept) throws DbException, FormatException {
+			GroupId contactGroupId, MessageId m, MessageMetadata meta,
+			MessageStatus status, boolean accept)
+			throws DbException, FormatException {
 		SessionId sessionId = getSessionId(meta.getPrivateGroupId());
-		return new GroupInvitationResponse(m, sessionId,
-				meta.getPrivateGroupId(), c, accept, meta.getTimestamp(),
+		return new GroupInvitationResponse(m, sessionId, contactGroupId, c,
+				meta.getPrivateGroupId(), accept, meta.getTimestamp(),
 				meta.isLocal(), status.isSent(), status.isSeen(),
 				meta.isRead());
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java
index d1bf5bd6088076c8b87f4907fa4ce44907c369df..ba1a7623ad989b5829f1865b6893b89a9b9dec94 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java
@@ -318,8 +318,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 			ContactId c) {
 		SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes());
 		return new GroupInvitationRequest(m.getId(), sessionId,
-				m.getContactGroupId(), c, m.getMessage(), m.getGroupName(),
-				m.getCreator(), true, m.getTimestamp(), false, false, true,
-				false);
+				m.getContactGroupId(), c, m.getMessage(), m.getPrivateGroupId(),
+				m.getGroupName(), m.getCreator(), true, m.getTimestamp(), false,
+				false, true, false);
 	}
 }
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 68db4520d1254a3ef4633835cffebadb9d022990..721b633236a585cb144c049f8890db9f5cc061d2 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
@@ -40,6 +40,7 @@ import org.briarproject.briar.api.sharing.InvitationMessage;
 import java.security.SecureRandom;
 import java.util.Collection;
 
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
@@ -133,21 +134,23 @@ class BlogSharingManagerImpl extends
 
 	@Override
 	protected InvitationMessage createInvitationRequest(MessageId id,
-			BlogInvitation msg, ContactId contactId, boolean available,
-			long time, boolean local, boolean sent, boolean seen,
-			boolean read) {
+			BlogInvitation msg, ContactId contactId, GroupId blogId,
+			boolean available, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
+
 		return new BlogInvitationRequest(id, msg.getSessionId(),
 				msg.getGroupId(), contactId, msg.getBlogAuthorName(),
-				msg.getMessage(), available, time, local, sent, seen, read);
+				msg.getMessage(), blogId, available, time, local, sent, seen,
+				read);
 	}
 
 	@Override
 	protected InvitationMessage createInvitationResponse(MessageId id,
 			SessionId sessionId, GroupId groupId, ContactId contactId,
-			boolean accept, long time,
-			boolean local, boolean sent, boolean seen, boolean read) {
+			GroupId blogId, boolean accept, long time, boolean local,
+			boolean sent, boolean seen, boolean read) {
 		return new BlogInvitationResponse(id, sessionId, groupId, contactId,
-				accept, time, local, sent, seen, read);
+				blogId, accept, time, local, sent, seen, read);
 	}
 
 	@Override
@@ -333,14 +336,17 @@ class BlogSharingManagerImpl extends
 
 		@Override
 		public BlogInvitationRequestReceivedEvent build(
-				BlogInviteeSessionState localState, long time, String msg) {
+				BlogInviteeSessionState localState, long time,
+				@Nullable String msg) {
 			Blog blog = sFactory.parse(localState);
 			ContactId contactId = localState.getContactId();
 			BlogInvitationRequest request =
 					new BlogInvitationRequest(localState.getInvitationId(),
-							localState.getSessionId(), localState.getContactGroupId(),
-							contactId, blog.getAuthor().getName(), msg, true,
-							time, false, false, false, false);
+							localState.getSessionId(),
+							localState.getContactGroupId(), contactId,
+							blog.getAuthor().getName(), msg,
+							localState.getShareableId(), true, time, false,
+							false, false, false);
 			return new BlogInvitationRequestReceivedEvent(blog, contactId,
 					request);
 		}
@@ -358,8 +364,9 @@ class BlogSharingManagerImpl extends
 			BlogInvitationResponse response =
 					new BlogInvitationResponse(responseId,
 							localState.getSessionId(),
-							localState.getShareableId(),
-							localState.getContactId(), accept, time, false,
+							localState.getContactGroupId(),
+							localState.getContactId(),
+							localState.getShareableId(), accept, time, false,
 							false, false, false);
 			return new BlogInvitationResponseReceivedEvent(c, response);
 		}
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 8d92552557fe96e2003be37a89ee89a32592ac7b..75148d8a7455b1172dc505bf9fcf547ceabb25ef 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
@@ -33,6 +33,7 @@ import org.briarproject.briar.api.sharing.InvitationMessage;
 
 import java.security.SecureRandom;
 
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static org.briarproject.briar.api.forum.ForumConstants.FORUM_NAME;
@@ -81,21 +82,21 @@ class ForumSharingManagerImpl extends
 
 	@Override
 	protected InvitationMessage createInvitationRequest(MessageId id,
-			ForumInvitation msg, ContactId contactId, boolean available,
-			long time, boolean local, boolean sent, boolean seen,
-			boolean read) {
+			ForumInvitation msg, ContactId contactId, GroupId forumId,
+			boolean available, long time, boolean local, boolean sent,
+			boolean seen, boolean read) {
 		return new ForumInvitationRequest(id, msg.getSessionId(),
-				msg.getGroupId(), contactId, msg.getForumName(),
+				msg.getGroupId(), contactId, forumId, msg.getForumName(),
 				msg.getMessage(), available, time, local, sent, seen, read);
 	}
 
 	@Override
 	protected InvitationMessage createInvitationResponse(MessageId id,
 			SessionId sessionId, GroupId groupId, ContactId contactId,
-			boolean accept, long time, boolean local, boolean sent,
-			boolean seen, boolean read) {
+			GroupId forumId, boolean accept, long time, boolean local,
+			boolean sent, boolean seen, boolean read) {
 		return new ForumInvitationResponse(id, sessionId, groupId, contactId,
-				accept, time, local, sent, seen, read);
+				forumId, accept, time, local, sent, seen, read);
 	}
 
 	@Override
@@ -263,13 +264,15 @@ class ForumSharingManagerImpl extends
 
 		@Override
 		public ForumInvitationRequestReceivedEvent build(
-				ForumInviteeSessionState localState, long time, String msg) {
+				ForumInviteeSessionState localState, long time,
+				@Nullable String msg) {
 			Forum forum = sFactory.parse(localState);
 			ContactId contactId = localState.getContactId();
 			ForumInvitationRequest request = new ForumInvitationRequest(
 					localState.getInvitationId(), localState.getSessionId(),
-					localState.getContactGroupId(), contactId, forum.getName(), msg,
-					true, time, false, false, false, false);
+					localState.getContactGroupId(), contactId,
+					localState.getShareableId(), forum.getName(), msg, true,
+					time, false, false, false, false);
 			return new ForumInvitationRequestReceivedEvent(forum, contactId,
 					request);
 		}
@@ -287,8 +290,9 @@ class ForumSharingManagerImpl extends
 				throw new IllegalStateException("No responseId");
 			ForumInvitationResponse response = new ForumInvitationResponse(
 					responseId, localState.getSessionId(),
-					localState.getShareableId(), localState.getContactId(),
-					accept, time, false, false, false, false);
+					localState.getContactGroupId(), localState.getContactId(),
+					localState.getShareableId(), accept, time, false, false,
+					false, false);
 			return new ForumInvitationResponseReceivedEvent(name, c, response);
 		}
 	}
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 c96d0df9fd422498632deaf06831dc4c48fef839..b383a36e82841c9ff253865be663ef4ff202a163 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
@@ -125,13 +125,13 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 	protected abstract ClientId getClientId();
 
 	protected abstract InvitationMessage createInvitationRequest(MessageId id,
-			I msg, ContactId contactId, boolean available, long time,
-			boolean local, boolean sent, boolean seen, boolean read);
+			I msg, ContactId contactId, GroupId shareableId, boolean available,
+			long time, boolean local, boolean sent, boolean seen, boolean read);
 
 	protected abstract InvitationMessage createInvitationResponse(MessageId id,
 			SessionId sessionId, GroupId groupId, ContactId contactId,
-			boolean accept, long time, boolean local, boolean sent,
-			boolean seen, boolean read);
+			GroupId shareableId, boolean accept, long time, boolean local,
+			boolean sent, boolean seen, boolean read);
 
 	protected abstract ShareableFactory<S, I, IS, SS> getSFactory();
 
@@ -391,6 +391,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 				try {
 					MessageStatus status =
 							db.getMessageStatus(txn, contactId, m.getKey());
+					SharingSessionState s;
 					long time = d.getLong(TIME);
 					boolean local = d.getBoolean(LOCAL);
 					boolean read = d.getBoolean(MSG_KEY_READ, false);
@@ -398,11 +399,10 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 
 					if (type == SHARE_MSG_TYPE_INVITATION) {
 						I msg = getIFactory().build(group.getId(), d);
+						SessionId sessionId = msg.getSessionId();
+						s = getSessionState(txn, sessionId, true);
 						if (!local) {
 							// figure out whether the shareable is still available
-							SharingSessionState s =
-									getSessionState(txn, msg.getSessionId(),
-											true);
 							if (!(s instanceof InviteeSessionState))
 								continue;
 							available = ((InviteeSessionState) s).getState() ==
@@ -410,8 +410,9 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 						}
 						InvitationMessage im =
 								createInvitationRequest(m.getKey(), msg,
-										contactId, available, time, local,
-										status.isSent(), status.isSeen(), read);
+										contactId, s.getShareableId(),
+										available, time, local, status.isSent(),
+										status.isSeen(), read);
 						list.add(im);
 					} else if (type == SHARE_MSG_TYPE_ACCEPT ||
 							type == SHARE_MSG_TYPE_DECLINE) {
@@ -419,10 +420,12 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 						BaseMessage msg = BaseMessage
 								.from(getIFactory(), group.getId(), d);
 						SessionId sessionId = msg.getSessionId();
-						InvitationMessage im = createInvitationResponse(
-								m.getKey(), sessionId, group.getId(), contactId,
-								accept, time, local, status.isSent(),
-								status.isSeen(), read);
+						s = getSessionState(txn, sessionId, true);
+						InvitationMessage im =
+								createInvitationResponse(m.getKey(), sessionId,
+										group.getId(), contactId,
+										s.getShareableId(), accept, time, local,
+										status.isSent(), status.isSeen(), read);
 						list.add(im);
 					} else {
 						throw new RuntimeException("Unexpected Message Type");