diff --git a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java
index 1fa3eb5c48dcc9026ec258d707a5b7b230c15332..d77f04c25d8293f1233a296df8ae8ca1267eb7ae 100644
--- a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java
@@ -7,7 +7,8 @@ import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
-import org.briarproject.api.event.GroupInvitationReceivedEvent;
+import org.briarproject.api.event.GroupInvitationRequestReceivedEvent;
+import org.briarproject.api.event.GroupInvitationResponseReceivedEvent;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.privategroup.PrivateGroup;
 import org.briarproject.api.privategroup.PrivateGroupManager;
@@ -44,8 +45,11 @@ public class GroupInvitationControllerImpl
 	public void eventOccurred(Event e) {
 		super.eventOccurred(e);
 
-		if (e instanceof GroupInvitationReceivedEvent) {
-			LOG.info("Group invitation received, reloading");
+		if (e instanceof GroupInvitationRequestReceivedEvent) {
+			LOG.info("Group invitation request received, reloading");
+			listener.loadInvitations(false);
+		} else if (e instanceof GroupInvitationResponseReceivedEvent) {
+			LOG.info("Group invitation response received, reloading");
 			listener.loadInvitations(false);
 		}
 	}
diff --git a/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/GroupInvitationRequestReceivedEvent.java
similarity index 58%
rename from briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java
rename to briar-api/src/org/briarproject/api/event/GroupInvitationRequestReceivedEvent.java
index c8244a39248f621d4a829002afb232eed4f7208c..1fc2599c22f77ee4183c7da1836caa31b5a57af8 100644
--- a/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/GroupInvitationRequestReceivedEvent.java
@@ -1,15 +1,14 @@
 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
+public class GroupInvitationRequestReceivedEvent extends
 		InvitationRequestReceivedEvent<PrivateGroup> {
 
-	public GroupInvitationReceivedEvent(PrivateGroup group, ContactId contactId,
-			GroupInvitationRequest request) {
+	public GroupInvitationRequestReceivedEvent(PrivateGroup group,
+			ContactId contactId, GroupInvitationRequest request) {
 		super(group, contactId, request);
 	}
 
diff --git a/briar-api/src/org/briarproject/api/event/GroupInvitationResponseReceivedEvent.java b/briar-api/src/org/briarproject/api/event/GroupInvitationResponseReceivedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..a72fd313af7b3899b85fc7539b756270456f99cd
--- /dev/null
+++ b/briar-api/src/org/briarproject/api/event/GroupInvitationResponseReceivedEvent.java
@@ -0,0 +1,13 @@
+package org.briarproject.api.event;
+
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.sharing.InvitationResponse;
+
+public class GroupInvitationResponseReceivedEvent
+		extends InvitationResponseReceivedEvent {
+
+	public GroupInvitationResponseReceivedEvent(ContactId contactId,
+			InvitationResponse response) {
+		super(contactId, response);
+	}
+}
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java
index 7f86b5a9e45daba4ed905e57afd8537b19ece302..b3048c7779a76b9e878f5cbe0037fb3769ace04c 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java
@@ -41,10 +41,10 @@ abstract class AbstractProtocolEngine<S extends Session>
 	protected final DatabaseComponent db;
 	protected final ClientHelper clientHelper;
 	protected final PrivateGroupManager privateGroupManager;
+	protected final PrivateGroupFactory privateGroupFactory;
 
-	private final IdentityManager identityManager;
-	private final PrivateGroupFactory privateGroupFactory;
 	private final GroupMessageFactory groupMessageFactory;
+	private final IdentityManager identityManager;
 	private final MessageParser messageParser;
 	private final MessageEncoder messageEncoder;
 	private final Clock clock;
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java
index 72153ea4d40a72edee85266434e2441150029886..e3e6c0540443c144196cafced5c7fd85ac70ce5c 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java
@@ -3,14 +3,18 @@ package org.briarproject.privategroup.invitation;
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.clients.ProtocolStateException;
+import org.briarproject.api.clients.SessionId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Transaction;
+import org.briarproject.api.event.GroupInvitationResponseReceivedEvent;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.privategroup.GroupMessageFactory;
 import org.briarproject.api.privategroup.PrivateGroupFactory;
 import org.briarproject.api.privategroup.PrivateGroupManager;
+import org.briarproject.api.privategroup.invitation.GroupInvitationResponse;
 import org.briarproject.api.sync.Message;
 import org.briarproject.api.system.Clock;
 
@@ -35,7 +39,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 			IdentityManager identityManager, MessageParser messageParser,
 			MessageEncoder messageEncoder, Clock clock) {
 		super(db, clientHelper, privateGroupManager, privateGroupFactory,
-				groupMessageFactory, identityManager,messageParser,
+				groupMessageFactory, identityManager, messageParser,
 				messageEncoder, clock);
 	}
 
@@ -170,10 +174,14 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 		// The dependency, if any, must be the last remote message
 		if (!isValidDependency(s, m.getPreviousMessageId()))
 			return abort(txn, s);
-		// Mark the response visible
+		// Mark the response visible in the UI
 		markMessageVisibleInUi(txn, m.getId(), true);
 		// Start syncing the private group with the contact
 		syncPrivateGroupWithContact(txn, s, true);
+		// Broadcast an event
+		ContactId contactId = getContactId(txn, m.getContactGroupId());
+		txn.attach(new GroupInvitationResponseReceivedEvent(contactId,
+				createInvitationResponse(m, contactId, true)));
 		// Move to the INVITEE_JOINED state
 		return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(),
 				s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
@@ -187,8 +195,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 		// The dependency, if any, must be the last remote message
 		if (!isValidDependency(s, m.getPreviousMessageId()))
 			return abort(txn, s);
-		// Mark the response visible
+		// Mark the response visible in the UI
 		markMessageVisibleInUi(txn, m.getId(), true);
+		// Broadcast an event
+		ContactId contactId = getContactId(txn, m.getContactGroupId());
+		txn.attach(new GroupInvitationResponseReceivedEvent(contactId,
+				createInvitationResponse(m, contactId, false)));
 		// Move to the START state
 		return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(),
 				s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
@@ -224,4 +236,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 				sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
 				s.getInviteTimestamp(), ERROR);
 	}
+
+	private GroupInvitationResponse createInvitationResponse(
+			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,
+				false, true, false);
+	}
 }
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java
index f42cb2431b4e79b11afb90ddf36632d64ffa9033..1526e23bd923ac65e3c4257d6f68a01643379e0a 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java
@@ -3,16 +3,20 @@ package org.briarproject.privategroup.invitation;
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.clients.ProtocolStateException;
+import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Transaction;
+import org.briarproject.api.event.GroupInvitationRequestReceivedEvent;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.privategroup.GroupMessageFactory;
+import org.briarproject.api.privategroup.PrivateGroup;
 import org.briarproject.api.privategroup.PrivateGroupFactory;
 import org.briarproject.api.privategroup.PrivateGroupManager;
+import org.briarproject.api.privategroup.invitation.GroupInvitationRequest;
 import org.briarproject.api.sync.Message;
 import org.briarproject.api.sync.MessageId;
 import org.briarproject.api.system.Clock;
@@ -196,6 +200,11 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 		// Mark the invite message visible in the UI and available to answer
 		markMessageVisibleInUi(txn, m.getId(), true);
 		markMessageAvailableToAnswer(txn, m.getId(), true);
+		// Broadcast an event
+		PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup(
+				m.getGroupName(), m.getCreator(), m.getSalt());
+		txn.attach(new GroupInvitationRequestReceivedEvent(privateGroup,
+				contactId, createInvitationRequest(m, contactId)));
 		// Move to the INVITED state
 		return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(),
 				s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
@@ -239,4 +248,13 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 				sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
 				s.getInviteTimestamp(), ERROR);
 	}
+
+	private GroupInvitationRequest createInvitationRequest(InviteMessage m,
+			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);
+	}
 }