diff --git a/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java
index 758a94595714bcc74fd07bd10fdadb51def36770..8fd7479f457fc4f331e17d264da2817c782014ce 100644
--- a/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java
@@ -12,7 +12,6 @@ import org.briarproject.api.blogs.BlogPostHeader;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.Event;
@@ -455,6 +454,7 @@ public class BlogManagerTest extends BriarIntegrationTest {
 
 	@Test
 	public void testCommentOnOwnComment() throws Exception {
+
 		startLifecycles();
 		defaultInit();
 
@@ -526,26 +526,15 @@ public class BlogManagerTest extends BriarIntegrationTest {
 	}
 
 	private void defaultInit() throws DbException {
-		addDefaultIdentities();
+		getDefaultIdentities();
 		addDefaultContacts();
 		listenToEvents();
 	}
 
-	private void addDefaultIdentities() throws DbException {
-		KeyPair keyPair0 = crypto.generateSignatureKeyPair();
-		byte[] publicKey0 = keyPair0.getPublic().getEncoded();
-		byte[] privateKey0 = keyPair0.getPrivate().getEncoded();
-		author0 = authorFactory
-				.createLocalAuthor(AUTHOR1, publicKey0, privateKey0);
-		identityManager0.addLocalAuthor(author0);
+	private void getDefaultIdentities() throws DbException {
+		author0 = identityManager0.getLocalAuthor();
+		author1 = identityManager1.getLocalAuthor();
 		blog0 = blogFactory.createBlog(author0);
-
-		KeyPair keyPair1 = crypto.generateSignatureKeyPair();
-		byte[] publicKey1 = keyPair1.getPublic().getEncoded();
-		byte[] privateKey1 = keyPair1.getPrivate().getEncoded();
-		author1 = authorFactory
-				.createLocalAuthor(AUTHOR2, publicKey1, privateKey1);
-		identityManager1.addLocalAuthor(author1);
 		blog1 = blogFactory.createBlog(author1);
 	}
 
@@ -603,8 +592,8 @@ public class BlogManagerTest extends BriarIntegrationTest {
 		// Start the lifecycle manager and wait for it to finish
 		lifecycleManager0 = t0.getLifecycleManager();
 		lifecycleManager1 = t1.getLifecycleManager();
-		lifecycleManager0.startServices();
-		lifecycleManager1.startServices();
+		lifecycleManager0.startServices(AUTHOR1);
+		lifecycleManager1.startServices(AUTHOR2);
 		lifecycleManager0.waitForStartup();
 		lifecycleManager1.waitForStartup();
 	}
diff --git a/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java
index 0dc2e877c575fce332569cf3822980833936c29d..92bbedd71b774b22b9abc16e25a6717d115e074b 100644
--- a/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java
@@ -13,7 +13,6 @@ import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.BlogInvitationReceivedEvent;
@@ -617,9 +616,9 @@ public class BlogSharingIntegrationTest extends BriarIntegrationTest {
 		lifecycleManager0 = t0.getLifecycleManager();
 		lifecycleManager1 = t1.getLifecycleManager();
 		lifecycleManager2 = t2.getLifecycleManager();
-		lifecycleManager0.startServices();
-		lifecycleManager1.startServices();
-		lifecycleManager2.startServices();
+		lifecycleManager0.startServices(SHARER);
+		lifecycleManager1.startServices(INVITEE);
+		lifecycleManager2.startServices(CONTACT2);
 		lifecycleManager0.waitForStartup();
 		lifecycleManager1.waitForStartup();
 		lifecycleManager2.waitForStartup();
@@ -636,30 +635,16 @@ public class BlogSharingIntegrationTest extends BriarIntegrationTest {
 	}
 
 	private void defaultInit(boolean accept) throws DbException {
-		addDefaultIdentities();
+		getDefaultIdentities();
 		addDefaultContacts();
 		getPersonalBlogOfSharer();
 		listenToEvents(accept);
 	}
 
-	private void addDefaultIdentities() throws DbException {
-		KeyPair keyPair = cryptoComponent.generateSignatureKeyPair();
-		author0 = authorFactory.createLocalAuthor(SHARER,
-				keyPair.getPublic().getEncoded(),
-				keyPair.getPrivate().getEncoded());
-		identityManager0.addLocalAuthor(author0);
-
-		keyPair = cryptoComponent.generateSignatureKeyPair();
-		author1 = authorFactory.createLocalAuthor(INVITEE,
-				keyPair.getPublic().getEncoded(),
-				keyPair.getPrivate().getEncoded());
-		identityManager1.addLocalAuthor(author1);
-
-		keyPair = cryptoComponent.generateSignatureKeyPair();
-		author2 = authorFactory.createLocalAuthor(CONTACT2,
-				keyPair.getPublic().getEncoded(),
-				keyPair.getPrivate().getEncoded());
-		identityManager2.addLocalAuthor(author2);
+	private void getDefaultIdentities() throws DbException {
+		author0 = identityManager0.getLocalAuthor();
+		author1 = identityManager1.getLocalAuthor();
+		author2 = identityManager2.getLocalAuthor();
 	}
 
 	private void addDefaultContacts() throws DbException {
diff --git a/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java
index 059f3912e6e8fa45935f0bfa86181f30ef982674..07e11e038f93ba4cc85908a71e33d2f384616e04 100644
--- a/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java
@@ -140,7 +140,7 @@ public class ForumManagerTest extends BriarIntegrationTest {
 	@Test
 	public void testForumPost() throws Exception {
 		startLifecycles();
-		addDefaultIdentities();
+		getDefaultIdentities();
 		Forum forum = forumManager0.addForum("TestForum");
 		assertEquals(1, forumManager0.getForums().size());
 		final long ms1 = clock.currentTimeMillis() - 1000L;
@@ -362,26 +362,15 @@ public class ForumManagerTest extends BriarIntegrationTest {
 	}
 
 	private void defaultInit() throws DbException {
-		addDefaultIdentities();
+		getDefaultIdentities();
 		addDefaultContacts();
 		addForum();
 		listenToEvents();
 	}
 
-	private void addDefaultIdentities() throws DbException {
-		KeyPair keyPair0 = crypto.generateSignatureKeyPair();
-		byte[] publicKey0 = keyPair0.getPublic().getEncoded();
-		byte[] privateKey0 = keyPair0.getPrivate().getEncoded();
-		author0 = authorFactory
-				.createLocalAuthor(SHARER, publicKey0, privateKey0);
-		identityManager0.addLocalAuthor(author0);
-
-		KeyPair keyPair1 = crypto.generateSignatureKeyPair();
-		byte[] publicKey1 = keyPair1.getPublic().getEncoded();
-		byte[] privateKey1 = keyPair1.getPrivate().getEncoded();
-		author1 = authorFactory
-				.createLocalAuthor(INVITEE, publicKey1, privateKey1);
-		identityManager1.addLocalAuthor(author1);
+	private void getDefaultIdentities() throws DbException {
+		author0 = identityManager0.getLocalAuthor();
+		author1 = identityManager1.getLocalAuthor();
 	}
 
 	private void addDefaultContacts() throws DbException {
@@ -442,8 +431,8 @@ public class ForumManagerTest extends BriarIntegrationTest {
 		// Start the lifecycle manager and wait for it to finish
 		lifecycleManager0 = t0.getLifecycleManager();
 		lifecycleManager1 = t1.getLifecycleManager();
-		lifecycleManager0.startServices();
-		lifecycleManager1.startServices();
+		lifecycleManager0.startServices(SHARER);
+		lifecycleManager1.startServices(INVITEE);
 		lifecycleManager0.waitForStartup();
 		lifecycleManager1.waitForStartup();
 	}
diff --git a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java
index a30be29ce8d3da4e35fd4367235e0e7be1e57ba0..ccf25040a1b7c66911ae681353739780f64f7138 100644
--- a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java
@@ -10,7 +10,6 @@ import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.data.BdfList;
 import org.briarproject.api.db.DatabaseComponent;
@@ -729,7 +728,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase {
 		startLifecycles();
 		try {
 			// initialize
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addForumForSharer();
 
@@ -1017,9 +1016,9 @@ public class ForumSharingIntegrationTest extends BriarTestCase {
 		lifecycleManager0 = t0.getLifecycleManager();
 		lifecycleManager1 = t1.getLifecycleManager();
 		lifecycleManager2 = t2.getLifecycleManager();
-		lifecycleManager0.startServices();
-		lifecycleManager1.startServices();
-		lifecycleManager2.startServices();
+		lifecycleManager0.startServices(SHARER);
+		lifecycleManager1.startServices(INVITEE);
+		lifecycleManager2.startServices(SHARER2);
 		lifecycleManager0.waitForStartup();
 		lifecycleManager1.waitForStartup();
 		lifecycleManager2.waitForStartup();
@@ -1036,30 +1035,16 @@ public class ForumSharingIntegrationTest extends BriarTestCase {
 	}
 
 	private void defaultInit(boolean accept) throws DbException {
-		addDefaultIdentities();
+		getDefaultIdentities();
 		addDefaultContacts();
 		addForumForSharer();
 		listenToEvents(accept);
 	}
 
-	private void addDefaultIdentities() throws DbException {
-		KeyPair keyPair = cryptoComponent.generateSignatureKeyPair();
-		author0 = authorFactory.createLocalAuthor(SHARER,
-				keyPair.getPublic().getEncoded(),
-				keyPair.getPrivate().getEncoded());
-		identityManager0.addLocalAuthor(author0);
-
-		keyPair = cryptoComponent.generateSignatureKeyPair();
-		author1 = authorFactory.createLocalAuthor(INVITEE,
-				keyPair.getPublic().getEncoded(),
-				keyPair.getPrivate().getEncoded());
-		identityManager1.addLocalAuthor(author1);
-
-		keyPair = cryptoComponent.generateSignatureKeyPair();
-		author2 = authorFactory.createLocalAuthor(SHARER2,
-				keyPair.getPublic().getEncoded(),
-				keyPair.getPrivate().getEncoded());
-		identityManager2.addLocalAuthor(author2);
+	private void getDefaultIdentities() throws DbException {
+		author0 = identityManager0.getLocalAuthor();
+		author1 = identityManager1.getLocalAuthor();
+		author2 = identityManager2.getLocalAuthor();
 	}
 
 	private void addDefaultContacts() throws DbException {
diff --git a/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java
index 18a6d5eb438981b0dd3a3731e787a37c106fa5e1..409d4af7feea64f15c857d8a7a89ccbdb837dcc5 100644
--- a/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java
@@ -416,7 +416,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
 		byte[] privateKey0 = keyPair0.getPrivate().getEncoded();
 		author0 = authorFactory
 				.createLocalAuthor(AUTHOR1, publicKey0, privateKey0);
-		identityManager0.addLocalAuthor(author0);
+		identityManager0.registerLocalAuthor(author0);
 		privateGroup0 =
 				privateGroupFactory.createPrivateGroup("Testgroup", author0);
 		groupId0 = privateGroup0.getId();
@@ -426,7 +426,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
 		byte[] privateKey1 = keyPair1.getPrivate().getEncoded();
 		author1 = authorFactory
 				.createLocalAuthor(AUTHOR2, publicKey1, privateKey1);
-		identityManager1.addLocalAuthor(author1);
+		identityManager1.registerLocalAuthor(author1);
 	}
 
 	private void addDefaultContacts() throws DbException {
@@ -531,8 +531,8 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
 		// Start the lifecycle manager and wait for it to finish
 		lifecycleManager0 = t0.getLifecycleManager();
 		lifecycleManager1 = t1.getLifecycleManager();
-		lifecycleManager0.startServices();
-		lifecycleManager1.startServices();
+		lifecycleManager0.startServices(AUTHOR1);
+		lifecycleManager1.startServices(AUTHOR2);
 		lifecycleManager0.waitForStartup();
 		lifecycleManager1.waitForStartup();
 	}
diff --git a/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java
index 295b41c41b28b7a9acce371ec5fed12d6bd2cda3..cc98b42c0347af7622f2954ef26d2e672b0babc8 100644
--- a/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java
@@ -43,6 +43,9 @@ import static org.junit.Assert.assertTrue;
 
 public class SimplexMessagingIntegrationTest extends BriarTestCase {
 
+	private final static String ALICE = "Alice";
+	private final static String BOB = "Bob";
+
 	private final File testDir = TestUtils.getTestDirectory();
 	private final File aliceDir = new File(testDir, "alice");
 	private final File bobDir = new File(testDir, "bob");
@@ -69,6 +72,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		read(write());
 	}
 
+
 	private byte[] write() throws Exception {
 		// Instantiate Alice's services
 		LifecycleManager lifecycleManager = alice.getLifecycleManager();
@@ -83,17 +87,17 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		SyncSessionFactory syncSessionFactory = alice.getSyncSessionFactory();
 
 		// Start the lifecycle manager
-		lifecycleManager.startServices();
+		lifecycleManager.startServices(null);
 		lifecycleManager.waitForStartup();
 		// Add an identity for Alice
 		LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice",
 				new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp);
-		identityManager.addLocalAuthor(aliceAuthor);
+		identityManager.registerLocalAuthor(aliceAuthor);
 		// Add Bob as a contact
-		Author bobAuthor = new Author(bobId, "Bob",
+		Author bobAuthor = new Author(bobId, BOB,
 				new byte[MAX_PUBLIC_KEY_LENGTH]);
-		ContactId contactId = contactManager.addContact(bobAuthor, aliceId,
-				master, timestamp, true, true, true);
+		ContactId contactId = contactManager.addContact(bobAuthor,
+				aliceAuthor.getId(), master, timestamp, true, true, true);
 
 		// Send Bob a message
 		GroupId groupId = messagingManager.getConversationId(contactId);
@@ -136,18 +140,17 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		bob.getMessagingManager();
 
 		// Start the lifecyle manager
-		lifecycleManager.startServices();
+		lifecycleManager.startServices(null);
 		lifecycleManager.waitForStartup();
 		// Add an identity for Bob
-		LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob",
+		LocalAuthor bobAuthor = new LocalAuthor(bobId, BOB,
 				new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp);
-		identityManager.addLocalAuthor(bobAuthor);
+		identityManager.registerLocalAuthor(bobAuthor);
 		// Add Alice as a contact
-		Author aliceAuthor = new Author(aliceId, "Alice",
+		Author aliceAuthor = new Author(aliceId, ALICE,
 				new byte[MAX_PUBLIC_KEY_LENGTH]);
-		ContactId contactId = contactManager.addContact(aliceAuthor, bobId,
-				master, timestamp, false, true, true);
-
+		ContactId contactId = contactManager.addContact(aliceAuthor,
+				bobAuthor.getId(), master, timestamp, false, true, true);
 		// Set up an event listener
 		MessageListener listener = new MessageListener();
 		bob.getEventBus().addListener(listener);
diff --git a/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java
index e9c4487a4e6047ad64b368e42de288aa196f5698..cc1560291fcd007a9af47feb04b17dd48a16a19a 100644
--- a/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java
+++ b/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java
@@ -188,7 +188,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroductionSession() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, true);
 			addTransportProperties();
@@ -282,7 +282,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroductionSessionFirstDecline() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(false, true);
 			addTransportProperties();
@@ -349,7 +349,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroductionSessionSecondDecline() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, false);
 			addTransportProperties();
@@ -411,7 +411,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroductionSessionDelayedFirstDecline() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(false, false);
 			addTransportProperties();
@@ -464,7 +464,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testResponseAndAckInOneSession() throws Exception {
 		startLifecycles();
 
-		addDefaultIdentities();
+		getDefaultIdentities();
 		addDefaultContacts();
 		addListeners(true, true);
 		addTransportProperties();
@@ -512,7 +512,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroductionToSameContact() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, false);
 			addTransportProperties();
@@ -541,19 +541,12 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroductionToIdentitiesOfSameContact() throws Exception {
 		startLifecycles();
 		try {
-			// Add Identities
-			author0 = authorFactory.createLocalAuthor(INTRODUCER,
-					TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH),
-					TestUtils.getRandomBytes(123));
-			identityManager0.addLocalAuthor(author0);
-			author1 = authorFactory.createLocalAuthor(INTRODUCEE1,
-					TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH),
-					TestUtils.getRandomBytes(123));
-			identityManager1.addLocalAuthor(author1);
+			// Get Identities
+			getDefaultIdentities();
 			author2 = authorFactory.createLocalAuthor(INTRODUCEE2,
 					TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH),
 					TestUtils.getRandomBytes(123));
-			identityManager1.addLocalAuthor(author2);
+			identityManager1.registerLocalAuthor(author2);
 
 			// Add introducees' authors as contacts
 			contactId1 = contactManager0.addContact(author1,
@@ -651,7 +644,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testSessionIdReuse() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, true);
 			addTransportProperties();
@@ -719,7 +712,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroducerRemovedCleanup() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, true);
 			addTransportProperties();
@@ -776,7 +769,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 	public void testIntroduceesRemovedCleanup() throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, true);
 			addTransportProperties();
@@ -847,7 +840,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 			throws Exception {
 		startLifecycles();
 		try {
-			addDefaultIdentities();
+			getDefaultIdentities();
 			addDefaultContacts();
 			addListeners(true, true);
 			addTransportProperties();
@@ -1091,9 +1084,9 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 		lifecycleManager0 = t0.getLifecycleManager();
 		lifecycleManager1 = t1.getLifecycleManager();
 		lifecycleManager2 = t2.getLifecycleManager();
-		lifecycleManager0.startServices();
-		lifecycleManager1.startServices();
-		lifecycleManager2.startServices();
+		lifecycleManager0.startServices(INTRODUCER);
+		lifecycleManager1.startServices(INTRODUCEE1);
+		lifecycleManager2.startServices(INTRODUCEE2);
 		lifecycleManager0.waitForStartup();
 		lifecycleManager1.waitForStartup();
 		lifecycleManager2.waitForStartup();
@@ -1138,25 +1131,11 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest {
 		t2.getEventBus().addListener(listener2);
 	}
 
-	private void addDefaultIdentities() throws DbException {
-		KeyPair keyPair0 = crypto.generateSignatureKeyPair();
-		byte[] publicKey0 = keyPair0.getPublic().getEncoded();
-		byte[] privateKey0 = keyPair0.getPrivate().getEncoded();
-		author0 = authorFactory
-				.createLocalAuthor(INTRODUCER, publicKey0, privateKey0);
-		identityManager0.addLocalAuthor(author0);
-		KeyPair keyPair1 = crypto.generateSignatureKeyPair();
-		byte[] publicKey1 = keyPair1.getPublic().getEncoded();
-		byte[] privateKey1 = keyPair1.getPrivate().getEncoded();
-		author1 = authorFactory
-				.createLocalAuthor(INTRODUCEE1, publicKey1, privateKey1);
-		identityManager1.addLocalAuthor(author1);
-		KeyPair keyPair2 = crypto.generateSignatureKeyPair();
-		byte[] publicKey2 = keyPair2.getPublic().getEncoded();
-		byte[] privateKey2 = keyPair2.getPrivate().getEncoded();
-		author2 = authorFactory
-				.createLocalAuthor(INTRODUCEE2, publicKey2, privateKey2);
-		identityManager2.addLocalAuthor(author2);
+	private void getDefaultIdentities() throws DbException {
+		author0 = identityManager0.getLocalAuthor();
+		author1 = identityManager1.getLocalAuthor();
+		author2 = identityManager2.getLocalAuthor();
+
 	}
 
 	private void addDefaultContacts() throws DbException {
diff --git a/briar-android/src/org/briarproject/android/AppModule.java b/briar-android/src/org/briarproject/android/AppModule.java
index 5060b5f31bfd05c8ad89d1bf3e685fd9823a28d4..2ad15515cec97ef8be2917063c0a8e39d89f9819 100644
--- a/briar-android/src/org/briarproject/android/AppModule.java
+++ b/briar-android/src/org/briarproject/android/AppModule.java
@@ -77,6 +77,7 @@ public class AppModule {
 		return new DatabaseConfig() {
 
 			private volatile SecretKey key = null;
+			private volatile String nickName;
 
 			@Override
 			public boolean databaseExists() {
@@ -95,6 +96,16 @@ public class AppModule {
 				this.key = key;
 			}
 
+			@Override
+			public void setAuthorNick(String nickName) {
+				this.nickName = nickName;
+			}
+
+			@Override
+			public String getAuthorNick() {
+				return nickName;
+			}
+
 			@Override
 			public SecretKey getEncryptionKey() {
 				return key;
diff --git a/briar-android/src/org/briarproject/android/BriarActivity.java b/briar-android/src/org/briarproject/android/BriarActivity.java
index c0bda36a8a722b6526e075fa7bf73ea2526f1544..9d162b62d6702b4863c888f1afafd51041235d14 100644
--- a/briar-android/src/org/briarproject/android/BriarActivity.java
+++ b/briar-android/src/org/briarproject/android/BriarActivity.java
@@ -22,8 +22,6 @@ import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
 @SuppressLint("Registered")
 public abstract class BriarActivity extends BaseActivity {
 
-	public static final String KEY_LOCAL_AUTHOR_HANDLE =
-			"briar.LOCAL_AUTHOR_HANDLE";
 	public static final String KEY_STARTUP_FAILED = "briar.STARTUP_FAILED";
 	public static final String GROUP_ID = "briar.GROUP_ID";
 	public static final String GROUP_NAME = "briar.GROUP_NAME";
diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java
index f03751821ddcc5886cb31715e32ffc9f1896140e..812399e56a5cde3e60d6734563060abde056ce99 100644
--- a/briar-android/src/org/briarproject/android/BriarService.java
+++ b/briar-android/src/org/briarproject/android/BriarService.java
@@ -45,11 +45,13 @@ public class BriarService extends Service {
 	private final AtomicBoolean created = new AtomicBoolean(false);
 	private final Binder binder = new BriarBinder();
 
-	@Inject protected DatabaseConfig databaseConfig;
-
+	@Inject
+	protected DatabaseConfig databaseConfig;
 	// Fields that are accessed from background threads must be volatile
-	@Inject protected volatile LifecycleManager lifecycleManager;
-	@Inject protected volatile AndroidExecutor androidExecutor;
+	@Inject
+	protected volatile LifecycleManager lifecycleManager;
+	@Inject
+	protected volatile AndroidExecutor androidExecutor;
 	private volatile boolean started = false;
 
 	@Override
@@ -91,7 +93,8 @@ public class BriarService extends Service {
 		new Thread() {
 			@Override
 			public void run() {
-				StartResult result = lifecycleManager.startServices();
+				StartResult result = lifecycleManager
+						.startServices(databaseConfig.getAuthorNick());
 				if (result == SUCCESS) {
 					started = true;
 				} else if (result == ALREADY_RUNNING) {
@@ -169,24 +172,32 @@ public class BriarService extends Service {
 		// FIXME: Work out what to do about it
 	}
 
-	/** Waits for all services to start before returning. */
+	/**
+	 * Waits for all services to start before returning.
+	 */
 	public void waitForStartup() throws InterruptedException {
 		lifecycleManager.waitForStartup();
 	}
 
-	/** Waits for all services to stop before returning. */
+	/**
+	 * Waits for all services to stop before returning.
+	 */
 	public void waitForShutdown() throws InterruptedException {
 		lifecycleManager.waitForShutdown();
 	}
 
-	/** Starts the shutdown process. */
+	/**
+	 * Starts the shutdown process.
+	 */
 	public void shutdown() {
 		stopSelf(); // This will call onDestroy()
 	}
 
 	public class BriarBinder extends Binder {
 
-		/** Returns the bound service. */
+		/**
+		 * Returns the bound service.
+		 */
 		public BriarService getService() {
 			return BriarService.this;
 		}
@@ -205,9 +216,12 @@ public class BriarService extends Service {
 		}
 
 		@Override
-		public void onServiceDisconnected(ComponentName name) {}
+		public void onServiceDisconnected(ComponentName name) {
+		}
 
-		/** Waits for the service to connect and returns its binder. */
+		/**
+		 * Waits for the service to connect and returns its binder.
+		 */
 		public IBinder waitForBinder() throws InterruptedException {
 			binderLatch.await();
 			return binder;
diff --git a/briar-android/src/org/briarproject/android/NavDrawerActivity.java b/briar-android/src/org/briarproject/android/NavDrawerActivity.java
index 5d69216a75ed1eafb08890864033c8b93587a399..16b3700cdaded5fa6e3e66781ca5b03554614eb2 100644
--- a/briar-android/src/org/briarproject/android/NavDrawerActivity.java
+++ b/briar-android/src/org/briarproject/android/NavDrawerActivity.java
@@ -25,12 +25,10 @@ import org.briarproject.android.blogs.FeedFragment;
 import org.briarproject.android.contact.ContactListFragment;
 import org.briarproject.android.controller.NavDrawerController;
 import org.briarproject.android.controller.TransportStateListener;
-import org.briarproject.android.controller.handler.UiResultHandler;
 import org.briarproject.android.forum.ForumListFragment;
 import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
 import org.briarproject.android.privategroup.list.GroupListFragment;
 import org.briarproject.api.TransportId;
-import org.briarproject.api.identity.LocalAuthor;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -72,7 +70,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 	protected void onNewIntent(Intent intent) {
 		super.onNewIntent(intent);
 		exitIfStartupFailed(intent);
-		checkAuthorHandle(intent);
 		// FIXME why was the stack cleared here?
 		// This prevents state from being restored properly
 //		clearBackStack();
@@ -115,7 +112,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 				R.string.nav_drawer_close_description);
 		drawerLayout.addDrawerListener(drawerToggle);
 		navigation.setNavigationItemSelectedListener(this);
-		checkAuthorHandle(getIntent());
 
 		initializeTransports(getLayoutInflater());
 		transportsView.setAdapter(transportsAdapter);
@@ -146,18 +142,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 		updateTransports();
 	}
 
-	private void checkAuthorHandle(Intent intent) {
-		long handle = intent.getLongExtra(KEY_LOCAL_AUTHOR_HANDLE, -1);
-		if (handle != -1) {
-			LocalAuthor a = controller.removeAuthorHandle(handle);
-			// The activity was launched from the setup wizard
-			if (a != null) {
-				showLoadingScreen(true, R.string.progress_title_please_wait);
-				storeLocalAuthor(a);
-			}
-		}
-	}
-
 	private void exitIfStartupFailed(Intent intent) {
 		if (intent.getBooleanExtra(KEY_STARTUP_FAILED, false)) {
 			finish();
@@ -166,15 +150,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
 		}
 	}
 
-	private void storeLocalAuthor(LocalAuthor a) {
-		controller.storeLocalAuthor(a, new UiResultHandler<Void>(this) {
-			@Override
-			public void onResultUi(Void result) {
-				hideLoadingScreen();
-			}
-		});
-	}
-
 	private void loadFragment(int fragmentId) {
 		// TODO re-use fragments from the manager when possible
 		switch (fragmentId) {
diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java
index db57956c503039d6047279fe5a9cd8a4e19e5257..e5c1b4b7c1608f2779e09aa8db216d10502617a1 100644
--- a/briar-android/src/org/briarproject/android/SetupActivity.java
+++ b/briar-android/src/org/briarproject/android/SetupActivity.java
@@ -2,7 +2,6 @@ package org.briarproject.android;
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.annotation.NonNull;
 import android.support.design.widget.TextInputLayout;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -135,18 +134,18 @@ public class SetupActivity extends BaseActivity implements OnClickListener,
 		progress.setVisibility(VISIBLE);
 		String nickname = nicknameEntry.getText().toString();
 		String password = passwordEntry.getText().toString();
-		setupController.createIdentity(nickname, password,
-				new UiResultHandler<Long>(this) {
+
+		setupController.storeAuthorInfo(password, nickname,
+				new UiResultHandler<Void>(this) {
 					@Override
-					public void onResultUi(@NonNull Long result) {
-						showMain(result);
+					public void onResultUi(Void result) {
+						showMain();
 					}
 				});
 	}
 
-	private void showMain(final long handle) {
+	private void showMain() {
 		Intent i = new Intent(this, NavDrawerActivity.class);
-		i.putExtra(BriarActivity.KEY_LOCAL_AUTHOR_HANDLE, handle);
 		i.setFlags(FLAG_ACTIVITY_NEW_TASK);
 		startActivity(i);
 		finish();
diff --git a/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java b/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java
index 0a10acdbf02c69aa8962e249cfd5c7438817dbe7..6dccc168564b19f1e803ff11518a629ae1fe181f 100644
--- a/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java
+++ b/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java
@@ -27,7 +27,6 @@ import org.briarproject.api.sync.GroupId;
 import org.briarproject.util.StringUtils;
 
 import java.security.GeneralSecurityException;
-import java.util.Collection;
 import java.util.logging.Logger;
 
 import javax.inject.Inject;
@@ -147,9 +146,7 @@ public class WriteBlogPostActivity extends BriarActivity
 			public void run() {
 				long now = System.currentTimeMillis();
 				try {
-					Collection<LocalAuthor> authors =
-							identityManager.getLocalAuthors();
-					LocalAuthor author = authors.iterator().next();
+					LocalAuthor author = identityManager.getLocalAuthor();
 					BlogPost p = blogPostFactory
 							.createBlogPost(groupId, now, null, author, body);
 					blogManager.addLocalPost(p);
diff --git a/briar-android/src/org/briarproject/android/controller/ConfigController.java b/briar-android/src/org/briarproject/android/controller/ConfigController.java
index b8b7d7d17dff300b6a8a01a8ae51f46311e7eb55..7ce5233033d1726246102e0601524435bf72c1fa 100644
--- a/briar-android/src/org/briarproject/android/controller/ConfigController.java
+++ b/briar-android/src/org/briarproject/android/controller/ConfigController.java
@@ -6,7 +6,7 @@ public interface ConfigController {
 
 	String getEncryptedDatabaseKey();
 
-	void setEncryptedDatabaseKey(String hex);
+	void storeEncryptedDatabaseKey(String hex);
 
 	void deleteAccount(Context ctx);
 
diff --git a/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java b/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java
index 3ed26016f4e32f161bf578a9daf7ca2f1b1b6ce3..33ca3253266ee188052b85790222f2460cb79176 100644
--- a/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java
@@ -29,7 +29,7 @@ public class ConfigControllerImpl implements ConfigController {
 	}
 
 	@Override
-	public void setEncryptedDatabaseKey(String hex) {
+	public void storeEncryptedDatabaseKey(String hex) {
 		SharedPreferences.Editor editor = briarPrefs.edit();
 		editor.putString(PREF_DB_KEY, hex);
 		editor.apply();
diff --git a/briar-android/src/org/briarproject/android/controller/NavDrawerController.java b/briar-android/src/org/briarproject/android/controller/NavDrawerController.java
index 8d25d45b30bb36b5d938fc34aafb6dced50c2196..869ec8bc0950597ab6aae2e5ae202d78aa0740cb 100644
--- a/briar-android/src/org/briarproject/android/controller/NavDrawerController.java
+++ b/briar-android/src/org/briarproject/android/controller/NavDrawerController.java
@@ -1,15 +1,9 @@
 package org.briarproject.android.controller;
 
-import org.briarproject.android.controller.handler.ResultHandler;
 import org.briarproject.api.TransportId;
-import org.briarproject.api.identity.LocalAuthor;
 
 public interface NavDrawerController extends ActivityLifecycleController {
 
 	boolean isTransportRunning(TransportId transportId);
 
-	void storeLocalAuthor(LocalAuthor author,
-			ResultHandler<Void> resultHandler);
-
-	LocalAuthor removeAuthorHandle(long handle);
 }
diff --git a/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java b/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java
index 55d5d267f74c8fb16b8befdae50ee54c5ba61c48..ce1bb1e3e0675f8e508015eb57a938e507f5ef2a 100644
--- a/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java
@@ -2,18 +2,14 @@ package org.briarproject.android.controller;
 
 import android.app.Activity;
 
-import org.briarproject.android.api.ReferenceManager;
-import org.briarproject.android.controller.handler.ResultHandler;
 import org.briarproject.api.TransportId;
 import org.briarproject.api.db.DatabaseExecutor;
-import org.briarproject.api.db.DbException;
 import org.briarproject.api.event.Event;
 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.IdentityManager;
-import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.plugins.Plugin;
 import org.briarproject.api.plugins.PluginManager;
@@ -24,7 +20,6 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
 
 public class NavDrawerControllerImpl extends DbControllerImpl
 		implements NavDrawerController, EventListener {
@@ -32,7 +27,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 	private static final Logger LOG =
 			Logger.getLogger(NavDrawerControllerImpl.class.getName());
 
-	private final ReferenceManager referenceManager;
 	private final PluginManager pluginManager;
 	private final EventBus eventBus;
 	private final IdentityManager identityManager;
@@ -42,10 +36,9 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 	@Inject
 	NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager,
-			ReferenceManager referenceManager, PluginManager pluginManager,
-			EventBus eventBus, IdentityManager identityManager) {
+			PluginManager pluginManager, EventBus eventBus,
+			IdentityManager identityManager) {
 		super(dbExecutor, lifecycleManager);
-		this.referenceManager = referenceManager;
 		this.pluginManager = pluginManager;
 		this.eventBus = eventBus;
 		this.identityManager = identityManager;
@@ -101,33 +94,8 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 	@Override
 	public boolean isTransportRunning(TransportId transportId) {
 		Plugin plugin = pluginManager.getPlugin(transportId);
-		return plugin != null && plugin.isRunning();
-	}
 
-	@Override
-	public void storeLocalAuthor(final LocalAuthor author,
-			final ResultHandler<Void> resultHandler) {
-		runOnDbThread(new Runnable() {
-			@Override
-			public void run() {
-				try {
-					long now = System.currentTimeMillis();
-					identityManager.addLocalAuthor(author);
-					long duration = System.currentTimeMillis() - now;
-					if (LOG.isLoggable(INFO))
-						LOG.info("Storing author took " + duration + " ms");
-					resultHandler.onResult(null);
-				} catch (final DbException e) {
-					if (LOG.isLoggable(WARNING))
-						LOG.log(WARNING, e.toString(), e);
-				}
-			}
-		});
-	}
-
-	@Override
-	public LocalAuthor removeAuthorHandle(long handle) {
-		return referenceManager.removeReference(handle, LocalAuthor.class);
+		return plugin != null && plugin.isRunning();
 	}
 
 }
diff --git a/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java b/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java
index 76768b49a7ab38c4ae017f28a270049c4df57fe5..9ea926474c97ab82c91d997e2be10344f2846d1c 100644
--- a/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java
@@ -65,7 +65,7 @@ public class PasswordControllerImpl extends ConfigControllerImpl
 				} else {
 					String hex =
 							encryptDatabaseKey(new SecretKey(key), newPassword);
-					setEncryptedDatabaseKey(hex);
+					storeEncryptedDatabaseKey(hex);
 					resultHandler.onResult(true);
 				}
 			}
diff --git a/briar-android/src/org/briarproject/android/controller/SetupController.java b/briar-android/src/org/briarproject/android/controller/SetupController.java
index 567d34b43ebbd0857ceda6b792cb447c5e97d1ff..b77a541fbe44b50238b51ffcfe52b6b6c0177284 100644
--- a/briar-android/src/org/briarproject/android/controller/SetupController.java
+++ b/briar-android/src/org/briarproject/android/controller/SetupController.java
@@ -6,6 +6,7 @@ public interface SetupController {
 
 	float estimatePasswordStrength(String password);
 
-	void createIdentity(String nickname, String password,
-			ResultHandler<Long> resultHandler);
+	void storeAuthorInfo(String password, String nickName,
+			ResultHandler<Void> resultHandler);
+
 }
diff --git a/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java b/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java
index b60d1072a81c1224e5f339997f91cadc452d90ce..e62e6800deb0b0f284027a2bcdb83abab85e3cb8 100644
--- a/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java
@@ -2,24 +2,18 @@ package org.briarproject.android.controller;
 
 import android.content.SharedPreferences;
 
-import org.briarproject.android.api.ReferenceManager;
 import org.briarproject.android.controller.handler.ResultHandler;
 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 java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
-import static java.util.logging.Level.INFO;
-
 public class SetupControllerImpl extends PasswordControllerImpl
 		implements SetupController {
 
@@ -27,33 +21,14 @@ public class SetupControllerImpl extends PasswordControllerImpl
 			Logger.getLogger(SetupControllerImpl.class.getName());
 
 	private final PasswordStrengthEstimator strengthEstimator;
-	private final AuthorFactory authorFactory;
-	private final ReferenceManager referenceManager;
 
 	@Inject
 	SetupControllerImpl(SharedPreferences briarPrefs,
 			DatabaseConfig databaseConfig,
 			@CryptoExecutor Executor cryptoExecutor, CryptoComponent crypto,
-			PasswordStrengthEstimator strengthEstimator,
-			AuthorFactory authorFactory, ReferenceManager referenceManager) {
+			PasswordStrengthEstimator strengthEstimator) {
 		super(briarPrefs, databaseConfig, cryptoExecutor, crypto);
 		this.strengthEstimator = strengthEstimator;
-		this.authorFactory = authorFactory;
-		this.referenceManager = referenceManager;
-
-	}
-
-	private LocalAuthor createLocalAuthor(String nickname) {
-		long now = System.currentTimeMillis();
-		KeyPair keyPair = crypto.generateSignatureKeyPair();
-		byte[] publicKey = keyPair.getPublic().getEncoded();
-		byte[] privateKey = keyPair.getPrivate().getEncoded();
-		LocalAuthor localAuthor = authorFactory.createLocalAuthor(nickname,
-				publicKey, privateKey);
-		long duration = System.currentTimeMillis() - now;
-		if (LOG.isLoggable(INFO))
-			LOG.info("Identity creation took " + duration + " ms");
-		return localAuthor;
 	}
 
 	@Override
@@ -62,20 +37,19 @@ public class SetupControllerImpl extends PasswordControllerImpl
 	}
 
 	@Override
-	public void createIdentity(final String nickname, final String password,
-			final ResultHandler<Long> resultHandler) {
+	public void storeAuthorInfo(final String password, final String nickName,
+			final ResultHandler<Void> resultHandler) {
 		cryptoExecutor.execute(new Runnable() {
 			@Override
 			public void run() {
 				SecretKey key = crypto.generateSecretKey();
 				databaseConfig.setEncryptionKey(key);
 				String hex = encryptDatabaseKey(key, password);
-				setEncryptedDatabaseKey(hex);
-				LocalAuthor localAuthor = createLocalAuthor(nickname);
-				long handle = referenceManager.putReference(localAuthor,
-						LocalAuthor.class);
-				resultHandler.onResult(handle);
+				storeEncryptedDatabaseKey(hex);
+				databaseConfig.setAuthorNick(nickName);
+				resultHandler.onResult(null);
 			}
 		});
 	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java
index 9a8f592e17243a71c1d9512aff68ca08fcd11b08..543b2c988d9af95148d060d474b69d7052752c75 100644
--- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java
+++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java
@@ -254,8 +254,7 @@ public class AddContactActivity extends BriarActivity
 		// change UI to show a progress indicator
 		setView(new InvitationCodeView(this, true));
 
-		task = invitationTaskFactory.createTask(localAuthorId,
-				localInvitationCode, code);
+		task = invitationTaskFactory.createTask(localInvitationCode, code);
 		taskHandle = referenceManager.putReference(task, InvitationTask.class);
 		task.addListener(AddContactActivity.this);
 		// Add a second listener so we can remove the first in onDestroy(),
diff --git a/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java b/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java
index 123616bc613d72734d88df572a94680060e3fb8e..820b4bf251886f09fb2da02c77f49dbc1c785d33 100644
--- a/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java
+++ b/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java
@@ -114,7 +114,6 @@ public class ChangePasswordActivityTest {
 
 	@Test
 	public void testChangePasswordUI() {
-
 		PasswordController mockedPasswordController = this.passwordController;
 		SetupController mockedSetupController = this.setupController;
 		changePasswordActivity.setPasswordController(mockedPasswordController);
@@ -135,7 +134,7 @@ public class ChangePasswordActivityTest {
 		verify(mockedPasswordController, times(1))
 				.changePassword(eq(curPass), eq(safePass),
 						resultCaptor.capture());
-		// execute the callback
+		// execute the callbacks
 		resultCaptor.getValue().onResult(true);
 		assertEquals(changePasswordActivity.isFinishing(), true);
 	}
@@ -147,12 +146,14 @@ public class ChangePasswordActivityTest {
 		SetupController setupController =
 				changePasswordActivity.getSetupController();
 		// mock a resulthandler
-		ResultHandler<Long> resultHandler =
-				(ResultHandler<Long>) mock(ResultHandler.class);
-		setupController.createIdentity("nick", "some.old.pass", resultHandler);
+		ResultHandler<Void> resultHandler =
+				(ResultHandler<Void>) mock(ResultHandler.class);
+		setupController
+				.storeAuthorInfo("nick", "some.old.pass", resultHandler);
 		// blocking verification call with timeout that waits until the mocked
 		// result gets called with handle 0L, the expected value
-		verify(resultHandler, timeout(2000).times(1)).onResult(0L);
+		verify(resultHandler, timeout(2000).times(1))
+				.onResult(null);
 		SharedPreferences prefs =
 				changePasswordActivity
 						.getSharedPreferences("db", Context.MODE_PRIVATE);
diff --git a/briar-android/test/java/org/briarproject/android/SetupActivityTest.java b/briar-android/test/java/org/briarproject/android/SetupActivityTest.java
index 1b84a05ae4533efa2885c2633609ae2133b0942f..f06c4f90c236267476f25e0c40aac477572dbba8 100644
--- a/briar-android/test/java/org/briarproject/android/SetupActivityTest.java
+++ b/briar-android/test/java/org/briarproject/android/SetupActivityTest.java
@@ -63,7 +63,7 @@ public class SetupActivityTest {
 	@Mock
 	private SetupController setupController;
 	@Captor
-	private ArgumentCaptor<ResultHandler<Long>> resultCaptor;
+	private ArgumentCaptor<ResultHandler<Void>> authorCaptor;
 
 	@Before
 	public void setUp() {
@@ -114,7 +114,6 @@ public class SetupActivityTest {
 
 	@Test
 	public void testCreateAccountUI() {
-
 		SetupController mockedController = this.setupController;
 		setupActivity.setController(mockedController);
 		// Mock strong password strength answer
@@ -131,9 +130,10 @@ public class SetupActivityTest {
 		// Verify that the controller's method was called with the correct
 		// params and get the callback
 		verify(mockedController, times(1))
-				.createIdentity(eq(nick), eq(safePass), resultCaptor.capture());
+				.storeAuthorInfo(eq(safePass), eq(nick),
+						authorCaptor.capture());
+		authorCaptor.getValue().onResult(null);
 		// execute the callback
-		resultCaptor.getValue().onResult(1L);
 		assertEquals(setupActivity.isFinishing(), true);
 		// Confirm that the correct Activity has been started
 		ShadowActivity shadowActivity = shadowOf(setupActivity);
@@ -158,13 +158,13 @@ public class SetupActivityTest {
 	public void testAccountCreation() {
 		SetupController controller = setupActivity.getController();
 		// mock a resulthandler
-		ResultHandler<Long> resultHandler =
-				(ResultHandler<Long>) mock(ResultHandler.class);
+		ResultHandler<Void> resultHandler =
+				(ResultHandler<Void>) mock(ResultHandler.class);
 		controller
-				.createIdentity("nick", "some.strong.pass", resultHandler);
+				.storeAuthorInfo("nick", "some.strong.pass", resultHandler);
 		// blocking verification call with timeout that waits until the mocked
 		// result gets called with handle 0L, the expected value
-		verify(resultHandler, timeout(2000).times(1)).onResult(0L);
+		verify(resultHandler, timeout(2000).times(1)).onResult(null);
 		SharedPreferences prefs =
 				setupActivity.getSharedPreferences("db", Context.MODE_PRIVATE);
 		// Confirm database key
diff --git a/briar-api/src/org/briarproject/api/db/DatabaseConfig.java b/briar-api/src/org/briarproject/api/db/DatabaseConfig.java
index 862afe1c8d8e271f3d411a5c6a6c8307af3add92..50484b41661e2a61a191997dd017fbe83da41a8a 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseConfig.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseConfig.java
@@ -1,9 +1,9 @@
 package org.briarproject.api.db;
 
-import java.io.File;
-
 import org.briarproject.api.crypto.SecretKey;
 
+import java.io.File;
+
 public interface DatabaseConfig {
 
 	boolean databaseExists();
@@ -14,5 +14,9 @@ public interface DatabaseConfig {
 
 	SecretKey getEncryptionKey();
 
+	void setAuthorNick(String nickName);
+
+	String getAuthorNick();
+
 	long getMaxSize();
 }
diff --git a/briar-api/src/org/briarproject/api/identity/IdentityManager.java b/briar-api/src/org/briarproject/api/identity/IdentityManager.java
index 398ec4b4b53de221ffd067a3009e6bfeb28f4195..9a27c3e38be419b30ca1f60e85721691254b9308 100644
--- a/briar-api/src/org/briarproject/api/identity/IdentityManager.java
+++ b/briar-api/src/org/briarproject/api/identity/IdentityManager.java
@@ -4,49 +4,23 @@ import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Transaction;
 import org.briarproject.api.identity.Author.Status;
 
-import java.util.Collection;
-
 public interface IdentityManager {
 
-	/** Registers a hook to be called whenever a local pseudonym is added. */
-	void registerAddIdentityHook(AddIdentityHook hook);
-
-	/** Registers a hook to be called whenever a local pseudonym is removed. */
-	void registerRemoveIdentityHook(RemoveIdentityHook hook);
-
-	/** Stores a local pseudonym. */
-	void addLocalAuthor(LocalAuthor a) throws DbException;
-
-	/** Returns the local pseudonym with the given ID. */
-	LocalAuthor getLocalAuthor(AuthorId a) throws DbException;
+	/** Stores the local pseudonym. */
+	void registerLocalAuthor(LocalAuthor a) throws DbException;
 
-	/** Returns the local pseudonym with the given ID. */
-	LocalAuthor getLocalAuthor(Transaction txn, AuthorId a) throws DbException;
-
-	/** Returns the main local identity. */
+	/** Returns the cached main local identity, non-blocking, or loads it from
+	 * the db, blocking*/
 	LocalAuthor getLocalAuthor() throws DbException;
 
-	/** Returns the main local identity within the given Transaction. */
+	/** Returns the cached main local identity, non-blocking, or loads it from
+	 * the db, blocking, within the given Transaction. */
 	LocalAuthor getLocalAuthor(Transaction txn) throws DbException;
 
-	/** Returns all local pseudonyms. */
-	Collection<LocalAuthor> getLocalAuthors() throws DbException;
-
-	/** Removes a local pseudonym and all associated state. */
-	void removeLocalAuthor(AuthorId a) throws DbException;
-
 	/** Returns the trust-level status of the author */
 	Status getAuthorStatus(AuthorId a) throws DbException;
 
 	/** Returns the trust-level status of the author */
 	Status getAuthorStatus(Transaction txn, AuthorId a) throws DbException;
 
-	interface AddIdentityHook {
-		void addingIdentity(Transaction txn, LocalAuthor a) throws DbException;
-	}
-
-	interface RemoveIdentityHook {
-		void removingIdentity(Transaction txn, LocalAuthor a)
-				throws DbException;
-	}
 }
diff --git a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java
index 35053ff6157b6e75129c42e979757e1d1511507b..feea2d8126a7d63152655bc486dfd147a1962fe9 100644
--- a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java
+++ b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java
@@ -1,11 +1,8 @@
 package org.briarproject.api.invitation;
 
-import org.briarproject.api.identity.AuthorId;
-
 /** Creates tasks for exchanging invitations with remote peers. */
 public interface InvitationTaskFactory {
 
-	/** Creates a task using the given pseudonym and invitation codes. */
-	InvitationTask createTask(AuthorId localAuthorId, int localCode,
-			int remoteCode);
+	/** Creates a task using the local author and invitation codes. */
+	InvitationTask createTask(int localCode, int remoteCode);
 }
diff --git a/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java b/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java
index 536c9c30937266cc17409218217b0ff4ed3bbff9..5ee3a559d4723c28ae3b8003a79d5ae172295487 100644
--- a/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java
+++ b/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java
@@ -4,6 +4,8 @@ import org.briarproject.api.clients.Client;
 
 import java.util.concurrent.ExecutorService;
 
+import javax.annotation.Nullable;
+
 /**
  * Manages the lifecycle of the app, starting {@link
  * org.briarproject.api.clients.Client Clients}, starting and stopping {@link
@@ -14,7 +16,7 @@ import java.util.concurrent.ExecutorService;
 public interface LifecycleManager {
 
 	/**
-	 * The result of calling {@link LifecycleManager#startServices()}.
+	 * The result of calling {@link LifecycleManager#startServices(String)}.
 	 */
 	enum StartResult {
 		ALREADY_RUNNING, DB_ERROR, SERVICE_ERROR, SUCCESS
@@ -39,11 +41,11 @@ public interface LifecycleManager {
 
 	/**
 	 * Opens the {@link org.briarproject.api.db.DatabaseComponent
-	 * DatabaseComponent} and starts any registered {@link
-	 * org.briarproject.api.clients.Client Clients} and {@link Service
-	 * Services}.
+	 * DatabaseComponent}, creates a local author with the provided nick, and
+	 * starts any registered {@link org.briarproject.api.clients.Client Clients}
+	 * and {@link Service Services}.
 	 */
-	StartResult startServices();
+	StartResult startServices(@Nullable String authorNick);
 
 	/**
 	 * Stops any registered {@link Service Services}, shuts down any
diff --git a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java
index 29fb1b5d1a4ac82dd93a300613fba63884a1c1d2..dfb8066b95c3776372144e6099513e20b63dd673 100644
--- a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java
+++ b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java
@@ -26,8 +26,6 @@ import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.Author.Status;
 import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.identity.IdentityManager;
-import org.briarproject.api.identity.IdentityManager.AddIdentityHook;
-import org.briarproject.api.identity.IdentityManager.RemoveIdentityHook;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.ClientId;
 import org.briarproject.api.sync.Group;
@@ -75,8 +73,7 @@ import static org.briarproject.api.contact.ContactManager.RemoveContactHook;
 import static org.briarproject.blogs.BlogPostValidator.authorToBdfDictionary;
 
 class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
-		AddContactHook, RemoveContactHook, Client,
-		AddIdentityHook, RemoveIdentityHook {
+		AddContactHook, RemoveContactHook, Client {
 
 	private static final Logger LOG =
 			Logger.getLogger(BlogManagerImpl.class.getName());
@@ -151,25 +148,6 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
 		}
 	}
 
-	@Override
-	public void addingIdentity(Transaction txn, LocalAuthor a)
-			throws DbException {
-
-		// add a personal blog for the new identity
-		LOG.info("New Personal Blog Added.");
-		Blog b = blogFactory.createBlog(a);
-		db.addGroup(txn, b.getGroup());
-	}
-
-	@Override
-	public void removingIdentity(Transaction txn, LocalAuthor a)
-			throws DbException {
-
-		// remove the personal blog of that identity
-		Blog b = blogFactory.createBlog(a);
-		db.removeGroup(txn, b.getGroup());
-	}
-
 	@Override
 	protected boolean incomingMessage(Transaction txn, Message m, BdfList list,
 			BdfDictionary meta) throws DbException, FormatException {
diff --git a/briar-core/src/org/briarproject/blogs/BlogsModule.java b/briar-core/src/org/briarproject/blogs/BlogsModule.java
index e8927d5afc374a7c4b29d8593b9214810f922150..0ba7eaa0d51362543aae7615ccd37204c4c08fe6 100644
--- a/briar-core/src/org/briarproject/blogs/BlogsModule.java
+++ b/briar-core/src/org/briarproject/blogs/BlogsModule.java
@@ -7,7 +7,6 @@ import org.briarproject.api.clients.ClientHelper;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.data.MetadataEncoder;
 import org.briarproject.api.identity.AuthorFactory;
-import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.sync.MessageFactory;
@@ -36,14 +35,11 @@ public class BlogsModule {
 	@Singleton
 	BlogManager provideBlogManager(BlogManagerImpl blogManager,
 			LifecycleManager lifecycleManager, ContactManager contactManager,
-			IdentityManager identityManager,
 			ValidationManager validationManager) {
 
 		lifecycleManager.registerClient(blogManager);
 		contactManager.registerAddContactHook(blogManager);
 		contactManager.registerRemoveContactHook(blogManager);
-		identityManager.registerAddIdentityHook(blogManager);
-		identityManager.registerRemoveIdentityHook(blogManager);
 		validationManager.registerIncomingMessageHook(CLIENT_ID, blogManager);
 		return blogManager;
 	}
diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
index 44bc5979e6b8725109dede1b22783d10a1a097a1..d8137fcba547f97b8ca28a11377aa9bfeb547cbd 100644
--- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
+++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
@@ -9,8 +9,6 @@ import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Transaction;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorId;
-import org.briarproject.api.identity.IdentityManager.RemoveIdentityHook;
-import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.transport.KeyManager;
 
 import java.util.ArrayList;
@@ -21,7 +19,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.inject.Inject;
 
-class ContactManagerImpl implements ContactManager, RemoveIdentityHook {
+class ContactManagerImpl implements ContactManager {
 
 	private final DatabaseComponent db;
 	private final KeyManager keyManager;
@@ -148,11 +146,4 @@ class ContactManagerImpl implements ContactManager, RemoveIdentityHook {
 		db.removeContact(txn, c);
 	}
 
-	@Override
-	public void removingIdentity(Transaction txn, LocalAuthor a)
-			throws DbException {
-		// Remove any contacts of the local pseudonym that's being removed
-		for (ContactId c : db.getContacts(txn, a.getId()))
-			removeContact(txn, c);
-	}
 }
diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java
index 3599eb0ddbfc79cf8d37855b3d18167d79aea945..800b8e57f9c0134bc5ca0802a33ecb4c014d54ac 100644
--- a/briar-core/src/org/briarproject/contact/ContactModule.java
+++ b/briar-core/src/org/briarproject/contact/ContactModule.java
@@ -2,17 +2,6 @@ package org.briarproject.contact;
 
 import org.briarproject.api.contact.ContactExchangeTask;
 import org.briarproject.api.contact.ContactManager;
-import org.briarproject.api.crypto.CryptoComponent;
-import org.briarproject.api.data.BdfReaderFactory;
-import org.briarproject.api.data.BdfWriterFactory;
-import org.briarproject.api.db.DatabaseComponent;
-import org.briarproject.api.identity.AuthorFactory;
-import org.briarproject.api.identity.IdentityManager;
-import org.briarproject.api.plugins.ConnectionManager;
-import org.briarproject.api.properties.TransportPropertyManager;
-import org.briarproject.api.system.Clock;
-import org.briarproject.api.transport.StreamReaderFactory;
-import org.briarproject.api.transport.StreamWriterFactory;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -30,9 +19,7 @@ public class ContactModule {
 
 	@Provides
 	@Singleton
-	ContactManager getContactManager(IdentityManager identityManager,
-			ContactManagerImpl contactManager) {
-		identityManager.registerRemoveIdentityHook(contactManager);
+	ContactManager getContactManager(ContactManagerImpl contactManager) {
 		return contactManager;
 	}
 
diff --git a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java
index e3daef72e5abe558994e59a91c8a944131617031..1d9eebea9c3734ae7e3fa73845ce6ef98ca3672a 100644
--- a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java
+++ b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java
@@ -9,7 +9,6 @@ import com.rometools.rome.io.XmlReader;
 
 import org.briarproject.api.FormatException;
 import org.briarproject.api.TransportId;
-import org.briarproject.api.blogs.Blog;
 import org.briarproject.api.blogs.BlogManager;
 import org.briarproject.api.blogs.BlogPost;
 import org.briarproject.api.blogs.BlogPostFactory;
@@ -27,7 +26,6 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.TransportEnabledEvent;
 import org.briarproject.api.feed.Feed;
 import org.briarproject.api.feed.FeedManager;
-import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.lifecycle.IoExecutor;
@@ -459,9 +457,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener {
 		String body = getPostBody(b.toString());
 		try {
 			// create and store post
-			Blog blog = blogManager.getBlog(txn, groupId);
-			AuthorId authorId = blog.getAuthor().getId();
-			LocalAuthor author = identityManager.getLocalAuthor(txn, authorId);
+			LocalAuthor author = identityManager.getLocalAuthor(txn);
 			BlogPost post = blogPostFactory
 					.createBlogPost(groupId, time, null, author, body);
 			blogManager.addLocalPost(txn, post);
diff --git a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
index 0901025840a0e0155deebfa7a4431d5deca99b7d..48b5b2d129d98ae755ac3954132e7390e980e133 100644
--- a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
+++ b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
@@ -10,8 +10,7 @@ import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 
 import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
@@ -22,104 +21,62 @@ import static org.briarproject.api.identity.Author.Status.VERIFIED;
 
 class IdentityManagerImpl implements IdentityManager {
 	private final DatabaseComponent db;
-	private final List<AddIdentityHook> addHooks;
-	private final List<RemoveIdentityHook> removeHooks;
+
+	private static final Logger LOG =
+			Logger.getLogger(IdentityManagerImpl.class.getName());
+
+	// Make sure that this variable is immutable
+	private volatile LocalAuthor cachedAuthor;
 
 	@Inject
 	IdentityManagerImpl(DatabaseComponent db) {
 		this.db = db;
-		addHooks = new CopyOnWriteArrayList<AddIdentityHook>();
-		removeHooks = new CopyOnWriteArrayList<RemoveIdentityHook>();
-	}
-
-	@Override
-	public void registerAddIdentityHook(AddIdentityHook hook) {
-		addHooks.add(hook);
 	}
 
 	@Override
-	public void registerRemoveIdentityHook(RemoveIdentityHook hook) {
-		removeHooks.add(hook);
-	}
-
-	@Override
-	public void addLocalAuthor(LocalAuthor localAuthor) throws DbException {
+	public void registerLocalAuthor(LocalAuthor localAuthor) throws DbException {
 		Transaction txn = db.startTransaction(false);
 		try {
 			db.addLocalAuthor(txn, localAuthor);
-			for (AddIdentityHook hook : addHooks)
-				hook.addingIdentity(txn, localAuthor);
 			txn.setComplete();
+			cachedAuthor = localAuthor;
+			LOG.info("Local Author created");
 		} finally {
 			db.endTransaction(txn);
 		}
 	}
 
 	@Override
-	public LocalAuthor getLocalAuthor(AuthorId a) throws DbException {
-		LocalAuthor author;
-		Transaction txn = db.startTransaction(true);
-		try {
-			author = getLocalAuthor(txn, a);
-			txn.setComplete();
-		} finally {
-			db.endTransaction(txn);
+	public LocalAuthor getLocalAuthor() throws DbException {
+		if (cachedAuthor == null) {
+			Transaction txn = db.startTransaction(true);
+			try {
+				cachedAuthor = loadLocalAuthor(txn);
+				LOG.info("Author loaded from db");
+				txn.setComplete();
+			} finally {
+				db.endTransaction(txn);
+			}
 		}
-		return author;
+		return cachedAuthor;
 	}
 
-	@Override
-	public LocalAuthor getLocalAuthor(Transaction txn, AuthorId a)
-			throws DbException {
-		return db.getLocalAuthor(txn, a);
-	}
-
-	@Override
-	public LocalAuthor getLocalAuthor() throws DbException {
-		return getLocalAuthors().iterator().next();
-	}
 
 	@Override
 	public LocalAuthor getLocalAuthor(Transaction txn) throws DbException {
-		return getLocalAuthors(txn).iterator().next();
-	}
-
-	@Override
-	public Collection<LocalAuthor> getLocalAuthors() throws DbException {
-		Collection<LocalAuthor> authors;
-		Transaction txn = db.startTransaction(true);
-		try {
-			authors = getLocalAuthors(txn);
-			txn.setComplete();
-		} finally {
-			db.endTransaction(txn);
+		if (cachedAuthor == null) {
+			cachedAuthor = loadLocalAuthor(txn);
 		}
-		return authors;
+		return cachedAuthor;
 	}
 
-	private Collection<LocalAuthor> getLocalAuthors(Transaction txn)
-			throws DbException {
-
-		return db.getLocalAuthors(txn);
-	}
-
-	@Override
-	public void removeLocalAuthor(AuthorId a) throws DbException {
-		Transaction txn = db.startTransaction(false);
-		try {
-			LocalAuthor localAuthor = db.getLocalAuthor(txn, a);
-			for (RemoveIdentityHook hook : removeHooks)
-				hook.removingIdentity(txn, localAuthor);
-			db.removeLocalAuthor(txn, a);
-			txn.setComplete();
-		} finally {
-			db.endTransaction(txn);
-		}
+	private LocalAuthor loadLocalAuthor(Transaction txn) throws  DbException{
+		return db.getLocalAuthors(txn).iterator().next();
 	}
 
 	@Override
 	public Status getAuthorStatus(AuthorId authorId) throws DbException {
-		Transaction txn = db.startTransaction(false);
+		Transaction txn = db.startTransaction(true);
 		try {
 			return getAuthorStatus(txn, authorId);
 		} finally {
@@ -131,10 +88,8 @@ class IdentityManagerImpl implements IdentityManager {
 	public Status getAuthorStatus(Transaction txn, AuthorId authorId)
 			throws DbException {
 
-		// Compare to the IDs of the user's identities
-		for (LocalAuthor a : db.getLocalAuthors(txn)) {
-			if (a.getId().equals(authorId)) return OURSELVES;
-		}
+		// Compare to the IDs of the user's identity
+		if (getLocalAuthor(txn).getId().equals(authorId)) return OURSELVES;
 
 		Collection<Contact> contacts = db.getContactsByAuthorId(txn, authorId);
 		if (contacts.isEmpty()) return UNKNOWN;
diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java
index c03ee24efb563ed121cbbf5139a68303a30e0ad2..3caa856fccfd644e1fbfde52169b38c089ef3cc1 100644
--- a/briar-core/src/org/briarproject/identity/IdentityModule.java
+++ b/briar-core/src/org/briarproject/identity/IdentityModule.java
@@ -31,7 +31,7 @@ public class IdentityModule {
 
 	@Provides
 	@Singleton
-	IdentityManager provideIdendityModule(DatabaseComponent db) {
+	IdentityManager provideIdentityModule(DatabaseComponent db) {
 		return new IdentityManagerImpl(db);
 	}
 
diff --git a/briar-core/src/org/briarproject/introduction/IntroduceeManager.java b/briar-core/src/org/briarproject/introduction/IntroduceeManager.java
index 4456a5671cb682d7af55bc2e50b597ea7a893525..01ac71211ff08b49ef5f6227a65f42fea11a2feb 100644
--- a/briar-core/src/org/briarproject/introduction/IntroduceeManager.java
+++ b/briar-core/src/org/briarproject/introduction/IntroduceeManager.java
@@ -305,10 +305,8 @@ class IntroduceeManager {
 			boolean alice = comp < 0;
 
 			// get our local author
-			AuthorId localAuthorId =
-					new AuthorId(localState.getRaw(LOCAL_AUTHOR_ID));
 			LocalAuthor author =
-					identityManager.getLocalAuthor(txn, localAuthorId);
+					identityManager.getLocalAuthor(txn);
 
 			SecretKey secretKey;
 			byte[] privateKeyBytes = localState.getRaw(OUR_PRIVATE_KEY);
@@ -336,7 +334,7 @@ class IntroduceeManager {
 					.createAuthor(localState.getString(NAME),
 							localState.getRaw(PUBLIC_KEY));
 			ContactId contactId = contactManager
-					.addContact(txn, remoteAuthor, localAuthorId, secretKey,
+					.addContact(txn, remoteAuthor, author.getId(), secretKey,
 							timestamp, alice, false, false);
 
 			// Update local state with ContactId, so we know what to activate
diff --git a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
index 7b2545789e076a070c0d8da8b02528977baf6fe9..a88163f52bd3a84335a4a0528b78940c8d61f4a9 100644
--- a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
+++ b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java
@@ -2,26 +2,19 @@ package org.briarproject.invitation;
 
 import org.briarproject.api.contact.ContactExchangeListener;
 import org.briarproject.api.contact.ContactExchangeTask;
-import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.PseudoRandom;
 import org.briarproject.api.data.BdfReaderFactory;
 import org.briarproject.api.data.BdfWriterFactory;
 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.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.invitation.InvitationListener;
 import org.briarproject.api.invitation.InvitationState;
 import org.briarproject.api.invitation.InvitationTask;
-import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.PluginManager;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
-import org.briarproject.api.system.Clock;
-import org.briarproject.api.transport.StreamReaderFactory;
-import org.briarproject.api.transport.StreamWriterFactory;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -51,7 +44,6 @@ class ConnectorGroup extends Thread implements InvitationTask,
 	private final ContactExchangeTask contactExchangeTask;
 	private final IdentityManager identityManager;
 	private final PluginManager pluginManager;
-	private final AuthorId localAuthorId;
 	private final int localInvitationCode, remoteInvitationCode;
 	private final Collection<InvitationListener> listeners;
 	private final AtomicBoolean connected;
@@ -66,11 +58,9 @@ class ConnectorGroup extends Thread implements InvitationTask,
 	private String remoteName = null;
 
 	ConnectorGroup(CryptoComponent crypto, BdfReaderFactory bdfReaderFactory,
-			BdfWriterFactory bdfWriterFactory,
-			ContactExchangeTask contactExchangeTask,
+			BdfWriterFactory bdfWriterFactory, ContactExchangeTask contactExchangeTask,
 			IdentityManager identityManager, PluginManager pluginManager,
-			AuthorId localAuthorId, int localInvitationCode,
-			int remoteInvitationCode) {
+			int localInvitationCode, int remoteInvitationCode) {
 		super("ConnectorGroup");
 		this.crypto = crypto;
 		this.bdfReaderFactory = bdfReaderFactory;
@@ -78,7 +68,6 @@ class ConnectorGroup extends Thread implements InvitationTask,
 		this.contactExchangeTask = contactExchangeTask;
 		this.identityManager = identityManager;
 		this.pluginManager = pluginManager;
-		this.localAuthorId = localAuthorId;
 		this.localInvitationCode = localInvitationCode;
 		this.remoteInvitationCode = remoteInvitationCode;
 		listeners = new CopyOnWriteArrayList<InvitationListener>();
@@ -113,7 +102,7 @@ class ConnectorGroup extends Thread implements InvitationTask,
 		LocalAuthor localAuthor;
 		// Load the local pseudonym
 		try {
-			localAuthor = identityManager.getLocalAuthor(localAuthorId);
+			localAuthor = identityManager.getLocalAuthor();
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 			lock.lock();
diff --git a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
index 750153956d63fe692162301caf52291dc5c8875a..5c18deddc0c4332ed98e5a2c75fb8632228ccc57 100644
--- a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
+++ b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java
@@ -4,7 +4,6 @@ import org.briarproject.api.contact.ContactExchangeTask;
 import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.data.BdfReaderFactory;
 import org.briarproject.api.data.BdfWriterFactory;
-import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.invitation.InvitationTask;
 import org.briarproject.api.invitation.InvitationTaskFactory;
@@ -35,10 +34,9 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
 		this.pluginManager = pluginManager;
 	}
 
-	public InvitationTask createTask(AuthorId localAuthorId, int localCode,
-			int remoteCode) {
+	public InvitationTask createTask(int localCode, int remoteCode) {
 		return new ConnectorGroup(crypto, bdfReaderFactory, bdfWriterFactory,
 				contactExchangeTask, identityManager, pluginManager,
-				localAuthorId, localCode, remoteCode);
+				localCode, remoteCode);
 	}
 }
diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
index 3abfa4cbc3ac732a2cff9c66bf5c2f9395580350..895f80c284e0426354464164cb2cda38c9d3a17a 100644
--- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
+++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
@@ -1,11 +1,16 @@
 package org.briarproject.lifecycle;
 
 import org.briarproject.api.clients.Client;
+import org.briarproject.api.crypto.CryptoComponent;
+import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Transaction;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.ShutdownEvent;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.IdentityManager;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.Service;
 import org.briarproject.api.lifecycle.ServiceException;
@@ -17,6 +22,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Semaphore;
 import java.util.logging.Logger;
 
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.INFO;
@@ -36,15 +42,23 @@ class LifecycleManagerImpl implements LifecycleManager {
 	private final List<Service> services;
 	private final List<Client> clients;
 	private final List<ExecutorService> executors;
+	private final CryptoComponent crypto;
+	private final AuthorFactory authorFactory;
+	private final IdentityManager identityManager;
 	private final Semaphore startStopSemaphore = new Semaphore(1);
 	private final CountDownLatch dbLatch = new CountDownLatch(1);
 	private final CountDownLatch startupLatch = new CountDownLatch(1);
 	private final CountDownLatch shutdownLatch = new CountDownLatch(1);
 
 	@Inject
-	LifecycleManagerImpl(DatabaseComponent db, EventBus eventBus) {
+	LifecycleManagerImpl(DatabaseComponent db, EventBus eventBus,
+			CryptoComponent crypto, AuthorFactory authorFactory,
+			IdentityManager identityManager) {
 		this.db = db;
 		this.eventBus = eventBus;
+		this.crypto = crypto;
+		this.authorFactory = authorFactory;
+		this.identityManager = identityManager;
 		services = new CopyOnWriteArrayList<Service>();
 		clients = new CopyOnWriteArrayList<Client>();
 		executors = new CopyOnWriteArrayList<ExecutorService>();
@@ -70,8 +84,30 @@ class LifecycleManagerImpl implements LifecycleManager {
 		executors.add(e);
 	}
 
+	private LocalAuthor createLocalAuthor(final String nickname) {
+		long now = System.currentTimeMillis();
+		KeyPair keyPair = crypto.generateSignatureKeyPair();
+		byte[] publicKey = keyPair.getPublic().getEncoded();
+		byte[] privateKey = keyPair.getPrivate().getEncoded();
+		LocalAuthor localAuthor = authorFactory
+				.createLocalAuthor(nickname, publicKey, privateKey);
+		long duration = System.currentTimeMillis() - now;
+		if (LOG.isLoggable(INFO))
+			LOG.info("Identity creation took " + duration + " ms");
+		return localAuthor;
+	}
+
+	private void registerLocalAuthor(LocalAuthor author) throws DbException {
+		long now = System.currentTimeMillis();
+		identityManager.registerLocalAuthor(author);
+		long duration = System.currentTimeMillis() - now;
+		if (LOG.isLoggable(INFO))
+			LOG.info("Author registration took " + duration +
+					" ms");
+	}
+
 	@Override
-	public StartResult startServices() {
+	public StartResult startServices(@Nullable String authorNick) {
 		if (!startStopSemaphore.tryAcquire()) {
 			LOG.info("Already starting or stopping");
 			return ALREADY_RUNNING;
@@ -79,6 +115,7 @@ class LifecycleManagerImpl implements LifecycleManager {
 		try {
 			LOG.info("Starting services");
 			long start = System.currentTimeMillis();
+
 			boolean reopened = db.open();
 			long duration = System.currentTimeMillis() - start;
 			if (LOG.isLoggable(INFO)) {
@@ -86,6 +123,11 @@ class LifecycleManagerImpl implements LifecycleManager {
 					LOG.info("Reopening database took " + duration + " ms");
 				else LOG.info("Creating database took " + duration + " ms");
 			}
+
+			if (authorNick != null) {
+				registerLocalAuthor(createLocalAuthor(authorNick));
+			}
+
 			dbLatch.countDown();
 			Transaction txn = db.startTransaction(false);
 			try {
@@ -181,4 +223,5 @@ class LifecycleManagerImpl implements LifecycleManager {
 	public void waitForShutdown() throws InterruptedException {
 		shutdownLatch.await();
 	}
+
 }
diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
index 7ad4cb6b0cb27f48c5e8a6fa6253ed0ee3176c07..67c94c1a841ac59e59e6a0944ee638bedf6d36b3 100644
--- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
+++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
@@ -1,7 +1,10 @@
 package org.briarproject.lifecycle;
 
+import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.event.EventBus;
+import org.briarproject.api.identity.AuthorFactory;
+import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.ShutdownManager;
@@ -26,7 +29,8 @@ public class LifecycleModule {
 
 	public static class EagerSingletons {
 		@Inject
-		@IoExecutor Executor executor;
+		@IoExecutor
+		Executor executor;
 	}
 
 	private final ExecutorService ioExecutor;
@@ -51,8 +55,10 @@ public class LifecycleModule {
 	@Provides
 	@Singleton
 	LifecycleManager provideLifecycleManager(DatabaseComponent db,
-			EventBus eventBus) {
-		return new LifecycleManagerImpl(db, eventBus);
+			EventBus eventBus, CryptoComponent crypto,
+			AuthorFactory authorFactory, IdentityManager identityManager) {
+		return new LifecycleManagerImpl(db, eventBus, crypto, authorFactory,
+				identityManager);
 	}
 
 	@Provides
diff --git a/briar-tests/src/org/briarproject/TestDatabaseConfig.java b/briar-tests/src/org/briarproject/TestDatabaseConfig.java
index 03bfb4b1e9d783d2e3654d2e8b23ced15e764e4f..3954a2a20be0eb5417a6f3390a0c7301c9963ff2 100644
--- a/briar-tests/src/org/briarproject/TestDatabaseConfig.java
+++ b/briar-tests/src/org/briarproject/TestDatabaseConfig.java
@@ -38,6 +38,16 @@ public class TestDatabaseConfig implements DatabaseConfig {
 		return key;
 	}
 
+	@Override
+	public void setAuthorNick(String nickName) {
+
+	}
+
+	@Override
+	public String getAuthorNick() {
+		return null;
+	}
+
 	@Override
 	public long getMaxSize() {
 		return maxSize;
diff --git a/briar-tests/src/org/briarproject/TestLifecycleModule.java b/briar-tests/src/org/briarproject/TestLifecycleModule.java
index 04137713c0315464ffbb0e3e5989959ce3abc437..02813eb76df71fe0d1477a3fa43a2706b2fac46b 100644
--- a/briar-tests/src/org/briarproject/TestLifecycleModule.java
+++ b/briar-tests/src/org/briarproject/TestLifecycleModule.java
@@ -38,7 +38,7 @@ public class TestLifecycleModule {
 			}
 
 			@Override
-			public StartResult startServices() {
+			public StartResult startServices(String authorNick) {
 				return StartResult.SUCCESS;
 			}
 
diff --git a/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java b/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java
index 34c9749b5650911fe3909c484702a7c90931a042..ac7d27cd1332bc1e847d4fdf021cc606a25f23ed 100644
--- a/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java
+++ b/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java
@@ -93,7 +93,6 @@ public class BlogManagerImplTest extends BriarTestCase {
 	@Test
 	public void testCreateLocalState() throws DbException {
 		final Transaction txn = new Transaction(null, false);
-		final LocalAuthor localAuthor = (LocalAuthor) blog1.getAuthor();
 
 		final ContactId contactId = new ContactId(0);
 		final Collection<ContactId> contactIds =
@@ -105,7 +104,7 @@ public class BlogManagerImplTest extends BriarTestCase {
 
 		context.checking(new Expectations() {{
 			oneOf(identityManager).getLocalAuthor(txn);
-			will(returnValue(localAuthor));
+			will(returnValue(blog1.getAuthor()));
 			oneOf(blogFactory).createBlog(blog1.getAuthor());
 			will(returnValue(blog1));
 			oneOf(db).containsGroup(txn, blog1.getId());
@@ -151,42 +150,6 @@ public class BlogManagerImplTest extends BriarTestCase {
 		context.assertIsSatisfied();
 	}
 
-	@Test
-	public void testAddingIdentity() throws DbException {
-		final Transaction txn = new Transaction(null, false);
-		Author a = blog1.getAuthor();
-		final LocalAuthor localAuthor =
-				new LocalAuthor(a.getId(), a.getName(), a.getPublicKey(),
-						a.getPublicKey(), 0);
-
-		context.checking(new Expectations() {{
-			oneOf(blogFactory).createBlog(localAuthor);
-			will(returnValue(blog1));
-			oneOf(db).addGroup(txn, blog1.getGroup());
-		}});
-
-		blogManager.addingIdentity(txn, localAuthor);
-		context.assertIsSatisfied();
-	}
-
-	@Test
-	public void testRemovingIdentity() throws DbException {
-		final Transaction txn = new Transaction(null, false);
-		Author a = blog1.getAuthor();
-		final LocalAuthor localAuthor =
-				new LocalAuthor(a.getId(), a.getName(), a.getPublicKey(),
-						a.getPublicKey(), 0);
-
-		context.checking(new Expectations() {{
-			oneOf(blogFactory).createBlog(localAuthor);
-			will(returnValue(blog1));
-			oneOf(db).removeGroup(txn, blog1.getGroup());
-		}});
-
-		blogManager.removingIdentity(txn, localAuthor);
-		context.assertIsSatisfied();
-	}
-
 	@Test
 	public void testIncomingMessage() throws DbException, FormatException {
 		final Transaction txn = new Transaction(null, false);
diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
index 87603e76ef7b50084fc9addd1242927180c6f2fe..0b5016b8d9870cdd2a4600eea0e51a295365f730 100644
--- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
+++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java
@@ -136,7 +136,7 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 			// startTransaction()
 			oneOf(database).startTransaction();
 			will(returnValue(txn));
-			// addLocalAuthor()
+			// registerLocalAuthor()
 			oneOf(database).containsLocalAuthor(txn, localAuthorId);
 			will(returnValue(false));
 			oneOf(database).addLocalAuthor(txn, localAuthor);
@@ -813,7 +813,7 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 			// startTransaction()
 			oneOf(database).startTransaction();
 			will(returnValue(txn));
-			// addLocalAuthor()
+			// registerLocalAuthor()
 			oneOf(database).containsLocalAuthor(txn, localAuthorId);
 			will(returnValue(false));
 			oneOf(database).addLocalAuthor(txn, localAuthor);
diff --git a/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java b/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java
index 9939e8f023c319c3eee6884e72d1ce10b7687186..ec73a0c1a5ec7258f1aa32572db3e73fdfc38759 100644
--- a/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java
+++ b/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java
@@ -46,7 +46,7 @@ public class IdentityManagerImplTest extends BriarTestCase {
 
 	@Test
 	public void testGetAuthorStatus() throws DbException {
-		AuthorId authorId = new AuthorId(TestUtils.getRandomId());
+		final AuthorId authorId = new AuthorId(TestUtils.getRandomId());
 		final Collection<LocalAuthor> localAuthors = new ArrayList<>();
 		LocalAuthor localAuthor =
 				new LocalAuthor(new AuthorId(TestUtils.getRandomId()),
@@ -54,9 +54,17 @@ public class IdentityManagerImplTest extends BriarTestCase {
 						TestUtils.getRandomBytes(42),
 						TestUtils.getRandomBytes(42), 0);
 		localAuthors.add(localAuthor);
-		Collection<Contact> contacts = new ArrayList<>();
+		final Collection<Contact> contacts = new ArrayList<>();
 
-		checkAuthorStatusContext(localAuthors, authorId, contacts);
+		context.checking(new Expectations() {{
+			oneOf(db).startTransaction(true);
+			will(returnValue(txn));
+			oneOf(db).getLocalAuthors(txn);
+			will(returnValue(localAuthors));
+			oneOf(db).getContactsByAuthorId(txn, authorId);
+			will(returnValue(contacts));
+			oneOf(db).endTransaction(txn);
+		}});
 		assertEquals(UNKNOWN, identityManager.getAuthorStatus(authorId));
 
 		// add one unverified contact
@@ -67,7 +75,7 @@ public class IdentityManagerImplTest extends BriarTestCase {
 						false, true);
 		contacts.add(contact);
 
-		checkAuthorStatusContext(localAuthors, authorId, contacts);
+		checkAuthorStatusContext(authorId, contacts);
 		assertEquals(UNVERIFIED, identityManager.getAuthorStatus(authorId));
 
 		// add one verified contact
@@ -76,37 +84,28 @@ public class IdentityManagerImplTest extends BriarTestCase {
 						true, true);
 		contacts.add(contact2);
 
-		checkAuthorStatusContext(localAuthors, authorId, contacts);
+		checkAuthorStatusContext(authorId, contacts);
 		assertEquals(VERIFIED, identityManager.getAuthorStatus(authorId));
 
-		// add ourselves to the local authors
-		LocalAuthor localAuthor2 =
-				new LocalAuthor(authorId,
-						TestUtils.getRandomString(8),
-						TestUtils.getRandomBytes(42),
-						TestUtils.getRandomBytes(42), 0);
-		localAuthors.add(localAuthor2);
-
 		context.checking(new Expectations() {{
-			oneOf(db).startTransaction(false);
+			oneOf(db).startTransaction(true);
 			will(returnValue(txn));
-			oneOf(db).getLocalAuthors(txn);
-			will(returnValue(localAuthors));
+			never(db).getLocalAuthors(txn);
+			never(db).getContactsByAuthorId(txn, authorId);
 			oneOf(db).endTransaction(txn);
 		}});
-		assertEquals(OURSELVES, identityManager.getAuthorStatus(authorId));
+		assertEquals(OURSELVES,
+				identityManager.getAuthorStatus(localAuthor.getId()));
 
 		context.assertIsSatisfied();
 	}
 
-	private void checkAuthorStatusContext(
-			final Collection<LocalAuthor> localAuthors, final AuthorId authorId,
+	private void checkAuthorStatusContext(final AuthorId authorId,
 			final Collection<Contact> contacts) throws DbException {
 		context.checking(new Expectations() {{
-			oneOf(db).startTransaction(false);
+			oneOf(db).startTransaction(true);
 			will(returnValue(txn));
-			oneOf(db).getLocalAuthors(txn);
-			will(returnValue(localAuthors));
+			never(db).getLocalAuthors(txn);
 			oneOf(db).getContactsByAuthorId(txn, authorId);
 			will(returnValue(contacts));
 			oneOf(db).endTransaction(txn);
diff --git a/build.gradle b/build.gradle
index a494e68f297f5217c2a3255c1772031563f7ca1d..eddf2bc6a583d821c4da4a361f51b04287ab3b81 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,7 +14,7 @@ buildscript {
 	}
 
 	dependencies {
-		classpath 'com.android.tools.build:gradle:2.2.1'
+		classpath 'com.android.tools.build:gradle:2.2.2'
 		classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 		classpath 'de.undercouch:gradle-download-task:2.1.0'
 		classpath files('briar-core/libs/gradle-witness.jar')