diff --git a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java
index 59475c9749bcf73768ae2cfef84a164ce0b67d1e..21a25e5933d3e1712c4729ffb4c55290d7e4ba71 100644
--- a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java
+++ b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java
@@ -5,6 +5,7 @@ import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.messaging.ConversationManager.ConversationClient;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.privategroup.PrivateGroup;
 import org.briarproject.api.sharing.InvitationMessage;
@@ -16,7 +17,7 @@ import java.util.Collection;
 import javax.annotation.Nullable;
 
 @NotNullByDefault
-public interface GroupInvitationManager {
+public interface GroupInvitationManager extends ConversationClient {
 
 	/**
 	 * The unique ID of the private group invitation client.
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java
index 86e8688a0da4f839669fad67ac05f9bd2abe489f..ddf3b5ae20c304b3dfae078dc27461e3651e902a 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java
@@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
+import org.briarproject.api.clients.MessageTracker;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.data.BdfDictionary;
 import org.briarproject.api.data.BdfList;
@@ -42,6 +43,7 @@ abstract class AbstractProtocolEngine<S extends Session>
 	protected final ClientHelper clientHelper;
 	protected final PrivateGroupManager privateGroupManager;
 	protected final PrivateGroupFactory privateGroupFactory;
+	protected final MessageTracker messageTracker;
 
 	private final GroupMessageFactory groupMessageFactory;
 	private final IdentityManager identityManager;
@@ -54,7 +56,8 @@ abstract class AbstractProtocolEngine<S extends Session>
 			PrivateGroupFactory privateGroupFactory,
 			GroupMessageFactory groupMessageFactory,
 			IdentityManager identityManager, MessageParser messageParser,
-			MessageEncoder messageEncoder, Clock clock) {
+			MessageEncoder messageEncoder, MessageTracker messageTracker,
+			Clock clock) {
 		this.db = db;
 		this.clientHelper = clientHelper;
 		this.privateGroupManager = privateGroupManager;
@@ -63,6 +66,7 @@ abstract class AbstractProtocolEngine<S extends Session>
 		this.identityManager = identityManager;
 		this.messageParser = messageParser;
 		this.messageEncoder = messageEncoder;
+		this.messageTracker = messageTracker;
 		this.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 e3e6c0540443c144196cafced5c7fd85ac70ce5c..f58630c4c8b73c6a00d439648c945ae241ef96fb 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java
@@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
+import org.briarproject.api.clients.MessageTracker;
 import org.briarproject.api.clients.ProtocolStateException;
 import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.contact.ContactId;
@@ -37,10 +38,11 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 			PrivateGroupFactory privateGroupFactory,
 			GroupMessageFactory groupMessageFactory,
 			IdentityManager identityManager, MessageParser messageParser,
-			MessageEncoder messageEncoder, Clock clock) {
+			MessageEncoder messageEncoder, MessageTracker messageTracker,
+			Clock clock) {
 		super(db, clientHelper, privateGroupManager, privateGroupFactory,
 				groupMessageFactory, identityManager, messageParser,
-				messageEncoder, clock);
+				messageEncoder, messageTracker, clock);
 	}
 
 	@Override
@@ -144,8 +146,10 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 			throws DbException {
 		// Send an INVITE message
 		Message sent = sendInviteMessage(txn, s, message, timestamp, signature);
-		long localTimestamp = Math.max(timestamp, getLocalTimestamp(s));
+		// Track the message
+		messageTracker.trackOutgoingMessage(txn, sent);
 		// Move to the INVITED state
+		long localTimestamp = Math.max(timestamp, getLocalTimestamp(s));
 		return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(),
 				sent.getId(), s.getLastRemoteMessageId(), localTimestamp,
 				timestamp, INVITED);
@@ -176,6 +180,9 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 			return abort(txn, s);
 		// Mark the response visible in the UI
 		markMessageVisibleInUi(txn, m.getId(), true);
+		// Track the message
+		messageTracker.trackMessage(txn, m.getContactGroupId(),
+				m.getTimestamp(), false);
 		// Start syncing the private group with the contact
 		syncPrivateGroupWithContact(txn, s, true);
 		// Broadcast an event
@@ -197,6 +204,9 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
 			return abort(txn, s);
 		// Mark the response visible in the UI
 		markMessageVisibleInUi(txn, m.getId(), true);
+		// Track the message
+		messageTracker.trackMessage(txn, m.getContactGroupId(),
+				m.getTimestamp(), false);
 		// Broadcast an event
 		ContactId contactId = getContactId(txn, m.getContactGroupId());
 		txn.attach(new GroupInvitationResponseReceivedEvent(contactId,
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java
index 1526e23bd923ac65e3c4257d6f68a01643379e0a..60579d46f5c4339a441092788c5d418a2c535664 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java
@@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
+import org.briarproject.api.clients.MessageTracker;
 import org.briarproject.api.clients.ProtocolStateException;
 import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.contact.ContactId;
@@ -40,10 +41,11 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 			PrivateGroupFactory privateGroupFactory,
 			GroupMessageFactory groupMessageFactory,
 			IdentityManager identityManager, MessageParser messageParser,
-			MessageEncoder messageEncoder, Clock clock) {
+			MessageEncoder messageEncoder, MessageTracker messageTracker,
+			Clock clock) {
 		super(db, clientHelper, privateGroupManager, privateGroupFactory,
 				groupMessageFactory, identityManager, messageParser,
-				messageEncoder, clock);
+				messageEncoder, messageTracker, clock);
 	}
 
 	@Override
@@ -150,6 +152,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 		markMessageAvailableToAnswer(txn, inviteId, false);
 		// Send a JOIN message
 		Message sent = sendJoinMessage(txn, s, true);
+		// Track the message
+		messageTracker.trackOutgoingMessage(txn, sent);
 		try {
 			// Subscribe to the private group
 			subscribeToPrivateGroup(txn, inviteId);
@@ -172,6 +176,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
 		markMessageAvailableToAnswer(txn, inviteId, false);
 		// Send a LEAVE message
 		Message sent = sendLeaveMessage(txn, s, true);
+		// Track the message
+		messageTracker.trackOutgoingMessage(txn, sent);
 		// Move to the START state
 		return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(),
 				sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
@@ -200,6 +206,9 @@ 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);
+		// Track the message
+		messageTracker.trackMessage(txn, m.getContactGroupId(),
+				m.getTimestamp(), false);
 		// Broadcast an event
 		PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup(
 				m.getGroupName(), m.getCreator(), m.getSalt());
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java
index 84aa82ced367d97dd8f063eeed21aaa34a0b37dd..d6674f841227097c2bd695f35810c91ae394a25c 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java
@@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.ClientHelper;
+import org.briarproject.api.clients.MessageTracker;
 import org.briarproject.api.clients.ProtocolStateException;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
@@ -36,10 +37,11 @@ class PeerProtocolEngine extends AbstractProtocolEngine<PeerSession> {
 			PrivateGroupFactory privateGroupFactory,
 			GroupMessageFactory groupMessageFactory,
 			IdentityManager identityManager, MessageParser messageParser,
-			MessageEncoder messageEncoder, Clock clock) {
+			MessageEncoder messageEncoder, MessageTracker messageTracker,
+			Clock clock) {
 		super(db, clientHelper, privateGroupManager, privateGroupFactory,
 				groupMessageFactory, identityManager, messageParser,
-				messageEncoder, clock);
+				messageEncoder, messageTracker, clock);
 	}
 
 	@Override
diff --git a/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java b/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java
index 3c2c9ce84c25a46a9f98a4ae1eb259d7dc0d10e3..ed48f1224135ec32b5c0e6c23e5205f9b8935374 100644
--- a/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java
+++ b/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java
@@ -1,6 +1,7 @@
 package org.briarproject.privategroup.invitation;
 
 import org.briarproject.api.clients.ClientHelper;
+import org.briarproject.api.clients.MessageTracker;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.nullsafety.NotNullByDefault;
@@ -24,6 +25,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
 	private final IdentityManager identityManager;
 	private final MessageParser messageParser;
 	private final MessageEncoder messageEncoder;
+	private final MessageTracker messageTracker;
 	private final Clock clock;
 
 	@Inject
@@ -32,7 +34,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
 			PrivateGroupFactory privateGroupFactory,
 			GroupMessageFactory groupMessageFactory,
 			IdentityManager identityManager, MessageParser messageParser,
-			MessageEncoder messageEncoder,
+			MessageEncoder messageEncoder, MessageTracker messageTracker,
 			Clock clock) {
 		this.db = db;
 		this.clientHelper = clientHelper;
@@ -42,6 +44,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
 		this.identityManager = identityManager;
 		this.messageParser = messageParser;
 		this.messageEncoder = messageEncoder;
+		this.messageTracker = messageTracker;
 		this.clock = clock;
 	}
 
@@ -49,20 +52,20 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
 	public ProtocolEngine<CreatorSession> createCreatorEngine() {
 		return new CreatorProtocolEngine(db, clientHelper, privateGroupManager,
 				privateGroupFactory, groupMessageFactory, identityManager,
-				messageParser, messageEncoder, clock);
+				messageParser, messageEncoder, messageTracker, clock);
 	}
 
 	@Override
 	public ProtocolEngine<InviteeSession> createInviteeEngine() {
 		return new InviteeProtocolEngine(db, clientHelper, privateGroupManager,
 				privateGroupFactory, groupMessageFactory, identityManager,
-				messageParser, messageEncoder, clock);
+				messageParser, messageEncoder, messageTracker, clock);
 	}
 
 	@Override
 	public ProtocolEngine<PeerSession> createPeerEngine() {
 		return new PeerProtocolEngine(db, clientHelper, privateGroupManager,
 				privateGroupFactory, groupMessageFactory, identityManager,
-				messageParser, messageEncoder, clock);
+				messageParser, messageEncoder, messageTracker, clock);
 	}
 }