diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java
index 5177b163f9e0379aa04ae7b14a086cee5655f7d1..9c6bbbe2343c673b9f5f1c3ad71d7e6896c0c493 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java
@@ -2,6 +2,7 @@ package org.briarproject.bramble.db;
 
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.db.DbClosedException;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.db.MigrationListener;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@@ -89,9 +90,9 @@ class H2Database extends JdbcDatabase {
 	}
 
 	@Override
-	protected Connection createConnection() throws SQLException {
+	protected Connection createConnection() throws DbException, SQLException {
 		SecretKey key = this.key;
-		if (key == null) throw new IllegalStateException();
+		if (key == null) throw new DbClosedException();
 		Properties props = new Properties();
 		props.setProperty("user", "user");
 		// Separate the file password from the user password with a space
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java
index 160fa76a24ea9590f70e952c3efc9eaaa88f5c64..610625a612bed9bb88ca9c76ac0ef9d94a41b263 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java
@@ -2,6 +2,7 @@ package org.briarproject.bramble.db;
 
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.db.DatabaseConfig;
+import org.briarproject.bramble.api.db.DbClosedException;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.db.MigrationListener;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@@ -87,9 +88,9 @@ class HyperSqlDatabase extends JdbcDatabase {
 	}
 
 	@Override
-	protected Connection createConnection() throws SQLException {
+	protected Connection createConnection() throws DbException, SQLException {
 		SecretKey key = this.key;
-		if (key == null) throw new IllegalStateException();
+		if (key == null) throw new DbClosedException();
 		String hex = StringUtils.toHexString(key.getBytes());
 		return DriverManager.getConnection(url + ";crypt_key=" + hex);
 	}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
index 7b51a6e29815e9f076bace97b8ab360d2bb9931e..b6e65894e55648dc7135ee1fac549a31dd90806b 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
@@ -347,7 +347,8 @@ abstract class JdbcDatabase implements Database<Connection> {
 	private int openConnections = 0; // Locking: connectionsLock
 	private boolean closed = false; // Locking: connectionsLock
 
-	protected abstract Connection createConnection() throws SQLException;
+	protected abstract Connection createConnection()
+			throws DbException, SQLException;
 
 	protected abstract void compactAndClose() throws DbException;
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
index 5315abb6ab312bfbc4350b9ccc59558ed648c60f..8d0019acc0b17d897188c981cdff1712c2dcfa34 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
@@ -30,6 +30,7 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
 import static android.os.Build.VERSION.SDK_INT;
+import static java.util.logging.Level.INFO;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_UNLOCK;
@@ -66,9 +67,15 @@ public abstract class BriarActivity extends BaseActivity {
 			@Nullable Intent data) {
 		super.onActivityResult(request, result, data);
 		if (request == REQUEST_PASSWORD) {
-			// We get RESULT_CANCELED when the account gets deleted or
-			// StartupActivity finishes before entering the password.
-			if (result == RESULT_OK) briarController.startAndBindService();
+			// Recreate the activity so any DB tasks that failed before
+			// signing in can be retried
+			if (result == RESULT_OK) {
+				if (LOG.isLoggable(INFO)) {
+					LOG.info("Recreating " + getClass().getSimpleName()
+							+ " after signing in");
+				}
+				recreate();
+			}
 		} else if (request == REQUEST_UNLOCK && result != RESULT_OK) {
 			// We arrive here, if the user presses 'back'
 			// in the Keyguard unlock screen, because UnlockActivity finishes.
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java
index 8650c8233d711790c6d45f4a8a1883819dbe077d..191f95fc6f2f8002cd4decc411d63eed7fd5d3c2 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java
@@ -49,6 +49,7 @@ public class AddContactActivity extends BriarActivity implements
 
 		viewModel = ViewModelProviders.of(this, viewModelFactory)
 				.get(AddContactViewModel.class);
+		viewModel.onCreate();
 		viewModel.getRemoteLinkEntered().observeEvent(this, entered -> {
 			if (entered) {
 				NicknameFragment f = new NicknameFragment();
@@ -93,13 +94,11 @@ public class AddContactActivity extends BriarActivity implements
 
 	@Override
 	public boolean onOptionsItemSelected(MenuItem item) {
-		switch (item.getItemId()) {
-			case android.R.id.home:
-				onBackPressed();
-				return true;
-			default:
-				return super.onOptionsItemSelected(item);
+		if (item.getItemId() == android.R.id.home) {
+			onBackPressed();
+			return true;
 		}
+		return super.onOptionsItemSelected(item);
 	}
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java
index d51f1547bc44de3d30329cf38eb7acf7037864bf..718cdc83da5528f6b6899af004417dc2b35a9650 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java
@@ -53,7 +53,10 @@ public class AddContactViewModel extends AndroidViewModel {
 		super(application);
 		this.contactManager = contactManager;
 		this.dbExecutor = dbExecutor;
-		loadHandshakeLink();
+	}
+
+	void onCreate() {
+		if (handshakeLink.getValue() == null) loadHandshakeLink();
 	}
 
 	private void loadHandshakeLink() {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java
index c3decf51d3997e2f21e38061806aa7d9ee348478..dc780d4850e179df6a4116e03fc2234358c1d8dd 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java
@@ -55,6 +55,7 @@ public class PendingContactListActivity extends BriarActivity
 
 		viewModel = ViewModelProviders.of(this, viewModelFactory)
 				.get(PendingContactListViewModel.class);
+		viewModel.onCreate();
 		viewModel.getPendingContacts()
 				.observe(this, this::onPendingContactsChanged);
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java
index 5c9ea749171d1f4ffeecd7c0f3edad68f463619a..a68c4fe4b4e71efb0d36c04e9cb110db6bd35998 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java
@@ -61,7 +61,10 @@ public class PendingContactListViewModel extends AndroidViewModel
 		this.rendezvousPoller = rendezvousPoller;
 		this.eventBus = eventBus;
 		this.eventBus.addListener(this);
-		loadPendingContacts();
+	}
+
+	void onCreate() {
+		if (pendingContacts.getValue() == null) loadPendingContacts();
 	}
 
 	@Override