diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
index ea4e273e24f4e568d34bb434b6568a440ddf909c..2ac0c3e3e60166d5e6de8da51e0cef53ce0d7773 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
@@ -54,7 +54,6 @@ public class BriarService extends Service {
 	private final Binder binder = new BriarBinder();
 	@Nullable
 	private BriarBroadcastReceiver receiver = null;
-	private boolean hasDozed = false;
 
 	@Inject
 	protected DatabaseConfig databaseConfig;
@@ -63,7 +62,7 @@ public class BriarService extends Service {
 	protected volatile LifecycleManager lifecycleManager;
 	@Inject
 	protected volatile AndroidExecutor androidExecutor;
-	private volatile boolean started = false;
+	private volatile boolean started = false, hasDozed = false;
 
 	@Override
 	public void onCreate() {
@@ -185,7 +184,7 @@ public class BriarService extends Service {
 	private void registerBroadcastReceiver() {
 		if (SDK_INT < 23) return;
 		IntentFilter filter = new IntentFilter(ACTION_DEVICE_IDLE_MODE_CHANGED);
-		if (receiver == null) receiver = new BriarBroadcastReceiver();
+		receiver = new BriarBroadcastReceiver();
 		registerReceiver(receiver, filter);
 	}
 
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 9d9f5b0de0459a2585c0f9f36c81e0c0b09f5225..64cc194f3e179eac48cb9cbb3ea298ed89789a7a 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
@@ -68,7 +68,10 @@ public abstract class BriarActivity extends BaseActivity {
 			briarController.hasDozed(new UiResultHandler<Boolean>(this) {
 				@Override
 				public void onResultUi(Boolean result) {
-					if (result) showDozeDialog();
+					if (result) {
+						showDozeDialog(getString(R.string.warning_dozed,
+								getString(R.string.app_name)));
+					}
 				}
 			});
 		}
@@ -109,11 +112,10 @@ public abstract class BriarActivity extends BaseActivity {
 		return toolbar;
 	}
 
-	private void showDozeDialog() {
+	protected void showDozeDialog(String message) {
 		AlertDialog.Builder b =
 				new AlertDialog.Builder(this, R.style.BriarDialogTheme);
-		b.setMessage(getString(R.string.warning_dozed,
-				getString(R.string.app_name)));
+		b.setMessage(message);
 		b.setView(R.layout.checkbox);
 		b.setPositiveButton(R.string.fix,
 				(dialog, which) -> {
@@ -127,7 +129,7 @@ public abstract class BriarActivity extends BaseActivity {
 			CheckBox checkBox = (CheckBox) ((AlertDialog) dialog)
 					.findViewById(R.id.checkbox);
 			if (checkBox.isChecked())
-				briarController.doNotNotifyWhenDozed();
+				briarController.doNotAskAgainForDozeWhiteListing();
 		});
 		b.show();
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java
index 8d7aaacd54a96d5eee6161d6363bac960973dadf..350faeabaa0d8565b6a5ef5d477716a09cb1e2c3 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java
@@ -14,7 +14,7 @@ public interface BriarController extends ActivityLifecycleController {
 	 */
 	void hasDozed(ResultHandler<Boolean> handler);
 
-	void doNotNotifyWhenDozed();
+	void doNotAskAgainForDozeWhiteListing();
 
 	void signOut(ResultHandler<Void> eventHandler);
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java
index 7faaaa1de785cbbc6765dc065eec60b965252b50..9ecd35e915d67542dffb2c94e169b27a4476c6d2 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java
@@ -4,6 +4,8 @@ import android.app.Activity;
 import android.content.Intent;
 import android.os.IBinder;
 import android.support.annotation.CallSuper;
+import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
 
 import org.briarproject.bramble.api.db.DatabaseConfig;
 import org.briarproject.bramble.api.db.DatabaseExecutor;
@@ -28,7 +30,7 @@ public class BriarControllerImpl implements BriarController {
 	private static final Logger LOG =
 			Logger.getLogger(BriarControllerImpl.class.getName());
 
-	private static final String HAS_DOZED_ASK_AGAIN = "hasDozedAskAgain";
+	public static final String DOZE_ASK_AGAIN = "dozeAskAgain";
 
 	private final BriarServiceConnection serviceConnection;
 	private final DatabaseConfig databaseConfig;
@@ -39,6 +41,9 @@ public class BriarControllerImpl implements BriarController {
 
 	private boolean bound = false;
 
+	@Nullable
+	private volatile BriarService service;
+
 	@Inject
 	BriarControllerImpl(BriarServiceConnection serviceConnection,
 			DatabaseConfig databaseConfig,
@@ -76,6 +81,15 @@ public class BriarControllerImpl implements BriarController {
 		activity.startService(new Intent(activity, BriarService.class));
 		bound = activity.bindService(new Intent(activity, BriarService.class),
 				serviceConnection, 0);
+		if (!bound) throw new IllegalStateException();
+
+		new Thread(() -> {
+			try {
+				service = getBriarService();
+			} catch (InterruptedException e) {
+				LOG.warning("Interrupted while waiting for service");
+			}
+		}).start();
 	}
 
 	@Override
@@ -85,27 +99,19 @@ public class BriarControllerImpl implements BriarController {
 
 	@Override
 	public void hasDozed(ResultHandler<Boolean> handler) {
-		// check this first, to hit the DbThread only when really necessary
-		if (!needsDozeWhitelisting(activity)) {
+		BriarService briarService = service;
+		if (briarService == null || !briarService.hasDozed() ||
+				!needsDozeWhitelisting(activity)) {
 			handler.onResult(false);
 			return;
 		}
+		if (briarService.hasDozed()) briarService.resetDozeFlag();
 		databaseExecutor.execute(() -> {
 			try {
 				Settings settings =
 						settingsManager.getSettings(SETTINGS_NAMESPACE);
-				boolean ask = settings.getBoolean(HAS_DOZED_ASK_AGAIN, true);
-				if (!ask) {
-					handler.onResult(false);
-					return;
-				}
-				IBinder binder = serviceConnection.waitForBinder();
-				BriarService service =
-						((BriarService.BriarBinder) binder).getService();
-				handler.onResult(service.hasDozed());
-				service.resetDozeFlag();
-			} catch (InterruptedException e) {
-				LOG.warning("Interrupted while waiting for service");
+				boolean ask = settings.getBoolean(DOZE_ASK_AGAIN, true);
+				handler.onResult(ask);
 			} catch (DbException e) {
 				if (LOG.isLoggable(WARNING))
 					LOG.log(WARNING, e.toString(), e);
@@ -114,11 +120,11 @@ public class BriarControllerImpl implements BriarController {
 	}
 
 	@Override
-	public void doNotNotifyWhenDozed() {
+	public void doNotAskAgainForDozeWhiteListing() {
 		databaseExecutor.execute(() -> {
 			try {
 				Settings settings = new Settings();
-				settings.putBoolean(HAS_DOZED_ASK_AGAIN, false);
+				settings.putBoolean(DOZE_ASK_AGAIN, false);
 				settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
 			} catch (DbException e) {
 				if (LOG.isLoggable(WARNING))
@@ -131,12 +137,11 @@ public class BriarControllerImpl implements BriarController {
 	public void signOut(ResultHandler<Void> eventHandler) {
 		new Thread() {
 			@Override
+			@SuppressWarnings("ConstantConditions")
 			public void run() {
 				try {
+					if (service == null) service = getBriarService();
 					// Wait for the service to finish starting up
-					IBinder binder = serviceConnection.waitForBinder();
-					BriarService service =
-							((BriarService.BriarBinder) binder).getService();
 					service.waitForStartup();
 					// Shut down the service and wait for it to shut down
 					LOG.info("Shutting down service");
@@ -150,6 +155,12 @@ public class BriarControllerImpl implements BriarController {
 		}.start();
 	}
 
+	@WorkerThread
+	private BriarService getBriarService() throws InterruptedException {
+		IBinder binder = serviceConnection.waitForBinder();
+		return ((BriarService.BriarBinder) binder).getService();
+	}
+
 	private void unbindService() {
 		if (bound) activity.unbindService(serviceConnection);
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
index 4ce1d18b2e73749daa0016d7f059ebc41bd847fd..c5e4a5b12623f708bbfce6b837b920a8125c209c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
@@ -1,7 +1,6 @@
 package org.briarproject.briar.android.navdrawer;
 
 import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
@@ -12,14 +11,12 @@ import android.support.v4.app.FragmentTransaction;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.Toolbar;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.CheckBox;
 import android.widget.GridView;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -54,12 +51,10 @@ import static android.support.v4.view.GravityCompat.START;
 import static android.support.v4.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
-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.navdrawer.NavDrawerController.ExpiryWarning.NO;
 import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.UPDATE;
 import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
-import static org.briarproject.briar.android.util.UiUtils.getDozeWhitelistingIntent;
 
 public class NavDrawerActivity extends BriarActivity implements
 		BaseFragmentListener, TransportStateListener,
@@ -158,12 +153,14 @@ public class NavDrawerActivity extends BriarActivity implements
 	protected void onActivityResult(int request, int result, Intent data) {
 		super.onActivityResult(request, result, data);
 		if (request == REQUEST_PASSWORD && result == RESULT_OK) {
-			controller.askDozeWhitelisting(this,
+			controller.shouldAskForDozeWhitelisting(this,
 					new UiResultHandler<Boolean>(this) {
 						@Override
 						public void onResultUi(Boolean ask) {
-							if (!ask) return;
-							requestDozeWhitelisting();
+							if (ask) {
+								showDozeDialog(
+										getString(R.string.setup_doze_intro));
+							}
 						}
 					});
 		}
@@ -328,28 +325,6 @@ public class NavDrawerActivity extends BriarActivity implements
 		expiryWarning.setVisibility(VISIBLE);
 	}
 
-	@TargetApi(23)
-	private void requestDozeWhitelisting() {
-		AlertDialog.Builder b =
-				new AlertDialog.Builder(this, R.style.BriarDialogTheme);
-		b.setMessage(R.string.setup_doze_intro);
-		b.setView(R.layout.checkbox);
-		b.setPositiveButton(R.string.ok,
-				(dialog, which) -> {
-					Intent i = getDozeWhitelistingIntent(
-							NavDrawerActivity.this);
-					startActivityForResult(i, REQUEST_DOZE_WHITELISTING);
-				});
-		b.setNegativeButton(R.string.cancel,
-				(dialog, which) -> {
-					CheckBox checkBox = (CheckBox) ((AlertDialog) dialog)
-							.findViewById(R.id.checkbox);
-					if (checkBox.isChecked())
-						controller.doNotAskAgainForDozeWhiteListing();
-				});
-		b.show();
-	}
-
 	private void initializeTransports(LayoutInflater inflater) {
 		transports = new ArrayList<>(3);
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java
index 21c220d6aafdcf9409f78c0219264c61f8c38699..d2d883e9040165c78945b3c1cb70365f0a733289 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java
@@ -18,9 +18,7 @@ public interface NavDrawerController extends ActivityLifecycleController {
 
 	void expiryWarningDismissed();
 
-	void askDozeWhitelisting(final Context ctx,
-			final ResultHandler<Boolean> handler);
-
-	void doNotAskAgainForDozeWhiteListing();
+	void shouldAskForDozeWhitelisting(Context ctx,
+			ResultHandler<Boolean> handler);
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java
index aa89c0dfa99c94908dd80e0db1f55c1c7134b937..ba5a22f2c70dae56223cb009a06aaed0375de013 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java
@@ -29,6 +29,7 @@ import javax.inject.Inject;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE;
+import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN;
 import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.NO;
 import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.SHOW;
 import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.UPDATE;
@@ -44,7 +45,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 			Logger.getLogger(NavDrawerControllerImpl.class.getName());
 	private static final String EXPIRY_DATE_WARNING = "expiryDateWarning";
 	private static final String EXPIRY_SHOW_UPDATE = "expiryShowUpdate";
-	private static final String DOZE_ASK_AGAIN = "dozeAskAgain";
 
 	private final PluginManager pluginManager;
 	private final SettingsManager settingsManager;
@@ -158,7 +158,7 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 	}
 
 	@Override
-	public void askDozeWhitelisting(Context ctx,
+	public void shouldAskForDozeWhitelisting(Context ctx,
 			ResultHandler<Boolean> handler) {
 		// check this first, to hit the DbThread only when really necessary
 		if (!needsDozeWhitelisting(ctx)) {
@@ -179,20 +179,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl
 		});
 	}
 
-	@Override
-	public void doNotAskAgainForDozeWhiteListing() {
-		runOnDbThread(() -> {
-			try {
-				Settings settings = new Settings();
-				settings.putBoolean(DOZE_ASK_AGAIN, false);
-				settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
-			} catch (DbException e) {
-				if (LOG.isLoggable(WARNING))
-					LOG.log(WARNING, e.toString(), e);
-			}
-		});
-	}
-
 	@Override
 	public boolean isTransportRunning(TransportId transportId) {
 		Plugin plugin = pluginManager.getPlugin(transportId);