diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
index 2fbc137192e8dcdfc87a03d2ab52a8938e4888f4..ff2c852edf8d2e677ddb93ba68bfd6f3b6f1a90c 100644
--- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
+++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java
@@ -13,9 +13,9 @@ import org.briarproject.android.contact.ContactListActivity;
 import org.briarproject.android.contact.ConversationActivity;
 import org.briarproject.android.forum.ForumActivity;
 import org.briarproject.android.forum.ForumListActivity;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.Settings;
 import org.briarproject.api.android.AndroidNotificationManager;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java
index 35db05931a56f9397735acbea5e42128088dbc72..d93e7bcd375c461d6354a7053bfa419a8470f3ab 100644
--- a/briar-android/src/org/briarproject/android/BriarService.java
+++ b/briar-android/src/org/briarproject/android/BriarService.java
@@ -10,9 +10,9 @@ import android.os.IBinder;
 import android.support.v4.app.NotificationCompat;
 
 import org.briarproject.R;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.android.AndroidExecutor;
 import org.briarproject.api.android.AndroidNotificationManager;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DatabaseConfig;
 import org.briarproject.api.db.DatabaseExecutor;
diff --git a/briar-android/src/org/briarproject/android/DashboardActivity.java b/briar-android/src/org/briarproject/android/DashboardActivity.java
index 6e08cd217088694d4a43fed85eef12ea2d807b6a..94312d788ddfe59878af2cf5e31a27a918fd8d4d 100644
--- a/briar-android/src/org/briarproject/android/DashboardActivity.java
+++ b/briar-android/src/org/briarproject/android/DashboardActivity.java
@@ -21,7 +21,6 @@ import org.briarproject.R;
 import org.briarproject.android.contact.ContactListActivity;
 import org.briarproject.android.forum.ForumListActivity;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.android.ReferenceManager;
 import org.briarproject.api.db.DatabaseComponent;
@@ -31,6 +30,7 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.TransportDisabledEvent;
 import org.briarproject.api.event.TransportEnabledEvent;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.plugins.Plugin;
 import org.briarproject.api.plugins.PluginManager;
 
diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java
index 46778711ae4e32ab99b8689672c8b7b4998ebf4e..b22e771babe593d006c31ee5d6dc37221fdec6ef 100644
--- a/briar-android/src/org/briarproject/android/SetupActivity.java
+++ b/briar-android/src/org/briarproject/android/SetupActivity.java
@@ -1,5 +1,40 @@
 package org.briarproject.android;
 
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
+
+import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
+import org.briarproject.android.util.StrengthMeter;
+import org.briarproject.api.android.ReferenceManager;
+import org.briarproject.api.crypto.CryptoComponent;
+import org.briarproject.api.crypto.CryptoExecutor;
+import org.briarproject.api.crypto.KeyPair;
+import org.briarproject.api.crypto.PasswordStrengthEstimator;
+import org.briarproject.api.crypto.SecretKey;
+import org.briarproject.api.db.DatabaseConfig;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.LocalAuthor;
+import org.briarproject.util.StringUtils;
+
+import java.util.concurrent.Executor;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.text.InputType.TYPE_CLASS_TEXT;
 import static android.text.InputType.TYPE_TEXT_FLAG_CAP_WORDS;
@@ -16,44 +51,8 @@ import static java.util.logging.Level.INFO;
 import static org.briarproject.android.TestingConstants.PREVENT_SCREENSHOTS;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
 import static org.briarproject.api.crypto.PasswordStrengthEstimator.WEAK;
-
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
-
-import org.briarproject.R;
-import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.android.util.StrengthMeter;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.LocalAuthor;
-import org.briarproject.api.android.ReferenceManager;
-import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.crypto.CryptoExecutor;
-import org.briarproject.api.crypto.KeyPair;
-import org.briarproject.api.crypto.PasswordStrengthEstimator;
-import org.briarproject.api.crypto.SecretKey;
-import org.briarproject.api.db.DatabaseConfig;
-import org.briarproject.util.StringUtils;
-
-import roboguice.activity.RoboActivity;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.ScrollView;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
+import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
 
 public class SetupActivity extends BaseActivity implements OnClickListener,
 OnEditorActionListener {
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
index e167eb20bac6bbbc492369d59bb9d1a225c2072b..d80b00cbfd048e93cc84064ea498e7612f232cd1 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListActivity.java
@@ -23,9 +23,8 @@ import org.briarproject.android.BriarActivity;
 import org.briarproject.android.invitation.AddContactActivity;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.ListLoadingProgressBar;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchContactException;
@@ -37,6 +36,7 @@ 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.identity.AuthorId;
 import org.briarproject.api.plugins.ConnectionRegistry;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageHeader;
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListItem.java b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
index 0e2cca813d495816a75d432d4f9c66f4746f7636..4772f4b9af8d79af636e91ff0b5aaaeb3df3391b 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
@@ -1,6 +1,6 @@
 package org.briarproject.android.contact;
 
-import org.briarproject.api.Contact;
+import org.briarproject.api.contact.Contact;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageHeader;
 
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 9f62cd500663e7d146c46148bd32adec46c2f1ef..7bbec7095f8c6b4997ef5d11112f66ca59c398b1 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -19,10 +19,9 @@ import android.widget.TextView;
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.android.AndroidNotificationManager;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoExecutor;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
@@ -38,6 +37,7 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.MessagesAckedEvent;
 import org.briarproject.api.event.MessagesSentEvent;
+import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.plugins.ConnectionRegistry;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
index c95324b793fe4fce5246b8f803d79944719ae595..7b8df89d4448863d98bbb391592cf19250a4fe01 100644
--- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
@@ -17,10 +17,10 @@ import org.briarproject.android.util.AuthorView;
 import org.briarproject.android.util.ElasticHorizontalSpace;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.LayoutUtils;
-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.identity.AuthorId;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
@@ -38,7 +38,7 @@ 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 static org.briarproject.api.identity.Author.Status.VERIFIED;
 
 public class ReadPrivateMessageActivity extends BriarActivity
 implements OnClickListener {
diff --git a/briar-android/src/org/briarproject/android/contact/SelectContactsDialog.java b/briar-android/src/org/briarproject/android/contact/SelectContactsDialog.java
index 0cbec574a671711ba83914e307c5c81eb14b04e8..d31070f29d4819d4352950bc23598204fb4cf8a6 100644
--- a/briar-android/src/org/briarproject/android/contact/SelectContactsDialog.java
+++ b/briar-android/src/org/briarproject/android/contact/SelectContactsDialog.java
@@ -1,21 +1,21 @@
 package org.briarproject.android.contact;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.briarproject.R;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
-
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnMultiChoiceClickListener;
 
+import org.briarproject.R;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 public class SelectContactsDialog implements OnMultiChoiceClickListener {
 
 	private Listener listener = null;
diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
index 481f72fe69a2a720d37177e9f6f4e1197a58b1c1..03cf96e9b17412615d8b5498ffa8377b921150e4 100644
--- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
@@ -16,13 +16,13 @@ import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.CommonLayoutParams;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.crypto.CryptoExecutor;
 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.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.Message;
diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
index 8c3e1c8bf62a8c3c86030d34eb8c5ee92a77126d..30df4b035c7d56da41d455333a7e34643abd225b 100644
--- a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
@@ -10,8 +10,8 @@ import android.widget.Toast;
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.ListLoadingProgressBar;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsAdapter.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsAdapter.java
index f2e34cad11d245c3e46764492e7bcd413c565902..918cfe15de41cc4c7ad5e46368c5920ef34f18ec 100644
--- a/briar-android/src/org/briarproject/android/forum/AvailableForumsAdapter.java
+++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsAdapter.java
@@ -9,7 +9,7 @@ import android.widget.TextView;
 
 import org.briarproject.R;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.Contact;
+import org.briarproject.api.contact.Contact;
 import org.briarproject.util.StringUtils;
 
 import java.util.ArrayList;
diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java
index c5e62e75ce9e54116d78c2c108e23e48245e17bc..f9b9c3a64dc835341105ad4f25affbd8123f7e60 100644
--- a/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java
+++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java
@@ -1,6 +1,6 @@
 package org.briarproject.android.forum;
 
-import org.briarproject.api.Contact;
+import org.briarproject.api.contact.Contact;
 import org.briarproject.api.sync.Group;
 
 import java.util.Collection;
diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
index 26410d25dcc5e9fc973faa1af9a3bc18a04c94d9..aa2d71504db3a49a048b5e596a48b8bb1ab9c51d 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -17,7 +17,6 @@ import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.ElasticHorizontalSpace;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.ListLoadingProgressBar;
-import org.briarproject.api.Author;
 import org.briarproject.api.android.AndroidNotificationManager;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
@@ -28,6 +27,7 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
+import org.briarproject.api.identity.Author;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageHeader;
diff --git a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
index 8660f4381497c3663941b5b3930b2f292b2532cd..506796f0b6a14c6d77bb3145502ed98ab6a429f3 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
@@ -13,7 +13,7 @@ import android.widget.TextView;
 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.identity.Author;
 import org.briarproject.api.sync.MessageHeader;
 import org.briarproject.util.StringUtils;
 
diff --git a/briar-android/src/org/briarproject/android/forum/ForumContacts.java b/briar-android/src/org/briarproject/android/forum/ForumContacts.java
index f75c439455239f70c61c88267699f1ca6424ce06..aa3b0c75c47e26da64c400e336550dde322d26e3 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumContacts.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumContacts.java
@@ -1,6 +1,6 @@
 package org.briarproject.android.forum;
 
-import org.briarproject.api.Contact;
+import org.briarproject.api.contact.Contact;
 import org.briarproject.api.sync.Group;
 
 import java.util.Collection;
diff --git a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
index dba39cca75a44bbd2ae61adbc312aaf8e29bf990..e41a8b97095955b2075a10d6e658e35d0f5f37ea 100644
--- a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
@@ -17,10 +17,10 @@ import org.briarproject.android.util.AuthorView;
 import org.briarproject.android.util.ElasticHorizontalSpace;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.LayoutUtils;
-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.identity.Author;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 import org.briarproject.util.StringUtils;
diff --git a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
index a3f771edc83b1079a6ef896f5e160fbac0adbba0..ae7115a38ce891d7ef08a2de9aada68558694b7d 100644
--- a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
@@ -15,8 +15,8 @@ import org.briarproject.android.BriarActivity;
 import org.briarproject.android.contact.SelectContactsDialog;
 import org.briarproject.android.invitation.AddContactActivity;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.sync.GroupId;
diff --git a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
index 4b8297a81737f408df2ade8b0d13a8d4dd908c6c..2ce94975864cf4a7e2aaf7552743759a5eac0a55 100644
--- a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
@@ -23,14 +23,14 @@ import org.briarproject.android.identity.LocalAuthorItemComparator;
 import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
 import org.briarproject.android.util.CommonLayoutParams;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.CryptoExecutor;
 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.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.Message;
diff --git a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java
index 458b194d98b13a5f2d97e3ec8beed6acf5aef756..fcbc439cff7dc583370f6789543012720b276531 100644
--- a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java
+++ b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java
@@ -1,36 +1,5 @@
 package org.briarproject.android.identity;
 
-import static android.text.InputType.TYPE_CLASS_TEXT;
-import static android.text.InputType.TYPE_TEXT_FLAG_CAP_WORDS;
-import static android.view.Gravity.CENTER;
-import static android.view.Gravity.CENTER_HORIZONTAL;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-import static android.widget.LinearLayout.VERTICAL;
-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_MATCH;
-import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
-
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
-
-import org.briarproject.R;
-import org.briarproject.android.BriarActivity;
-import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.LocalAuthor;
-import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.crypto.CryptoExecutor;
-import org.briarproject.api.crypto.KeyPair;
-import org.briarproject.api.db.DatabaseComponent;
-import org.briarproject.api.db.DbException;
-import org.briarproject.util.StringUtils;
-
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.KeyEvent;
@@ -44,6 +13,37 @@ import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
 import android.widget.Toast;
 
+import org.briarproject.R;
+import org.briarproject.android.BriarActivity;
+import org.briarproject.android.util.LayoutUtils;
+import org.briarproject.api.crypto.CryptoComponent;
+import org.briarproject.api.crypto.CryptoExecutor;
+import org.briarproject.api.crypto.KeyPair;
+import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.LocalAuthor;
+import org.briarproject.util.StringUtils;
+
+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_WORDS;
+import static android.view.Gravity.CENTER;
+import static android.view.Gravity.CENTER_HORIZONTAL;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+import static android.widget.LinearLayout.VERTICAL;
+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_MATCH;
+import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
+import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
+
 public class CreateIdentityActivity extends BriarActivity
 implements OnEditorActionListener, OnClickListener {
 
diff --git a/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java b/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java
index abb44221b026ee8e97709dcddaf982401ba605d1..a005144f5e2dfd54049ebc51d0b08ca2b4d6c9b5 100644
--- a/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java
+++ b/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java
@@ -1,6 +1,6 @@
 package org.briarproject.android.identity;
 
-import org.briarproject.api.LocalAuthor;
+import org.briarproject.api.identity.LocalAuthor;
 
 public class LocalAuthorItem {
 
diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java
index 03c94188638fcbe05c1f1b93d17dcc83abdbf584..89111f2acfdcdfc2f56bc66e95503d2daa0d1df2 100644
--- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java
+++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java
@@ -7,14 +7,14 @@ import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.android.ReferenceManager;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.invitation.InvitationListener;
 import org.briarproject.api.invitation.InvitationState;
 import org.briarproject.api.invitation.InvitationTask;
diff --git a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java
index f609eb93f2d00b015e1fa4ac8a7ec856f814efe4..95fcca9057e6bc6139ace43234c315d53f7ead89 100644
--- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java
@@ -1,24 +1,5 @@
 package org.briarproject.android.invitation;
 
-import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
-import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION;
-import static android.view.Gravity.CENTER;
-import static org.briarproject.android.identity.LocalAuthorItem.NEW;
-import static org.briarproject.android.invitation.AddContactActivity.REQUEST_BLUETOOTH;
-import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CREATE_IDENTITY;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
-
-import java.util.Collection;
-
-import org.briarproject.R;
-import org.briarproject.android.identity.CreateIdentityActivity;
-import org.briarproject.android.identity.LocalAuthorItem;
-import org.briarproject.android.identity.LocalAuthorItemComparator;
-import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
-
 import android.content.Context;
 import android.content.Intent;
 import android.view.LayoutInflater;
@@ -27,10 +8,25 @@ import android.view.View.OnClickListener;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemSelectedListener;
 import android.widget.Button;
-import android.widget.LinearLayout;
 import android.widget.Spinner;
 import android.widget.TextView;
 
+import org.briarproject.R;
+import org.briarproject.android.identity.CreateIdentityActivity;
+import org.briarproject.android.identity.LocalAuthorItem;
+import org.briarproject.android.identity.LocalAuthorItemComparator;
+import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
+
+import java.util.Collection;
+
+import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
+import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION;
+import static org.briarproject.android.identity.LocalAuthorItem.NEW;
+import static org.briarproject.android.invitation.AddContactActivity.REQUEST_BLUETOOTH;
+import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CREATE_IDENTITY;
+
 class ChooseIdentityView extends AddContactView
 implements OnItemSelectedListener, OnClickListener {
 
diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java
index b73c7c85cbf932f66688dd2ce3083f58f8072e67..152a801b91495218d4b843b7bb4ff71daba326ab 100644
--- a/briar-android/src/org/briarproject/android/util/AuthorView.java
+++ b/briar-android/src/org/briarproject/android/util/AuthorView.java
@@ -1,15 +1,15 @@
 package org.briarproject.android.util;
 
-import static android.text.TextUtils.TruncateAt.END;
-
-import org.briarproject.R;
-import org.briarproject.api.Author;
-
 import android.content.Context;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import org.briarproject.R;
+import org.briarproject.api.identity.Author;
+
+import static android.text.TextUtils.TruncateAt.END;
+
 public class AuthorView extends RelativeLayout {
 
 	public AuthorView(Context ctx) {
diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java
index 06dfd1dc9cdba8053203aa8461af38f3f3c67de2..635f7d42982f783661de978fb1e90a013be7223f 100644
--- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java
+++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java
@@ -1,18 +1,25 @@
 package org.briarproject.plugins.droidtooth;
 
-import static android.bluetooth.BluetoothAdapter.ACTION_SCAN_MODE_CHANGED;
-import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
-import static android.bluetooth.BluetoothAdapter.EXTRA_SCAN_MODE;
-import static android.bluetooth.BluetoothAdapter.EXTRA_STATE;
-import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE;
-import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE;
-import static android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE;
-import static android.bluetooth.BluetoothAdapter.STATE_OFF;
-import static android.bluetooth.BluetoothAdapter.STATE_ON;
-import static android.bluetooth.BluetoothDevice.EXTRA_DEVICE;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothServerSocket;
+import android.bluetooth.BluetoothSocket;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import org.briarproject.api.TransportId;
+import org.briarproject.api.TransportProperties;
+import org.briarproject.api.android.AndroidExecutor;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.crypto.PseudoRandom;
+import org.briarproject.api.plugins.duplex.DuplexPlugin;
+import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
+import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.system.Clock;
+import org.briarproject.util.LatchedReference;
+import org.briarproject.util.StringUtils;
 
 import java.io.IOException;
 import java.security.SecureRandom;
@@ -29,26 +36,19 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
-import org.briarproject.api.ContactId;
-import org.briarproject.api.TransportId;
-import org.briarproject.api.TransportProperties;
-import org.briarproject.api.android.AndroidExecutor;
-import org.briarproject.api.crypto.PseudoRandom;
-import org.briarproject.api.plugins.duplex.DuplexPlugin;
-import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
-import org.briarproject.api.system.Clock;
-import org.briarproject.util.LatchedReference;
-import org.briarproject.util.StringUtils;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothServerSocket;
-import android.bluetooth.BluetoothSocket;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
+import static android.bluetooth.BluetoothAdapter.ACTION_SCAN_MODE_CHANGED;
+import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
+import static android.bluetooth.BluetoothAdapter.EXTRA_SCAN_MODE;
+import static android.bluetooth.BluetoothAdapter.EXTRA_STATE;
+import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE;
+import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE;
+import static android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE;
+import static android.bluetooth.BluetoothAdapter.STATE_OFF;
+import static android.bluetooth.BluetoothAdapter.STATE_ON;
+import static android.bluetooth.BluetoothDevice.EXTRA_DEVICE;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
 
 class DroidtoothPlugin implements DuplexPlugin {
 
diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java
index ebd954dfa559bb90f85b1dda16cb7984e3201dc2..ebcf4c779e467a4285e5b6cda562ea51c6b2fc24 100644
--- a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java
+++ b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java
@@ -11,10 +11,10 @@ import android.os.FileObserver;
 import net.freehaven.tor.control.EventHandler;
 import net.freehaven.tor.control.TorControlConnection;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventListener;
diff --git a/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java b/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java
index 9c39fd75da6523d5e159a9ee3acc825a6ffe4627..67e6e2a5823e3ff234c470e80034437acef3f565 100644
--- a/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java
+++ b/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.android;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.lifecycle.Service;
 import org.briarproject.api.sync.GroupId;
 
diff --git a/briar-api/src/org/briarproject/api/Contact.java b/briar-api/src/org/briarproject/api/contact/Contact.java
similarity index 82%
rename from briar-api/src/org/briarproject/api/Contact.java
rename to briar-api/src/org/briarproject/api/contact/Contact.java
index fa03b836814de668bf9addc1a180708c45a9e8ac..5c65c57d21f22a0ebd3d8e5c55bc9c2c87f44480 100644
--- a/briar-api/src/org/briarproject/api/Contact.java
+++ b/briar-api/src/org/briarproject/api/contact/Contact.java
@@ -1,4 +1,7 @@
-package org.briarproject.api;
+package org.briarproject.api.contact;
+
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
 
 public class Contact {
 
diff --git a/briar-api/src/org/briarproject/api/ContactId.java b/briar-api/src/org/briarproject/api/contact/ContactId.java
similarity index 92%
rename from briar-api/src/org/briarproject/api/ContactId.java
rename to briar-api/src/org/briarproject/api/contact/ContactId.java
index 7a60116027c2c9ebb484b68257236757755b629d..1805818d7c884ff640b03d05f5f7b11c5c4d1fa5 100644
--- a/briar-api/src/org/briarproject/api/ContactId.java
+++ b/briar-api/src/org/briarproject/api/contact/ContactId.java
@@ -1,4 +1,4 @@
-package org.briarproject.api;
+package org.briarproject.api.contact;
 
 /**
  * Type-safe wrapper for an integer that uniquely identifies a contact within
diff --git a/briar-api/src/org/briarproject/api/contact/ContactManager.java b/briar-api/src/org/briarproject/api/contact/ContactManager.java
index 50a4a76a3d7e473a76801d2f33a6af8bca4d5278..f323c07371df5267ddc814ca9961e8743b9c1a2d 100644
--- a/briar-api/src/org/briarproject/api/contact/ContactManager.java
+++ b/briar-api/src/org/briarproject/api/contact/ContactManager.java
@@ -1,10 +1,8 @@
 package org.briarproject.api.contact;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
 
 import java.util.Collection;
 
diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
index ea30eb6ebbcf6a6623b55eee3865c97172178537..13d28f9d8e257c63edad7bdf8cb36af0752b02b6 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
@@ -1,14 +1,14 @@
 package org.briarproject.api.db;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.Settings;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Ack;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
diff --git a/briar-api/src/org/briarproject/api/event/ContactAddedEvent.java b/briar-api/src/org/briarproject/api/event/ContactAddedEvent.java
index 6728c7905064edf9af7c4b32d6d74e23c99354f1..b8d29bf27cb526f830c371175e81db986b6eeb1f 100644
--- a/briar-api/src/org/briarproject/api/event/ContactAddedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/ContactAddedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /** An event that is broadcast when a contact is added. */
 public class ContactAddedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/ContactConnectedEvent.java b/briar-api/src/org/briarproject/api/event/ContactConnectedEvent.java
index 42c8bf7b820c44ae900690f050b605ea16e168b6..0f0f90bac93e18af6de09e4397080923f4492bfb 100644
--- a/briar-api/src/org/briarproject/api/event/ContactConnectedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/ContactConnectedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /**
  * An event that is broadcast when a contact connects that was not previously
diff --git a/briar-api/src/org/briarproject/api/event/ContactDisconnectedEvent.java b/briar-api/src/org/briarproject/api/event/ContactDisconnectedEvent.java
index a0f858dfd1fd1972a4985497fb8bdc3b82a03ea1..2cef4d167b6fb39dd34fc131f6e7e7ffb5cfe181 100644
--- a/briar-api/src/org/briarproject/api/event/ContactDisconnectedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/ContactDisconnectedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /**
  * An event that is broadcast when a contact disconnects and is no longer
diff --git a/briar-api/src/org/briarproject/api/event/ContactRemovedEvent.java b/briar-api/src/org/briarproject/api/event/ContactRemovedEvent.java
index 6b080340eae95e5d5f099e0cd686b0e7bb81592d..f76c9a7ecacb6e80928afe16848d57ddab842c25 100644
--- a/briar-api/src/org/briarproject/api/event/ContactRemovedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/ContactRemovedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /** An event that is broadcast when a contact is removed. */
 public class ContactRemovedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/LocalAuthorAddedEvent.java b/briar-api/src/org/briarproject/api/event/LocalAuthorAddedEvent.java
index 81c4145ebf93c08ccb17fb6a1e83840c62e52493..5f0aeb3cd4ea2107c9a3f755a7e851085ce71cad 100644
--- a/briar-api/src/org/briarproject/api/event/LocalAuthorAddedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/LocalAuthorAddedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.AuthorId;
+import org.briarproject.api.identity.AuthorId;
 
 /** An event that is broadcast when a local pseudonym is added. */
 public class LocalAuthorAddedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/LocalAuthorRemovedEvent.java b/briar-api/src/org/briarproject/api/event/LocalAuthorRemovedEvent.java
index 9671792474255355c464f69c68b1266035e5117a..5e69ccf7a2c13bb3fcf7aa8a1f7ec0d2860ea914 100644
--- a/briar-api/src/org/briarproject/api/event/LocalAuthorRemovedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/LocalAuthorRemovedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.AuthorId;
+import org.briarproject.api.identity.AuthorId;
 
 /** An event that is broadcast when a local pseudonym is removed. */
 public class LocalAuthorRemovedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/LocalSubscriptionsUpdatedEvent.java b/briar-api/src/org/briarproject/api/event/LocalSubscriptionsUpdatedEvent.java
index 2617a06ce55f9792864e62e207c317673ae6f01e..ce7a2d909463c678319dd30b4747d6e6b213f748 100644
--- a/briar-api/src/org/briarproject/api/event/LocalSubscriptionsUpdatedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/LocalSubscriptionsUpdatedEvent.java
@@ -1,8 +1,8 @@
 package org.briarproject.api.event;
 
-import java.util.Collection;
+import org.briarproject.api.contact.ContactId;
 
-import org.briarproject.api.ContactId;
+import java.util.Collection;
 
 /**
  * An event that is broadcast when the set of subscriptions visible to one or
diff --git a/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java b/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
index 8c6664d1c4386c8412a5215e8346fedc189cb9ce..73f4175fb412348262e82a5a481f607f49bd678d 100644
--- a/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessageAddedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.sync.Group;
 
 /** An event that is broadcast when a message is added to the database. */
diff --git a/briar-api/src/org/briarproject/api/event/MessageRequestedEvent.java b/briar-api/src/org/briarproject/api/event/MessageRequestedEvent.java
index a3c023f2d52d23f861cfe7c01022003c8179c8e4..f2dd84be0b95224eacade2ddffd8e9cb833c881d 100644
--- a/briar-api/src/org/briarproject/api/event/MessageRequestedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessageRequestedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /** An event that is broadcast when a message is requested by a contact. */
 public class MessageRequestedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/MessageToAckEvent.java b/briar-api/src/org/briarproject/api/event/MessageToAckEvent.java
index f59eabab8c790bd22a1c87a8caf5c0dbfa347449..8afaed4e749f33e2854560bb69157853f524b7df 100644
--- a/briar-api/src/org/briarproject/api/event/MessageToAckEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessageToAckEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /**
  * An event that is broadcast when a message is received from or offered by a
diff --git a/briar-api/src/org/briarproject/api/event/MessageToRequestEvent.java b/briar-api/src/org/briarproject/api/event/MessageToRequestEvent.java
index 11a6b699536ebcd81bb7fcf3477cf6a5c4a0d362..812fb0ad3716400c89b57a39e4639e37720ba9e6 100644
--- a/briar-api/src/org/briarproject/api/event/MessageToRequestEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessageToRequestEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /**
  * An event that is broadcast when a message is offered by a contact and needs
diff --git a/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java b/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java
index ab99b37b001c1f07ead7c0de3ed27ce235de0aad..fc6a7fca30180a4804f332b3302cbcd4e499db27 100644
--- a/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessagesAckedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.sync.MessageId;
 
 import java.util.Collection;
diff --git a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java
index 0c9f700e6f9aeedc7b85cb8705e1dd10585396c2..51bcbda4fb020565d4e793fe63e5d950b80f2388 100644
--- a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java
+++ b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.sync.MessageId;
 
 import java.util.Collection;
diff --git a/briar-api/src/org/briarproject/api/event/RemoteSubscriptionsUpdatedEvent.java b/briar-api/src/org/briarproject/api/event/RemoteSubscriptionsUpdatedEvent.java
index a56c8cb9abb4405bc8510ca1f02e905840dc371f..cd7a17ec34e12e3d61c2aa4cc696686fc47f04bc 100644
--- a/briar-api/src/org/briarproject/api/event/RemoteSubscriptionsUpdatedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/RemoteSubscriptionsUpdatedEvent.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 
 /**  An event that is broadcast when a contact's subscriptions are updated. */
 public class RemoteSubscriptionsUpdatedEvent extends Event {
diff --git a/briar-api/src/org/briarproject/api/event/RemoteTransportsUpdatedEvent.java b/briar-api/src/org/briarproject/api/event/RemoteTransportsUpdatedEvent.java
index 7e0d834ed24fc39d362f2d3f9a05e2a5e74acbd1..52d36961bfbc843f9051deda7f9c1d1945c5185e 100644
--- a/briar-api/src/org/briarproject/api/event/RemoteTransportsUpdatedEvent.java
+++ b/briar-api/src/org/briarproject/api/event/RemoteTransportsUpdatedEvent.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.event;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 
 /**
  * An event that is broadcast when a contact's remote transport properties
diff --git a/briar-api/src/org/briarproject/api/forum/ForumManager.java b/briar-api/src/org/briarproject/api/forum/ForumManager.java
index 3a380bfc888d0456bddfb49af06ccf360e3b9b15..eec231dd996099d2c35443516f6168044caf070d 100644
--- a/briar-api/src/org/briarproject/api/forum/ForumManager.java
+++ b/briar-api/src/org/briarproject/api/forum/ForumManager.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.forum;
 
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
diff --git a/briar-api/src/org/briarproject/api/Author.java b/briar-api/src/org/briarproject/api/identity/Author.java
similarity index 86%
rename from briar-api/src/org/briarproject/api/Author.java
rename to briar-api/src/org/briarproject/api/identity/Author.java
index c4f3c050bf844663ad7ca4f18b093b3af4eabf07..9aa543b3acd09654cac3f81da23814350496336a 100644
--- a/briar-api/src/org/briarproject/api/Author.java
+++ b/briar-api/src/org/briarproject/api/identity/Author.java
@@ -1,13 +1,11 @@
-package org.briarproject.api;
-
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
+package org.briarproject.api.identity;
 
 import java.io.UnsupportedEncodingException;
 
 /** A pseudonym for a user. */
 public class Author {
 
-	public enum Status { ANONYMOUS, UNKNOWN, UNVERIFIED, VERIFIED };
+	public enum Status { ANONYMOUS, UNKNOWN, UNVERIFIED, VERIFIED }
 
 	private final AuthorId id;
 	private final String name;
@@ -20,7 +18,7 @@ public class Author {
 		} catch (UnsupportedEncodingException e) {
 			throw new RuntimeException(e);
 		}
-		if (length == 0 || length > MAX_AUTHOR_NAME_LENGTH)
+		if (length == 0 || length > AuthorConstants.MAX_AUTHOR_NAME_LENGTH)
 			throw new IllegalArgumentException();
 		this.id = id;
 		this.name = name;
diff --git a/briar-api/src/org/briarproject/api/AuthorConstants.java b/briar-api/src/org/briarproject/api/identity/AuthorConstants.java
similarity index 96%
rename from briar-api/src/org/briarproject/api/AuthorConstants.java
rename to briar-api/src/org/briarproject/api/identity/AuthorConstants.java
index 1b2123d9572b9ea97b2f1d3726e4cdf058582a0e..58fd9c4a84490566ab0945769c1f614ab3b70928 100644
--- a/briar-api/src/org/briarproject/api/AuthorConstants.java
+++ b/briar-api/src/org/briarproject/api/identity/AuthorConstants.java
@@ -1,4 +1,4 @@
-package org.briarproject.api;
+package org.briarproject.api.identity;
 
 public interface AuthorConstants {
 
diff --git a/briar-api/src/org/briarproject/api/AuthorFactory.java b/briar-api/src/org/briarproject/api/identity/AuthorFactory.java
similarity index 81%
rename from briar-api/src/org/briarproject/api/AuthorFactory.java
rename to briar-api/src/org/briarproject/api/identity/AuthorFactory.java
index f70ef2135ec7bba3cda4f8aab621aea7bd2414f4..2c474b7cd7569f8649c29e60e873342b1b1a9cc9 100644
--- a/briar-api/src/org/briarproject/api/AuthorFactory.java
+++ b/briar-api/src/org/briarproject/api/identity/AuthorFactory.java
@@ -1,4 +1,4 @@
-package org.briarproject.api;
+package org.briarproject.api.identity;
 
 public interface AuthorFactory {
 
diff --git a/briar-api/src/org/briarproject/api/AuthorId.java b/briar-api/src/org/briarproject/api/identity/AuthorId.java
similarity index 81%
rename from briar-api/src/org/briarproject/api/AuthorId.java
rename to briar-api/src/org/briarproject/api/identity/AuthorId.java
index 0ee86a33a643019843d751e08960733c18e9d484..b0fd7d10dd496637a15c1553da97699879829192 100644
--- a/briar-api/src/org/briarproject/api/AuthorId.java
+++ b/briar-api/src/org/briarproject/api/identity/AuthorId.java
@@ -1,4 +1,6 @@
-package org.briarproject.api;
+package org.briarproject.api.identity;
+
+import org.briarproject.api.UniqueId;
 
 import java.util.Arrays;
 
diff --git a/briar-api/src/org/briarproject/api/identity/IdentityManager.java b/briar-api/src/org/briarproject/api/identity/IdentityManager.java
index a657a0851862f84536b3a6dbad436376f3562074..207fea87d55170a1341993416b0ca0259c94cbb4 100644
--- a/briar-api/src/org/briarproject/api/identity/IdentityManager.java
+++ b/briar-api/src/org/briarproject/api/identity/IdentityManager.java
@@ -1,7 +1,5 @@
 package org.briarproject.api.identity;
 
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.db.DbException;
 
 import java.util.Collection;
diff --git a/briar-api/src/org/briarproject/api/LocalAuthor.java b/briar-api/src/org/briarproject/api/identity/LocalAuthor.java
similarity index 93%
rename from briar-api/src/org/briarproject/api/LocalAuthor.java
rename to briar-api/src/org/briarproject/api/identity/LocalAuthor.java
index 68520b6752df932a6d2cd73ea1d52560b2b95098..9f5626d77b01cbde395f84dc02b97dec179e85e3 100644
--- a/briar-api/src/org/briarproject/api/LocalAuthor.java
+++ b/briar-api/src/org/briarproject/api/identity/LocalAuthor.java
@@ -1,4 +1,4 @@
-package org.briarproject.api;
+package org.briarproject.api.identity;
 
 /** A pseudonym for the local user. */
 public class LocalAuthor extends Author {
diff --git a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java
index 43445480178a06455a8fe7dedf12a914dfdda492..85b4f882d2668a3c435bbeea1a7c0ca9ea712721 100644
--- a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java
+++ b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.invitation;
 
-import org.briarproject.api.AuthorId;
+import org.briarproject.api.identity.AuthorId;
 
 /** Creates tasks for exchanging invitations with remote peers. */
 public interface InvitationTaskFactory {
diff --git a/briar-api/src/org/briarproject/api/messaging/MessagingManager.java b/briar-api/src/org/briarproject/api/messaging/MessagingManager.java
index 4662157624891ceeb756f2fa1029bc3699aa5a31..a306d6d753c6989a10e5506a6b61095970b3e16a 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessagingManager.java
+++ b/briar-api/src/org/briarproject/api/messaging/MessagingManager.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.messaging;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
diff --git a/briar-api/src/org/briarproject/api/plugins/ConnectionManager.java b/briar-api/src/org/briarproject/api/plugins/ConnectionManager.java
index 644a3c8132d9c946cbba9a6560f0a01ec076ca22..da7940187a6438c3b8ea8952d1a8b751fb9cd91d 100644
--- a/briar-api/src/org/briarproject/api/plugins/ConnectionManager.java
+++ b/briar-api/src/org/briarproject/api/plugins/ConnectionManager.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.plugins;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
 
 public interface ConnectionManager {
diff --git a/briar-api/src/org/briarproject/api/plugins/ConnectionRegistry.java b/briar-api/src/org/briarproject/api/plugins/ConnectionRegistry.java
index c1a1046c8000e167f15453a8bbd989e90e75d241..6de3d00c5b55e34b4ca4a364a6056f4a510fa6cd 100644
--- a/briar-api/src/org/briarproject/api/plugins/ConnectionRegistry.java
+++ b/briar-api/src/org/briarproject/api/plugins/ConnectionRegistry.java
@@ -1,9 +1,9 @@
 package org.briarproject.api.plugins;
 
-import java.util.Collection;
-
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
+
+import java.util.Collection;
 
 /**
  * Keeps track of which contacts are currently connected by which transports.
diff --git a/briar-api/src/org/briarproject/api/plugins/Plugin.java b/briar-api/src/org/briarproject/api/plugins/Plugin.java
index cc0338a4a3b9d1d9386db6885368e6f34adbef6c..393fa27ea1737e86a8c794eacc3d4b506a7a6eb7 100644
--- a/briar-api/src/org/briarproject/api/plugins/Plugin.java
+++ b/briar-api/src/org/briarproject/api/plugins/Plugin.java
@@ -1,11 +1,11 @@
 package org.briarproject.api.plugins;
 
+import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
+
 import java.io.IOException;
 import java.util.Collection;
 
-import org.briarproject.api.ContactId;
-import org.briarproject.api.TransportId;
-
 public interface Plugin {
 
 	/** Returns the plugin's transport identifier. */
diff --git a/briar-api/src/org/briarproject/api/plugins/PluginCallback.java b/briar-api/src/org/briarproject/api/plugins/PluginCallback.java
index 34361a2cab62ae52adb13ac528dc5907659a7d89..78d870a1518995efeb7bb6180e8f13d079679dde 100644
--- a/briar-api/src/org/briarproject/api/plugins/PluginCallback.java
+++ b/briar-api/src/org/briarproject/api/plugins/PluginCallback.java
@@ -1,10 +1,10 @@
 package org.briarproject.api.plugins;
 
-import java.util.Map;
-
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
+
+import java.util.Map;
 
 /**
  * An interface through which a transport plugin interacts with the rest of
diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java
index 8712d7b7920ac554ce9dc7c0b812c2092fdcb5fa..b64f4a1498e200ec61c537081cff3b2dd6289f42 100644
--- a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java
+++ b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.plugins.duplex;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.plugins.Plugin;
 
diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPluginCallback.java b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPluginCallback.java
index 494f746a17925422a468b520d69e6540e09d46f9..eb88626b88965bff84588dda4efe80341c6e4de2 100644
--- a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPluginCallback.java
+++ b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPluginCallback.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.plugins.duplex;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.PluginCallback;
 
 /**
diff --git a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPlugin.java b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPlugin.java
index 9e4a1defd8e64fe5a46b550f1d39f3676f30e64d..36e2ed438393090fa71cea2dde44f4b744298326 100644
--- a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPlugin.java
+++ b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPlugin.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.plugins.simplex;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.Plugin;
 import org.briarproject.api.plugins.TransportConnectionReader;
 import org.briarproject.api.plugins.TransportConnectionWriter;
diff --git a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPluginCallback.java b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPluginCallback.java
index 1f597c70d21cf9f6d4f7f10790c9e2065786c569..51f15da58b5f594d9b16f0116d66df3cc511c9c5 100644
--- a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPluginCallback.java
+++ b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexPluginCallback.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.plugins.simplex;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.PluginCallback;
 import org.briarproject.api.plugins.TransportConnectionReader;
 import org.briarproject.api.plugins.TransportConnectionWriter;
diff --git a/briar-api/src/org/briarproject/api/sync/Message.java b/briar-api/src/org/briarproject/api/sync/Message.java
index a8245f13fed2a76e9318198925d290b0ac6c9a98..14c16d371dd9839e1d8fce457a8191f3e6209a3e 100644
--- a/briar-api/src/org/briarproject/api/sync/Message.java
+++ b/briar-api/src/org/briarproject/api/sync/Message.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.sync;
 
-import org.briarproject.api.Author;
+import org.briarproject.api.identity.Author;
 
 public interface Message {
 
@@ -20,7 +20,7 @@ public interface Message {
 	Group getGroup();
 
 	/**
-	 * Returns the message's {@link org.briarproject.api.Author Author}, or null
+	 * Returns the message's {@link Author Author}, or null
 	 * if this is an anonymous message.
 	 */
 	Author getAuthor();
diff --git a/briar-api/src/org/briarproject/api/sync/MessageFactory.java b/briar-api/src/org/briarproject/api/sync/MessageFactory.java
index 17a1404d1b2f6a12a8a3f4181a527245c80feade..b54070d78cd8eac8173d8f0dfeda5c056fd6c442 100644
--- a/briar-api/src/org/briarproject/api/sync/MessageFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/MessageFactory.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.sync;
 
-import org.briarproject.api.Author;
 import org.briarproject.api.crypto.PrivateKey;
+import org.briarproject.api.identity.Author;
 
 import java.io.IOException;
 import java.security.GeneralSecurityException;
diff --git a/briar-api/src/org/briarproject/api/sync/MessageHeader.java b/briar-api/src/org/briarproject/api/sync/MessageHeader.java
index 583adca7814b4ca6c4e236830ed35e06c685fbac..701fbf5474154c1099b0b477adc1b6d3c9012990 100644
--- a/briar-api/src/org/briarproject/api/sync/MessageHeader.java
+++ b/briar-api/src/org/briarproject/api/sync/MessageHeader.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.sync;
 
-import org.briarproject.api.Author;
+import org.briarproject.api.identity.Author;
 
 public class MessageHeader {
 
diff --git a/briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java b/briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java
index 0cae83d8902c576f0ea595d1d30106d4be419070..a54695dfe026e6c57b3d249dbcc597cf3530f229 100644
--- a/briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java
+++ b/briar-api/src/org/briarproject/api/sync/MessagingSessionFactory.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.sync;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 
 import java.io.InputStream;
 import java.io.OutputStream;
diff --git a/briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java b/briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java
index f5ab02e91341154af838f236f84faf49b9378838..523cc1e305b1d3b145626b8248670aac61b557b5 100644
--- a/briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java
+++ b/briar-api/src/org/briarproject/api/sync/UnverifiedMessage.java
@@ -1,6 +1,6 @@
 package org.briarproject.api.sync;
 
-import org.briarproject.api.Author;
+import org.briarproject.api.identity.Author;
 
 /** A {@link Message} that has not yet had its signatures (if any) verified. */
 public class UnverifiedMessage {
@@ -45,7 +45,7 @@ public class UnverifiedMessage {
 	}
 
 	/**
-	 * Returns the message's {@link org.briarproject.api.Author Author}, or null
+	 * Returns the message's {@link Author Author}, or null
 	 * if this is an anonymous message.
 	 */
 	public Author getAuthor() {
diff --git a/briar-api/src/org/briarproject/api/transport/KeyManager.java b/briar-api/src/org/briarproject/api/transport/KeyManager.java
index 7b08b1c0e21325f83577b24b489967f5f4903efe..4602584c17afd13a56c42535dee70b78d3ef92ba 100644
--- a/briar-api/src/org/briarproject/api/transport/KeyManager.java
+++ b/briar-api/src/org/briarproject/api/transport/KeyManager.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.transport;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.lifecycle.Service;
 
diff --git a/briar-api/src/org/briarproject/api/transport/StreamContext.java b/briar-api/src/org/briarproject/api/transport/StreamContext.java
index 5c46b9f8c1664f4e9196429246df78c4af65c4ff..d9dbe9cd1550fb747c7383c23612aca2c1f943cb 100644
--- a/briar-api/src/org/briarproject/api/transport/StreamContext.java
+++ b/briar-api/src/org/briarproject/api/transport/StreamContext.java
@@ -1,7 +1,7 @@
 package org.briarproject.api.transport;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.SecretKey;
 
 public class StreamContext {
diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java
index b8a57ccb3f06c371205019c3860e0af6d659bc1e..a34c92814c55d5d17985ce12aeaadf9086061bc0 100644
--- a/briar-core/src/org/briarproject/db/Database.java
+++ b/briar-core/src/org/briarproject/db/Database.java
@@ -1,15 +1,15 @@
 package org.briarproject.db;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.Settings;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.Message;
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 5af5e56eca3c9823fcba344647467ee6c4abb0c6..87f8aa49b4533135e08aeaff7115d7f27aaad7c2 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -1,14 +1,11 @@
 package org.briarproject.db;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.Settings;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.ContactExistsException;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
@@ -38,6 +35,9 @@ import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
 import org.briarproject.api.event.TransportAddedEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.lifecycle.ShutdownManager;
 import org.briarproject.api.sync.Ack;
 import org.briarproject.api.sync.Group;
diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java
index 89491704cd755f508512d6fbca3901431c7c5470..d9a9a2f47abc9a4ceba4b739b383ffabf2d4a992 100644
--- a/briar-core/src/org/briarproject/db/JdbcDatabase.java
+++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java
@@ -1,17 +1,17 @@
 package org.briarproject.db;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.Settings;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DbClosedException;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.Message;
@@ -52,9 +52,9 @@ import java.util.logging.Logger;
 import static java.sql.Types.BINARY;
 import static java.sql.Types.VARCHAR;
 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.identity.Author.Status.ANONYMOUS;
+import static org.briarproject.api.identity.Author.Status.UNKNOWN;
+import static org.briarproject.api.identity.Author.Status.VERIFIED;
 import static org.briarproject.api.sync.MessagingConstants.MAX_SUBSCRIPTIONS;
 import static org.briarproject.db.ExponentialBackoff.calculateExpiry;
 
diff --git a/briar-core/src/org/briarproject/invitation/AliceConnector.java b/briar-core/src/org/briarproject/invitation/AliceConnector.java
index 460feac2404a43233b6ec260483329762cefa610..963aa10ff734321d61a33092f3b0e2ec5218955a 100644
--- a/briar-core/src/org/briarproject/invitation/AliceConnector.java
+++ b/briar-core/src/org/briarproject/invitation/AliceConnector.java
@@ -1,8 +1,5 @@
 package org.briarproject.invitation;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -14,6 +11,9 @@ 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.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
diff --git a/briar-core/src/org/briarproject/invitation/BobConnector.java b/briar-core/src/org/briarproject/invitation/BobConnector.java
index 20c60061a07179dcfa4dcbff831311b8220103d7..826659fddf7cdfcefae541e66dafd924f18f99e7 100644
--- a/briar-core/src/org/briarproject/invitation/BobConnector.java
+++ b/briar-core/src/org/briarproject/invitation/BobConnector.java
@@ -1,8 +1,5 @@
 package org.briarproject.invitation;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -14,6 +11,9 @@ 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.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
diff --git a/briar-core/src/org/briarproject/invitation/Connector.java b/briar-core/src/org/briarproject/invitation/Connector.java
index 47341606294bf41b63376d340397769b17c874e0..ed654fbd1e93f87ba28474ab9344eafd119f1835 100644
--- a/briar-core/src/org/briarproject/invitation/Connector.java
+++ b/briar-core/src/org/briarproject/invitation/Connector.java
@@ -1,12 +1,9 @@
 package org.briarproject.invitation;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.FormatException;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.KeyParser;
@@ -20,6 +17,9 @@ 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.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
@@ -43,12 +43,12 @@ import java.util.logging.Logger;
 
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
-import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
-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.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH;
 import static org.briarproject.api.invitation.InvitationConstants.CONNECTION_TIMEOUT;
 import static org.briarproject.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE;
 
diff --git a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
index 11c9855224b07eeb0ee17c22f4845fd2a8ecde37..564b86fa82668238a6350392b3ab4b2c6ff8038d 100644
--- a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
+++ b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
@@ -1,9 +1,5 @@
 package org.briarproject.invitation;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -12,6 +8,10 @@ import org.briarproject.api.data.ReaderFactory;
 import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.invitation.InvitationListener;
 import org.briarproject.api.invitation.InvitationState;
 import org.briarproject.api.invitation.InvitationTask;
diff --git a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
index 7438deccd747fd9fbb47f282b9eff1dd929da940..25cb8b8069f69afdbf519be83d1c541de4ebf88a 100644
--- a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
+++ b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
@@ -1,11 +1,11 @@
 package org.briarproject.invitation;
 
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.AuthorId;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.data.ReaderFactory;
 import org.briarproject.api.data.WriterFactory;
 import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.invitation.InvitationTask;
 import org.briarproject.api.invitation.InvitationTaskFactory;
 import org.briarproject.api.plugins.ConnectionManager;
diff --git a/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java b/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
index 20c7fb49de3626ba36c10dce136e327458c5ff39..f3a31c83bc7cd6d1af19a6493710d9836a68bae7 100644
--- a/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
+++ b/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
@@ -1,7 +1,7 @@
 package org.briarproject.plugins;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.plugins.ConnectionManager;
diff --git a/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java b/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java
index 66e6eb3db594c3bbecc8922a0240ba1098d95a8a..245a37dbb417d57013b402ff14fb178a2c4ba425 100644
--- a/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java
+++ b/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java
@@ -1,6 +1,13 @@
 package org.briarproject.plugins;
 
-import static java.util.logging.Level.INFO;
+import com.google.inject.Inject;
+
+import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.event.ContactConnectedEvent;
+import org.briarproject.api.event.ContactDisconnectedEvent;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.plugins.ConnectionRegistry;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -12,14 +19,7 @@ import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
 
-import org.briarproject.api.ContactId;
-import org.briarproject.api.TransportId;
-import org.briarproject.api.event.ContactConnectedEvent;
-import org.briarproject.api.event.ContactDisconnectedEvent;
-import org.briarproject.api.event.EventBus;
-import org.briarproject.api.plugins.ConnectionRegistry;
-
-import com.google.inject.Inject;
+import static java.util.logging.Level.INFO;
 
 class ConnectionRegistryImpl implements ConnectionRegistry {
 
@@ -109,7 +109,8 @@ class ConnectionRegistryImpl implements ConnectionRegistry {
 			Map<ContactId, Integer> m = connections.get(t);
 			if (m == null) return Collections.emptyList();
 			List<ContactId> ids = new ArrayList<ContactId>(m.keySet());
-			if (LOG.isLoggable(INFO)) LOG.info(ids.size() + " contacts connected");
+			if (LOG.isLoggable(INFO))
+				LOG.info(ids.size() + " contacts connected");
 			return Collections.unmodifiableList(ids);
 		} finally {
 			lock.unlock();
diff --git a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java
index 4742d82513dbccd61014300611dc4c2582f78417..e96254b04a4c127b24aa7840a6f54450004c4a3f 100644
--- a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java
+++ b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java
@@ -1,9 +1,9 @@
 package org.briarproject.plugins;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.EventBus;
diff --git a/briar-core/src/org/briarproject/plugins/file/FilePlugin.java b/briar-core/src/org/briarproject/plugins/file/FilePlugin.java
index 3b11ebee51db996a6210c32f02ac96bcacd95b60..3394995cfd6ff0cac1503409b0f33aacf22e0919 100644
--- a/briar-core/src/org/briarproject/plugins/file/FilePlugin.java
+++ b/briar-core/src/org/briarproject/plugins/file/FilePlugin.java
@@ -1,6 +1,6 @@
 package org.briarproject.plugins.file;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.TransportConnectionReader;
 import org.briarproject.api.plugins.TransportConnectionWriter;
 import org.briarproject.api.plugins.simplex.SimplexPlugin;
diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
index 48f731464f6bc89043dae23301da637a2aa5a77a..3388de5f13252128d13255806d97f3ba2877a2c6 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
@@ -1,7 +1,12 @@
 package org.briarproject.plugins.tcp;
 
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
+import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.crypto.PseudoRandom;
+import org.briarproject.api.plugins.duplex.DuplexPlugin;
+import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
+import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.util.StringUtils;
 
 import java.io.IOException;
 import java.net.InetAddress;
@@ -20,13 +25,8 @@ import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 import java.util.regex.Pattern;
 
-import org.briarproject.api.ContactId;
-import org.briarproject.api.TransportProperties;
-import org.briarproject.api.crypto.PseudoRandom;
-import org.briarproject.api.plugins.duplex.DuplexPlugin;
-import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
-import org.briarproject.util.StringUtils;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
 
 abstract class TcpPlugin implements DuplexPlugin {
 
@@ -91,7 +91,6 @@ abstract class TcpPlugin implements DuplexPlugin {
 						if (LOG.isLoggable(INFO))
 							LOG.info("Failed to bind " + addr);
 						tryToClose(ss);
-						continue;
 					}
 				}
 				if (ss == null || !ss.isBound()) {
diff --git a/briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java b/briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java
index c0cf59deb74097730571ce2f0c522a9728406f3f..9f318112e3747ef1606ef5a90b448f47041a1600 100644
--- a/briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/AuthorFactoryImpl.java
@@ -1,13 +1,13 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.LocalAuthor;
 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.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.system.Clock;
 
 import java.io.ByteArrayOutputStream;
diff --git a/briar-core/src/org/briarproject/sync/AuthorReader.java b/briar-core/src/org/briarproject/sync/AuthorReader.java
index 22aa7a5f1290c23e0ef62ccf0067ff5d6604127a..eb15f833170fa1539fc4b2b96808065ddd198403 100644
--- a/briar-core/src/org/briarproject/sync/AuthorReader.java
+++ b/briar-core/src/org/briarproject/sync/AuthorReader.java
@@ -1,17 +1,17 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
 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.identity.Author;
+import org.briarproject.api.identity.AuthorId;
 
 import java.io.IOException;
 
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
-import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 
 class AuthorReader implements ObjectReader<Author> {
 
diff --git a/briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java b/briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java
index 2153a0ea83133e4ada3d59b8a5727cd68c21fcaa..0a8751b2b7111439e0ff44efe12c67588df55499 100644
--- a/briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/sync/DuplexOutgoingSession.java
@@ -1,7 +1,7 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.ContactRemovedEvent;
diff --git a/briar-core/src/org/briarproject/sync/IncomingSession.java b/briar-core/src/org/briarproject/sync/IncomingSession.java
index 44d36bc7019106304031626d896ff7a0350dfd23..907ffaf195ddad2265c346fac4e972d56c5b953a 100644
--- a/briar-core/src/org/briarproject/sync/IncomingSession.java
+++ b/briar-core/src/org/briarproject/sync/IncomingSession.java
@@ -1,8 +1,8 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.FormatException;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.ContactRemovedEvent;
diff --git a/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java b/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java
index 9b7e4c4b7afeb90d286f6961275dedf94ca24862..209b71362a9c8ad28860c900ef7efbd41614e1ce 100644
--- a/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java
@@ -1,6 +1,5 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.Author;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.MessageDigest;
 import org.briarproject.api.crypto.PrivateKey;
@@ -8,6 +7,7 @@ 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.identity.Author;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.Message;
 import org.briarproject.api.sync.MessageFactory;
@@ -21,7 +21,7 @@ import java.security.SecureRandom;
 
 import javax.inject.Inject;
 
-import static org.briarproject.api.AuthorConstants.MAX_SIGNATURE_LENGTH;
+import static org.briarproject.api.identity.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;
@@ -78,7 +78,7 @@ class MessageFactoryImpl implements MessageFactory {
 		Consumer signingConsumer = null;
 		if (privateKey != null) {
 			signature.initSign(privateKey);
-			signingConsumer = new org.briarproject.sync.SigningConsumer(signature);
+			signingConsumer = new 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 org.briarproject.sync.MessageImpl(id, parent, group, author, contentType,
+		return new MessageImpl(id, parent, group, author, contentType,
 				timestamp, out.toByteArray(), bodyStart, body.length);
 	}
 
diff --git a/briar-core/src/org/briarproject/sync/MessageImpl.java b/briar-core/src/org/briarproject/sync/MessageImpl.java
index 761d2e9b6e06c921c6154648029f61ae2e532c1d..dc2f7af170e07f710739831bbe21ae3565b874d0 100644
--- a/briar-core/src/org/briarproject/sync/MessageImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessageImpl.java
@@ -1,6 +1,6 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.Author;
+import org.briarproject.api.identity.Author;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.Message;
 import org.briarproject.api.sync.MessageId;
diff --git a/briar-core/src/org/briarproject/sync/MessageReader.java b/briar-core/src/org/briarproject/sync/MessageReader.java
index fc549af8312bfe7bc0cd201c05fc8b98a24ecdf3..f96c964f0b704c29f1014e791f05939d4d03b0f0 100644
--- a/briar-core/src/org/briarproject/sync/MessageReader.java
+++ b/briar-core/src/org/briarproject/sync/MessageReader.java
@@ -1,17 +1,17 @@
 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.identity.Author;
 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.identity.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;
diff --git a/briar-core/src/org/briarproject/sync/MessageVerifierImpl.java b/briar-core/src/org/briarproject/sync/MessageVerifierImpl.java
index 9c38f3b7b264d3b12d1003b9b1d355a94660fae4..13fc03abb5aca1c7f4c1a2ebc227706229132a16 100644
--- a/briar-core/src/org/briarproject/sync/MessageVerifierImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessageVerifierImpl.java
@@ -1,11 +1,11 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.Author;
 import org.briarproject.api.crypto.CryptoComponent;
 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.identity.Author;
 import org.briarproject.api.sync.Message;
 import org.briarproject.api.sync.MessageId;
 import org.briarproject.api.sync.MessageVerifier;
diff --git a/briar-core/src/org/briarproject/sync/MessagingModule.java b/briar-core/src/org/briarproject/sync/MessagingModule.java
index 205ca471773f05930a39091b9dcf1b2cf1284454..d73de1a7c5943be8c1de0033cea5d457ce8fb7f5 100644
--- a/briar-core/src/org/briarproject/sync/MessagingModule.java
+++ b/briar-core/src/org/briarproject/sync/MessagingModule.java
@@ -3,10 +3,10 @@ package org.briarproject.sync;
 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.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.sync.MessageFactory;
@@ -47,7 +47,7 @@ public class MessagingModule extends AbstractModule {
 	ObjectReader<UnverifiedMessage> getMessageReader(
 			ObjectReader<Group> groupReader,
 			ObjectReader<Author> authorReader) {
-		return new org.briarproject.sync.MessageReader(groupReader, authorReader);
+		return new MessageReader(groupReader, authorReader);
 	}
 
 	@Provides
diff --git a/briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java b/briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java
index 13c14244c019d8d96969d829a15bafcbfa17570a..ef3317dc87487b8198eb88f392f69418eeeae522 100644
--- a/briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java
+++ b/briar-core/src/org/briarproject/sync/MessagingSessionFactoryImpl.java
@@ -1,7 +1,7 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoExecutor;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DatabaseExecutor;
diff --git a/briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java b/briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java
index cfa7c6899c7cfa420371e15674e5a82665418d28..ace1d016cf1671a5acd9208b2638e34504563dda 100644
--- a/briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/sync/SimplexOutgoingSession.java
@@ -1,7 +1,7 @@
 package org.briarproject.sync;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.ContactRemovedEvent;
diff --git a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java
index 64dbe14e3fab37926c42753655b1f6ed09c8acbd..c25008141caea4424cf1cfe85b8b5ec4412e1ce5 100644
--- a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java
+++ b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java
@@ -1,7 +1,7 @@
 package org.briarproject.transport;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DatabaseExecutor;
diff --git a/briar-core/src/org/briarproject/transport/TransportKeyManager.java b/briar-core/src/org/briarproject/transport/TransportKeyManager.java
index 7818c356efa3d66cac3dc119b6d66045aad943c2..19e49a89cc62e35725fbec4eee113e61adfcab68 100644
--- a/briar-core/src/org/briarproject/transport/TransportKeyManager.java
+++ b/briar-core/src/org/briarproject/transport/TransportKeyManager.java
@@ -1,8 +1,8 @@
 package org.briarproject.transport;
 
 import org.briarproject.api.Bytes;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
diff --git a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothPlugin.java b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothPlugin.java
index 792db1398dc778457c0cd3f85b7383b8d5c6c086..1796d9a6a79da5e8e7f56be3dfb99ec72deaa6ad 100644
--- a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothPlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothPlugin.java
@@ -1,8 +1,16 @@
 package org.briarproject.plugins.bluetooth;
 
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static javax.bluetooth.DiscoveryAgent.GIAC;
+import org.briarproject.api.TransportId;
+import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.crypto.PseudoRandom;
+import org.briarproject.api.plugins.duplex.DuplexPlugin;
+import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
+import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
+import org.briarproject.api.system.Clock;
+import org.briarproject.util.LatchedReference;
+import org.briarproject.util.OsUtils;
+import org.briarproject.util.StringUtils;
 
 import java.io.IOException;
 import java.security.SecureRandom;
@@ -21,17 +29,9 @@ import javax.microedition.io.Connector;
 import javax.microedition.io.StreamConnection;
 import javax.microedition.io.StreamConnectionNotifier;
 
-import org.briarproject.api.ContactId;
-import org.briarproject.api.TransportId;
-import org.briarproject.api.TransportProperties;
-import org.briarproject.api.crypto.PseudoRandom;
-import org.briarproject.api.plugins.duplex.DuplexPlugin;
-import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
-import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
-import org.briarproject.api.system.Clock;
-import org.briarproject.util.LatchedReference;
-import org.briarproject.util.OsUtils;
-import org.briarproject.util.StringUtils;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static javax.bluetooth.DiscoveryAgent.GIAC;
 
 class BluetoothPlugin implements DuplexPlugin {
 
diff --git a/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java b/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java
index 1042ad77b6e77bdb48b1384dad1c7ee028714a96..116143225fde83a0762d2c77329c1002a35d1089 100644
--- a/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java
@@ -1,7 +1,7 @@
 package org.briarproject.plugins.file;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.simplex.SimplexPluginCallback;
 
 import java.io.File;
diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
index 48f8b3487120fdfe55739039708d83e4e44a443a..fdfeb52c30b0d473b4efb1e3649a4846c7970983 100644
--- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
@@ -1,19 +1,8 @@
 package org.briarproject.plugins.modem;
 
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Logger;
-
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.plugins.TransportConnectionReader;
 import org.briarproject.api.plugins.TransportConnectionWriter;
@@ -22,6 +11,17 @@ import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
 import org.briarproject.util.StringUtils;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Logger;
+
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+
 class ModemPlugin implements DuplexPlugin, Modem.Callback {
 
 	static final TransportId ID = new TransportId("modem");
@@ -195,7 +195,7 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 		private class Reader implements TransportConnectionReader {
 
 			public long getMaxLatency() {
-				return maxLatency;
+				return ModemPlugin.this.getMaxLatency();
 			}
 
 			public InputStream getInputStream() throws IOException {
@@ -211,11 +211,11 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 		private class Writer implements TransportConnectionWriter {
 
 			public int getMaxLatency() {
-				return getMaxLatency();
+				return ModemPlugin.this.getMaxLatency();
 			}
 
 			public int getMaxIdleTime() {
-				return getMaxIdleTime();
+				return ModemPlugin.this.getMaxIdleTime();
 			}
 
 			public long getCapacity() {
diff --git a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
index e449d1e4809470349fef4575154d9ab9d8cf3167..d942de487f027352a100676f0242e6d1a19b77c0 100644
--- a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
@@ -3,14 +3,14 @@ package org.briarproject;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.SecretKey;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
 import org.briarproject.api.sync.Ack;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupFactory;
diff --git a/briar-tests/src/org/briarproject/TestMessage.java b/briar-tests/src/org/briarproject/TestMessage.java
index bea7d78e832cfbebe4a89354cbc55a5935a7c498..a8ffc3cb3a3e45ab2cb53c3146e93d0a55bffd9a 100644
--- a/briar-tests/src/org/briarproject/TestMessage.java
+++ b/briar-tests/src/org/briarproject/TestMessage.java
@@ -1,39 +1,34 @@
 package org.briarproject;
 
-import org.briarproject.api.Author;
+import org.briarproject.api.identity.Author;
 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;
-
 public class TestMessage implements Message {
 
 	private final MessageId id, parent;
 	private final Group group;
 	private final Author author;
-	private final String contentType, subject;
+	private final String contentType;
 	private final long timestamp;
 	private final byte[] raw;
 	private final int bodyStart, bodyLength;
 
 	public TestMessage(MessageId id, MessageId parent, Group group,
-			Author author, String contentType, String subject, long timestamp,
-			byte[] raw) {
-		this(id, parent, group, author, contentType, subject, timestamp, raw, 0,
+			Author author, String contentType, long timestamp, byte[] raw) {
+		this(id, parent, group, author, contentType, timestamp, raw, 0,
 				raw.length);
 	}
 
 	public TestMessage(MessageId id, MessageId parent, Group group,
-			Author author, String contentType, String subject, long timestamp,
-			byte[] raw, int bodyStart, int bodyLength) {
+			Author author, String contentType, long timestamp, byte[] raw,
+			int bodyStart, int bodyLength) {
 		this.id = id;
 		this.parent = parent;
 		this.group = group;
 		this.author = author;
 		this.contentType = contentType;
-		this.subject = subject;
 		this.timestamp = timestamp;
 		this.raw = raw;
 		this.bodyStart = bodyStart;
@@ -60,10 +55,6 @@ public class TestMessage implements Message {
 		return contentType;
 	}
 
-	public String getSubject() {
-		return subject;
-	}
-
 	public long getTimestamp() {
 		return timestamp;
 	}
@@ -80,10 +71,6 @@ public class TestMessage implements Message {
 		return bodyLength;
 	}
 
-	public InputStream getSerialisedStream() {
-		return new ByteArrayInputStream(raw);
-	}
-
 	@Override
 	public int hashCode() {
 		return id.hashCode();
diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
index 5f1b36ed2748dfa96c9cf81f65474bf0aa904e74..98115c6c760189009d94743011360ce050130a71 100644
--- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
+++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
@@ -3,14 +3,11 @@ package org.briarproject.db;
 import org.briarproject.BriarTestCase;
 import org.briarproject.TestMessage;
 import org.briarproject.TestUtils;
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.Contact;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.NoSuchContactException;
@@ -32,6 +29,9 @@ import org.briarproject.api.event.MessagesAckedEvent;
 import org.briarproject.api.event.MessagesSentEvent;
 import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.lifecycle.ShutdownManager;
 import org.briarproject.api.sync.Ack;
 import org.briarproject.api.sync.Group;
@@ -55,7 +55,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
-import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_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;
@@ -74,7 +74,7 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 	protected final AuthorId localAuthorId;
 	protected final LocalAuthor localAuthor;
 	protected final MessageId messageId, messageId1;
-	protected final String contentType, subject;
+	protected final String contentType;
 	protected final long timestamp;
 	protected final int size;
 	protected final byte[] raw;
@@ -96,14 +96,13 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 		messageId = new MessageId(TestUtils.getRandomId());
 		messageId1 = new MessageId(TestUtils.getRandomId());
 		contentType = "text/plain";
-		subject = "Foo";
 		timestamp = System.currentTimeMillis();
 		size = 1234;
 		raw = new byte[size];
 		message = new TestMessage(messageId, null, group, author, contentType,
-				subject, timestamp, raw);
+				timestamp, raw);
 		message1 = new TestMessage(messageId1, messageId, group, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		transportId = new TransportId("id");
 		transportProperties = new TransportProperties(Collections.singletonMap(
 				"bar", "baz"));
diff --git a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
index 2a42f5ea5f01e7a84d4baed6f4a2c2c35d775721..41efa0ec6d61a0c7b08db039345068f6c7606ce2 100644
--- a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
+++ b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java
@@ -4,15 +4,15 @@ import org.briarproject.BriarTestCase;
 import org.briarproject.TestDatabaseConfig;
 import org.briarproject.TestMessage;
 import org.briarproject.TestUtils;
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.Message;
@@ -41,7 +41,7 @@ import java.util.concurrent.CountDownLatch;
 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.identity.AuthorConstants.MAX_PUBLIC_KEY_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;
@@ -65,7 +65,7 @@ public class H2DatabaseTest extends BriarTestCase {
 	private final AuthorId localAuthorId;
 	private final LocalAuthor localAuthor;
 	private final MessageId messageId;
-	private final String contentType, subject;
+	private final String contentType;
 	private final long timestamp;
 	private final int size;
 	private final byte[] raw;
@@ -83,13 +83,12 @@ public class H2DatabaseTest extends BriarTestCase {
 				new byte[MAX_PUBLIC_KEY_LENGTH], new byte[100], 1234);
 		messageId = new MessageId(TestUtils.getRandomId());
 		contentType = "text/plain";
-		subject = "Foo";
 		timestamp = System.currentTimeMillis();
 		size = 1234;
 		raw = new byte[size];
 		random.nextBytes(raw);
 		message = new TestMessage(messageId, null, group, author, contentType,
-				subject, timestamp, raw);
+				timestamp, raw);
 		transportId = new TransportId("id");
 		contactId = new ContactId(1);
 	}
@@ -311,7 +310,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Add some messages to ack
 		MessageId messageId1 = new MessageId(TestUtils.getRandomId());
 		Message message1 = new TestMessage(messageId1, null, group, author,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, message, true);
 		db.addStatus(txn, contactId, messageId, false, true);
 		db.raiseAckFlag(txn, contactId, messageId);
@@ -408,7 +407,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		byte[] largeBody = new byte[ONE_MEGABYTE];
 		for (int i = 0; i < largeBody.length; i++) largeBody[i] = (byte) i;
 		Message message = new TestMessage(messageId, null, group, author,
-				contentType, subject, timestamp, largeBody);
+				contentType, timestamp, largeBody);
 		Database<Connection> db = open(false);
 
 		// Sanity check: there should be enough space on disk for this test
@@ -730,7 +729,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// A message with no parent should return null
 		MessageId childId = new MessageId(TestUtils.getRandomId());
 		Message child = new TestMessage(childId, null, group, null, contentType,
-				subject, timestamp, raw);
+				timestamp, raw);
 		db.addMessage(txn, child, true);
 		assertTrue(db.containsMessage(txn, childId));
 		assertNull(db.getParent(txn, childId));
@@ -751,7 +750,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		MessageId childId = new MessageId(TestUtils.getRandomId());
 		MessageId parentId = new MessageId(TestUtils.getRandomId());
 		Message child = new TestMessage(childId, parentId, group, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, child, true);
 		assertTrue(db.containsMessage(txn, childId));
 		assertFalse(db.containsMessage(txn, parentId));
@@ -777,9 +776,9 @@ public class H2DatabaseTest extends BriarTestCase {
 		MessageId childId = new MessageId(TestUtils.getRandomId());
 		MessageId parentId = new MessageId(TestUtils.getRandomId());
 		Message child = new TestMessage(childId, parentId, group, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		Message parent = new TestMessage(parentId, null, group1, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, child, true);
 		db.addMessage(txn, parent, true);
 		assertTrue(db.containsMessage(txn, childId));
@@ -802,9 +801,9 @@ public class H2DatabaseTest extends BriarTestCase {
 		MessageId childId = new MessageId(TestUtils.getRandomId());
 		MessageId parentId = new MessageId(TestUtils.getRandomId());
 		Message child = new TestMessage(childId, parentId, group, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		Message parent = new TestMessage(parentId, null, group, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, child, true);
 		db.addMessage(txn, parent, true);
 		assertTrue(db.containsMessage(txn, childId));
@@ -828,10 +827,10 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Store a couple of messages
 		int bodyLength = raw.length - 20;
 		Message message = new TestMessage(messageId, null, group, null,
-				contentType, subject, timestamp, raw, 5, bodyLength);
+				contentType, timestamp, raw, 5, bodyLength);
 		MessageId messageId1 = new MessageId(TestUtils.getRandomId());
 		Message message1 = new TestMessage(messageId1, null, group, null,
-				contentType, subject, timestamp, raw, 10, bodyLength);
+				contentType, timestamp, raw, 10, bodyLength);
 		db.addMessage(txn, message, true);
 		db.addMessage(txn, message1, true);
 
@@ -871,7 +870,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		MessageId parentId = new MessageId(TestUtils.getRandomId());
 		long timestamp1 = System.currentTimeMillis();
 		Message message1 = new TestMessage(messageId1, parentId, group, author,
-				contentType, subject, timestamp1, raw);
+				contentType, timestamp1, raw);
 		db.addMessage(txn, message1, true);
 		// Mark one of the messages read
 		db.setReadFlag(txn, messageId, true);
@@ -930,12 +929,12 @@ public class H2DatabaseTest extends BriarTestCase {
 				new byte[MAX_PUBLIC_KEY_LENGTH]);
 		MessageId messageId1 = new MessageId(TestUtils.getRandomId());
 		Message message1 = new TestMessage(messageId1, null, group, author1,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, message1, true);
 		// Store an anonymous message - status ANONYMOUS
 		MessageId messageId2 = new MessageId(TestUtils.getRandomId());
 		Message message2 = new TestMessage(messageId2, null, group, null,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, message2, true);
 
 		// Retrieve the message headers (order is undefined)
@@ -1008,13 +1007,13 @@ public class H2DatabaseTest extends BriarTestCase {
 		db.addMessage(txn, message, true);
 		MessageId messageId1 = new MessageId(TestUtils.getRandomId());
 		Message message1 = new TestMessage(messageId1, null, group, author,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, message1, true);
 
 		// Store one message in the second group
 		MessageId messageId2 = new MessageId(TestUtils.getRandomId());
 		Message message2 = new TestMessage(messageId2, null, group1, author,
-				contentType, subject, timestamp, raw);
+				contentType, timestamp, raw);
 		db.addMessage(txn, message2, true);
 
 		// Mark one of the messages in the first group read
diff --git a/briar-tests/src/org/briarproject/plugins/ConnectionRegistryImplTest.java b/briar-tests/src/org/briarproject/plugins/ConnectionRegistryImplTest.java
index a31d9124018d66ee9290c9b3aaba142e1ec4f9f9..8ea235249bca696de2b2edc2323c5d9ecad2a3cc 100644
--- a/briar-tests/src/org/briarproject/plugins/ConnectionRegistryImplTest.java
+++ b/briar-tests/src/org/briarproject/plugins/ConnectionRegistryImplTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.plugins;
 
 import org.briarproject.BriarTestCase;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.event.ContactConnectedEvent;
 import org.briarproject.api.event.ContactDisconnectedEvent;
 import org.briarproject.api.event.EventBus;
@@ -11,7 +11,6 @@ import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -52,19 +51,19 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
 		// Check that a registered connection shows up - this should
 		// broadcast a ContactConnectedEvent
 		c.registerConnection(contactId, transportId);
-		assertEquals(Arrays.asList(contactId),
+		assertEquals(Collections.singletonList(contactId),
 				c.getConnectedContacts(transportId));
 		assertEquals(Collections.emptyList(),
 				c.getConnectedContacts(transportId1));
 		// Register an identical connection - lookup should be unaffected
 		c.registerConnection(contactId, transportId);
-		assertEquals(Arrays.asList(contactId),
+		assertEquals(Collections.singletonList(contactId),
 				c.getConnectedContacts(transportId));
 		assertEquals(Collections.emptyList(),
 				c.getConnectedContacts(transportId1));
 		// Unregister one of the connections - lookup should be unaffected
 		c.unregisterConnection(contactId, transportId);
-		assertEquals(Arrays.asList(contactId),
+		assertEquals(Collections.singletonList(contactId),
 				c.getConnectedContacts(transportId));
 		assertEquals(Collections.emptyList(),
 				c.getConnectedContacts(transportId1));
@@ -79,7 +78,9 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
 		try {
 			c.unregisterConnection(contactId, transportId);
 			fail();
-		} catch (IllegalArgumentException expected) {}
+		} catch (IllegalArgumentException expected) {
+			// Expected
+		}
 		// Register both contacts with one transport, one contact with both -
 		// this should broadcast two ContactConnectedEvents
 		c.registerConnection(contactId, transportId);
@@ -89,7 +90,7 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
 		assertEquals(2, connected.size());
 		assertTrue(connected.contains(contactId));
 		assertTrue(connected.contains(contactId1));
-		assertEquals(Arrays.asList(contactId1),
+		assertEquals(Collections.singletonList(contactId1),
 				c.getConnectedContacts(transportId1));
 		context.assertIsSatisfied();
 	}
diff --git a/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java b/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java
index a32cf9683bc5e105250965cab9f5fcd7ba8931e1..640632b4de03471cc039145d809a4325a608e9b5 100644
--- a/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java
+++ b/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.plugins;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
@@ -45,7 +45,6 @@ public abstract class DuplexClientTest extends DuplexTest {
 			d = plugin.createInvitationConnection(r, CONNECTION_TIMEOUT);
 			if (d == null) {
 				System.out.println("Connection failed");
-				return;
 			} else {
 				System.out.println("Connection created");
 				sendChallengeReceiveResponse(d);
diff --git a/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java b/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java
index daf3c47407a19f83787ab22ba85aeb08e6fbf50e..134bf36b69fca9b9225ffb19f0ec0ef52a67f75e 100644
--- a/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java
+++ b/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.plugins;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
 
@@ -42,7 +42,6 @@ public abstract class DuplexServerTest extends DuplexTest {
 					getPseudoRandom(123), CONNECTION_TIMEOUT);
 			if (d == null) {
 				System.out.println("Connection failed");
-				return;
 			} else {
 				System.out.println("Connection created");
 				receiveChallengeSendResponse(d);
diff --git a/briar-tests/src/org/briarproject/plugins/DuplexTest.java b/briar-tests/src/org/briarproject/plugins/DuplexTest.java
index 5d54e12c1f7efe37075470fcbaaf348bf56f3a2d..d20418a3f52cc06a5176522200a69d5fc675566d 100644
--- a/briar-tests/src/org/briarproject/plugins/DuplexTest.java
+++ b/briar-tests/src/org/briarproject/plugins/DuplexTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.plugins;
 
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.plugins.TransportConnectionReader;
 import org.briarproject.api.plugins.TransportConnectionWriter;
diff --git a/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java b/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java
index fdf768548e0e222dc2a80e9dfe455c645e00d1b9..02e0a343efceb6d687947b4583cde192f0456686 100644
--- a/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java
+++ b/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.plugins.bluetooth;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.plugins.DuplexClientTest;
 import org.briarproject.system.SystemClock;
 
diff --git a/briar-tests/src/org/briarproject/plugins/file/RemovableDrivePluginTest.java b/briar-tests/src/org/briarproject/plugins/file/RemovableDrivePluginTest.java
index 58cce58ac615ef4a07ed044c6f521b064e4f1a49..6a28037028658c48283352a0e8329956a95f6f2c 100644
--- a/briar-tests/src/org/briarproject/plugins/file/RemovableDrivePluginTest.java
+++ b/briar-tests/src/org/briarproject/plugins/file/RemovableDrivePluginTest.java
@@ -2,7 +2,7 @@ package org.briarproject.plugins.file;
 
 import org.briarproject.BriarTestCase;
 import org.briarproject.TestUtils;
-import org.briarproject.api.ContactId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.TransportConnectionWriter;
 import org.briarproject.api.plugins.simplex.SimplexPluginCallback;
 import org.briarproject.plugins.ImmediateExecutor;
diff --git a/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java b/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java
index f186355b52896301b86064c7d86ab42203678754..10f885130f522fc70c18241f92e1e3e18646c7e3 100644
--- a/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java
+++ b/briar-tests/src/org/briarproject/plugins/modem/ModemPluginTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.plugins.modem;
 
 import org.briarproject.BriarTestCase;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java
index ac6bfb305a4f3998fc640da13f53b5cffd381d47..4975d78c1004e5598252e410afd3a6a8b3bde027 100644
--- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java
+++ b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.plugins.tcp;
 
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.plugins.DuplexClientTest;
 
 import java.util.Collections;
diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java
index 575b8f136e3c048a73998be5f64f9ae3274b86ff..96f730d3c7201199a6bea04ddb8266b82e5b101e 100644
--- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java
+++ b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.plugins.tcp;
 
 import org.briarproject.BriarTestCase;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportConfig;
 import org.briarproject.api.TransportProperties;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
diff --git a/briar-tests/src/org/briarproject/sync/ConstantsTest.java b/briar-tests/src/org/briarproject/sync/ConstantsTest.java
index 6a935970e87c66df94a4d81e1870e2e48a81cc91..c823206a4901ea1e75aa29d09729217ada628b08 100644
--- a/briar-tests/src/org/briarproject/sync/ConstantsTest.java
+++ b/briar-tests/src/org/briarproject/sync/ConstantsTest.java
@@ -8,8 +8,6 @@ import org.briarproject.TestDatabaseModule;
 import org.briarproject.TestLifecycleModule;
 import org.briarproject.TestSystemModule;
 import org.briarproject.TestUtils;
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorFactory;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.TransportProperties;
 import org.briarproject.api.UniqueId;
@@ -17,6 +15,8 @@ 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.identity.Author;
+import org.briarproject.api.identity.AuthorFactory;
 import org.briarproject.api.sync.Ack;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupFactory;
@@ -40,12 +40,12 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Random;
 
-import static org.briarproject.api.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
-import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
-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.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+import static org.briarproject.api.identity.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_GROUP_NAME_LENGTH;
diff --git a/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java b/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java
index 9c0308b7b669f7e295c9704da4a80d5b54049187..04db6db752ce5b9aa1e51fbd24dafce344cb857e 100644
--- a/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java
@@ -8,11 +8,8 @@ import org.briarproject.TestDatabaseModule;
 import org.briarproject.TestLifecycleModule;
 import org.briarproject.TestSystemModule;
 import org.briarproject.TestUtils;
-import org.briarproject.api.Author;
-import org.briarproject.api.AuthorId;
-import org.briarproject.api.ContactId;
-import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DatabaseComponent;
@@ -20,6 +17,9 @@ 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.identity.Author;
+import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.sync.Message;
@@ -52,7 +52,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Collections;
 
-import static org.briarproject.api.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_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;
diff --git a/briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java b/briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java
index 714e02430244786098eaa98bc0bcd637f245df78..1848bad7fcc1d9b7f32ee4516c05f8bdcfa98b0d 100644
--- a/briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java
+++ b/briar-tests/src/org/briarproject/sync/SimplexOutgoingSessionTest.java
@@ -2,8 +2,8 @@ package org.briarproject.sync;
 
 import org.briarproject.BriarTestCase;
 import org.briarproject.TestUtils;
-import org.briarproject.api.ContactId;
 import org.briarproject.api.TransportId;
+import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.sync.Ack;