diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
index dd8dea976d4f15fdd8ef33ab7ebd55b08ca4b3f9..9e8d31a614f3c86f6633bae009e266dbc624c70c 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
@@ -668,7 +668,9 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 				acked.add(m);
 			}
 		}
-		transaction.attach(new MessagesAckedEvent(c, acked));
+		if (acked.size() > 0) {
+			transaction.attach(new MessagesAckedEvent(c, acked));
+		}
 	}
 
 	@Override
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java b/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java
index 4707ba8caae827b560ceeb733def586de35f31fc..8cbbceb320f8f7e84aac251e2fa5a2a03c62596e 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java
@@ -13,18 +13,18 @@ public abstract class BaseMessageHeader {
 	private final MessageId id;
 	private final GroupId groupId;
 	private final long timestamp;
-	private final boolean local, read, sent, seen;
+	private final boolean local, sent, seen, read;
 
 	public BaseMessageHeader(MessageId id, GroupId groupId, long timestamp,
-			boolean local, boolean read, boolean sent, boolean seen) {
+			boolean local, boolean sent, boolean seen, boolean read) {
 
 		this.id = id;
 		this.groupId = groupId;
 		this.timestamp = timestamp;
 		this.local = local;
-		this.read = read;
 		this.sent = sent;
 		this.seen = seen;
+		this.read = read;
 	}
 
 	public MessageId getId() {
@@ -43,10 +43,6 @@ public abstract class BaseMessageHeader {
 		return local;
 	}
 
-	public boolean isRead() {
-		return read;
-	}
-
 	public boolean isSent() {
 		return sent;
 	}
@@ -55,4 +51,8 @@ public abstract class BaseMessageHeader {
 		return seen;
 	}
 
+	public boolean isRead() {
+		return read;
+	}
+
 }
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java
index 680a955ff144a92c48e9f455f5f81c8444146b49..861469a3a4d0c8eb6b9f34b5c6e5247db98fe995 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java
@@ -22,7 +22,7 @@ public class IntroductionMessage extends BaseMessageHeader {
 			GroupId groupId, int role, long time, boolean local, boolean sent,
 			boolean seen, boolean read) {
 
-		super(messageId, groupId, time, local, read, sent, seen);
+		super(messageId, groupId, time, local, sent, seen, read);
 		this.sessionId = sessionId;
 		this.messageId = messageId;
 		this.role = role;
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java
index bc0003177f986b71878fa1df82f808d59410719a..9caf3bd5608ad561953fb4a17cd111607d382b6e 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java
@@ -14,7 +14,7 @@ public class PrivateMessageHeader extends BaseMessageHeader {
 	public PrivateMessageHeader(MessageId id, GroupId groupId, long timestamp,
 			boolean local, boolean read, boolean sent, boolean seen) {
 
-		super(id, groupId, timestamp, local, read, sent, seen);
+		super(id, groupId, timestamp, 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 4bdc394559767cdd4603ba07d39659bc81111835..df93ebdfab831f585bf16cac400582ce42ff5264 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
@@ -20,7 +20,7 @@ public class InvitationMessage extends BaseMessageHeader {
 			boolean local, boolean sent, boolean seen, boolean read,
 			SessionId sessionId, ContactId contactId) {
 
-		super(id, groupId, time, local, read, sent, seen);
+		super(id, groupId, time, local, sent, seen, read);
 		this.sessionId = sessionId;
 		this.contactId = contactId;
 	}
diff --git a/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java
index 03722734b01285b2d694c50e353e20a8c6dd6701..4dcc471ada1f6b79ef7b98081f98393f8a8cb38d 100644
--- a/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java
@@ -14,6 +14,7 @@ import javax.inject.Inject;
 
 import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_LENGTH;
 import static org.briarproject.bramble.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
+import static org.briarproject.bramble.util.ByteUtils.INT_64_BYTES;
 import static org.briarproject.briar.api.client.QueueMessage.MAX_QUEUE_MESSAGE_BODY_LENGTH;
 import static org.briarproject.briar.api.client.QueueMessage.QUEUE_MESSAGE_HEADER_LENGTH;
 
@@ -39,11 +40,14 @@ class QueueMessageFactoryImpl implements QueueMessageFactory {
 		ByteUtils.writeUint64(queuePosition, raw, MESSAGE_HEADER_LENGTH);
 		System.arraycopy(body, 0, raw, QUEUE_MESSAGE_HEADER_LENGTH,
 				body.length);
-		byte[] timeBytes = new byte[ByteUtils.INT_64_BYTES];
+		byte[] timeBytes = new byte[INT_64_BYTES];
 		ByteUtils.writeUint64(timestamp, timeBytes, 0);
+		byte[] bodyBytes = new byte[body.length + INT_64_BYTES];
+		System.arraycopy(raw, MESSAGE_HEADER_LENGTH, bodyBytes, 0,
+				body.length + INT_64_BYTES);
 		MessageId id = new MessageId(
 				crypto.hash(MessageId.LABEL, groupId.getBytes(), timeBytes,
-						body));
+						bodyBytes));
 		return new QueueMessage(id, groupId, timestamp, queuePosition, raw);
 	}
 
diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
index 06ff73e6838565efdd72f4b4e3df173aebb001fd..7a4f263f85bc1a6e0104314849abfce2a2e290a7 100644
--- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
@@ -19,6 +19,7 @@ import org.briarproject.bramble.api.event.EventListener;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.bramble.api.plugin.TransportId;
 import org.briarproject.bramble.api.properties.TransportProperties;
 import org.briarproject.bramble.api.properties.TransportPropertyManager;
 import org.briarproject.bramble.api.sync.Group;
@@ -360,6 +361,14 @@ public class IntroductionIntegrationTest
 		eventWaiter.await(TIMEOUT, 1);
 		assertTrue(listener0.response1Received);
 
+		// sync fake transport properties back to 1, so Message ACK can arrive
+		// and the assertDefaultUiMessages() check at the end will not fail
+		TransportProperties tp = new TransportProperties(
+				Collections.singletonMap("key", "value"));
+		c0.getTransportPropertyManager()
+				.mergeLocalProperties(new TransportId("fake"), tp);
+		sync0To1(1, true);
+
 		// sync second response
 		sync2To0(1, true);
 		eventWaiter.await(TIMEOUT, 1);
@@ -836,14 +845,32 @@ public class IntroductionIntegrationTest
 	}
 
 	private void assertDefaultUiMessages() throws DbException {
-		assertEquals(2, introductionManager0.getIntroductionMessages(
-				contactId1From0).size());
-		assertEquals(2, introductionManager0.getIntroductionMessages(
-				contactId2From0).size());
-		assertEquals(2, introductionManager1.getIntroductionMessages(
-				contactId0From1).size());
-		assertEquals(2, introductionManager2.getIntroductionMessages(
-				contactId0From2).size());
+		Collection<IntroductionMessage> messages =
+				introductionManager0.getIntroductionMessages(contactId1From0);
+		assertEquals(2, messages.size());
+		assertMessagesAreAcked(messages);
+
+		messages = introductionManager0.getIntroductionMessages(
+				contactId2From0);
+		assertEquals(2, messages.size());
+		assertMessagesAreAcked(messages);
+
+		messages = introductionManager1.getIntroductionMessages(
+				contactId0From1);
+		assertEquals(2, messages.size());
+		assertMessagesAreAcked(messages);
+
+		messages = introductionManager2.getIntroductionMessages(
+				contactId0From2);
+		assertEquals(2, messages.size());
+		assertMessagesAreAcked(messages);
+	}
+
+	private void assertMessagesAreAcked(
+			Collection<IntroductionMessage> messages) {
+		for (IntroductionMessage msg : messages) {
+			if (msg.isLocal()) assertTrue(msg.isSeen());
+		}
 	}
 
 	private void addListeners(boolean accept1, boolean accept2) {