diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
index f5ba0b03dd04dad58717dc4e772a640063bbbbd7..2fbc137192e8dcdfc87a03d2ab52a8938e4888f4 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 11e8dcebaa156dec816adc693595754b14151d45..35db05931a56f9397735acbea5e42128088dbc72 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 630c4dec9915fb2a5447f742d662298e337c8adc..02a244c23ca8cece8ea00256a670315e3e43de7d 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;
@@ -28,7 +28,6 @@ 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.db.MessageHeader;
 import org.briarproject.api.db.NoSuchContactException;
 import org.briarproject.api.event.ContactAddedEvent;
 import org.briarproject.api.event.ContactConnectedEvent;
@@ -39,26 +38,27 @@ 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 org.briarproject.api.sync.MessageHeader;
 
-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 276ae9178f85f4736383d199b302e3e014b5faca..0e2cca813d495816a75d432d4f9c66f4746f7636 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 org.briarproject.api.sync.MessageHeader;
+
+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 7023da46e6936e2d6438270c236ab40174bb16e1..fc4fcb4d9a73423b0f317b889d62586d34b2f548 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -26,8 +26,6 @@ import org.briarproject.api.android.AndroidNotificationManager;
 import org.briarproject.api.crypto.CryptoExecutor;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.db.MessageHeader.State;
 import org.briarproject.api.db.NoSuchContactException;
 import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
@@ -41,12 +39,14 @@ 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.plugins.ConnectionRegistry;
+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.MessageHeader;
+import org.briarproject.api.sync.MessageHeader.State;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
 
 import java.io.IOException;
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index f78f4bb682d100ed3259b623257554101f1704f4..240bdea4dd32bc0b08eb76c847ed9f3b95e25588 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -1,21 +1,5 @@
 package org.briarproject.android.contact;
 
-import static android.view.Gravity.BOTTOM;
-import static android.view.Gravity.LEFT;
-import static android.view.View.INVISIBLE;
-import static android.widget.LinearLayout.HORIZONTAL;
-import static android.widget.LinearLayout.VERTICAL;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-
-import java.util.ArrayList;
-
-import org.briarproject.R;
-import org.briarproject.android.util.ElasticHorizontalSpace;
-import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.db.MessageHeader.State;
-import org.briarproject.util.StringUtils;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.text.format.DateUtils;
@@ -27,6 +11,21 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import org.briarproject.R;
+import org.briarproject.android.util.ElasticHorizontalSpace;
+import org.briarproject.android.util.LayoutUtils;
+import org.briarproject.api.sync.MessageHeader;
+import org.briarproject.api.sync.MessageHeader.State;
+import org.briarproject.util.StringUtils;
+
+import java.util.ArrayList;
+
+import static android.view.Gravity.BOTTOM;
+import static android.view.Gravity.LEFT;
+import static android.widget.LinearLayout.HORIZONTAL;
+import static android.widget.LinearLayout.VERTICAL;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
+
 class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 
 	private final int pad;
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
index ac5637e16400a26946fb9f3a72a67ce8b984d7a1..292bd4a713289d448e61582ef696bff8e10698b6 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
@@ -1,7 +1,7 @@
 package org.briarproject.android.contact;
 
-import org.briarproject.api.db.MessageHeader;
-import org.briarproject.api.db.MessageHeader.State;
+import org.briarproject.api.sync.MessageHeader;
+import org.briarproject.api.sync.MessageHeader.State;
 
 // This class is not thread-safe
 class ConversationItem {
diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
index abbbb5fe900aca6fba040c30f126f97140f79faf..c95324b793fe4fce5246b8f803d79944719ae595 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 b173983499c6c1b1b3f6a04c5c7b95ab5058669f..481f72fe69a2a720d37177e9f6f4e1197a58b1c1 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 1c9cb668997d98934101f329b5e3f09fc17fb687..8c3e1c8bf62a8c3c86030d34eb8c5ee92a77126d 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 1c46e66b5f54eea0b69b57d8403d6db38719ba92..c5e62e75ce9e54116d78c2c108e23e48245e17bc 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 c005104e685b0dfb9ed01da1a5fcd32211e1b0f0..d422684bb6d56043b8f3eb594837c7119fd2b2c4 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 8786ec401f27b924fab0fdbf7dd5b310a241a4c7..3c4b5a2674b142f8db42ce6a09959aed8668ed34 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -21,7 +21,6 @@ import org.briarproject.api.Author;
 import org.briarproject.api.android.AndroidNotificationManager;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.db.MessageHeader;
 import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
 import org.briarproject.api.event.Event;
@@ -30,9 +29,10 @@ 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.MessageHeader;
+import org.briarproject.api.sync.MessageId;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
index cc8db894db029791b93f35c204b8a053fef64041..8660f4381497c3663941b5b3930b2f292b2532cd 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
@@ -14,7 +14,7 @@ import org.briarproject.R;
 import org.briarproject.android.util.AuthorView;
 import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.Author;
-import org.briarproject.api.db.MessageHeader;
+import org.briarproject.api.sync.MessageHeader;
 import org.briarproject.util.StringUtils;
 
 import java.util.ArrayList;
diff --git a/briar-android/src/org/briarproject/android/forum/ForumContacts.java b/briar-android/src/org/briarproject/android/forum/ForumContacts.java
index daa01d7efe9d9707d8ea33a2858a336b7ad7ef44..f75c439455239f70c61c88267699f1ca6424ce06 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/ForumItem.java b/briar-android/src/org/briarproject/android/forum/ForumItem.java
index ca42d7e9a6f9df994c4c667906d9ffbe6d1a5398..ec87cbf0349ad53fbfd5d016b51187a60f544eaa 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumItem.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumItem.java
@@ -1,6 +1,6 @@
 package org.briarproject.android.forum;
 
-import org.briarproject.api.db.MessageHeader;
+import org.briarproject.api.sync.MessageHeader;
 
 // This class is not thread-safe
 class ForumItem {
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
index ee1c75584fdc6b0e76a7056841c755b2e208a99a..38f1d4356111c769c7de3762963b8d6582a1d760 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
@@ -25,7 +25,6 @@ import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.android.util.ListLoadingProgressBar;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.db.MessageHeader;
 import org.briarproject.api.db.NoSuchSubscriptionException;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
@@ -35,8 +34,9 @@ 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 org.briarproject.api.sync.MessageHeader;
 
 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 c20b91603fed1ba8bf0ed198875bdada8e47128a..3eef6c43618ac539375465903d101f0ee4c39154 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 org.briarproject.api.sync.MessageHeader;
 
 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 0318ecb24a64e9053a93d9b5cc3e2a9e04ce7f0c..dba39cca75a44bbd2ae61adbc312aaf8e29bf990 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 3f736c096b132dccdb6148e44c8952de14ca1505..a3f771edc83b1079a6ef896f5e160fbac0adbba0 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 6ae49b1faf1fa8bfe0d657c447732ed5e6d61b4b..4b8297a81737f408df2ade8b0d13a8d4dd908c6c 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 a824b1ca5ddf7711291ec26b15d2b18906a752c2..9c39fd75da6523d5e159a9ee3acc825a6ffe4627 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 530cffbb20eab558bda1112c4ae587d6507383f3..9aff24206c413deb01aa4c34f424048addd80444 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;
@@ -179,7 +179,7 @@ public interface DatabaseComponent {
 	 * Returns the headers of all messages in the inbox group for the given
 	 * contact, or null if no inbox group has been set.
 	 */
-	Collection<MessageHeader> getInboxMessageHeaders(ContactId c)
+	Collection<org.briarproject.api.sync.MessageHeader> getInboxMessageHeaders(ContactId c)
 			throws DbException;
 
 	/** Returns the local pseudonym with the given ID. */
@@ -199,7 +199,7 @@ public interface DatabaseComponent {
 	byte[] getMessageBody(MessageId m) throws DbException;
 
 	/** Returns the headers of all messages in the given group. */
-	Collection<MessageHeader> getMessageHeaders(GroupId g)
+	Collection<org.briarproject.api.sync.MessageHeader> getMessageHeaders(GroupId g)
 			throws DbException;
 
 	/** Returns true if the given message is marked as read. */
diff --git a/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java b/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
index 333293f22386deadf30bec45627159f8fd6fd944..8c6664d1c4386c8412a5215e8346fedc189cb9ce 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 cb7676455988d5a17395c8d591e7a3b5d8aeed6a..ab99b37b001c1f07ead7c0de3ed27ce235de0aad 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 a70b7a872d4160bb5ad3a32fbe96788b0fc4e6ca..0c9f700e6f9aeedc7b85cb8705e1dd10585396c2 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 c59e9cd3d6ecdabbb07176a339488669927f3aa0..a9065b28b29184ac2e314414eb47e82aa22f3949 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 8a3d0dabdfed876dd472aa0264e4333a41d448ab..a8e7524571643bd6364916f12dab5626c7e66db8 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 1300e84c5b7730eb3f2088bf308e6dfcb561b0cd..0000000000000000000000000000000000000000
--- 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 eae1e39283047d2c4bfe30488c924bdfe4546d0d..0000000000000000000000000000000000000000
--- 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 485c17b8169ca76a267b3aa827771549b62f8f69..70417fc1617c39dfba5076426af1193c7e8cb28e 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 90e6953874a6811670cfb3a34578c810a55acb48..c10accdb8491fcc77ee186f2a991a76a07232478 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 f1ec1183a93019fb67ef08588943cfbf096296d5..2850bec19cce6ec438ad3aa6b50c308b59be1272 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 7732774e43312e95f4b85aa92c04e3b90abc562f..dc5a4b9239cfee5c344196a04e8a335df9186bbf 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 dd6291e55e82565e739422d15ec8dc1bae44cd87..a8245f13fed2a76e9318198925d290b0ac6c9a98 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 7e06f0d0b7d38863d26d2bc474e3fb9958ed2217..63012b3bc429fd345d419c0400bb3839000e4089 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/db/MessageHeader.java b/briar-api/src/org/briarproject/api/sync/MessageHeader.java
similarity index 91%
rename from briar-api/src/org/briarproject/api/db/MessageHeader.java
rename to briar-api/src/org/briarproject/api/sync/MessageHeader.java
index c500971eb145cc0a5a8c27f0a8a0acfcfdce0d5d..e70e1fef16cc9faff5f47d5c2584c78d45611247 100644
--- a/briar-api/src/org/briarproject/api/db/MessageHeader.java
+++ b/briar-api/src/org/briarproject/api/sync/MessageHeader.java
@@ -1,12 +1,10 @@
-package org.briarproject.api.db;
+package org.briarproject.api.sync;
 
 import org.briarproject.api.Author;
-import org.briarproject.api.messaging.GroupId;
-import org.briarproject.api.messaging.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/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 a2a79c43deb98f921fa67f0c0a1634bd183f4946..472caec3fbe343c70402d75257592d8b191d809e 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 6ac3d277bdc4ec97bf8c8821b634f66977b0a662..87ee02be696103372689cc05758aa0bcaeece0ed 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 fefe79a3ba996414a5a85340bfca18447a16b612..5353f442f7365583b2b2ede9004a3cbaf92e2e47 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 c4d8d398908e608bef5fd0ceb90e5344033d8aec..17009b964497636d2c45a1e652acbe2f19886fdf 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 8764f3e255bb0ed10e8a676b9887dfd63172b22d..0cae83d8902c576f0ea595d1d30106d4be419070 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 8ab4a0dc175e920bf734f975050f94eb64500f2c..6611fda66b236c4312b8dc3e3c612e2062acdd41 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 d390bf2498b6376caa9c5bbf813232972b9b93d6..b6c6e61e0093af60cf0223eb929483ded8e5144e 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 3bede6db2a0721debe6d81583f8f3d41348c4693..5e48269d2ff636e6da6c77ffb02914c3008226d0 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 41c2eee6f7c7cc5d5c7b5b6102995208eb81c007..595135d12596b918f7f3cf5d24a32f5cfb6d640c 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 0000000000000000000000000000000000000000..3e43eeb48de2fde32b0cb4f9b4991e0208a69015
--- /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 5c1c5b4ec6a2e8848fb7aa88963a8f91bba04401..51befe31fe53715de89149f4e9260f5579254236 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 0000000000000000000000000000000000000000..3b562802dffbaae1756d8bbfdf3f5d27298f48a0
--- /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 9a538e65a74f6a96eed7b6dca8c880d03786ae23..5c36a943455f01ba35d395fae6f472a4dcad4093 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 4e8a59498013146adfcbcc0865e2d4a51f0df5e9..5955a3955a1b0c022e5272788dc0067d61bbee39 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 c304853858b37b69e623ad70512b4a5eedd407a8..b65ccf1c279116b8bc14aa7656265d8aa6436014 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 76f95ce097805175ad4df817608b6e0f73dfa2d9..0fabdf27836282b556aef156a22f3965f516f923 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 ce6ccd4fb0b55c52394f8daf6bd31fb8ba6dff15..160d24dfff062fe6fe838153c8596f35c7a21dee 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 78f2b5b1b7bf01be572448e6d2a3f130fb46d8bf..ea403ba342955f285b4d3baa49f12831de16a0d7 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 1438e288c60c582be55dd6379dd49e6b16e513a7..9f8baf59c60aa714336c9e71111493cc5415e5a0 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 9d3eda9bf891a361c08eb6ee2733b3b562765f4e..9e0e8045c3ecbd441d31bed8f2ace426248c55d9 100644
--- a/briar-core/src/org/briarproject/db/Database.java
+++ b/briar-core/src/org/briarproject/db/Database.java
@@ -10,17 +10,17 @@ import org.briarproject.api.TransportConfig;
 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.MessageHeader;
+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 4eafdfa5139ee1009b71e88ba3140b24c8cc5617..280dda05b9bc9e12cb648a08ad63fe0fe12ce1ea 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -13,7 +13,6 @@ import org.briarproject.api.db.ContactExistsException;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.LocalAuthorExistsException;
-import org.briarproject.api.db.MessageHeader;
 import org.briarproject.api.db.NoSuchContactException;
 import org.briarproject.api.db.NoSuchLocalAuthorException;
 import org.briarproject.api.db.NoSuchMessageException;
@@ -42,19 +41,20 @@ 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.MessageHeader;
+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 acecbf4fb79cee3234bb388e7af9d00db05c98a9..f51f4e192ecb4140b61db23dcf22a22758a73c2e 100644
--- a/briar-core/src/org/briarproject/db/JdbcDatabase.java
+++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java
@@ -12,18 +12,18 @@ import org.briarproject.api.TransportProperties;
 import org.briarproject.api.crypto.SecretKey;
 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.MessageHeader;
+import org.briarproject.api.sync.MessageHeader.State;
+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 f37357385c74f2c90967c0ef34bd50f28bb828ea..460feac2404a43233b6ec260483329762cefa610 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 845ee0df7ba724d8fa81191ee06baf2f0d232936..20c60061a07179dcfa4dcbff831311b8220103d7 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 d8c4e674fcc8df39a1eda267923f729161bb3491..47341606294bf41b63376d340397769b17c874e0 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 5861c07b005ced62980f51ec048125c95d534418..11c9855224b07eeb0ee17c22f4845fd2a8ecde37 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 97c65c0985a67b96a28a8753dab46717b87555dc..7438deccd747fd9fbb47f282b9eff1dd929da940 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 334581daac6631e0e3245299d2762cf359fecf60..0000000000000000000000000000000000000000
--- 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 5b1e32be1031afb730aa4be533898df0e816063f..20c7fb49de3626ba36c10dce136e327458c5ff39 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 14581372914ac7387c5c755731a7665546687257..c0cf59deb74097730571ce2f0c522a9728406f3f 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 3223b4ca20029709a060479b1c89c7f2b5acdf46..22aa7a5f1290c23e0ef62ccf0067ff5d6604127a 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 76bbd49adcf78999ac71950c01716ef6062f8de7..39ee00b25fe4a10962849c175ed1941fa62c1d8d 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 8b01aa06b21a716e36b25581155dd4a68b2f4381..63b2874e07e40ff3e98218706ab5f32c46951ef9 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 e9bb102eb0f0a10abd7078adcdb0168c539a28d4..ee217334e878dda00880a4421ce581668b710a1c 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 a2b1ff99f86c6cb8fe778ce2e096ff1c43dd8dc4..ad7cea37582f50d02ebbbe6aadad355a024ee5b6 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 37bee81a29643be5c9a52d4e5173edba9b5ad7c0..2b422b917c9947f2a74211fa89f2f20ecaa4aefc 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 6e6f5d3c83cd8af19827936f671d82d0a8de497e..9ee9fe1a0507e6aae30fc5fe080ca7c7968c7a40 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 a3c8d1cde265104fda18ba849bd36dffb602bf04..092cf507944b91f16b8e29a4f85a75e7420b1169 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 d584a9daf07fedef8f10b9c299c9a86df30ddf6a..9b7e4c4b7afeb90d286f6961275dedf94ca24862 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 32a2caeaf2618d62e44bfeb74f645f1237b33cba..761d2e9b6e06c921c6154648029f61ae2e532c1d 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 a415ce0c4cbb11e275b745379a7135c31fa9c14c..fc549af8312bfe7bc0cd201c05fc8b98a24ecdf3 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 4daa9066629006dd142f7c200cd69f924b660917..9c38f3b7b264d3b12d1003b9b1d355a94660fae4 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 1b58a8e57725588d33e5b32babf3a86fdbe05526..205ca471773f05930a39091b9dcf1b2cf1284454 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 c7a31f6094642f983c2549ff460b989c3579f6c5..13c14244c019d8d96969d829a15bafcbfa17570a 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 1bca8fcee6e5c313608cc2503673f8910be196e2..19766e31a2ea0c09deeb5d95c88466ff5dcff176 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 a18b86e9051295631b9982ff0f2cad8bc665ac57..c5c8e5a09b02f27091218121dd8ad323684324e3 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 e3d771774157f7c7c32289b3609c84ec1287aea2..4925e0eb2f5149cb418e7c9552043e459f139f3f 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 ced4d417910bc50c7c6003ca4d28a0e19f1d6a1b..62263d181e023d9f643db73b1fc520ab472060f1 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 137cd8c61498ab27a52f7a1573d15c3b688a8b07..4947cd659106c737b5bf889917cc3875379d8416 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 e77c3308d0e3435de50cac44d08d421e95ff043a..b82ff02012fcc9999d8e3d9aea9da6d1675d62a8 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 0632ada96530886a70cc5bf7e7089817360b6a80..3b6b0594d4ad9c8b85797b830336cd4b83f99627 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 0000000000000000000000000000000000000000..5532a8fc0facbdf393b240f2920087b8a8f46fbc
--- /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 07405398bff5990d3dcd7a9123997dd4e111fceb..e449d1e4809470349fef4575154d9ab9d8cf3167 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 4249a809f43af91a9a9d40d3fd29dc2b7da3c99c..bea7d78e832cfbebe4a89354cbc55a5935a7c498 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 0c4c69792d864061e8fb870f4d20120f2a3a0dfe..01dd33cb9f11297d1fb19196e0c2e2c1ab6b350c 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 d771973a73a25c83b81e12b86f6c99604ba3092b..686789f687f62e0089f88f0cd80db7dc0d7b9453 100644
--- a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
+++ b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
@@ -13,11 +13,11 @@ import org.briarproject.api.TransportId;
 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.MessageHeader;
+import org.briarproject.api.sync.MessageId;
 import org.briarproject.api.transport.IncomingKeys;
 import org.briarproject.api.transport.OutgoingKeys;
 import org.briarproject.api.transport.TransportKeys;
@@ -43,8 +43,8 @@ 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.MessageHeader.State.STORED;
+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 a96bdaee4c5bfbcdebafdd7780e85ed5f34b2e27..6a935970e87c66df94a4d81e1870e2e48a81cc91 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 cdcb406c17fc94c5804098167b525a9803286214..a9d4ed67ba770354205ce4a22b1ef677de7a6fb3 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 3850d0494cab1b0d13991d26bb4e1bbdac9e8f8c..f75550fdf15b613b4c2fb75e234137fa220e8c9d 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 5aad3b5c0899cb7bb0ceef8aa254f72c438cedc4..9c0308b7b669f7e295c9704da4a80d5b54049187 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 e618c3ec43dad73735ee8f32690602b4c8230b7d..f3b27bf85bd8bfce53d7811c4b818f19453e872e 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() {{