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 e89e57b53849568a519044caf579b12ffa6adbd6..e9dcac50860d4d7ed40bb0b04674c2716449c526 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
@@ -269,6 +269,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 		// The dependency, if any, must be the last remote message
 		if (!isValidDependency(s, m.getPreviousMessageId()))
 			return abort(txn, s);
+		// Mark any invite messages in the session unavailable to answer
+		markInvitesUnavailableToAnswer(txn, s);
 		// Move to the DISSOLVED state
 		return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(),
 				s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java
similarity index 98%
rename from briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java
index 83eb59003fca5f49a6030a33b90981c29cbcaac5..7431ffe483f160022bbf03d1ea51507a3e8b5c45 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.briar.privategroup;
+package org.briarproject.briar.privategroup.invitation;
 
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.sync.Group;
@@ -329,6 +329,9 @@ public class GroupInvitationIntegrationTest
 		// Creator's leave message is delivered to invitee
 		sync0To1(1, true);
 
+		// invitee should have no more open invitations
+		assertTrue(groupInvitationManager1.getInvitations().isEmpty());
+
 		// Invitee declines invitation, but it's no longer open - no exception
 		// as the action has succeeded
 		assertEquals(0, groupManager1.getPrivateGroups().size());
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
index bc83f9053fb1c3a989186e78efa85762b7023dde..2e4c64ddb195b12e99cd89f3793cc0b417b61e1c 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
@@ -651,6 +651,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
 		assertTrue(session.getLastRemoteMessageId()
 				.equals(properLeaveMessage.getPreviousMessageId()));
 
+		expectMarkInvitesUnavailableToAnswer();
 		InviteeSession newSession =
 				engine.onLeaveMessage(txn, session, properLeaveMessage);
 
@@ -680,6 +681,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
 		assertTrue(session.getLastRemoteMessageId()
 				.equals(properLeaveMessage.getPreviousMessageId()));
 
+		expectMarkInvitesUnavailableToAnswer();
 		InviteeSession newSession =
 				engine.onLeaveMessage(txn, session, properLeaveMessage);
 
@@ -701,7 +703,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
 	public void testOnAbortMessageWhenNotSubscribed() throws Exception {
 		InviteeSession session = getDefaultSession(START);
 
-		expectAbortWhenSubscribedToGroup();
+		expectAbortWhenNotSubscribedToGroup();
 		InviteeSession newSession =
 				engine.onAbortMessage(txn, session, abortMessage);
 		assertSessionAborted(session, newSession);
@@ -711,7 +713,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
 	public void testOnAbortMessageWhenSubscribed() throws Exception {
 		InviteeSession session = getDefaultSession(START);
 
-		expectAbortWhenNotSubscribedToGroup();
+		expectAbortWhenSubscribedToGroup();
 		InviteeSession newSession =
 				engine.onAbortMessage(txn, session, abortMessage);
 		assertSessionAborted(session, newSession);
@@ -739,6 +741,17 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
 	}
 
 	private void expectAbort(boolean subscribed) throws Exception {
+		expectMarkInvitesUnavailableToAnswer();
+		if (subscribed) {
+			expectIsSubscribedPrivateGroup();
+			expectSetPrivateGroupVisibility(INVISIBLE);
+		} else {
+			expectIsNotSubscribedPrivateGroup();
+		}
+		expectSendAbortMessage();
+	}
+
+	private void expectMarkInvitesUnavailableToAnswer() throws Exception {
 		final BdfDictionary query = BdfDictionary.of(new BdfEntry("query", ""));
 		final BdfDictionary meta = BdfDictionary.of(new BdfEntry("meta", ""));
 		final Map<MessageId, BdfDictionary> invites =
@@ -752,13 +765,6 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
 			will(returnValue(invites));
 		}});
 		expectMarkMessageAvailableToAnswer(lastRemoteMessageId, false);
-		if (subscribed) {
-			expectIsSubscribedPrivateGroup();
-			expectSetPrivateGroupVisibility(INVISIBLE);
-		} else {
-			expectIsNotSubscribedPrivateGroup();
-		}
-		expectSendAbortMessage();
 	}
 
 	private void assertSessionAborted(InviteeSession oldSession,