diff --git a/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java b/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java
index 9636c3dc08e40d362132ac5d1007706c5517353e..f23e249ae0031865ef58dea3ecd7a7026e84dc89 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java
@@ -8,6 +8,7 @@ import android.preference.PreferenceManager;
 import org.briarproject.bramble.api.account.AccountManager;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.identity.IdentityManager;
 import org.briarproject.bramble.util.IoUtils;
 
 import java.io.File;
@@ -29,8 +30,9 @@ class AndroidAccountManager extends AccountManagerImpl
 
 	@Inject
 	AndroidAccountManager(DatabaseConfig databaseConfig,
-			CryptoComponent crypto, SharedPreferences prefs, Application app) {
-		super(databaseConfig, crypto);
+			CryptoComponent crypto, IdentityManager identityManager,
+			SharedPreferences prefs, Application app) {
+		super(databaseConfig, crypto, identityManager);
 		this.prefs = prefs;
 		appContext = app.getApplicationContext();
 	}
diff --git a/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java b/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java
index d283adceac17a91796dccef1efe47793ebe2c34f..6736533a69fee377ddd180789dec515816a1f5c0 100644
--- a/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java
+++ b/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java
@@ -6,6 +6,7 @@ import android.content.pm.ApplicationInfo;
 
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.identity.IdentityManager;
 import org.briarproject.bramble.test.BrambleMockTestCase;
 import org.jmock.Expectations;
 import org.jmock.lib.legacy.ClassImposteriser;
@@ -32,6 +33,8 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
 	private final DatabaseConfig databaseConfig =
 			context.mock(DatabaseConfig.class);
 	private final CryptoComponent crypto = context.mock(CryptoComponent.class);
+	private final IdentityManager identityManager =
+			context.mock(IdentityManager.class);
 	private final SharedPreferences.Editor
 			editor = context.mock(SharedPreferences.Editor.class);
 	private final Application app;
@@ -64,7 +67,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
 			will(returnValue(app));
 		}});
 		accountManager = new AndroidAccountManager(databaseConfig, crypto,
-				prefs, app) {
+				identityManager, prefs, app) {
 			@Override
 			SharedPreferences getDefaultSharedPreferences() {
 				return defaultPrefs;
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java
index 5b475ae6362bf098b390c43971e0585cca392c15..2e1b5a9510066907b55c83621c613fe8c2616366 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java
@@ -1,6 +1,7 @@
 package org.briarproject.bramble.api.account;
 
 import org.briarproject.bramble.api.crypto.SecretKey;
+import org.briarproject.bramble.api.identity.IdentityManager;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 
 import javax.annotation.Nullable;
@@ -10,17 +11,18 @@ public interface AccountManager {
 
 	/**
 	 * Returns true if the manager has the database key. This will be false
-	 * before {@link #createAccount(String)} or {@link #signIn(String)} has
-	 * been called, and true after {@link #createAccount(String)} or
-	 * {@link #signIn(String)} has returned true, until the process exits.
+	 * before {@link #createAccount(String, String)} or {@link #signIn(String)}
+	 * has been called, and true after {@link #createAccount(String, String)}
+	 * or {@link #signIn(String)} has returned true, until the process exits.
 	 */
 	boolean hasDatabaseKey();
 
 	/**
 	 * Returns the database key if the manager has it. This will be null
-	 * before {@link #createAccount(String)} or {@link #signIn(String)} has
-	 * been called, and non-null after {@link #createAccount(String)} or
-	 * {@link #signIn(String)} has returned true, until the process exits.
+	 * before {@link #createAccount(String, String)} or {@link #signIn(String)}
+	 * has been called, and non-null after
+	 * {@link #createAccount(String, String)} or {@link #signIn(String)} has
+	 * returned true, until the process exits.
 	 */
 	@Nullable
 	SecretKey getDatabaseKey();
@@ -32,12 +34,15 @@ public interface AccountManager {
 	boolean accountExists();
 
 	/**
-	 * Creates a database key, encrypts it with the given password and stores
-	 * it on disk. This method does not create the database directory, so
+	 * Creates an identity with the given name and registers it with the
+	 * {@link IdentityManager}. Creates a database key, encrypts it with the
+	 * given password and stores it on disk.
+	 * <p/>
+	 * This method does not create the database directory, so
 	 * {@link #accountExists()} will continue to return false until the
 	 * database directory is created.
 	 */
-	boolean createAccount(String password);
+	boolean createAccount(String name, String password);
 
 	/**
 	 * Deletes all account state from disk. {@link #accountExists()} will
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java
index 47ddd87f656e8e3ba7fca762b68ad6defb6d57b8..7eda4688be9d8e0cdf87abf0dcbb1dcc99a83124 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java
@@ -4,6 +4,8 @@ import org.briarproject.bramble.api.account.AccountManager;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.identity.IdentityManager;
+import org.briarproject.bramble.api.identity.LocalAuthor;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.bramble.util.IoUtils;
@@ -36,6 +38,7 @@ class AccountManagerImpl implements AccountManager {
 
 	private final DatabaseConfig databaseConfig;
 	private final CryptoComponent crypto;
+	private final IdentityManager identityManager;
 	private final File dbKeyFile, dbKeyBackupFile;
 
 	final Object stateChangeLock = new Object();
@@ -44,9 +47,11 @@ class AccountManagerImpl implements AccountManager {
 	private volatile SecretKey databaseKey = null;
 
 	@Inject
-	AccountManagerImpl(DatabaseConfig databaseConfig, CryptoComponent crypto) {
+	AccountManagerImpl(DatabaseConfig databaseConfig, CryptoComponent crypto,
+			IdentityManager identityManager) {
 		this.databaseConfig = databaseConfig;
 		this.crypto = crypto;
+		this.identityManager = identityManager;
 		File keyDir = databaseConfig.getDatabaseKeyDirectory();
 		dbKeyFile = new File(keyDir, DB_KEY_FILENAME);
 		dbKeyBackupFile = new File(keyDir, DB_KEY_BACKUP_FILENAME);
@@ -152,8 +157,10 @@ class AccountManagerImpl implements AccountManager {
 	}
 
 	@Override
-	public boolean createAccount(String password) {
+	public boolean createAccount(String name, String password) {
 		synchronized (stateChangeLock) {
+			LocalAuthor localAuthor = identityManager.createLocalAuthor(name);
+			identityManager.registerLocalAuthor(localAuthor);
 			SecretKey key = crypto.generateSecretKey();
 			if (!encryptAndStoreDatabaseKey(key, password)) return false;
 			databaseKey = key;
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/account/AccountManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/account/AccountManagerImplTest.java
index 66dcf9bdb3b765d1207d2acf796782d0e3d796e1..84c5da72f4a70d79bb8c45254d4436fc6ea0afc8 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/account/AccountManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/account/AccountManagerImplTest.java
@@ -3,6 +3,8 @@ package org.briarproject.bramble.account;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.identity.IdentityManager;
+import org.briarproject.bramble.api.identity.LocalAuthor;
 import org.briarproject.bramble.test.BrambleMockTestCase;
 import org.jmock.Expectations;
 import org.junit.After;
@@ -22,6 +24,7 @@ import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
 import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory;
+import static org.briarproject.bramble.test.TestUtils.getLocalAuthor;
 import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
 import static org.briarproject.bramble.test.TestUtils.getSecretKey;
 import static org.briarproject.bramble.test.TestUtils.getTestDirectory;
@@ -36,12 +39,16 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
 	private final DatabaseConfig databaseConfig =
 			context.mock(DatabaseConfig.class);
 	private final CryptoComponent crypto = context.mock(CryptoComponent.class);
+	private final IdentityManager identityManager =
+			context.mock(IdentityManager.class);
 
 	private final SecretKey key = getSecretKey();
 	private final byte[] encryptedKey = getRandomBytes(123);
 	private final String encryptedKeyHex = toHexString(encryptedKey);
 	private final byte[] newEncryptedKey = getRandomBytes(123);
 	private final String newEncryptedKeyHex = toHexString(newEncryptedKey);
+	private final LocalAuthor localAuthor = getLocalAuthor();
+	private final String authorName = localAuthor.getName();
 	private final String password = getRandomString(10);
 	private final String newPassword = getRandomString(10);
 	private final File testDir = getTestDirectory();
@@ -61,7 +68,8 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
 			will(returnValue(keyDir));
 		}});
 
-		accountManager = new AccountManagerImpl(databaseConfig, crypto);
+		accountManager =
+				new AccountManagerImpl(databaseConfig, crypto, identityManager);
 
 		assertFalse(keyFile.exists());
 		assertFalse(keyBackupFile.exists());
@@ -243,6 +251,9 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
 	@Test
 	public void testCreateAccountStoresDbKey() throws Exception {
 		context.checking(new Expectations() {{
+			oneOf(identityManager).createLocalAuthor(authorName);
+			will(returnValue(localAuthor));
+			oneOf(identityManager).registerLocalAuthor(localAuthor);
 			oneOf(crypto).generateSecretKey();
 			will(returnValue(key));
 			oneOf(crypto).encryptWithPassword(key.getBytes(), password);
@@ -251,7 +262,7 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
 
 		assertFalse(accountManager.hasDatabaseKey());
 
-		assertTrue(accountManager.createAccount(password));
+		assertTrue(accountManager.createAccount(authorName, password));
 
 		assertTrue(accountManager.hasDatabaseKey());
 		SecretKey dbKey = accountManager.getDatabaseKey();
diff --git a/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java b/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java
index e1fee81cda6d809b0f8fefddbece10360ab95438..eb1e2faaae939632ddbca1d6e1a1284f9a8eff94 100644
--- a/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java
+++ b/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java
@@ -5,6 +5,7 @@ import android.content.SharedPreferences;
 
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.identity.IdentityManager;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.Localizer;
 import org.briarproject.briar.android.util.UiUtils;
@@ -15,8 +16,9 @@ class BriarAccountManager extends AndroidAccountManager {
 
 	@Inject
 	BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto,
-			SharedPreferences prefs, Application app) {
-		super(databaseConfig, crypto, prefs, app);
+			IdentityManager identityManager, SharedPreferences prefs,
+			Application app) {
+		super(databaseConfig, crypto, identityManager, prefs, app);
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java
index e74f632b896d6559cf16cfe5f81d5a0048f4818b..02f40226e404806620b53c2df0323140cdccaa9c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java
@@ -4,8 +4,6 @@ import android.support.annotation.Nullable;
 
 import org.briarproject.bramble.api.account.AccountManager;
 import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator;
-import org.briarproject.bramble.api.identity.IdentityManager;
-import org.briarproject.bramble.api.identity.LocalAuthor;
 import org.briarproject.bramble.api.lifecycle.IoExecutor;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.briar.android.controller.handler.ResultHandler;
@@ -23,18 +21,14 @@ public class SetupControllerImpl extends PasswordControllerImpl
 	private static final Logger LOG =
 			Logger.getLogger(SetupControllerImpl.class.getName());
 
-	private final IdentityManager identityManager;
-
 	@Nullable
 	private volatile SetupActivity setupActivity;
 
 	@Inject
 	SetupControllerImpl(AccountManager accountManager,
 			@IoExecutor Executor ioExecutor,
-			PasswordStrengthEstimator strengthEstimator,
-			IdentityManager identityManager) {
+			PasswordStrengthEstimator strengthEstimator) {
 		super(accountManager, ioExecutor, strengthEstimator);
-		this.identityManager = identityManager;
 	}
 
 	@Override
@@ -104,10 +98,8 @@ public class SetupControllerImpl extends PasswordControllerImpl
 		if (password == null) throw new IllegalStateException();
 		ioExecutor.execute(() -> {
 			LOG.info("Creating account");
-			LocalAuthor localAuthor =
-					identityManager.createLocalAuthor(authorName);
-			identityManager.registerLocalAuthor(localAuthor);
-			resultHandler.onResult(accountManager.createAccount(password));
+			resultHandler.onResult(accountManager.createAccount(authorName,
+					password));
 		});
 	}
 }
diff --git a/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java
index 51f6609c8bbe7911363c6407b311497d130054a0..2ee6d0594b28c2cfc24d17372a9e241acf1ef5d2 100644
--- a/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java
+++ b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java
@@ -2,8 +2,6 @@ package org.briarproject.briar.android.login;
 
 import org.briarproject.bramble.api.account.AccountManager;
 import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator;
-import org.briarproject.bramble.api.identity.IdentityManager;
-import org.briarproject.bramble.api.identity.LocalAuthor;
 import org.briarproject.bramble.test.BrambleMockTestCase;
 import org.briarproject.bramble.test.ImmediateExecutor;
 import org.jmock.Expectations;
@@ -15,7 +13,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import static junit.framework.Assert.assertTrue;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
-import static org.briarproject.bramble.test.TestUtils.getLocalAuthor;
 import static org.briarproject.bramble.util.StringUtils.getRandomString;
 
 public class SetupControllerImplTest extends BrambleMockTestCase {
@@ -24,15 +21,12 @@ public class SetupControllerImplTest extends BrambleMockTestCase {
 			context.mock(AccountManager.class);
 	private final PasswordStrengthEstimator estimator =
 			context.mock(PasswordStrengthEstimator.class);
-	private final IdentityManager identityManager =
-			context.mock(IdentityManager.class);
 	private final SetupActivity setupActivity;
 
 	private final Executor ioExecutor = new ImmediateExecutor();
 
 	private final String authorName = getRandomString(MAX_AUTHOR_NAME_LENGTH);
 	private final String password = getRandomString(10);
-	private final LocalAuthor localAuthor = getLocalAuthor();
 
 	public SetupControllerImplTest() {
 		context.setImposteriser(ClassImposteriser.INSTANCE);
@@ -51,17 +45,13 @@ public class SetupControllerImplTest extends BrambleMockTestCase {
 			will(returnValue(authorName));
 			oneOf(setupActivity).getPassword();
 			will(returnValue(password));
-			// Create and register the local author
-			oneOf(identityManager).createLocalAuthor(authorName);
-			will(returnValue(localAuthor));
-			oneOf(identityManager).registerLocalAuthor(localAuthor);
 			// Create the account
-			oneOf(accountManager).createAccount(password);
+			oneOf(accountManager).createAccount(authorName, password);
 			will(returnValue(true));
 		}});
 
 		SetupControllerImpl s = new SetupControllerImpl(accountManager,
-				ioExecutor, estimator, identityManager);
+				ioExecutor, estimator);
 		s.setSetupActivity(setupActivity);
 
 		AtomicBoolean called = new AtomicBoolean(false);