From e370cafb1288a8a1ad27e3d7ac8372ed070c6a46 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Tue, 15 Dec 2015 14:36:45 +0000
Subject: [PATCH] Moved classes from messaging package to sync package.

---
 .../AndroidNotificationManagerImpl.java       |   2 +-
 .../briarproject/android/BriarService.java    |   2 +-
 .../android/contact/ContactListActivity.java  |  70 +++----
 .../android/contact/ContactListItem.java      |   6 +-
 .../android/contact/ConversationActivity.java |  98 ++++-----
 .../contact/ReadPrivateMessageActivity.java   |  52 ++---
 .../contact/WritePrivateMessageActivity.java  |  70 +++----
 .../forum/AvailableForumsActivity.java        |   4 +-
 .../android/forum/AvailableForumsItem.java    |   2 +-
 .../android/forum/CreateForumActivity.java    |   6 +-
 .../android/forum/ForumActivity.java          |   6 +-
 .../android/forum/ForumContacts.java          |   2 +-
 .../android/forum/ForumListActivity.java      |   4 +-
 .../android/forum/ForumListItem.java          |   2 +-
 .../android/forum/ReadForumPostActivity.java  |   4 +-
 .../android/forum/ShareForumActivity.java     |   2 +-
 .../android/forum/WriteForumPostActivity.java |  10 +-
 .../android/AndroidNotificationManager.java   |   2 +-
 .../api/db/DatabaseComponent.java             |  26 +--
 .../briarproject/api/db/MessageHeader.java    |   6 +-
 .../api/event/MessageAddedEvent.java          |   2 +-
 .../api/event/MessagesAckedEvent.java         |   6 +-
 .../api/event/MessagesSentEvent.java          |   6 +-
 .../api/event/SubscriptionAddedEvent.java     |   2 +-
 .../api/event/SubscriptionRemovedEvent.java   |   2 +-
 .../api/messaging/PacketWriter.java           |  34 ----
 .../briarproject/api/messaging/Request.java   |  18 --
 .../api/{messaging => sync}/Ack.java          |   2 +-
 .../api/{messaging => sync}/Group.java        |   9 +-
 .../api/{messaging => sync}/GroupFactory.java |   2 +-
 .../api/{messaging => sync}/GroupId.java      |   6 +-
 .../api/{messaging => sync}/Message.java      |   2 +-
 .../{messaging => sync}/MessageFactory.java   |  12 +-
 .../api/{messaging => sync}/MessageId.java    |   6 +-
 .../{messaging => sync}/MessageVerifier.java  |   2 +-
 .../MessagingConstants.java                   |   2 +-
 .../{messaging => sync}/MessagingSession.java |   2 +-
 .../MessagingSessionFactory.java              |   8 +-
 .../api/{messaging => sync}/Offer.java        |   4 +-
 .../api/{messaging => sync}/PacketReader.java |  12 +-
 .../PacketReaderFactory.java                  |   2 +-
 .../api/{messaging => sync}/PacketTypes.java  |   2 +-
 .../briarproject/api/sync/PacketWriter.java   |  34 ++++
 .../PacketWriterFactory.java                  |   2 +-
 .../org/briarproject/api/sync/Request.java    |  18 ++
 .../api/{messaging => sync}/RetentionAck.java |   2 +-
 .../{messaging => sync}/RetentionUpdate.java  |   2 +-
 .../{messaging => sync}/SubscriptionAck.java  |   2 +-
 .../SubscriptionUpdate.java                   |   2 +-
 .../api/{messaging => sync}/TransportAck.java |   2 +-
 .../{messaging => sync}/TransportUpdate.java  |   2 +-
 .../UnverifiedMessage.java                    |  10 +-
 .../src/org/briarproject/db/Database.java     |  20 +-
 .../db/DatabaseComponentImpl.java             |  26 +--
 .../src/org/briarproject/db/JdbcDatabase.java |  28 ++-
 .../invitation/AliceConnector.java            |   2 +-
 .../briarproject/invitation/BobConnector.java |   2 +-
 .../briarproject/invitation/Connector.java    |   4 +-
 .../invitation/ConnectorGroup.java            |   2 +-
 .../invitation/InvitationTaskFactoryImpl.java |   6 +-
 .../messaging/ThrowingRunnable.java           |   6 -
 .../plugins/ConnectionManagerImpl.java        |  28 +--
 .../AuthorFactoryImpl.java                    |  12 +-
 .../{messaging => sync}/AuthorReader.java     |  12 +-
 .../{messaging => sync}/CopyingConsumer.java  |   6 +-
 .../{messaging => sync}/CountingConsumer.java |   6 +-
 .../DigestingConsumer.java                    |   2 +-
 .../DuplexOutgoingSession.java                |  50 ++---
 .../{messaging => sync}/GroupFactoryImpl.java |  18 +-
 .../{messaging => sync}/GroupReader.java      |  16 +-
 .../{messaging => sync}/IncomingSession.java  |  46 ++---
 .../MessageFactoryImpl.java                   |  40 ++--
 .../{messaging => sync}/MessageImpl.java      |  12 +-
 .../{messaging => sync}/MessageReader.java    |  24 +--
 .../MessageVerifierImpl.java                  |  26 +--
 .../{messaging => sync}/MessagingModule.java  |  28 +--
 .../MessagingSessionFactoryImpl.java          |  28 +--
 .../PacketReaderFactoryImpl.java              |  16 +-
 .../{messaging => sync}/PacketReaderImpl.java |  76 +++----
 .../PacketWriterFactoryImpl.java              |  10 +-
 .../{messaging => sync}/PacketWriterImpl.java |  64 +++---
 .../{messaging => sync}/SigningConsumer.java  |   2 +-
 .../SimplexOutgoingSession.java               |  46 ++---
 .../SubscriptionUpdateReader.java             |  20 +-
 .../briarproject/sync/ThrowingRunnable.java   |   6 +
 .../briarproject/ProtocolIntegrationTest.java |  34 ++--
 .../src/org/briarproject/TestMessage.java     |   6 +-
 .../db/DatabaseComponentTest.java             | 192 +++++++++++++-----
 .../org/briarproject/db/H2DatabaseTest.java   |  10 +-
 .../{messaging => sync}/ConstantsTest.java    |  38 ++--
 .../{messaging => sync}/ConsumersTest.java    |  15 +-
 .../PacketReaderImplTest.java                 |  63 ++++--
 .../SimplexMessagingIntegrationTest.java      |  30 +--
 .../SimplexOutgoingSessionTest.java           |  17 +-
 94 files changed, 897 insertions(+), 793 deletions(-)
 delete mode 100644 briar-api/src/org/briarproject/api/messaging/PacketWriter.java
 delete mode 100644 briar-api/src/org/briarproject/api/messaging/Request.java
 rename briar-api/src/org/briarproject/api/{messaging => sync}/Ack.java (90%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/Group.java (77%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/GroupFactory.java (85%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/GroupId.java (90%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/Message.java (96%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/MessageFactory.java (67%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/MessageId.java (90%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/MessageVerifier.java (85%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/MessagingConstants.java (97%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/MessagingSession.java (90%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/MessagingSessionFactory.java (92%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/Offer.java (74%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/PacketReader.java (63%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/PacketReaderFactory.java (75%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/PacketTypes.java (88%)
 create mode 100644 briar-api/src/org/briarproject/api/sync/PacketWriter.java
 rename briar-api/src/org/briarproject/api/{messaging => sync}/PacketWriterFactory.java (75%)
 create mode 100644 briar-api/src/org/briarproject/api/sync/Request.java
 rename briar-api/src/org/briarproject/api/{messaging => sync}/RetentionAck.java (88%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/RetentionUpdate.java (90%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/SubscriptionAck.java (88%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/SubscriptionUpdate.java (93%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/TransportAck.java (92%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/TransportUpdate.java (95%)
 rename briar-api/src/org/briarproject/api/{messaging => sync}/UnverifiedMessage.java (85%)
 delete mode 100644 briar-core/src/org/briarproject/messaging/ThrowingRunnable.java
 rename briar-core/src/org/briarproject/{messaging => sync}/AuthorFactoryImpl.java (97%)
 rename briar-core/src/org/briarproject/{messaging => sync}/AuthorReader.java (97%)
 rename briar-core/src/org/briarproject/{messaging => sync}/CopyingConsumer.java (93%)
 rename briar-core/src/org/briarproject/{messaging => sync}/CountingConsumer.java (95%)
 rename briar-core/src/org/briarproject/{messaging => sync}/DigestingConsumer.java (93%)
 rename briar-core/src/org/briarproject/{messaging => sync}/DuplexOutgoingSession.java (95%)
 rename briar-core/src/org/briarproject/{messaging => sync}/GroupFactoryImpl.java (83%)
 rename briar-core/src/org/briarproject/{messaging => sync}/GroupReader.java (77%)
 rename briar-core/src/org/briarproject/{messaging => sync}/IncomingSession.java (90%)
 rename briar-core/src/org/briarproject/{messaging => sync}/MessageFactoryImpl.java (85%)
 rename briar-core/src/org/briarproject/{messaging => sync}/MessageImpl.java (85%)
 rename briar-core/src/org/briarproject/{messaging => sync}/MessageReader.java (82%)
 rename briar-core/src/org/briarproject/{messaging => sync}/MessageVerifierImpl.java (90%)
 rename briar-core/src/org/briarproject/{messaging => sync}/MessagingModule.java (70%)
 rename briar-core/src/org/briarproject/{messaging => sync}/MessagingSessionFactoryImpl.java (84%)
 rename briar-core/src/org/briarproject/{messaging => sync}/PacketReaderFactoryImpl.java (76%)
 rename briar-core/src/org/briarproject/{messaging => sync}/PacketReaderImpl.java (87%)
 rename briar-core/src/org/briarproject/{messaging => sync}/PacketWriterFactoryImpl.java (75%)
 rename briar-core/src/org/briarproject/{messaging => sync}/PacketWriterImpl.java (75%)
 rename briar-core/src/org/briarproject/{messaging => sync}/SigningConsumer.java (92%)
 rename briar-core/src/org/briarproject/{messaging => sync}/SimplexOutgoingSession.java (94%)
 rename briar-core/src/org/briarproject/{messaging => sync}/SubscriptionUpdateReader.java (81%)
 create mode 100644 briar-core/src/org/briarproject/sync/ThrowingRunnable.java
 rename briar-tests/src/org/briarproject/{messaging => sync}/ConstantsTest.java (88%)
 rename briar-tests/src/org/briarproject/{messaging => sync}/ConsumersTest.java (86%)
 rename briar-tests/src/org/briarproject/{messaging => sync}/PacketReaderImplTest.java (78%)
 rename briar-tests/src/org/briarproject/{messaging => sync}/SimplexMessagingIntegrationTest.java (91%)
 rename briar-tests/src/org/briarproject/{messaging => sync}/SimplexOutgoingSessionTest.java (90%)

diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
index f5ba0b03dd..2fbc137192 100644
--- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
+++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
@@ -23,7 +23,7 @@ import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.SettingsUpdatedEvent;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.GroupId;
 import org.briarproject.util.StringUtils;
 
 import java.util.HashMap;
diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java
index 11e8dcebaa..35db05931a 100644
--- a/briar-android/src/org/briarproject/android/BriarService.java
+++ b/briar-android/src/org/briarproject/android/BriarService.java
@@ -23,7 +23,7 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.LifecycleManager.StartResult;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.GroupId;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
index 630c4dec99..094de1133c 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
@@ -1,22 +1,22 @@
 package org.briarproject.android.contact;
 
-import static android.view.Gravity.CENTER;
-import static android.view.Gravity.CENTER_HORIZONTAL;
-import static android.view.Menu.NONE;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-import static android.widget.LinearLayout.VERTICAL;
-import static android.widget.Toast.LENGTH_SHORT;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
-
-import java.util.Collection;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnCreateContextMenuListener;
+import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
@@ -39,26 +39,26 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.MessageExpiredEvent;
-import org.briarproject.api.messaging.GroupId;
 import org.briarproject.api.plugins.ConnectionRegistry;
+import org.briarproject.api.sync.GroupId;
 
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnCreateContextMenuListener;
-import android.widget.AdapterView;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
+import java.util.Collection;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static android.view.Gravity.CENTER;
+import static android.view.Gravity.CENTER_HORIZONTAL;
+import static android.view.Menu.NONE;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+import static android.widget.LinearLayout.VERTICAL;
+import static android.widget.Toast.LENGTH_SHORT;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
 
 public class ContactListActivity extends BriarActivity
 implements OnClickListener, OnItemClickListener, OnCreateContextMenuListener,
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListItem.java b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
index 276ae9178f..19cec75cc0 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
@@ -1,10 +1,10 @@
 package org.briarproject.android.contact;
 
-import java.util.Collection;
-
 import org.briarproject.api.Contact;
 import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.GroupId;
+
+import java.util.Collection;
 
 // This class is not thread-safe
 class ContactListItem {
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 828ef3b9fb..76cc95310d 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -1,35 +1,19 @@
 package org.briarproject.android.contact;
 
-import static android.text.InputType.TYPE_CLASS_TEXT;
-import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
-import static android.view.Gravity.CENTER;
-import static android.view.Gravity.CENTER_VERTICAL;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-import static android.widget.LinearLayout.HORIZONTAL;
-import static android.widget.LinearLayout.VERTICAL;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
-import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
@@ -56,27 +40,43 @@ import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.MessageExpiredEvent;
 import org.briarproject.api.event.MessagesAckedEvent;
 import org.briarproject.api.event.MessagesSentEvent;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Bundle;
-import android.text.InputType;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
+import static android.view.Gravity.CENTER;
+import static android.view.Gravity.CENTER_VERTICAL;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+import static android.widget.LinearLayout.HORIZONTAL;
+import static android.widget.LinearLayout.VERTICAL;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
+import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
 
 public class ConversationActivity extends BriarActivity
 implements EventListener, OnClickListener, OnItemClickListener {
diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
index abbbb5fe90..c95324b793 100644
--- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
@@ -1,19 +1,15 @@
 package org.briarproject.android.contact;
 
-import static android.view.Gravity.CENTER;
-import static android.view.Gravity.CENTER_VERTICAL;
-import static android.widget.LinearLayout.HORIZONTAL;
-import static android.widget.LinearLayout.VERTICAL;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
-import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
-import static org.briarproject.api.Author.Status.VERIFIED;
-
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.text.format.DateUtils;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
@@ -25,20 +21,24 @@ import org.briarproject.api.AuthorId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchMessageException;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.text.format.DateUtils;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static android.view.Gravity.CENTER;
+import static android.view.Gravity.CENTER_VERTICAL;
+import static android.widget.LinearLayout.HORIZONTAL;
+import static android.widget.LinearLayout.VERTICAL;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
+import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
+import static org.briarproject.api.Author.Status.VERIFIED;
 
 public class ReadPrivateMessageActivity extends BriarActivity
 implements OnClickListener {
diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
index b173983499..481f72fe69 100644
--- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
@@ -1,24 +1,16 @@
 package org.briarproject.android.contact;
 
-import static android.text.InputType.TYPE_CLASS_TEXT;
-import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
-import static android.text.TextUtils.TruncateAt.END;
-import static android.widget.LinearLayout.VERTICAL;
-import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT;
-import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT;
-import static android.widget.RelativeLayout.CENTER_VERTICAL;
-import static android.widget.RelativeLayout.LEFT_OF;
-import static android.widget.Toast.LENGTH_LONG;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
@@ -31,24 +23,32 @@ import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchContactException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.InputType;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.Toast;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.concurrent.Executor;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
+import static android.text.TextUtils.TruncateAt.END;
+import static android.widget.LinearLayout.VERTICAL;
+import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT;
+import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT;
+import static android.widget.RelativeLayout.CENTER_VERTICAL;
+import static android.widget.RelativeLayout.LEFT_OF;
+import static android.widget.Toast.LENGTH_LONG;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
 
 public class WritePrivateMessageActivity extends BriarActivity
 implements OnClickListener {
diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
index 1c9cb66899..8c3e1c8bf6 100644
--- a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
@@ -21,8 +21,8 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
 import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java
index 1c46e66b5f..c5e62e75ce 100644
--- a/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java
+++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java
@@ -1,7 +1,7 @@
 package org.briarproject.android.forum;
 
 import org.briarproject.api.Contact;
-import org.briarproject.api.messaging.Group;
+import org.briarproject.api.sync.Group;
 
 import java.util.Collection;
 
diff --git a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java
index c005104e68..d422684bb6 100644
--- a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java
@@ -18,8 +18,8 @@ import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.util.StringUtils;
 
 import java.util.logging.Logger;
@@ -38,7 +38,7 @@ import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_GROUP_NAME_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_GROUP_NAME_LENGTH;
 
 public class CreateForumActivity extends BriarActivity
 implements OnEditorActionListener, OnClickListener {
diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
index 8786ec401f..e17719ece3 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -30,9 +30,9 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.MessageExpiredEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.MessageId;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/briar-android/src/org/briarproject/android/forum/ForumContacts.java b/briar-android/src/org/briarproject/android/forum/ForumContacts.java
index daa01d7efe..f75c439455 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumContacts.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumContacts.java
@@ -1,7 +1,7 @@
 package org.briarproject.android.forum;
 
 import org.briarproject.api.Contact;
-import org.briarproject.api.messaging.Group;
+import org.briarproject.api.sync.Group;
 
 import java.util.Collection;
 
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
index ee1c75584f..1b061f44ab 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
@@ -35,8 +35,8 @@ import org.briarproject.api.event.MessageExpiredEvent;
 import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
 import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
 import java.util.Map;
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListItem.java b/briar-android/src/org/briarproject/android/forum/ForumListItem.java
index c20b91603f..a41ae98f3a 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListItem.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListItem.java
@@ -1,7 +1,7 @@
 package org.briarproject.android.forum;
 
 import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.messaging.Group;
+import org.briarproject.api.sync.Group;
 
 import java.util.Collection;
 
diff --git a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
index 0318ecb24a..dba39cca75 100644
--- a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
@@ -21,8 +21,8 @@ import org.briarproject.api.Author;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchMessageException;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
 import java.util.logging.Logger;
diff --git a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
index 3f736c096b..a3f771edc8 100644
--- a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
@@ -19,7 +19,7 @@ import org.briarproject.api.Contact;
 import org.briarproject.api.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
 import java.util.Collections;
diff --git a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
index 6ae49b1faf..4b8297a817 100644
--- a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
@@ -31,11 +31,11 @@ import org.briarproject.api.crypto.KeyParser;
 import org.briarproject.api.crypto.PrivateKey;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
 import java.io.IOException;
diff --git a/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java b/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java
index a824b1ca5d..9c39fd75da 100644
--- a/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java
+++ b/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java
@@ -2,7 +2,7 @@ package org.briarproject.api.android;
 
 import org.briarproject.api.ContactId;
 import org.briarproject.api.lifecycle.Service;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.GroupId;
 
 /**
  * Manages notifications for private messages and group posts. All methods must
diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
index 530cffbb20..c76a155d92 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
@@ -9,19 +9,19 @@ import org.briarproject.api.Settings;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.api.transport.TransportKeys;
 
 import java.io.IOException;
diff --git a/briar-api/src/org/briarproject/api/db/MessageHeader.java b/briar-api/src/org/briarproject/api/db/MessageHeader.java
index c500971eb1..7ba4eaaf1c 100644
--- a/briar-api/src/org/briarproject/api/db/MessageHeader.java
+++ b/briar-api/src/org/briarproject/api/db/MessageHeader.java
@@ -1,12 +1,12 @@
 package org.briarproject.api.db;
 
 import org.briarproject.api.Author;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.MessageId;
 
 public class MessageHeader {
 
-	public enum State { STORED, SENT, DELIVERED };
+	public enum State { STORED, SENT, DELIVERED }
 
 	private final MessageId id, parent;
 	private final GroupId groupId;
diff --git a/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java b/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
index 333293f223..8c6664d1c4 100644
--- a/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.event;
 
 import org.briarproject.api.ContactId;
-import org.briarproject.api.messaging.Group;
+import org.briarproject.api.sync.Group;
 
 /** An event that is broadcast when a message is added to the database. */
 public class MessageAddedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java b/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java
index cb76764559..ab99b37b00 100644
--- a/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java
@@ -1,9 +1,9 @@
 package org.briarproject.api.event;
 
-import java.util.Collection;
-
 import org.briarproject.api.ContactId;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.MessageId;
+
+import java.util.Collection;
 
 /** An event that is broadcast when messages are acked by a contact. */
 public class MessagesAckedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java
index a70b7a872d..0c9f700e6f 100644
--- a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java
@@ -1,9 +1,9 @@
 package org.briarproject.api.event;
 
-import java.util.Collection;
-
 import org.briarproject.api.ContactId;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.MessageId;
+
+import java.util.Collection;
 
 /** An event that is broadcast when messages are sent to a contact. */
 public class MessagesSentEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/SubscriptionAddedEvent.java b/briar-api/src/org/briarproject/api/event/SubscriptionAddedEvent.java
index c59e9cd3d6..a9065b28b2 100644
--- a/briar-api/src/org/briarproject/api/event/SubscriptionAddedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/SubscriptionAddedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.messaging.Group;
+import org.briarproject.api.sync.Group;
 
 /** An event that is broadcast when the user subscribes to a group. */
 public class SubscriptionAddedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/SubscriptionRemovedEvent.java b/briar-api/src/org/briarproject/api/event/SubscriptionRemovedEvent.java
index 8a3d0dabdf..a8e7524571 100644
--- a/briar-api/src/org/briarproject/api/event/SubscriptionRemovedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/SubscriptionRemovedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.messaging.Group;
+import org.briarproject.api.sync.Group;
 
 /** An event that is broadcast when the user unsubscribes from a group. */
 public class SubscriptionRemovedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
deleted file mode 100644
index 1300e84c5b..0000000000
--- a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.briarproject.api.messaging;
-
-import java.io.IOException;
-
-public interface PacketWriter {
-
-	int getMaxMessagesForAck(long capacity);
-
-	int getMaxMessagesForRequest(long capacity);
-
-	int getMaxMessagesForOffer(long capacity);
-
-	void writeAck(Ack a) throws IOException;
-
-	void writeMessage(byte[] raw) throws IOException;
-
-	void writeOffer(Offer o) throws IOException;
-
-	void writeRequest(Request r) throws IOException;
-
-	void writeRetentionAck(RetentionAck a) throws IOException;
-
-	void writeRetentionUpdate(RetentionUpdate u) throws IOException;
-
-	void writeSubscriptionAck(SubscriptionAck a) throws IOException;
-
-	void writeSubscriptionUpdate(SubscriptionUpdate u) throws IOException;
-
-	void writeTransportAck(TransportAck a) throws IOException;
-
-	void writeTransportUpdate(TransportUpdate u) throws IOException;
-
-	void flush() throws IOException;
-}
diff --git a/briar-api/src/org/briarproject/api/messaging/Request.java b/briar-api/src/org/briarproject/api/messaging/Request.java
deleted file mode 100644
index eae1e39283..0000000000
--- a/briar-api/src/org/briarproject/api/messaging/Request.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.briarproject.api.messaging;
-
-import java.util.Collection;
-
-/** A packet requesting one or more {@link Message}s from the recipient. */
-public class Request {
-
-	private final Collection<MessageId> requested;
-
-	public Request(Collection<MessageId> requested) {
-		this.requested = requested;
-	}
-
-	/** Returns the identifiers of the requested messages. */
-	public Collection<MessageId> getMessageIds() {
-		return requested;
-	}
-}
diff --git a/briar-api/src/org/briarproject/api/messaging/Ack.java b/briar-api/src/org/briarproject/api/sync/Ack.java
similarity index 90%
rename from briar-api/src/org/briarproject/api/messaging/Ack.java
rename to briar-api/src/org/briarproject/api/sync/Ack.java
index 485c17b816..70417fc161 100644
--- a/briar-api/src/org/briarproject/api/messaging/Ack.java
+++ b/briar-api/src/org/briarproject/api/sync/Ack.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.util.Collection;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/Group.java b/briar-api/src/org/briarproject/api/sync/Group.java
similarity index 77%
rename from briar-api/src/org/briarproject/api/messaging/Group.java
rename to briar-api/src/org/briarproject/api/sync/Group.java
index 90e6953874..c10accdb84 100644
--- a/briar-api/src/org/briarproject/api/messaging/Group.java
+++ b/briar-api/src/org/briarproject/api/sync/Group.java
@@ -1,7 +1,4 @@
-package org.briarproject.api.messaging;
-
-import static org.briarproject.api.messaging.MessagingConstants.GROUP_SALT_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_GROUP_NAME_LENGTH;
+package org.briarproject.api.sync;
 
 import java.io.UnsupportedEncodingException;
 
@@ -19,9 +16,9 @@ public class Group {
 		} catch (UnsupportedEncodingException e) {
 			throw new RuntimeException(e);
 		}
-		if (length == 0 || length > MAX_GROUP_NAME_LENGTH)
+		if (length == 0 || length > MessagingConstants.MAX_GROUP_NAME_LENGTH)
 			throw new IllegalArgumentException();
-		if (salt.length != GROUP_SALT_LENGTH)
+		if (salt.length != MessagingConstants.GROUP_SALT_LENGTH)
 			throw new IllegalArgumentException();
 		this.id = id;
 		this.name = name;
diff --git a/briar-api/src/org/briarproject/api/messaging/GroupFactory.java b/briar-api/src/org/briarproject/api/sync/GroupFactory.java
similarity index 85%
rename from briar-api/src/org/briarproject/api/messaging/GroupFactory.java
rename to briar-api/src/org/briarproject/api/sync/GroupFactory.java
index f1ec1183a9..2850bec19c 100644
--- a/briar-api/src/org/briarproject/api/messaging/GroupFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/GroupFactory.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 public interface GroupFactory {
 
diff --git a/briar-api/src/org/briarproject/api/messaging/GroupId.java b/briar-api/src/org/briarproject/api/sync/GroupId.java
similarity index 90%
rename from briar-api/src/org/briarproject/api/messaging/GroupId.java
rename to briar-api/src/org/briarproject/api/sync/GroupId.java
index 7732774e43..dc5a4b9239 100644
--- a/briar-api/src/org/briarproject/api/messaging/GroupId.java
+++ b/briar-api/src/org/briarproject/api/sync/GroupId.java
@@ -1,9 +1,9 @@
-package org.briarproject.api.messaging;
-
-import java.util.Arrays;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.UniqueId;
 
+import java.util.Arrays;
+
 /**
  * Type-safe wrapper for a byte array that uniquely identifies a {@link Group}.
  */
diff --git a/briar-api/src/org/briarproject/api/messaging/Message.java b/briar-api/src/org/briarproject/api/sync/Message.java
similarity index 96%
rename from briar-api/src/org/briarproject/api/messaging/Message.java
rename to briar-api/src/org/briarproject/api/sync/Message.java
index dd6291e55e..a8245f13fe 100644
--- a/briar-api/src/org/briarproject/api/messaging/Message.java
+++ b/briar-api/src/org/briarproject/api/sync/Message.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.Author;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/MessageFactory.java b/briar-api/src/org/briarproject/api/sync/MessageFactory.java
similarity index 67%
rename from briar-api/src/org/briarproject/api/messaging/MessageFactory.java
rename to briar-api/src/org/briarproject/api/sync/MessageFactory.java
index 7e06f0d0b7..63012b3bc4 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessageFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/MessageFactory.java
@@ -1,18 +1,18 @@
-package org.briarproject.api.messaging;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.crypto.PrivateKey;
 
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+
 public interface MessageFactory {
 
-	Message createAnonymousMessage(MessageId parent, Group group,
+	Message createAnonymousMessage(MessageId parent, org.briarproject.api.sync.Group group,
 			String contentType, long timestamp, byte[] body) throws IOException,
 			GeneralSecurityException;
 
-	Message createPseudonymousMessage(MessageId parent, Group group,
+	Message createPseudonymousMessage(MessageId parent, org.briarproject.api.sync.Group group,
 			Author author, PrivateKey privateKey, String contentType,
 			long timestamp, byte[] body) throws IOException,
 			GeneralSecurityException;
diff --git a/briar-api/src/org/briarproject/api/messaging/MessageId.java b/briar-api/src/org/briarproject/api/sync/MessageId.java
similarity index 90%
rename from briar-api/src/org/briarproject/api/messaging/MessageId.java
rename to briar-api/src/org/briarproject/api/sync/MessageId.java
index a2a79c43de..472caec3fb 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessageId.java
+++ b/briar-api/src/org/briarproject/api/sync/MessageId.java
@@ -1,9 +1,9 @@
-package org.briarproject.api.messaging;
-
-import java.util.Arrays;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.UniqueId;
 
+import java.util.Arrays;
+
 /**
  * Type-safe wrapper for a byte array that uniquely identifies a
  * {@link Message}.
diff --git a/briar-api/src/org/briarproject/api/messaging/MessageVerifier.java b/briar-api/src/org/briarproject/api/sync/MessageVerifier.java
similarity index 85%
rename from briar-api/src/org/briarproject/api/messaging/MessageVerifier.java
rename to briar-api/src/org/briarproject/api/sync/MessageVerifier.java
index 6ac3d277bd..87ee02be69 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessageVerifier.java
+++ b/briar-api/src/org/briarproject/api/sync/MessageVerifier.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.security.GeneralSecurityException;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/MessagingConstants.java b/briar-api/src/org/briarproject/api/sync/MessagingConstants.java
similarity index 97%
rename from briar-api/src/org/briarproject/api/messaging/MessagingConstants.java
rename to briar-api/src/org/briarproject/api/sync/MessagingConstants.java
index fefe79a3ba..5353f442f7 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessagingConstants.java
+++ b/briar-api/src/org/briarproject/api/sync/MessagingConstants.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 
 public interface MessagingConstants {
diff --git a/briar-api/src/org/briarproject/api/messaging/MessagingSession.java b/briar-api/src/org/briarproject/api/sync/MessagingSession.java
similarity index 90%
rename from briar-api/src/org/briarproject/api/messaging/MessagingSession.java
rename to briar-api/src/org/briarproject/api/sync/MessagingSession.java
index c4d8d39890..17009b9644 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessagingSession.java
+++ b/briar-api/src/org/briarproject/api/sync/MessagingSession.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.io.IOException;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java b/briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java
similarity index 92%
rename from briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java
rename to briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java
index 8764f3e255..0cae83d890 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java
@@ -1,11 +1,11 @@
-package org.briarproject.api.messaging;
-
-import java.io.InputStream;
-import java.io.OutputStream;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
 
+import java.io.InputStream;
+import java.io.OutputStream;
+
 public interface MessagingSessionFactory {
 
 	MessagingSession createIncomingSession(ContactId c, TransportId t,
diff --git a/briar-api/src/org/briarproject/api/messaging/Offer.java b/briar-api/src/org/briarproject/api/sync/Offer.java
similarity index 74%
rename from briar-api/src/org/briarproject/api/messaging/Offer.java
rename to briar-api/src/org/briarproject/api/sync/Offer.java
index 8ab4a0dc17..6611fda66b 100644
--- a/briar-api/src/org/briarproject/api/messaging/Offer.java
+++ b/briar-api/src/org/briarproject/api/sync/Offer.java
@@ -1,8 +1,8 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.util.Collection;
 
-/** A packet offering the recipient one or more {@link Messages}. */
+/** A packet offering the recipient one or more {@link Message}s. */
 public class Offer {
 
 	private final Collection<MessageId> offered;
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketReader.java b/briar-api/src/org/briarproject/api/sync/PacketReader.java
similarity index 63%
rename from briar-api/src/org/briarproject/api/messaging/PacketReader.java
rename to briar-api/src/org/briarproject/api/sync/PacketReader.java
index d390bf2498..b6c6e61e00 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketReader.java
+++ b/briar-api/src/org/briarproject/api/sync/PacketReader.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.io.IOException;
 
@@ -19,20 +19,20 @@ public interface PacketReader {
 	Request readRequest() throws IOException;
 
 	boolean hasRetentionAck() throws IOException;
-	RetentionAck readRetentionAck() throws IOException;
+	org.briarproject.api.sync.RetentionAck readRetentionAck() throws IOException;
 
 	boolean hasRetentionUpdate() throws IOException;
-	RetentionUpdate readRetentionUpdate() throws IOException;
+	org.briarproject.api.sync.RetentionUpdate readRetentionUpdate() throws IOException;
 
 	boolean hasSubscriptionAck() throws IOException;
-	SubscriptionAck readSubscriptionAck() throws IOException;
+	org.briarproject.api.sync.SubscriptionAck readSubscriptionAck() throws IOException;
 
 	boolean hasSubscriptionUpdate() throws IOException;
-	SubscriptionUpdate readSubscriptionUpdate() throws IOException;
+	org.briarproject.api.sync.SubscriptionUpdate readSubscriptionUpdate() throws IOException;
 
 	boolean hasTransportAck() throws IOException;
 	TransportAck readTransportAck() throws IOException;
 
 	boolean hasTransportUpdate() throws IOException;
-	TransportUpdate readTransportUpdate() throws IOException;
+	org.briarproject.api.sync.TransportUpdate readTransportUpdate() throws IOException;
 }
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketReaderFactory.java b/briar-api/src/org/briarproject/api/sync/PacketReaderFactory.java
similarity index 75%
rename from briar-api/src/org/briarproject/api/messaging/PacketReaderFactory.java
rename to briar-api/src/org/briarproject/api/sync/PacketReaderFactory.java
index 3bede6db2a..5e48269d2f 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketReaderFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/PacketReaderFactory.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.io.InputStream;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketTypes.java b/briar-api/src/org/briarproject/api/sync/PacketTypes.java
similarity index 88%
rename from briar-api/src/org/briarproject/api/messaging/PacketTypes.java
rename to briar-api/src/org/briarproject/api/sync/PacketTypes.java
index 41c2eee6f7..595135d125 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketTypes.java
+++ b/briar-api/src/org/briarproject/api/sync/PacketTypes.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 /** Packet types for the messaging protocol. */
 public interface PacketTypes {
diff --git a/briar-api/src/org/briarproject/api/sync/PacketWriter.java b/briar-api/src/org/briarproject/api/sync/PacketWriter.java
new file mode 100644
index 0000000000..3e43eeb48d
--- /dev/null
+++ b/briar-api/src/org/briarproject/api/sync/PacketWriter.java
@@ -0,0 +1,34 @@
+package org.briarproject.api.sync;
+
+import java.io.IOException;
+
+public interface PacketWriter {
+
+	int getMaxMessagesForAck(long capacity);
+
+	int getMaxMessagesForRequest(long capacity);
+
+	int getMaxMessagesForOffer(long capacity);
+
+	void writeAck(Ack a) throws IOException;
+
+	void writeMessage(byte[] raw) throws IOException;
+
+	void writeOffer(org.briarproject.api.sync.Offer o) throws IOException;
+
+	void writeRequest(Request r) throws IOException;
+
+	void writeRetentionAck(org.briarproject.api.sync.RetentionAck a) throws IOException;
+
+	void writeRetentionUpdate(org.briarproject.api.sync.RetentionUpdate u) throws IOException;
+
+	void writeSubscriptionAck(org.briarproject.api.sync.SubscriptionAck a) throws IOException;
+
+	void writeSubscriptionUpdate(org.briarproject.api.sync.SubscriptionUpdate u) throws IOException;
+
+	void writeTransportAck(org.briarproject.api.sync.TransportAck a) throws IOException;
+
+	void writeTransportUpdate(org.briarproject.api.sync.TransportUpdate u) throws IOException;
+
+	void flush() throws IOException;
+}
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java b/briar-api/src/org/briarproject/api/sync/PacketWriterFactory.java
similarity index 75%
rename from briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java
rename to briar-api/src/org/briarproject/api/sync/PacketWriterFactory.java
index 5c1c5b4ec6..51befe31fe 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/PacketWriterFactory.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.io.OutputStream;
 
diff --git a/briar-api/src/org/briarproject/api/sync/Request.java b/briar-api/src/org/briarproject/api/sync/Request.java
new file mode 100644
index 0000000000..3b562802df
--- /dev/null
+++ b/briar-api/src/org/briarproject/api/sync/Request.java
@@ -0,0 +1,18 @@
+package org.briarproject.api.sync;
+
+import java.util.Collection;
+
+/** A packet requesting one or more {@link Message}s from the recipient. */
+public class Request {
+
+	private final Collection<org.briarproject.api.sync.MessageId> requested;
+
+	public Request(Collection<org.briarproject.api.sync.MessageId> requested) {
+		this.requested = requested;
+	}
+
+	/** Returns the identifiers of the requested messages. */
+	public Collection<org.briarproject.api.sync.MessageId> getMessageIds() {
+		return requested;
+	}
+}
diff --git a/briar-api/src/org/briarproject/api/messaging/RetentionAck.java b/briar-api/src/org/briarproject/api/sync/RetentionAck.java
similarity index 88%
rename from briar-api/src/org/briarproject/api/messaging/RetentionAck.java
rename to briar-api/src/org/briarproject/api/sync/RetentionAck.java
index 9a538e65a7..5c36a94345 100644
--- a/briar-api/src/org/briarproject/api/messaging/RetentionAck.java
+++ b/briar-api/src/org/briarproject/api/sync/RetentionAck.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 /** A packet acknowledging a (@link RetentionUpdate} */
 public class RetentionAck {
diff --git a/briar-api/src/org/briarproject/api/messaging/RetentionUpdate.java b/briar-api/src/org/briarproject/api/sync/RetentionUpdate.java
similarity index 90%
rename from briar-api/src/org/briarproject/api/messaging/RetentionUpdate.java
rename to briar-api/src/org/briarproject/api/sync/RetentionUpdate.java
index 4e8a594980..5955a3955a 100644
--- a/briar-api/src/org/briarproject/api/messaging/RetentionUpdate.java
+++ b/briar-api/src/org/briarproject/api/sync/RetentionUpdate.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 /**
  * A packet updating the recipient's view of the retention time of the sender's
diff --git a/briar-api/src/org/briarproject/api/messaging/SubscriptionAck.java b/briar-api/src/org/briarproject/api/sync/SubscriptionAck.java
similarity index 88%
rename from briar-api/src/org/briarproject/api/messaging/SubscriptionAck.java
rename to briar-api/src/org/briarproject/api/sync/SubscriptionAck.java
index c304853858..b65ccf1c27 100644
--- a/briar-api/src/org/briarproject/api/messaging/SubscriptionAck.java
+++ b/briar-api/src/org/briarproject/api/sync/SubscriptionAck.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 /** A packet acknowledging a {@link SubscriptionUpdate}. */
 public class SubscriptionAck {
diff --git a/briar-api/src/org/briarproject/api/messaging/SubscriptionUpdate.java b/briar-api/src/org/briarproject/api/sync/SubscriptionUpdate.java
similarity index 93%
rename from briar-api/src/org/briarproject/api/messaging/SubscriptionUpdate.java
rename to briar-api/src/org/briarproject/api/sync/SubscriptionUpdate.java
index 76f95ce097..0fabdf2783 100644
--- a/briar-api/src/org/briarproject/api/messaging/SubscriptionUpdate.java
+++ b/briar-api/src/org/briarproject/api/sync/SubscriptionUpdate.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import java.util.Collection;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/TransportAck.java b/briar-api/src/org/briarproject/api/sync/TransportAck.java
similarity index 92%
rename from briar-api/src/org/briarproject/api/messaging/TransportAck.java
rename to briar-api/src/org/briarproject/api/sync/TransportAck.java
index ce6ccd4fb0..160d24dfff 100644
--- a/briar-api/src/org/briarproject/api/messaging/TransportAck.java
+++ b/briar-api/src/org/briarproject/api/sync/TransportAck.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.TransportId;
 
diff --git a/briar-api/src/org/briarproject/api/messaging/TransportUpdate.java b/briar-api/src/org/briarproject/api/sync/TransportUpdate.java
similarity index 95%
rename from briar-api/src/org/briarproject/api/messaging/TransportUpdate.java
rename to briar-api/src/org/briarproject/api/sync/TransportUpdate.java
index 78f2b5b1b7..ea403ba342 100644
--- a/briar-api/src/org/briarproject/api/messaging/TransportUpdate.java
+++ b/briar-api/src/org/briarproject/api/sync/TransportUpdate.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
diff --git a/briar-api/src/org/briarproject/api/messaging/UnverifiedMessage.java b/briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java
similarity index 85%
rename from briar-api/src/org/briarproject/api/messaging/UnverifiedMessage.java
rename to briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java
index 1438e288c6..9f8baf59c6 100644
--- a/briar-api/src/org/briarproject/api/messaging/UnverifiedMessage.java
+++ b/briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java
@@ -1,4 +1,4 @@
-package org.briarproject.api.messaging;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.Author;
 
@@ -6,14 +6,14 @@ import org.briarproject.api.Author;
 public class UnverifiedMessage {
 
 	private final MessageId parent;
-	private final Group group;
+	private final org.briarproject.api.sync.Group group;
 	private final Author author;
 	private final String contentType;
 	private final long timestamp;
 	private final byte[] raw, signature;
 	private final int bodyStart, bodyLength, signedLength;
 
-	public UnverifiedMessage(MessageId parent, Group group, Author author,
+	public UnverifiedMessage(MessageId parent, org.briarproject.api.sync.Group group, Author author,
 			String contentType, long timestamp, byte[] raw, byte[] signature,
 			int bodyStart, int bodyLength, int signedLength) {
 		this.parent = parent;
@@ -37,10 +37,10 @@ public class UnverifiedMessage {
 	}
 
 	/**
-	 * Returns the {@link Group} to which the message belongs, or null if this
+	 * Returns the {@link org.briarproject.api.sync.Group} to which the message belongs, or null if this
 	 * is a private message.
 	 */
-	public Group getGroup() {
+	public org.briarproject.api.sync.Group getGroup() {
 		return group;
 	}
 
diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java
index 9d3eda9bf8..feeb4381b0 100644
--- a/briar-core/src/org/briarproject/db/Database.java
+++ b/briar-core/src/org/briarproject/db/Database.java
@@ -11,16 +11,16 @@ import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.api.transport.TransportKeys;
 
 import java.io.IOException;
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 4eafdfa513..caa88847d2 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -42,19 +42,19 @@ import org.briarproject.api.event.SubscriptionRemovedEvent;
 import org.briarproject.api.event.TransportAddedEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
 import org.briarproject.api.lifecycle.ShutdownManager;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.api.transport.TransportKeys;
 
 import java.io.IOException;
diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java
index acecbf4fb7..f0dd8c5324 100644
--- a/briar-core/src/org/briarproject/db/JdbcDatabase.java
+++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java
@@ -14,16 +14,16 @@ import org.briarproject.api.db.DbClosedException;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.MessageHeader;
 import org.briarproject.api.db.MessageHeader.State;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.transport.IncomingKeys;
 import org.briarproject.api.transport.OutgoingKeys;
@@ -57,8 +57,8 @@ import static java.util.logging.Level.WARNING;
 import static org.briarproject.api.Author.Status.ANONYMOUS;
 import static org.briarproject.api.Author.Status.UNKNOWN;
 import static org.briarproject.api.Author.Status.VERIFIED;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_SUBSCRIPTIONS;
-import static org.briarproject.api.messaging.MessagingConstants.RETENTION_GRANULARITY;
+import static org.briarproject.api.sync.MessagingConstants.MAX_SUBSCRIPTIONS;
+import static org.briarproject.api.sync.MessagingConstants.RETENTION_GRANULARITY;
 import static org.briarproject.db.ExponentialBackoff.calculateExpiry;
 
 /**
@@ -2675,7 +2675,6 @@ abstract class JdbcDatabase implements Database<Connection> {
 	public void raiseRequestedFlag(Connection txn, ContactId c, MessageId m)
 			throws DbException {
 		PreparedStatement ps = null;
-		ResultSet rs = null;
 		try {
 			String sql = "UPDATE statuses SET requested = TRUE"
 					+ " WHERE messageId = ? AND contactId = ?";
@@ -2686,7 +2685,6 @@ abstract class JdbcDatabase implements Database<Connection> {
 			if (affected < 0 || affected > 1) throw new DbStateException();
 			ps.close();
 		} catch (SQLException e) {
-			tryToClose(rs);
 			tryToClose(ps);
 			throw new DbException(e);
 		}
@@ -2695,7 +2693,6 @@ abstract class JdbcDatabase implements Database<Connection> {
 	public void raiseSeenFlag(Connection txn, ContactId c, MessageId m)
 			throws DbException {
 		PreparedStatement ps = null;
-		ResultSet rs = null;
 		try {
 			String sql = "UPDATE statuses SET seen = TRUE"
 					+ " WHERE messageId = ? AND contactId = ?";
@@ -2706,7 +2703,6 @@ abstract class JdbcDatabase implements Database<Connection> {
 			if (affected < 0 || affected > 1) throw new DbStateException();
 			ps.close();
 		} catch (SQLException e) {
-			tryToClose(rs);
 			tryToClose(ps);
 			throw new DbException(e);
 		}
diff --git a/briar-core/src/org/briarproject/invitation/AliceConnector.java b/briar-core/src/org/briarproject/invitation/AliceConnector.java
index f37357385c..460feac240 100644
--- a/briar-core/src/org/briarproject/invitation/AliceConnector.java
+++ b/briar-core/src/org/briarproject/invitation/AliceConnector.java
@@ -14,10 +14,10 @@ import org.briarproject.api.data.Writer;
 import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.messaging.GroupFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
diff --git a/briar-core/src/org/briarproject/invitation/BobConnector.java b/briar-core/src/org/briarproject/invitation/BobConnector.java
index 845ee0df7b..20c60061a0 100644
--- a/briar-core/src/org/briarproject/invitation/BobConnector.java
+++ b/briar-core/src/org/briarproject/invitation/BobConnector.java
@@ -14,10 +14,10 @@ import org.briarproject.api.data.Writer;
 import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.messaging.GroupFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
diff --git a/briar-core/src/org/briarproject/invitation/Connector.java b/briar-core/src/org/briarproject/invitation/Connector.java
index d8c4e674fc..4734160629 100644
--- a/briar-core/src/org/briarproject/invitation/Connector.java
+++ b/briar-core/src/org/briarproject/invitation/Connector.java
@@ -20,11 +20,11 @@ import org.briarproject.api.data.Writer;
 import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
diff --git a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
index 5861c07b00..11c9855224 100644
--- a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
+++ b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
@@ -15,10 +15,10 @@ import org.briarproject.api.db.DbException;
 import org.briarproject.api.invitation.InvitationListener;
 import org.briarproject.api.invitation.InvitationState;
 import org.briarproject.api.invitation.InvitationTask;
-import org.briarproject.api.messaging.GroupFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.PluginManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
+import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
diff --git a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
index 97c65c0985..7438deccd7 100644
--- a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
+++ b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
@@ -1,7 +1,5 @@
 package org.briarproject.invitation;
 
-import javax.inject.Inject;
-
 import org.briarproject.api.AuthorFactory;
 import org.briarproject.api.AuthorId;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -10,14 +8,16 @@ import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.invitation.InvitationTask;
 import org.briarproject.api.invitation.InvitationTaskFactory;
-import org.briarproject.api.messaging.GroupFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.PluginManager;
+import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.system.Clock;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
 
+import javax.inject.Inject;
+
 class InvitationTaskFactoryImpl implements InvitationTaskFactory {
 
 	private final CryptoComponent crypto;
diff --git a/briar-core/src/org/briarproject/messaging/ThrowingRunnable.java b/briar-core/src/org/briarproject/messaging/ThrowingRunnable.java
deleted file mode 100644
index 334581daac..0000000000
--- a/briar-core/src/org/briarproject/messaging/ThrowingRunnable.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.briarproject.messaging;
-
-interface ThrowingRunnable<T extends Throwable> {
-
-	public void run() throws T;
-}
diff --git a/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java b/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
index 5b1e32be10..20c7fb49de 100644
--- a/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
+++ b/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
@@ -1,33 +1,33 @@
 package org.briarproject.plugins;
 
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
-
 import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.lifecycle.IoExecutor;
-import org.briarproject.api.messaging.MessagingSession;
-import org.briarproject.api.messaging.MessagingSessionFactory;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.ConnectionRegistry;
 import org.briarproject.api.plugins.TransportConnectionReader;
 import org.briarproject.api.plugins.TransportConnectionWriter;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.sync.MessagingSession;
+import org.briarproject.api.sync.MessagingSessionFactory;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamContext;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
 
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.Executor;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH;
+
 class ConnectionManagerImpl implements ConnectionManager {
 
 	private static final Logger LOG =
diff --git a/briar-core/src/org/briarproject/messaging/AuthorFactoryImpl.java b/briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java
similarity index 97%
rename from briar-core/src/org/briarproject/messaging/AuthorFactoryImpl.java
rename to briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java
index 1458137291..c0cf59deb7 100644
--- a/briar-core/src/org/briarproject/messaging/AuthorFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java
@@ -1,9 +1,4 @@
-package org.briarproject.messaging;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-import javax.inject.Inject;
+package org.briarproject.sync;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.AuthorFactory;
@@ -15,6 +10,11 @@ import org.briarproject.api.data.Writer;
 import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.system.Clock;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.inject.Inject;
+
 class AuthorFactoryImpl implements AuthorFactory {
 
 	private final CryptoComponent crypto;
diff --git a/briar-core/src/org/briarproject/messaging/AuthorReader.java b/briar-core/src/org/briarproject/sync/AuthorReader.java
similarity index 97%
rename from briar-core/src/org/briarproject/messaging/AuthorReader.java
rename to briar-core/src/org/briarproject/sync/AuthorReader.java
index 3223b4ca20..22aa7a5f12 100644
--- a/briar-core/src/org/briarproject/messaging/AuthorReader.java
+++ b/briar-core/src/org/briarproject/sync/AuthorReader.java
@@ -1,9 +1,4 @@
-package org.briarproject.messaging;
-
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
-import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
-
-import java.io.IOException;
+package org.briarproject.sync;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.AuthorId;
@@ -13,6 +8,11 @@ import org.briarproject.api.crypto.MessageDigest;
 import org.briarproject.api.data.ObjectReader;
 import org.briarproject.api.data.Reader;
 
+import java.io.IOException;
+
+import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
+import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+
 class AuthorReader implements ObjectReader<Author> {
 
 	private final MessageDigest messageDigest;
diff --git a/briar-core/src/org/briarproject/messaging/CopyingConsumer.java b/briar-core/src/org/briarproject/sync/CopyingConsumer.java
similarity index 93%
rename from briar-core/src/org/briarproject/messaging/CopyingConsumer.java
rename to briar-core/src/org/briarproject/sync/CopyingConsumer.java
index 76bbd49adc..39ee00b25f 100644
--- a/briar-core/src/org/briarproject/messaging/CopyingConsumer.java
+++ b/briar-core/src/org/briarproject/sync/CopyingConsumer.java
@@ -1,10 +1,10 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
+
+import org.briarproject.api.data.Consumer;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
-import org.briarproject.api.data.Consumer;
-
 /** A consumer that makes a copy of the bytes consumed. */
 class CopyingConsumer implements Consumer {
 
diff --git a/briar-core/src/org/briarproject/messaging/CountingConsumer.java b/briar-core/src/org/briarproject/sync/CountingConsumer.java
similarity index 95%
rename from briar-core/src/org/briarproject/messaging/CountingConsumer.java
rename to briar-core/src/org/briarproject/sync/CountingConsumer.java
index 8b01aa06b2..63b2874e07 100644
--- a/briar-core/src/org/briarproject/messaging/CountingConsumer.java
+++ b/briar-core/src/org/briarproject/sync/CountingConsumer.java
@@ -1,10 +1,10 @@
-package org.briarproject.messaging;
-
-import java.io.IOException;
+package org.briarproject.sync;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.data.Consumer;
 
+import java.io.IOException;
+
 /**
  * A consumer that counts the number of bytes consumed and throws a
  * FormatException if the count exceeds a given limit.
diff --git a/briar-core/src/org/briarproject/messaging/DigestingConsumer.java b/briar-core/src/org/briarproject/sync/DigestingConsumer.java
similarity index 93%
rename from briar-core/src/org/briarproject/messaging/DigestingConsumer.java
rename to briar-core/src/org/briarproject/sync/DigestingConsumer.java
index e9bb102eb0..ee217334e8 100644
--- a/briar-core/src/org/briarproject/messaging/DigestingConsumer.java
+++ b/briar-core/src/org/briarproject/sync/DigestingConsumer.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import org.briarproject.api.crypto.MessageDigest;
 import org.briarproject.api.data.Consumer;
diff --git a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java b/briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java
similarity index 95%
rename from briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
rename to briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java
index a2b1ff99f8..ad7cea3758 100644
--- a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java
@@ -1,16 +1,4 @@
-package org.briarproject.messaging;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Logger;
+package org.briarproject.sync;
 
 import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
@@ -32,21 +20,33 @@ import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
 import org.briarproject.api.event.RemoteTransportsUpdatedEvent;
 import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.MessagingSession;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.MessagingSession;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.api.system.Clock;
 
+import java.io.IOException;
+import java.util.Collection;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.logging.Logger;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+
 /**
- * An outgoing {@link org.briarproject.api.messaging.MessagingSession
+ * An outgoing {@link MessagingSession
  * MessagingSession} suitable for duplex transports. The session offers
  * messages before sending them, keeps its output stream open when there are no
  * packets to send, and reacts to events that make packets available to send.
diff --git a/briar-core/src/org/briarproject/messaging/GroupFactoryImpl.java b/briar-core/src/org/briarproject/sync/GroupFactoryImpl.java
similarity index 83%
rename from briar-core/src/org/briarproject/messaging/GroupFactoryImpl.java
rename to briar-core/src/org/briarproject/sync/GroupFactoryImpl.java
index 37bee81a29..2b422b917c 100644
--- a/briar-core/src/org/briarproject/messaging/GroupFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/GroupFactoryImpl.java
@@ -1,19 +1,19 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
-import static org.briarproject.api.messaging.MessagingConstants.GROUP_SALT_LENGTH;
+import org.briarproject.api.crypto.CryptoComponent;
+import org.briarproject.api.crypto.MessageDigest;
+import org.briarproject.api.data.Writer;
+import org.briarproject.api.data.WriterFactory;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
+import org.briarproject.api.sync.GroupId;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import javax.inject.Inject;
 
-import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.crypto.MessageDigest;
-import org.briarproject.api.data.Writer;
-import org.briarproject.api.data.WriterFactory;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
-import org.briarproject.api.messaging.GroupId;
+import static org.briarproject.api.sync.MessagingConstants.GROUP_SALT_LENGTH;
 
 class GroupFactoryImpl implements GroupFactory {
 
diff --git a/briar-core/src/org/briarproject/messaging/GroupReader.java b/briar-core/src/org/briarproject/sync/GroupReader.java
similarity index 77%
rename from briar-core/src/org/briarproject/messaging/GroupReader.java
rename to briar-core/src/org/briarproject/sync/GroupReader.java
index 6e6f5d3c83..9ee9fe1a05 100644
--- a/briar-core/src/org/briarproject/messaging/GroupReader.java
+++ b/briar-core/src/org/briarproject/sync/GroupReader.java
@@ -1,17 +1,17 @@
-package org.briarproject.messaging;
-
-import static org.briarproject.api.messaging.MessagingConstants.GROUP_SALT_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_GROUP_NAME_LENGTH;
-
-import java.io.IOException;
+package org.briarproject.sync;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.MessageDigest;
 import org.briarproject.api.data.ObjectReader;
 import org.briarproject.api.data.Reader;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+
+import java.io.IOException;
+
+import static org.briarproject.api.sync.MessagingConstants.GROUP_SALT_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_GROUP_NAME_LENGTH;
 
 class GroupReader implements ObjectReader<Group> {
 
diff --git a/briar-core/src/org/briarproject/messaging/IncomingSession.java b/briar-core/src/org/briarproject/sync/IncomingSession.java
similarity index 90%
rename from briar-core/src/org/briarproject/messaging/IncomingSession.java
rename to briar-core/src/org/briarproject/sync/IncomingSession.java
index a3c8d1cde2..092cf50794 100644
--- a/briar-core/src/org/briarproject/messaging/IncomingSession.java
+++ b/briar-core/src/org/briarproject/sync/IncomingSession.java
@@ -1,11 +1,4 @@
-package org.briarproject.messaging;
-
-import static java.util.logging.Level.WARNING;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
+package org.briarproject.sync;
 
 import org.briarproject.api.ContactId;
 import org.briarproject.api.FormatException;
@@ -18,23 +11,30 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageVerifier;
-import org.briarproject.api.messaging.MessagingSession;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.PacketReader;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
-import org.briarproject.api.messaging.UnverifiedMessage;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageVerifier;
+import org.briarproject.api.sync.MessagingSession;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.PacketReader;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
+import org.briarproject.api.sync.UnverifiedMessage;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.concurrent.Executor;
+import java.util.logging.Logger;
+
+import static java.util.logging.Level.WARNING;
 
 /**
- * An incoming {@link org.briarproject.api.messaging.MessagingSession
+ * An incoming {@link MessagingSession
  * MessagingSession}.
  */
 class IncomingSession implements MessagingSession, EventListener {
diff --git a/briar-core/src/org/briarproject/messaging/MessageFactoryImpl.java b/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java
similarity index 85%
rename from briar-core/src/org/briarproject/messaging/MessageFactoryImpl.java
rename to briar-core/src/org/briarproject/sync/MessageFactoryImpl.java
index d584a9daf0..9b7e4c4b7a 100644
--- a/briar-core/src/org/briarproject/messaging/MessageFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java
@@ -1,17 +1,4 @@
-package org.briarproject.messaging;
-
-import static org.briarproject.api.AuthorConstants.MAX_SIGNATURE_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MESSAGE_SALT_LENGTH;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.security.SecureRandom;
-
-import javax.inject.Inject;
+package org.briarproject.sync;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -21,12 +8,25 @@ import org.briarproject.api.crypto.Signature;
 import org.briarproject.api.data.Consumer;
 import org.briarproject.api.data.Writer;
 import org.briarproject.api.data.WriterFactory;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.SecureRandom;
+
+import javax.inject.Inject;
+
+import static org.briarproject.api.AuthorConstants.MAX_SIGNATURE_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_BODY_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_CONTENT_TYPE_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MESSAGE_SALT_LENGTH;
+
 class MessageFactoryImpl implements MessageFactory {
 
 	private final Signature signature;
@@ -78,7 +78,7 @@ class MessageFactoryImpl implements MessageFactory {
 		Consumer signingConsumer = null;
 		if (privateKey != null) {
 			signature.initSign(privateKey);
-			signingConsumer = new SigningConsumer(signature);
+			signingConsumer = new org.briarproject.sync.SigningConsumer(signature);
 			w.addConsumer(signingConsumer);
 		}
 		// Write the message
@@ -109,7 +109,7 @@ class MessageFactoryImpl implements MessageFactory {
 		// Hash the message, including the signature, to get the message ID
 		w.removeConsumer(digestingConsumer);
 		MessageId id = new MessageId(messageDigest.digest());
-		return new MessageImpl(id, parent, group, author, contentType,
+		return new org.briarproject.sync.MessageImpl(id, parent, group, author, contentType,
 				timestamp, out.toByteArray(), bodyStart, body.length);
 	}
 
diff --git a/briar-core/src/org/briarproject/messaging/MessageImpl.java b/briar-core/src/org/briarproject/sync/MessageImpl.java
similarity index 85%
rename from briar-core/src/org/briarproject/messaging/MessageImpl.java
rename to briar-core/src/org/briarproject/sync/MessageImpl.java
index 32a2caeaf2..761d2e9b6e 100644
--- a/briar-core/src/org/briarproject/messaging/MessageImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessageImpl.java
@@ -1,11 +1,11 @@
-package org.briarproject.messaging;
-
-import static org.briarproject.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
+package org.briarproject.sync;
 
 import org.briarproject.api.Author;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+
+import static org.briarproject.api.sync.MessagingConstants.MAX_BODY_LENGTH;
 
 /** A simple in-memory implementation of a message. */
 class MessageImpl implements Message {
diff --git a/briar-core/src/org/briarproject/messaging/MessageReader.java b/briar-core/src/org/briarproject/sync/MessageReader.java
similarity index 82%
rename from briar-core/src/org/briarproject/messaging/MessageReader.java
rename to briar-core/src/org/briarproject/sync/MessageReader.java
index a415ce0c4c..fc549af831 100644
--- a/briar-core/src/org/briarproject/messaging/MessageReader.java
+++ b/briar-core/src/org/briarproject/sync/MessageReader.java
@@ -1,21 +1,21 @@
-package org.briarproject.messaging;
-
-import static org.briarproject.api.AuthorConstants.MAX_SIGNATURE_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MESSAGE_SALT_LENGTH;
-
-import java.io.IOException;
+package org.briarproject.sync;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.FormatException;
 import org.briarproject.api.UniqueId;
 import org.briarproject.api.data.ObjectReader;
 import org.briarproject.api.data.Reader;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.UnverifiedMessage;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.UnverifiedMessage;
+
+import java.io.IOException;
+
+import static org.briarproject.api.AuthorConstants.MAX_SIGNATURE_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_BODY_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_CONTENT_TYPE_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MESSAGE_SALT_LENGTH;
 
 class MessageReader implements ObjectReader<UnverifiedMessage> {
 
diff --git a/briar-core/src/org/briarproject/messaging/MessageVerifierImpl.java b/briar-core/src/org/briarproject/sync/MessageVerifierImpl.java
similarity index 90%
rename from briar-core/src/org/briarproject/messaging/MessageVerifierImpl.java
rename to briar-core/src/org/briarproject/sync/MessageVerifierImpl.java
index 4daa906662..9c38f3b7b2 100644
--- a/briar-core/src/org/briarproject/messaging/MessageVerifierImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessageVerifierImpl.java
@@ -1,12 +1,4 @@
-package org.briarproject.messaging;
-
-import static java.util.logging.Level.INFO;
-import static org.briarproject.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE;
-
-import java.security.GeneralSecurityException;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
+package org.briarproject.sync;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -14,12 +6,20 @@ import org.briarproject.api.crypto.KeyParser;
 import org.briarproject.api.crypto.MessageDigest;
 import org.briarproject.api.crypto.PublicKey;
 import org.briarproject.api.crypto.Signature;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.MessageVerifier;
-import org.briarproject.api.messaging.UnverifiedMessage;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.MessageVerifier;
+import org.briarproject.api.sync.UnverifiedMessage;
 import org.briarproject.api.system.Clock;
 
+import java.security.GeneralSecurityException;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import static java.util.logging.Level.INFO;
+import static org.briarproject.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE;
+
 class MessageVerifierImpl implements MessageVerifier {
 
 	private static final Logger LOG =
diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/sync/MessagingModule.java
similarity index 70%
rename from briar-core/src/org/briarproject/messaging/MessagingModule.java
rename to briar-core/src/org/briarproject/sync/MessagingModule.java
index 1b58a8e577..205ca47177 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingModule.java
+++ b/briar-core/src/org/briarproject/sync/MessagingModule.java
@@ -1,23 +1,23 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
-import javax.inject.Singleton;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
 
 import org.briarproject.api.Author;
 import org.briarproject.api.AuthorFactory;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.data.ObjectReader;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageVerifier;
-import org.briarproject.api.messaging.MessagingSessionFactory;
-import org.briarproject.api.messaging.PacketReaderFactory;
-import org.briarproject.api.messaging.PacketWriterFactory;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.UnverifiedMessage;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageVerifier;
+import org.briarproject.api.sync.MessagingSessionFactory;
+import org.briarproject.api.sync.PacketReaderFactory;
+import org.briarproject.api.sync.PacketWriterFactory;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.UnverifiedMessage;
 
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
+import javax.inject.Singleton;
 
 public class MessagingModule extends AbstractModule {
 
@@ -47,7 +47,7 @@ public class MessagingModule extends AbstractModule {
 	ObjectReader<UnverifiedMessage> getMessageReader(
 			ObjectReader<Group> groupReader,
 			ObjectReader<Author> authorReader) {
-		return new MessageReader(groupReader, authorReader);
+		return new org.briarproject.sync.MessageReader(groupReader, authorReader);
 	}
 
 	@Provides
diff --git a/briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java b/briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java
similarity index 84%
rename from briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java
rename to briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java
index c7a31f6094..13c14244c0 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java
@@ -1,10 +1,4 @@
-package org.briarproject.messaging;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.Executor;
-
-import javax.inject.Inject;
+package org.briarproject.sync;
 
 import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
@@ -12,15 +6,21 @@ import org.briarproject.api.crypto.CryptoExecutor;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.event.EventBus;
-import org.briarproject.api.messaging.MessageVerifier;
-import org.briarproject.api.messaging.MessagingSession;
-import org.briarproject.api.messaging.MessagingSessionFactory;
-import org.briarproject.api.messaging.PacketReader;
-import org.briarproject.api.messaging.PacketReaderFactory;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.PacketWriterFactory;
+import org.briarproject.api.sync.MessageVerifier;
+import org.briarproject.api.sync.MessagingSession;
+import org.briarproject.api.sync.MessagingSessionFactory;
+import org.briarproject.api.sync.PacketReader;
+import org.briarproject.api.sync.PacketReaderFactory;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.PacketWriterFactory;
 import org.briarproject.api.system.Clock;
 
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.Executor;
+
+import javax.inject.Inject;
+
 class MessagingSessionFactoryImpl implements MessagingSessionFactory {
 
 	private final DatabaseComponent db;
diff --git a/briar-core/src/org/briarproject/messaging/PacketReaderFactoryImpl.java b/briar-core/src/org/briarproject/sync/PacketReaderFactoryImpl.java
similarity index 76%
rename from briar-core/src/org/briarproject/messaging/PacketReaderFactoryImpl.java
rename to briar-core/src/org/briarproject/sync/PacketReaderFactoryImpl.java
index 1bca8fcee6..19766e31a2 100644
--- a/briar-core/src/org/briarproject/messaging/PacketReaderFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/PacketReaderFactoryImpl.java
@@ -1,16 +1,16 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
+
+import org.briarproject.api.data.ObjectReader;
+import org.briarproject.api.data.ReaderFactory;
+import org.briarproject.api.sync.PacketReader;
+import org.briarproject.api.sync.PacketReaderFactory;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.UnverifiedMessage;
 
 import java.io.InputStream;
 
 import javax.inject.Inject;
 
-import org.briarproject.api.data.ObjectReader;
-import org.briarproject.api.data.ReaderFactory;
-import org.briarproject.api.messaging.PacketReader;
-import org.briarproject.api.messaging.PacketReaderFactory;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.UnverifiedMessage;
-
 class PacketReaderFactoryImpl implements PacketReaderFactory {
 
 	private final ReaderFactory readerFactory;
diff --git a/briar-core/src/org/briarproject/messaging/PacketReaderImpl.java b/briar-core/src/org/briarproject/sync/PacketReaderImpl.java
similarity index 87%
rename from briar-core/src/org/briarproject/messaging/PacketReaderImpl.java
rename to briar-core/src/org/briarproject/sync/PacketReaderImpl.java
index a18b86e905..c5c8e5a09b 100644
--- a/briar-core/src/org/briarproject/messaging/PacketReaderImpl.java
+++ b/briar-core/src/org/briarproject/sync/PacketReaderImpl.java
@@ -1,21 +1,25 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
-import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT;
-import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTY_LENGTH;
-import static org.briarproject.api.TransportPropertyConstants.MAX_TRANSPORT_ID_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.HEADER_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.PROTOCOL_VERSION;
-import static org.briarproject.api.messaging.PacketTypes.ACK;
-import static org.briarproject.api.messaging.PacketTypes.MESSAGE;
-import static org.briarproject.api.messaging.PacketTypes.OFFER;
-import static org.briarproject.api.messaging.PacketTypes.REQUEST;
-import static org.briarproject.api.messaging.PacketTypes.RETENTION_ACK;
-import static org.briarproject.api.messaging.PacketTypes.RETENTION_UPDATE;
-import static org.briarproject.api.messaging.PacketTypes.SUBSCRIPTION_ACK;
-import static org.briarproject.api.messaging.PacketTypes.SUBSCRIPTION_UPDATE;
-import static org.briarproject.api.messaging.PacketTypes.TRANSPORT_ACK;
-import static org.briarproject.api.messaging.PacketTypes.TRANSPORT_UPDATE;
+import org.briarproject.api.FormatException;
+import org.briarproject.api.TransportId;
+import org.briarproject.api.TransportProperties;
+import org.briarproject.api.UniqueId;
+import org.briarproject.api.data.ObjectReader;
+import org.briarproject.api.data.Reader;
+import org.briarproject.api.data.ReaderFactory;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.PacketReader;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
+import org.briarproject.api.sync.UnverifiedMessage;
+import org.briarproject.util.ByteUtils;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -26,31 +30,27 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.briarproject.api.FormatException;
-import org.briarproject.api.TransportId;
-import org.briarproject.api.TransportProperties;
-import org.briarproject.api.UniqueId;
-import org.briarproject.api.data.ObjectReader;
-import org.briarproject.api.data.Reader;
-import org.briarproject.api.data.ReaderFactory;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.PacketReader;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
-import org.briarproject.api.messaging.UnverifiedMessage;
-import org.briarproject.util.ByteUtils;
+import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT;
+import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTY_LENGTH;
+import static org.briarproject.api.TransportPropertyConstants.MAX_TRANSPORT_ID_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.HEADER_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.PROTOCOL_VERSION;
+import static org.briarproject.api.sync.PacketTypes.ACK;
+import static org.briarproject.api.sync.PacketTypes.MESSAGE;
+import static org.briarproject.api.sync.PacketTypes.OFFER;
+import static org.briarproject.api.sync.PacketTypes.REQUEST;
+import static org.briarproject.api.sync.PacketTypes.RETENTION_ACK;
+import static org.briarproject.api.sync.PacketTypes.RETENTION_UPDATE;
+import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_ACK;
+import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_UPDATE;
+import static org.briarproject.api.sync.PacketTypes.TRANSPORT_ACK;
+import static org.briarproject.api.sync.PacketTypes.TRANSPORT_UPDATE;
 
 // This class is not thread-safe
 class PacketReaderImpl implements PacketReader {
 
-	private enum State { BUFFER_EMPTY, BUFFER_FULL, EOF };
+	private enum State { BUFFER_EMPTY, BUFFER_FULL, EOF }
 
 	private final ReaderFactory readerFactory;
 	private final ObjectReader<UnverifiedMessage> messageReader;
diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java b/briar-core/src/org/briarproject/sync/PacketWriterFactoryImpl.java
similarity index 75%
rename from briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
rename to briar-core/src/org/briarproject/sync/PacketWriterFactoryImpl.java
index e3d7717741..4925e0eb2f 100644
--- a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/PacketWriterFactoryImpl.java
@@ -1,13 +1,13 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
+
+import org.briarproject.api.data.WriterFactory;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.PacketWriterFactory;
 
 import java.io.OutputStream;
 
 import javax.inject.Inject;
 
-import org.briarproject.api.data.WriterFactory;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.PacketWriterFactory;
-
 class PacketWriterFactoryImpl implements PacketWriterFactory {
 
 	private final WriterFactory writerFactory;
diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java b/briar-core/src/org/briarproject/sync/PacketWriterImpl.java
similarity index 75%
rename from briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
rename to briar-core/src/org/briarproject/sync/PacketWriterImpl.java
index ced4d41791..62263d181e 100644
--- a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
+++ b/briar-core/src/org/briarproject/sync/PacketWriterImpl.java
@@ -1,41 +1,41 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
-import static org.briarproject.api.data.DataConstants.LIST_END_LENGTH;
-import static org.briarproject.api.data.DataConstants.LIST_START_LENGTH;
-import static org.briarproject.api.data.DataConstants.UNIQUE_ID_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.HEADER_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.PROTOCOL_VERSION;
-import static org.briarproject.api.messaging.PacketTypes.ACK;
-import static org.briarproject.api.messaging.PacketTypes.OFFER;
-import static org.briarproject.api.messaging.PacketTypes.REQUEST;
-import static org.briarproject.api.messaging.PacketTypes.RETENTION_ACK;
-import static org.briarproject.api.messaging.PacketTypes.RETENTION_UPDATE;
-import static org.briarproject.api.messaging.PacketTypes.SUBSCRIPTION_ACK;
-import static org.briarproject.api.messaging.PacketTypes.SUBSCRIPTION_UPDATE;
-import static org.briarproject.api.messaging.PacketTypes.TRANSPORT_ACK;
-import static org.briarproject.api.messaging.PacketTypes.TRANSPORT_UPDATE;
+import org.briarproject.api.data.Writer;
+import org.briarproject.api.data.WriterFactory;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.PacketTypes;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
+import org.briarproject.util.ByteUtils;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
-import org.briarproject.api.data.Writer;
-import org.briarproject.api.data.WriterFactory;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.PacketTypes;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
-import org.briarproject.util.ByteUtils;
+import static org.briarproject.api.data.DataConstants.LIST_END_LENGTH;
+import static org.briarproject.api.data.DataConstants.LIST_START_LENGTH;
+import static org.briarproject.api.data.DataConstants.UNIQUE_ID_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.HEADER_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.PROTOCOL_VERSION;
+import static org.briarproject.api.sync.PacketTypes.ACK;
+import static org.briarproject.api.sync.PacketTypes.OFFER;
+import static org.briarproject.api.sync.PacketTypes.REQUEST;
+import static org.briarproject.api.sync.PacketTypes.RETENTION_ACK;
+import static org.briarproject.api.sync.PacketTypes.RETENTION_UPDATE;
+import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_ACK;
+import static org.briarproject.api.sync.PacketTypes.SUBSCRIPTION_UPDATE;
+import static org.briarproject.api.sync.PacketTypes.TRANSPORT_ACK;
+import static org.briarproject.api.sync.PacketTypes.TRANSPORT_UPDATE;
 
 // This class is not thread-safe
 class PacketWriterImpl implements PacketWriter {
diff --git a/briar-core/src/org/briarproject/messaging/SigningConsumer.java b/briar-core/src/org/briarproject/sync/SigningConsumer.java
similarity index 92%
rename from briar-core/src/org/briarproject/messaging/SigningConsumer.java
rename to briar-core/src/org/briarproject/sync/SigningConsumer.java
index 137cd8c614..4947cd6591 100644
--- a/briar-core/src/org/briarproject/messaging/SigningConsumer.java
+++ b/briar-core/src/org/briarproject/sync/SigningConsumer.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import org.briarproject.api.crypto.Signature;
 import org.briarproject.api.data.Consumer;
diff --git a/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java b/briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java
similarity index 94%
rename from briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java
rename to briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java
index e77c3308d0..b82ff02012 100644
--- a/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java
@@ -1,16 +1,4 @@
-package org.briarproject.messaging;
-
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Logger;
+package org.briarproject.sync;
 
 import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
@@ -22,18 +10,30 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.MessagingSession;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.MessagingSession;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Logger;
+
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
 
 /**
- * An outgoing {@link org.briarproject.api.messaging.MessagingSession
+ * An outgoing {@link MessagingSession
  * MessagingSession} suitable for simplex transports. The session sends
  * messages without offering them, and closes its output stream when there are
  * no more packets to send.
diff --git a/briar-core/src/org/briarproject/messaging/SubscriptionUpdateReader.java b/briar-core/src/org/briarproject/sync/SubscriptionUpdateReader.java
similarity index 81%
rename from briar-core/src/org/briarproject/messaging/SubscriptionUpdateReader.java
rename to briar-core/src/org/briarproject/sync/SubscriptionUpdateReader.java
index 0632ada965..3b6b0594d4 100644
--- a/briar-core/src/org/briarproject/messaging/SubscriptionUpdateReader.java
+++ b/briar-core/src/org/briarproject/sync/SubscriptionUpdateReader.java
@@ -1,7 +1,12 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_SUBSCRIPTIONS;
+import org.briarproject.api.FormatException;
+import org.briarproject.api.data.Consumer;
+import org.briarproject.api.data.ObjectReader;
+import org.briarproject.api.data.Reader;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.SubscriptionUpdate;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -10,13 +15,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.briarproject.api.FormatException;
-import org.briarproject.api.data.Consumer;
-import org.briarproject.api.data.ObjectReader;
-import org.briarproject.api.data.Reader;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.SubscriptionUpdate;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_SUBSCRIPTIONS;
 
 class SubscriptionUpdateReader implements ObjectReader<SubscriptionUpdate> {
 
diff --git a/briar-core/src/org/briarproject/sync/ThrowingRunnable.java b/briar-core/src/org/briarproject/sync/ThrowingRunnable.java
new file mode 100644
index 0000000000..5532a8fc0f
--- /dev/null
+++ b/briar-core/src/org/briarproject/sync/ThrowingRunnable.java
@@ -0,0 +1,6 @@
+package org.briarproject.sync;
+
+interface ThrowingRunnable<T extends Throwable> {
+
+	void run() throws T;
+}
diff --git a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
index 07405398bf..e449d1e480 100644
--- a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
@@ -11,22 +11,22 @@ import org.briarproject.api.TransportProperties;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.SecretKey;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.MessageVerifier;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.PacketReader;
-import org.briarproject.api.messaging.PacketReaderFactory;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.PacketWriterFactory;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportUpdate;
-import org.briarproject.api.messaging.UnverifiedMessage;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.MessageVerifier;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.PacketReader;
+import org.briarproject.api.sync.PacketReaderFactory;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.PacketWriterFactory;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportUpdate;
+import org.briarproject.api.sync.UnverifiedMessage;
 import org.briarproject.api.transport.StreamContext;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
@@ -34,7 +34,7 @@ import org.briarproject.crypto.CryptoModule;
 import org.briarproject.data.DataModule;
 import org.briarproject.db.DatabaseModule;
 import org.briarproject.event.EventModule;
-import org.briarproject.messaging.MessagingModule;
+import org.briarproject.sync.MessagingModule;
 import org.briarproject.transport.TransportModule;
 import org.junit.Test;
 
diff --git a/briar-tests/src/org/briarproject/TestMessage.java b/briar-tests/src/org/briarproject/TestMessage.java
index 4249a809f4..bea7d78e83 100644
--- a/briar-tests/src/org/briarproject/TestMessage.java
+++ b/briar-tests/src/org/briarproject/TestMessage.java
@@ -1,9 +1,9 @@
 package org.briarproject;
 
 import org.briarproject.api.Author;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentTest.java
index 0c4c69792d..01dd33cb9f 100644
--- a/briar-tests/src/org/briarproject/db/DatabaseComponentTest.java
+++ b/briar-tests/src/org/briarproject/db/DatabaseComponentTest.java
@@ -33,19 +33,19 @@ import org.briarproject.api.event.MessagesSentEvent;
 import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
 import org.briarproject.api.lifecycle.ShutdownManager;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.RetentionAck;
-import org.briarproject.api.messaging.RetentionUpdate;
-import org.briarproject.api.messaging.SubscriptionAck;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportAck;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.RetentionAck;
+import org.briarproject.api.sync.RetentionUpdate;
+import org.briarproject.api.sync.SubscriptionAck;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportAck;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.api.transport.IncomingKeys;
 import org.briarproject.api.transport.OutgoingKeys;
 import org.briarproject.api.transport.TransportKeys;
@@ -58,7 +58,7 @@ import java.util.Collection;
 import java.util.Collections;
 
 import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.GROUP_SALT_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.GROUP_SALT_LENGTH;
 import static org.briarproject.db.DatabaseConstants.MAX_OFFERED_MESSAGES;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -335,137 +335,187 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		try {
 			db.addTransportKeys(contactId, createTransportKeys());
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateAck(contactId, 123);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateBatch(contactId, 123, 456);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateOffer(contactId, 123, 456);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateRetentionAck(contactId);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateRetentionUpdate(contactId, 123);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateSubscriptionAck(contactId);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateSubscriptionUpdate(contactId, 123);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateTransportAcks(contactId);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.generateTransportUpdates(contactId, 123);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.getContact(contactId);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.getInboxGroupId(contactId);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.incrementStreamCounter(contactId, transportId, 0);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			Ack a = new Ack(Collections.singletonList(messageId));
 			db.receiveAck(contactId, a);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.receiveMessage(contactId, message);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			Offer o = new Offer(Collections.singletonList(messageId));
 			db.receiveOffer(contactId, o);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			RetentionAck a = new RetentionAck(0);
 			db.receiveRetentionAck(contactId, a);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			RetentionUpdate u = new RetentionUpdate(0, 1);
 			db.receiveRetentionUpdate(contactId, u);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			SubscriptionAck a = new SubscriptionAck(0);
 			db.receiveSubscriptionAck(contactId, a);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			SubscriptionUpdate u = new SubscriptionUpdate(
 					Collections.<Group>emptyList(), 1);
 			db.receiveSubscriptionUpdate(contactId, u);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			TransportAck a = new TransportAck(transportId, 0);
 			db.receiveTransportAck(contactId, a);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			TransportUpdate u = new TransportUpdate(transportId,
 					transportProperties, 1);
 			db.receiveTransportUpdate(contactId, u);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.removeContact(contactId);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.setReorderingWindow(contactId, transportId, 0, 0, new byte[4]);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		try {
 			db.setInboxGroup(contactId, group);
 			fail();
-		} catch (NoSuchContactException expected) {}
+		} catch (NoSuchContactException expected) {
+			// Expected
+		}
 
 		context.assertIsSatisfied();
 	}
@@ -496,17 +546,23 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		try {
 			db.addContact(author, localAuthorId);
 			fail();
-		} catch (NoSuchLocalAuthorException expected) {}
+		} catch (NoSuchLocalAuthorException expected) {
+			// Expected
+		}
 
 		try {
 			db.getLocalAuthor(localAuthorId);
 			fail();
-		} catch (NoSuchLocalAuthorException expected) {}
+		} catch (NoSuchLocalAuthorException expected) {
+			// Expected
+		}
 
 		try {
 			db.removeLocalAuthor(localAuthorId);
 			fail();
-		} catch (NoSuchLocalAuthorException expected) {}
+		} catch (NoSuchLocalAuthorException expected) {
+			// Expected
+		}
 
 		context.assertIsSatisfied();
 	}
@@ -534,27 +590,37 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		try {
 			db.getGroup(groupId);
 			fail();
-		} catch (NoSuchSubscriptionException expected) {}
+		} catch (NoSuchSubscriptionException expected) {
+			// Expected
+		}
 
 		try {
 			db.getMessageHeaders(groupId);
 			fail();
-		} catch (NoSuchSubscriptionException expected) {}
+		} catch (NoSuchSubscriptionException expected) {
+			// Expected
+		}
 
 		try {
 			db.getVisibility(groupId);
 			fail();
-		} catch (NoSuchSubscriptionException expected) {}
+		} catch (NoSuchSubscriptionException expected) {
+			// Expected
+		}
 
 		try {
 			db.removeGroup(group);
 			fail();
-		} catch (NoSuchSubscriptionException expected) {}
+		} catch (NoSuchSubscriptionException expected) {
+			// Expected
+		}
 
 		try {
 			db.setVisibility(groupId, Collections.<ContactId>emptyList());
 			fail();
-		} catch (NoSuchSubscriptionException expected) {}
+		} catch (NoSuchSubscriptionException expected) {
+			// Expected
+		}
 
 		context.assertIsSatisfied();
 	}
@@ -606,42 +672,58 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		try {
 			db.getConfig(transportId);
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.getLocalProperties(transportId);
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.getTransportKeys(transportId);
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.mergeConfig(transportId, new TransportConfig());
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.mergeLocalProperties(transportId, new TransportProperties());
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.incrementStreamCounter(contactId, transportId, 0);
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.removeTransport(transportId);
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		try {
 			db.setReorderingWindow(contactId, transportId, 0, 0, new byte[4]);
 			fail();
-		} catch (NoSuchTransportException expected) {}
+		} catch (NoSuchTransportException expected) {
+			// Expected
+		}
 
 		context.assertIsSatisfied();
 	}
diff --git a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
index d771973a73..4c0b0b6e2e 100644
--- a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
+++ b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
@@ -14,10 +14,10 @@ import org.briarproject.api.TransportProperties;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageId;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupId;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.api.transport.IncomingKeys;
 import org.briarproject.api.transport.OutgoingKeys;
 import org.briarproject.api.transport.TransportKeys;
@@ -44,7 +44,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 import static org.briarproject.api.db.MessageHeader.State.STORED;
-import static org.briarproject.api.messaging.MessagingConstants.GROUP_SALT_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.GROUP_SALT_LENGTH;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java b/briar-tests/src/org/briarproject/sync/ConstantsTest.java
similarity index 88%
rename from briar-tests/src/org/briarproject/messaging/ConstantsTest.java
rename to briar-tests/src/org/briarproject/sync/ConstantsTest.java
index a96bdaee4c..6a935970e8 100644
--- a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
+++ b/briar-tests/src/org/briarproject/sync/ConstantsTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -17,18 +17,18 @@ import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.PrivateKey;
 import org.briarproject.api.crypto.Signature;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.Offer;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.PacketWriterFactory;
-import org.briarproject.api.messaging.Request;
-import org.briarproject.api.messaging.SubscriptionUpdate;
-import org.briarproject.api.messaging.TransportUpdate;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.Offer;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.PacketWriterFactory;
+import org.briarproject.api.sync.Request;
+import org.briarproject.api.sync.SubscriptionUpdate;
+import org.briarproject.api.sync.TransportUpdate;
 import org.briarproject.crypto.CryptoModule;
 import org.briarproject.data.DataModule;
 import org.briarproject.db.DatabaseModule;
@@ -46,11 +46,11 @@ import static org.briarproject.api.AuthorConstants.MAX_SIGNATURE_LENGTH;
 import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT;
 import static org.briarproject.api.TransportPropertyConstants.MAX_PROPERTY_LENGTH;
 import static org.briarproject.api.TransportPropertyConstants.MAX_TRANSPORT_ID_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_GROUP_NAME_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_SUBSCRIPTIONS;
+import static org.briarproject.api.sync.MessagingConstants.MAX_BODY_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_CONTENT_TYPE_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_GROUP_NAME_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_SUBSCRIPTIONS;
 import static org.junit.Assert.assertTrue;
 
 public class ConstantsTest extends BriarTestCase {
@@ -65,7 +65,7 @@ public class ConstantsTest extends BriarTestCase {
 		Injector i = Guice.createInjector(new TestDatabaseModule(),
 				new TestLifecycleModule(), new TestSystemModule(),
 				new CryptoModule(), new DatabaseModule(), new EventModule(),
-				new MessagingModule(), new DataModule());
+				new org.briarproject.sync.MessagingModule(), new DataModule());
 		crypto = i.getInstance(CryptoComponent.class);
 		groupFactory = i.getInstance(GroupFactory.class);
 		authorFactory = i.getInstance(AuthorFactory.class);
diff --git a/briar-tests/src/org/briarproject/messaging/ConsumersTest.java b/briar-tests/src/org/briarproject/sync/ConsumersTest.java
similarity index 86%
rename from briar-tests/src/org/briarproject/messaging/ConsumersTest.java
rename to briar-tests/src/org/briarproject/sync/ConsumersTest.java
index cdcb406c17..a9d4ed67ba 100644
--- a/briar-tests/src/org/briarproject/messaging/ConsumersTest.java
+++ b/briar-tests/src/org/briarproject/sync/ConsumersTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import org.briarproject.BriarTestCase;
 import org.briarproject.api.FormatException;
@@ -23,7 +23,8 @@ public class ConsumersTest extends BriarTestCase {
 		messageDigest.update(data);
 		byte[] dig = messageDigest.digest();
 		// Check that feeding a DigestingConsumer generates the same digest
-		DigestingConsumer dc = new DigestingConsumer(messageDigest);
+		org.briarproject.sync.DigestingConsumer
+				dc = new org.briarproject.sync.DigestingConsumer(messageDigest);
 		dc.write(data[0]);
 		dc.write(data, 1, data.length - 2);
 		dc.write(data[data.length - 1]);
@@ -34,7 +35,8 @@ public class ConsumersTest extends BriarTestCase {
 	@Test
 	public void testCountingConsumer() throws Exception {
 		byte[] data = new byte[1234];
-		CountingConsumer cc = new CountingConsumer(data.length);
+		org.briarproject.sync.CountingConsumer
+				cc = new org.briarproject.sync.CountingConsumer(data.length);
 		cc.write(data[0]);
 		cc.write(data, 1, data.length - 2);
 		cc.write(data[data.length - 1]);
@@ -42,7 +44,9 @@ public class ConsumersTest extends BriarTestCase {
 		try {
 			cc.write((byte) 0);
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	@Test
@@ -50,7 +54,8 @@ public class ConsumersTest extends BriarTestCase {
 		byte[] data = new byte[1234];
 		new Random().nextBytes(data);
 		// Check that a CopyingConsumer creates a faithful copy
-		CopyingConsumer cc = new CopyingConsumer();
+		org.briarproject.sync.CopyingConsumer
+				cc = new org.briarproject.sync.CopyingConsumer();
 		cc.write(data[0]);
 		cc.write(data, 1, data.length - 2);
 		cc.write(data[data.length - 1]);
diff --git a/briar-tests/src/org/briarproject/messaging/PacketReaderImplTest.java b/briar-tests/src/org/briarproject/sync/PacketReaderImplTest.java
similarity index 78%
rename from briar-tests/src/org/briarproject/messaging/PacketReaderImplTest.java
rename to briar-tests/src/org/briarproject/sync/PacketReaderImplTest.java
index 3850d0494c..f75550fdf1 100644
--- a/briar-tests/src/org/briarproject/messaging/PacketReaderImplTest.java
+++ b/briar-tests/src/org/briarproject/sync/PacketReaderImplTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -18,11 +18,11 @@ import java.io.ByteArrayOutputStream;
 
 import static org.briarproject.api.data.DataConstants.LIST_END_LENGTH;
 import static org.briarproject.api.data.DataConstants.UNIQUE_ID_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.HEADER_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.MAX_PAYLOAD_LENGTH;
-import static org.briarproject.api.messaging.PacketTypes.ACK;
-import static org.briarproject.api.messaging.PacketTypes.OFFER;
-import static org.briarproject.api.messaging.PacketTypes.REQUEST;
+import static org.briarproject.api.sync.MessagingConstants.HEADER_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.MAX_PAYLOAD_LENGTH;
+import static org.briarproject.api.sync.PacketTypes.ACK;
+import static org.briarproject.api.sync.PacketTypes.OFFER;
+import static org.briarproject.api.sync.PacketTypes.REQUEST;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -43,19 +43,23 @@ public class PacketReaderImplTest extends BriarTestCase {
 	public void testFormatExceptionIfAckIsTooLarge() throws Exception {
 		byte[] b = createAck(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readAck();
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	@Test
 	public void testNoFormatExceptionIfAckIsMaximumSize() throws Exception {
 		byte[] b = createAck(false);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		reader.readAck();
 	}
@@ -64,31 +68,38 @@ public class PacketReaderImplTest extends BriarTestCase {
 	public void testEmptyAck() throws Exception {
 		byte[] b = createEmptyAck();
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readAck();
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	@Test
 	public void testFormatExceptionIfOfferIsTooLarge() throws Exception {
 		byte[] b = createOffer(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readOffer();
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	@Test
 	public void testNoFormatExceptionIfOfferIsMaximumSize() throws Exception {
 		byte[] b = createOffer(false);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		reader.readOffer();
 	}
@@ -97,31 +108,38 @@ public class PacketReaderImplTest extends BriarTestCase {
 	public void testEmptyOffer() throws Exception {
 		byte[] b = createEmptyOffer();
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readOffer();
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	@Test
 	public void testFormatExceptionIfRequestIsTooLarge() throws Exception {
 		byte[] b = createRequest(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readRequest();
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	@Test
 	public void testNoFormatExceptionIfRequestIsMaximumSize() throws Exception {
 		byte[] b = createRequest(false);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		reader.readRequest();
 	}
@@ -130,12 +148,15 @@ public class PacketReaderImplTest extends BriarTestCase {
 	public void testEmptyRequest() throws Exception {
 		byte[] b = createEmptyRequest();
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
+		org.briarproject.sync.PacketReaderImpl
+				reader = new org.briarproject.sync.PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readRequest();
 			fail();
-		} catch (FormatException expected) {}
+		} catch (FormatException expected) {
+			// Expected
+		}
 	}
 
 	private byte[] createAck(boolean tooBig) throws Exception {
diff --git a/briar-tests/src/org/briarproject/messaging/SimplexMessagingIntegrationTest.java b/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java
similarity index 91%
rename from briar-tests/src/org/briarproject/messaging/SimplexMessagingIntegrationTest.java
rename to briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java
index 5aad3b5c08..9c0308b7b6 100644
--- a/briar-tests/src/org/briarproject/messaging/SimplexMessagingIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -20,16 +20,16 @@ import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
-import org.briarproject.api.messaging.Group;
-import org.briarproject.api.messaging.GroupFactory;
-import org.briarproject.api.messaging.Message;
-import org.briarproject.api.messaging.MessageFactory;
-import org.briarproject.api.messaging.MessageVerifier;
-import org.briarproject.api.messaging.MessagingSession;
-import org.briarproject.api.messaging.PacketReader;
-import org.briarproject.api.messaging.PacketReaderFactory;
-import org.briarproject.api.messaging.PacketWriter;
-import org.briarproject.api.messaging.PacketWriterFactory;
+import org.briarproject.api.sync.Group;
+import org.briarproject.api.sync.GroupFactory;
+import org.briarproject.api.sync.Message;
+import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.api.sync.MessageVerifier;
+import org.briarproject.api.sync.MessagingSession;
+import org.briarproject.api.sync.PacketReader;
+import org.briarproject.api.sync.PacketReaderFactory;
+import org.briarproject.api.sync.PacketWriter;
+import org.briarproject.api.sync.PacketWriterFactory;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamContext;
 import org.briarproject.api.transport.StreamReaderFactory;
@@ -53,7 +53,7 @@ import java.io.OutputStream;
 import java.util.Collections;
 
 import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
-import static org.briarproject.api.messaging.MessagingConstants.GROUP_SALT_LENGTH;
+import static org.briarproject.api.sync.MessagingConstants.GROUP_SALT_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE;
 import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH;
 import static org.junit.Assert.assertEquals;
@@ -87,7 +87,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		return Guice.createInjector(new TestDatabaseModule(dir),
 				new TestLifecycleModule(), new TestSystemModule(),
 				new CryptoModule(), new DatabaseModule(), new EventModule(),
-				new MessagingModule(), new DataModule(),
+				new org.briarproject.sync.MessagingModule(), new DataModule(),
 				new TransportModule());
 	}
 
@@ -149,7 +149,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 				alice.getInstance(PacketWriterFactory.class);
 		PacketWriter packetWriter = packetWriterFactory.createPacketWriter(
 				streamWriter);
-		MessagingSession session = new SimplexOutgoingSession(db,
+		MessagingSession session = new org.briarproject.sync.SimplexOutgoingSession(db,
 				new ImmediateExecutor(), eventBus, contactId, transportId,
 				MAX_LATENCY, packetWriter);
 		// Write whatever needs to be written
@@ -216,7 +216,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 				bob.getInstance(PacketReaderFactory.class);
 		PacketReader packetReader = packetReaderFactory.createPacketReader(
 				streamReader);
-		MessagingSession session = new IncomingSession(db,
+		MessagingSession session = new org.briarproject.sync.IncomingSession(db,
 				new ImmediateExecutor(), new ImmediateExecutor(), eventBus,
 				messageVerifier, contactId, transportId, packetReader);
 		// No messages should have been added yet
diff --git a/briar-tests/src/org/briarproject/messaging/SimplexOutgoingSessionTest.java b/briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java
similarity index 90%
rename from briar-tests/src/org/briarproject/messaging/SimplexOutgoingSessionTest.java
rename to briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java
index e618c3ec43..f3b27bf85b 100644
--- a/briar-tests/src/org/briarproject/messaging/SimplexOutgoingSessionTest.java
+++ b/briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.messaging;
+package org.briarproject.sync;
 
 import org.briarproject.BriarTestCase;
 import org.briarproject.TestUtils;
@@ -6,15 +6,16 @@ import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.event.EventBus;
-import org.briarproject.api.messaging.Ack;
-import org.briarproject.api.messaging.MessageId;
-import org.briarproject.api.messaging.PacketWriter;
+import org.briarproject.api.sync.Ack;
+import org.briarproject.api.sync.MessageId;
+import org.briarproject.api.sync.PacketWriter;
 import org.briarproject.plugins.ImmediateExecutor;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.concurrent.Executor;
 
 public class SimplexOutgoingSessionTest extends BriarTestCase {
@@ -45,7 +46,8 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
 
 	@Test
 	public void testNothingToSend() throws Exception {
-		final SimplexOutgoingSession session = new SimplexOutgoingSession(db,
+		final org.briarproject.sync.SimplexOutgoingSession
+				session = new org.briarproject.sync.SimplexOutgoingSession(db,
 				dbExecutor, eventBus, contactId, transportId, maxLatency,
 				packetWriter);
 		context.checking(new Expectations() {{
@@ -89,9 +91,10 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
 
 	@Test
 	public void testSomethingToSend() throws Exception {
-		final Ack ack = new Ack(Arrays.asList(messageId));
+		final Ack ack = new Ack(Collections.singletonList(messageId));
 		final byte[] raw = new byte[1234];
-		final SimplexOutgoingSession session = new SimplexOutgoingSession(db,
+		final org.briarproject.sync.SimplexOutgoingSession
+				session = new org.briarproject.sync.SimplexOutgoingSession(db,
 				dbExecutor, eventBus, contactId, transportId, maxLatency,
 				packetWriter);
 		context.checking(new Expectations() {{
-- 
GitLab