diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
index 08e2d2650e113ca409cddc3e4186f6a6b9a191b3..e113a9a08577a2ab832c730755652840f3e8d1a0 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
@@ -33,7 +33,9 @@ import org.briarproject.api.event.ContactStatusChangedEvent;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
-import org.briarproject.api.event.MessageStateChangedEvent;
+import org.briarproject.api.event.ForumInvitationReceivedEvent;
+import org.briarproject.api.event.IntroductionRequestReceivedEvent;
+import org.briarproject.api.event.IntroductionResponseReceivedEvent;
 import org.briarproject.api.event.PrivateMessageReceivedEvent;
 import org.briarproject.api.forum.ForumInvitationMessage;
 import org.briarproject.api.forum.ForumSharingManager;
@@ -41,10 +43,11 @@ import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.introduction.IntroductionManager;
 import org.briarproject.api.introduction.IntroductionMessage;
+import org.briarproject.api.introduction.IntroductionRequest;
+import org.briarproject.api.introduction.IntroductionResponse;
 import org.briarproject.api.messaging.MessagingManager;
 import org.briarproject.api.messaging.PrivateMessageHeader;
 import org.briarproject.api.plugins.ConnectionRegistry;
-import org.briarproject.api.sync.ClientId;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.ArrayList;
@@ -58,7 +61,6 @@ import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAn
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.android.BriarActivity.GROUP_ID;
-import static org.briarproject.api.sync.ValidationManager.State.DELIVERED;
 
 public class ContactListFragment extends BaseFragment implements EventListener {
 
@@ -68,7 +70,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 			Logger.getLogger(ContactListFragment.class.getName());
 
 	@Inject
-	protected ConnectionRegistry connectionRegistry;
+	ConnectionRegistry connectionRegistry;
 	@Inject
 	protected EventBus eventBus;
 
@@ -245,6 +247,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 			}
 		} else if (e instanceof ContactStatusChangedEvent) {
 			LOG.info("Contact Status changed, reloading");
+			// TODO We can update the contact state without needing to reload
 			loadContacts();
 		} else if (e instanceof ContactConnectedEvent) {
 			setConnected(((ContactConnectedEvent) e).getContactId(), true);
@@ -258,26 +261,31 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 			PrivateMessageReceivedEvent p = (PrivateMessageReceivedEvent) e;
 			PrivateMessageHeader h = p.getMessageHeader();
 			updateItem(p.getGroupId(), ConversationItem.from(h));
-		} else if (e instanceof MessageStateChangedEvent) {
-			MessageStateChangedEvent m = (MessageStateChangedEvent) e;
-			ClientId c = m.getClientId();
-			if (m.getState() == DELIVERED &&
-					(c.equals(introductionManager.getClientId()) ||
-							c.equals(forumSharingManager.getClientId()))) {
-				LOG.info("Message added, reloading");
-				reloadConversation(m.getMessage().getGroupId());
-			}
+		} else if (e instanceof IntroductionRequestReceivedEvent) {
+			LOG.info("Introduction Request received, update contact");
+			IntroductionRequestReceivedEvent m =
+					(IntroductionRequestReceivedEvent) e;
+			IntroductionRequest ir = m.getIntroductionRequest();
+			updateItem(m.getContactId(), ConversationItem.from(ir));
+		} else if (e instanceof IntroductionResponseReceivedEvent) {
+			LOG.info("Introduction Response received, update contact");
+			IntroductionResponseReceivedEvent m =
+					(IntroductionResponseReceivedEvent) e;
+			IntroductionResponse ir = m.getIntroductionResponse();
+			updateItem(m.getContactId(), ConversationItem.from(ir));
+		} else if (e instanceof ForumInvitationReceivedEvent) {
+			LOG.info("Forum Invitation received, reloading conversation...");
+			ForumInvitationReceivedEvent m = (ForumInvitationReceivedEvent) e;
+			reloadConversation(m.getContactId());
 		}
 	}
 
-	private void reloadConversation(final GroupId g) {
+	private void reloadConversation(final ContactId c) {
 		listener.runOnDbThread(new Runnable() {
 			@Override
 			public void run() {
 				try {
-					ContactId c = messagingManager.getContactId(g);
-					Collection<ConversationItem> messages =
-							getMessages(c);
+					Collection<ConversationItem> messages = getMessages(c);
 					updateItem(c, messages);
 				} catch (NoSuchContactException e) {
 					LOG.info("Contact removed");
@@ -304,6 +312,20 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 		});
 	}
 
+	private void updateItem(final ContactId c, final ConversationItem m) {
+		listener.runOnUiThread(new Runnable() {
+			@Override
+			public void run() {
+				int position = adapter.findItemPosition(c);
+				ContactListItem item = adapter.getItem(position);
+				if (item != null) {
+					item.addMessage(m);
+					adapter.updateItem(position, item);
+				}
+			}
+		});
+	}
+
 	private void updateItem(final GroupId g, final ConversationItem m) {
 		listener.runOnUiThread(new Runnable() {
 			@Override
diff --git a/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java
index 63aa3bce19810f3ba450e7eeeed6799c070a881f..d823a2a6ba42f23fe765faee6b4fa0e5a7d0feca 100644
--- a/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java
@@ -2,7 +2,6 @@ package org.briarproject.api.event;
 
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.forum.Forum;
-import org.briarproject.api.introduction.IntroductionRequest;
 
 public class ForumInvitationReceivedEvent extends InvitationReceivedEvent {
 
diff --git a/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java
index 4b1b6df2d36fb18f0e41124919571cc04a5d415a..834b71eddfc8df351bf34bdcc82d39036ad615b3 100644
--- a/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java
@@ -1,13 +1,12 @@
 package org.briarproject.api.event;
 
 import org.briarproject.api.contact.ContactId;
-import org.briarproject.api.forum.Forum;
 
 public abstract class InvitationReceivedEvent extends Event {
 
 	private final ContactId contactId;
 
-	public InvitationReceivedEvent(ContactId contactId) {
+	InvitationReceivedEvent(ContactId contactId) {
 		this.contactId = contactId;
 	}
 
diff --git a/briar-api/src/org/briarproject/api/sharing/SharingMessage.java b/briar-api/src/org/briarproject/api/sharing/SharingMessage.java
index 78433ff6fa5ba601ff71a0a9c6c83cbb5bbefdae..2b14cefde4a0af5a0c6abb8f665b19552c067b5f 100644
--- a/briar-api/src/org/briarproject/api/sharing/SharingMessage.java
+++ b/briar-api/src/org/briarproject/api/sharing/SharingMessage.java
@@ -22,7 +22,7 @@ public interface SharingMessage {
 		private final GroupId groupId;
 		private final SessionId sessionId;
 
-		public BaseMessage(GroupId groupId, SessionId sessionId) {
+		BaseMessage(GroupId groupId, SessionId sessionId) {
 
 			this.groupId = groupId;
 			this.sessionId = sessionId;
diff --git a/briar-core/src/org/briarproject/sharing/InviteeEngine.java b/briar-core/src/org/briarproject/sharing/InviteeEngine.java
index e786d9a74b59891c20c4a79cb9dce856542698d5..766a37e4142f57a5033e9fe091c675bb43fd7f22 100644
--- a/briar-core/src/org/briarproject/sharing/InviteeEngine.java
+++ b/briar-core/src/org/briarproject/sharing/InviteeEngine.java
@@ -23,7 +23,7 @@ import static org.briarproject.api.sharing.SharingConstants.TASK_UNSHARE_SHAREAB
 import static org.briarproject.api.sharing.SharingMessage.BaseMessage;
 import static org.briarproject.api.sharing.SharingMessage.SimpleMessage;
 
-public class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationReceivedEvent>
+class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationReceivedEvent>
 		implements ProtocolEngine<InviteeSessionState.Action, IS, BaseMessage> {
 
 	private static final Logger LOG =