diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index 8be1cbf4d3b86536ffb3a0357c455c4f58d930be..e0dbc1a3d9d10fd3304349d73d1f6f1436ac2021 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -1,28 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest
 	package="org.briarproject.briar"
-	xmlns:tools="http://schemas.android.com/tools"
-	xmlns:android="http://schemas.android.com/apk/res/android">
-
-	<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
-	<uses-feature android:name="android.hardware.camera" android:required="false"/>
-	<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
-
-	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-	<uses-permission android:name="android.permission.BLUETOOTH" />
-	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
-	<uses-permission android:name="android.permission.CAMERA" />
-	<uses-permission android:name="android.permission.INTERNET" />
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:tools="http://schemas.android.com/tools">
+
+	<uses-feature
+		android:name="android.hardware.bluetooth"
+		android:required="false"/>
+	<uses-feature
+		android:name="android.hardware.camera"
+		android:required="false"/>
+	<uses-feature
+		android:name="android.hardware.touchscreen"
+		android:required="false"/>
+
+	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+	<uses-permission android:name="android.permission.BLUETOOTH"/>
+	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+	<uses-permission android:name="android.permission.CAMERA"/>
+	<uses-permission android:name="android.permission.INTERNET"/>
 	<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
-	<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
-	<uses-permission android:name="android.permission.VIBRATE" />
-	<uses-permission android:name="android.permission.WAKE_LOCK" />
-	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-	<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
+	<uses-permission android:name="android.permission.VIBRATE"/>
+	<uses-permission android:name="android.permission.WAKE_LOCK"/>
+	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+
+	<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 	<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
-	<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" />
-	<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
+	<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC"/>
+	<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE"/>
 
 	<application
 		android:name="org.briarproject.briar.android.BriarApplicationImpl"
@@ -32,7 +38,8 @@
 		android:logo="@mipmap/ic_launcher_round"
 		android:supportsRtl="true"
 		android:theme="@style/BriarTheme"
-		tools:ignore="GoogleAppIndexingWarning">
+		tools:ignore="GoogleAppIndexingWarning"
+		tools:targetApi="16">
 
 		<receiver
 			android:name="org.briarproject.briar.android.login.SignInReminderReceiver"
@@ -85,8 +92,8 @@
 
 		<activity
 			android:name="org.briarproject.briar.android.splash.SplashScreenActivity"
-			android:theme="@style/BriarTheme.NoActionBar"
-			android:label="@string/app_name">
+			android:label="@string/app_name"
+			android:theme="@style/BriarTheme.NoActionBar">
 			<intent-filter>
 				<action android:name="android.intent.action.MAIN"/>
 				<category android:name="android.intent.category.LAUNCHER"/>
@@ -95,20 +102,38 @@
 
 		<activity
 			android:name="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-			android:theme="@style/BriarTheme.NoActionBar"
-		    android:launchMode="singleTop">
+			android:launchMode="singleTask"
+			android:theme="@style/BriarTheme.NoActionBar">
+
+			<intent-filter>
+				<action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
+				<category android:name="android.intent.category.DEFAULT"/>
+			</intent-filter>
+			<intent-filter android:label="@string/add_contact_remotely_title_case">
+				<action android:name="android.intent.action.VIEW"/>
+
+				<category android:name="android.intent.category.DEFAULT"/>
+				<category android:name="android.intent.category.BROWSABLE"/>
+
+				<data android:scheme="briar"/>
+			</intent-filter>
+			<intent-filter android:label="@string/add_contact_remotely_title_case">
+				<action android:name="android.intent.action.SEND"/>
+				<category android:name="android.intent.category.DEFAULT"/>
+				<data android:mimeType="text/plain"/>
+			</intent-filter>
+
 		</activity>
 
 		<activity
 			android:name="org.briarproject.briar.android.conversation.ConversationActivity"
 			android:label="@string/app_name"
-			android:theme="@style/BriarTheme.NoActionBar"
 			android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
+			android:theme="@style/BriarTheme.NoActionBar"
 			android:windowSoftInputMode="stateHidden|adjustResize">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -127,8 +152,7 @@
 			android:windowSoftInputMode="adjustResize">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -139,8 +163,7 @@
 			android:windowSoftInputMode="adjustResize|stateHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -159,8 +182,7 @@
 			android:windowSoftInputMode="adjustResize|stateHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"
-				/>
+				android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/>
 		</activity>
 
 		<activity
@@ -170,8 +192,7 @@
 			android:windowSoftInputMode="adjustResize|stateAlwaysHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"
-				/>
+				android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/>
 		</activity>
 
 		<activity
@@ -190,8 +211,7 @@
 			android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -200,8 +220,7 @@
 			android:parentActivityName="org.briarproject.briar.android.conversation.ConversationActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.conversation.ConversationActivity"
-				/>
+				android:value="org.briarproject.briar.android.conversation.ConversationActivity"/>
 		</activity>
 
 		<activity
@@ -211,8 +230,7 @@
 			android:windowSoftInputMode="adjustResize">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -223,8 +241,7 @@
 			android:windowSoftInputMode="adjustResize|stateHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -234,8 +251,7 @@
 			android:windowSoftInputMode="adjustResize|stateHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.forum.ForumActivity"
-				/>
+				android:value="org.briarproject.briar.android.forum.ForumActivity"/>
 		</activity>
 
 		<activity
@@ -245,8 +261,7 @@
 			android:windowSoftInputMode="adjustResize|stateHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.blog.BlogActivity"
-				/>
+				android:value="org.briarproject.briar.android.blog.BlogActivity"/>
 		</activity>
 
 		<activity
@@ -265,8 +280,7 @@
 			android:parentActivityName="org.briarproject.briar.android.blog.BlogActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.blog.BlogActivity"
-				/>
+				android:value="org.briarproject.briar.android.blog.BlogActivity"/>
 		</activity>
 
 		<activity
@@ -285,8 +299,7 @@
 			android:windowSoftInputMode="stateVisible|adjustResize">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.blog.BlogActivity"
-				/>
+				android:value="org.briarproject.briar.android.blog.BlogActivity"/>
 		</activity>
 
 		<activity
@@ -296,8 +309,7 @@
 			android:windowSoftInputMode="stateHidden">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.blog.BlogActivity"
-				/>
+				android:value="org.briarproject.briar.android.blog.BlogActivity"/>
 		</activity>
 
 		<activity
@@ -307,8 +319,7 @@
 			android:windowSoftInputMode="stateVisible|adjustResize">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -317,15 +328,14 @@
 			android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
 			android:name="org.briarproject.briar.android.keyagreement.ContactExchangeActivity"
 			android:label="@string/add_contact_title"
-			android:theme="@style/BriarTheme.NoActionBar"
-			android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
+			android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
+			android:theme="@style/BriarTheme.NoActionBar">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
@@ -338,8 +348,7 @@
 			android:windowSoftInputMode="stateHidden|adjustResize">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.conversation.ConversationActivity"
-				/>
+				android:value="org.briarproject.briar.android.conversation.ConversationActivity"/>
 		</activity>
 
 		<activity
@@ -354,12 +363,7 @@
 			android:permission="android.permission.READ_NETWORK_USAGE_HISTORY">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
-				/>
-			<intent-filter>
-				<action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
-				<category android:name="android.intent.category.DEFAULT"/>
-			</intent-filter>
+				android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
 		</activity>
 
 		<activity
@@ -368,8 +372,7 @@
 			android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.settings.SettingsActivity"
-				/>
+				android:value="org.briarproject.briar.android.settings.SettingsActivity"/>
 		</activity>
 
 		<activity
@@ -378,8 +381,7 @@
 			android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.settings.SettingsActivity"
-				/>
+				android:value="org.briarproject.briar.android.settings.SettingsActivity"/>
 		</activity>
 
 		<activity
@@ -388,8 +390,7 @@
 			android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
-				android:value="org.briarproject.briar.android.settings.SettingsActivity"
-				/>
+				android:value="org.briarproject.briar.android.settings.SettingsActivity"/>
 		</activity>
 
 		<activity
@@ -422,23 +423,8 @@
 		<activity
 			android:name=".android.contact.add.remote.AddContactActivity"
 			android:label="@string/add_contact_remotely_title_case"
-			android:launchMode="singleTask"
 			android:theme="@style/BriarTheme"
-			android:windowSoftInputMode="stateHidden|adjustResize">
-			<intent-filter>
-				<action android:name="android.intent.action.VIEW"/>
-
-				<category android:name="android.intent.category.DEFAULT"/>
-				<category android:name="android.intent.category.BROWSABLE"/>
-
-				<data android:scheme="briar"/>
-			</intent-filter>
-			<intent-filter>
-				<action android:name="android.intent.action.SEND"/>
-				<category android:name="android.intent.category.DEFAULT"/>
-				<data android:mimeType="text/plain"/>
-			</intent-filter>
-		</activity>
+			android:windowSoftInputMode="stateHidden|adjustResize"/>
 
 		<activity
 			android:name=".android.contact.add.remote.PendingContactListActivity"
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java
index cf0b74416f24fcdb6b6890ae8a40c7683ea028ca..cd5871a92d7c323164a5312787fee2724e15757f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java
@@ -9,6 +9,7 @@ import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.support.annotation.Nullable;
 import android.support.annotation.StringRes;
 import android.support.annotation.UiThread;
 import android.support.v4.app.NotificationCompat;
@@ -73,10 +74,11 @@ import static android.support.v4.app.NotificationCompat.VISIBILITY_SECRET;
 import static android.support.v4.content.ContextCompat.getColor;
 import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
 import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID;
-import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_BLOGS;
-import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_CONTACTS;
-import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_FORUMS;
-import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_GROUPS;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.BLOG_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_ADDED_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.FORUM_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.GROUP_URI;
 import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
 
 @ThreadSafe
@@ -101,7 +103,9 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 	private final Multiset<GroupId> blogCounts = new Multiset<>();
 	private int contactAddedTotal = 0;
 	private int nextRequestId = 0;
+	@Nullable
 	private ContactId blockedContact = null;
+	@Nullable
 	private GroupId blockedGroup = null;
 	private boolean blockSignInReminder = false;
 	private boolean blockBlogs = false;
@@ -325,9 +329,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 			} else {
 				// Touching the notification shows the contact list
 				Intent i = new Intent(appContext, NavDrawerActivity.class);
-				i.putExtra(INTENT_CONTACTS, true);
 				i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-				i.setData(Uri.parse(CONTACT_URI));
+				i.setData(CONTACT_URI);
 				TaskStackBuilder t = TaskStackBuilder.create(appContext);
 				t.addParentStack(NavDrawerActivity.class);
 				t.addNextIntent(i);
@@ -363,9 +366,9 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 		return defaults;
 	}
 
-	private void setDeleteIntent(BriarNotificationBuilder b, String uri) {
+	private void setDeleteIntent(BriarNotificationBuilder b, Uri uri) {
 		Intent i = new Intent(appContext, NotificationCleanupService.class);
-		i.setData(Uri.parse(uri));
+		i.setData(uri);
 		b.setDeleteIntent(PendingIntent.getService(appContext, nextRequestId++,
 				i, 0));
 	}
@@ -425,9 +428,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 			} else {
 				// Touching the notification shows the group list
 				Intent i = new Intent(appContext, NavDrawerActivity.class);
-				i.putExtra(INTENT_GROUPS, true);
 				i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-				i.setData(Uri.parse(GROUP_URI));
+				i.setData(GROUP_URI);
 				TaskStackBuilder t = TaskStackBuilder.create(appContext);
 				t.addParentStack(NavDrawerActivity.class);
 				t.addNextIntent(i);
@@ -493,9 +495,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 			} else {
 				// Touching the notification shows the forum list
 				Intent i = new Intent(appContext, NavDrawerActivity.class);
-				i.putExtra(INTENT_FORUMS, true);
 				i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-				i.setData(Uri.parse(FORUM_URI));
+				i.setData(FORUM_URI);
 				TaskStackBuilder t = TaskStackBuilder.create(appContext);
 				t.addParentStack(NavDrawerActivity.class);
 				t.addNextIntent(i);
@@ -546,9 +547,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 			setDeleteIntent(b, BLOG_URI);
 			// Touching the notification shows the combined blog feed
 			Intent i = new Intent(appContext, NavDrawerActivity.class);
-			i.putExtra(INTENT_BLOGS, true);
 			i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-			i.setData(Uri.parse(BLOG_URI));
+			i.setData(BLOG_URI);
 			TaskStackBuilder t = TaskStackBuilder.create(appContext);
 			t.addParentStack(NavDrawerActivity.class);
 			t.addNextIntent(i);
@@ -585,9 +585,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
 		setDeleteIntent(b, CONTACT_ADDED_URI);
 		// Touching the notification shows the contact list
 		Intent i = new Intent(appContext, NavDrawerActivity.class);
-		i.putExtra(INTENT_CONTACTS, true);
 		i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-		i.setData(Uri.parse(CONTACT_URI));
+		i.setData(CONTACT_URI);
 		TaskStackBuilder t = TaskStackBuilder.create(appContext);
 		t.addParentStack(NavDrawerActivity.class);
 		t.addNextIntent(i);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java b/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java
index 44698d3f5fb053f4ba4e4627b77723d81551cea1..1d8ca912fc031ab48ecd8a51645ef8163ea57a95 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java
@@ -2,17 +2,18 @@ package org.briarproject.briar.android;
 
 import android.app.IntentService;
 import android.content.Intent;
+import android.net.Uri;
 import android.support.annotation.Nullable;
 
 import org.briarproject.briar.api.android.AndroidNotificationManager;
 
 import javax.inject.Inject;
 
-import static org.briarproject.briar.api.android.AndroidNotificationManager.BLOG_URI;
-import static org.briarproject.briar.api.android.AndroidNotificationManager.CONTACT_URI;
-import static org.briarproject.briar.api.android.AndroidNotificationManager.FORUM_URI;
-import static org.briarproject.briar.api.android.AndroidNotificationManager.GROUP_URI;
-import static org.briarproject.briar.api.android.AndroidNotificationManager.CONTACT_ADDED_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.BLOG_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_ADDED_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.FORUM_URI;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.GROUP_URI;
 
 public class NotificationCleanupService extends IntentService {
 
@@ -37,7 +38,7 @@ public class NotificationCleanupService extends IntentService {
 	@Override
 	protected void onHandleIntent(@Nullable Intent i) {
 		if (i == null || i.getData() == null) return;
-		String uri = i.getData().toString();
+		Uri uri = i.getData();
 		if (uri.equals(CONTACT_URI)) {
 			notificationManager.clearAllContactNotifications();
 		} else if (uri.equals(GROUP_URI)) {
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 8f476d4563c03039f2bad42636082a2656c8abf3..4db1bd6b2e04ccf09ddfbfb06cd1fd6023679980 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
@@ -12,11 +12,11 @@ import android.widget.CheckBox;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.briar.R;
+import org.briarproject.briar.android.account.UnlockActivity;
 import org.briarproject.briar.android.controller.BriarController;
 import org.briarproject.briar.android.controller.DbController;
 import org.briarproject.briar.android.controller.handler.UiResultHandler;
 import org.briarproject.briar.android.login.StartupActivity;
-import org.briarproject.briar.android.account.UnlockActivity;
 import org.briarproject.briar.android.logout.ExitActivity;
 import org.briarproject.briar.api.android.LockManager;
 
@@ -66,9 +66,7 @@ public abstract class BriarActivity extends BaseActivity {
 			@Nullable Intent data) {
 		super.onActivityResult(request, result, data);
 		if (request == REQUEST_PASSWORD) {
-			// The result can be RESULT_CANCELED if there's no account
 			if (result == RESULT_OK) briarController.startAndBindService();
-			else finish();
 		} 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 b043580166ba7e80aa04b8f1c82a49cd5a5f0f2a..3bca5ce75f149008c704bde48898bea4bb89c7aa 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
@@ -57,9 +57,9 @@ public class AddContactActivity extends BriarActivity implements
 		});
 
 		Intent i = getIntent();
-		if (i != null) {
+		if (state == null && i != null) {
+			// do not react to the intent again when recreating the activity
 			onNewIntent(i);
-			setIntent(null);  // don't keep the intent for configuration changes
 		}
 
 		if (state == null) {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/IntentRouter.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/IntentRouter.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a9e1c1747ebfef7eaf560e4b0061cf4cc069950
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/IntentRouter.java
@@ -0,0 +1,45 @@
+package org.briarproject.briar.android.navdrawer;
+
+import android.content.Context;
+import android.content.Intent;
+
+import org.briarproject.briar.android.activity.BriarActivity;
+import org.briarproject.briar.android.contact.add.remote.AddContactActivity;
+import org.briarproject.briar.android.settings.SettingsActivity;
+
+import static android.content.Intent.ACTION_MANAGE_NETWORK_USAGE;
+import static android.content.Intent.ACTION_SEND;
+import static android.content.Intent.ACTION_VIEW;
+import static android.content.Intent.EXTRA_TEXT;
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
+import static org.briarproject.bramble.api.contact.HandshakeLinkConstants.LINK_REGEX;
+
+class IntentRouter {
+
+	static void handleExternalIntent(Context ctx, Intent i) {
+		String action = i.getAction();
+		// add remote contact with clicked briar:// link
+		if (ACTION_VIEW.equals(action) && "briar".equals(i.getScheme())) {
+			redirect(ctx, i, AddContactActivity.class);
+		}
+		// add remote contact with shared briar:// link
+		else if (ACTION_SEND.equals(action) &&
+				"text/plain".equals(i.getType()) &&
+				i.getStringExtra(EXTRA_TEXT) != null &&
+				LINK_REGEX.matcher(i.getStringExtra(EXTRA_TEXT)).find()) {
+			redirect(ctx, i, AddContactActivity.class);
+		}
+		// network settings as launched from system settings app
+		else if (ACTION_MANAGE_NETWORK_USAGE.equals(action)) {
+			redirect(ctx, i, SettingsActivity.class);
+		}
+	}
+
+	private static void redirect(Context ctx, Intent i,
+			Class<? extends BriarActivity> activityClass) {
+		i.setClass(ctx, activityClass);
+		i.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
+		ctx.startActivity(i);
+	}
+
+}
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 a9901acf4acc52cc5814d7317955282ff246f114..1b8ea5c4ea7477937a5edebcf0d4fd72313a5c66 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
@@ -3,6 +3,7 @@ package org.briarproject.briar.android.navdrawer;
 import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.content.res.Configuration;
+import android.net.Uri;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -60,9 +61,11 @@ 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 java.util.Objects.requireNonNull;
+import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING;
 import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
+import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent;
 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;
@@ -73,14 +76,21 @@ public class NavDrawerActivity extends BriarActivity implements
 		BaseFragmentListener, TransportStateListener,
 		OnNavigationItemSelectedListener {
 
-	public static final String INTENT_CONTACTS = "intent_contacts";
-	public static final String INTENT_GROUPS = "intent_groups";
-	public static final String INTENT_FORUMS = "intent_forums";
-	public static final String INTENT_BLOGS = "intent_blogs";
-	public static final String INTENT_SIGN_OUT = "intent_sign_out";
-
 	private static final Logger LOG =
-			Logger.getLogger(NavDrawerActivity.class.getName());
+			getLogger(NavDrawerActivity.class.getName());
+
+	public static Uri CONTACT_URI =
+			Uri.parse("briar-content://org.briarproject.briar/contact");
+	public static Uri GROUP_URI =
+			Uri.parse("briar-content://org.briarproject.briar/group");
+	public static Uri FORUM_URI =
+			Uri.parse("briar-content://org.briarproject.briar/forum");
+	public static Uri BLOG_URI =
+			Uri.parse("briar-content://org.briarproject.briar/blog");
+	public static Uri CONTACT_ADDED_URI =
+			Uri.parse("briar-content://org.briarproject.briar/contact/added");
+	public static Uri SIGN_OUT_URI =
+			Uri.parse("briar-content://org.briarproject.briar/sign-out");
 
 	private ActionBarDrawerToggle drawerToggle;
 
@@ -95,26 +105,6 @@ public class NavDrawerActivity extends BriarActivity implements
 	private List<Transport> transports;
 	private BaseAdapter transportsAdapter;
 
-	@Override
-	protected void onNewIntent(Intent intent) {
-		super.onNewIntent(intent);
-		exitIfStartupFailed(intent);
-		// TODO don't create new instances if they are on the stack (#606)
-		if (intent.getBooleanExtra(INTENT_GROUPS, false)) {
-			startFragment(GroupListFragment.newInstance(), R.id.nav_btn_groups);
-		} else if (intent.getBooleanExtra(INTENT_FORUMS, false)) {
-			startFragment(ForumListFragment.newInstance(), R.id.nav_btn_forums);
-		} else if (intent.getBooleanExtra(INTENT_CONTACTS, false)) {
-			startFragment(ContactListFragment.newInstance(),
-					R.id.nav_btn_contacts);
-		} else if (intent.getBooleanExtra(INTENT_BLOGS, false)) {
-			startFragment(FeedFragment.newInstance(), R.id.nav_btn_blogs);
-		} else if (intent.getBooleanExtra(INTENT_SIGN_OUT, false)) {
-			signOut(false, false);
-		}
-		setIntent(null);
-	}
-
 	@Override
 	public void injectActivity(ActivityComponent component) {
 		component.inject(this);
@@ -153,7 +143,8 @@ public class NavDrawerActivity extends BriarActivity implements
 			startFragment(ContactListFragment.newInstance(),
 					R.id.nav_btn_contacts);
 		}
-		if (getIntent() != null) {
+		if (state == null && getIntent() != null) {
+			// do not call this again when there's existing state
 			onNewIntent(getIntent());
 		}
 	}
@@ -190,6 +181,37 @@ public class NavDrawerActivity extends BriarActivity implements
 		}
 	}
 
+	@Override
+	protected void onNewIntent(Intent intent) {
+		super.onNewIntent(intent);
+
+		// will call System.exit()
+		exitIfStartupFailed(intent);
+
+		if ("briar-content".equals(intent.getScheme())) {
+			handleContentIntent(intent);
+		} else {
+			handleExternalIntent(this, intent);
+		}
+	}
+
+	private void handleContentIntent(Intent intent) {
+		Uri uri = intent.getData();
+		// TODO don't create new instances if they are on the stack (#606)
+		if (CONTACT_URI.equals(uri) || CONTACT_ADDED_URI.equals(uri)) {
+			startFragment(ContactListFragment.newInstance(),
+					R.id.nav_btn_contacts);
+		} else if (GROUP_URI.equals(uri)) {
+			startFragment(GroupListFragment.newInstance(), R.id.nav_btn_groups);
+		} else if (FORUM_URI.equals(uri)) {
+			startFragment(ForumListFragment.newInstance(), R.id.nav_btn_forums);
+		} else if (BLOG_URI.equals(uri)) {
+			startFragment(FeedFragment.newInstance(), R.id.nav_btn_blogs);
+		} else if (SIGN_OUT_URI.equals(uri)) {
+			signOut(false, false);
+		}
+	}
+
 	private void exitIfStartupFailed(Intent intent) {
 		if (intent.getBooleanExtra(EXTRA_STARTUP_FAILED, false)) {
 			finish();
@@ -325,7 +347,6 @@ public class NavDrawerActivity extends BriarActivity implements
 		if (item != null) item.setVisible(visible);
 	}
 
-	@SuppressWarnings("ConstantConditions")
 	private void showExpiryWarning(ExpiryWarning expiry) {
 		int daysUntilExpiry = getDaysUntilExpiry();
 		if (daysUntilExpiry < 0) signOut();
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
index 6f5dcacc4a751852c76fc752b48bb0f126d084a6..b87e0e4cb67e61969ef8cf840d9fd25bca3835bd 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
@@ -79,10 +79,10 @@ import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ONLY_WHE
 import static org.briarproject.bramble.util.LogUtils.logDuration;
 import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.LogUtils.now;
-import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
 import static org.briarproject.briar.android.BriarApplication.ENTRY_ACTIVITY;
+import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_RINGTONE;
-import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_SIGN_OUT;
+import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.SIGN_OUT_URI;
 import static org.briarproject.briar.android.util.UiUtils.hasScreenLock;
 import static org.briarproject.briar.android.util.UiUtils.triggerFeedback;
 import static org.briarproject.briar.api.android.AndroidNotificationManager.BLOG_CHANNEL_ID;
@@ -578,7 +578,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
 					language.setValue(newValue);
 					Intent intent = new Intent(getContext(), ENTRY_ACTIVITY);
 					intent.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
-					intent.putExtra(INTENT_SIGN_OUT, true);
+					intent.setData(SIGN_OUT_URI);
 					requireActivity().startActivity(intent);
 					requireActivity().finish();
 				});
diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java
index 0a4951155cbfbe7c20bd6d4c62d7b6e8e52baa0d..eec2b8e9f65ec7106d0a4e118914ca7a8dca4948 100644
--- a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java
+++ b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java
@@ -43,13 +43,6 @@ public interface AndroidNotificationManager {
 	String FAILURE_CHANNEL_ID = "zStartupFailure";
 	String REMINDER_CHANNEL_ID = "zSignInReminder";
 
-	// Content URIs for pending intents
-	String CONTACT_URI = "content://org.briarproject.briar/contact";
-	String GROUP_URI = "content://org.briarproject.briar/group";
-	String FORUM_URI = "content://org.briarproject.briar/forum";
-	String BLOG_URI = "content://org.briarproject.briar/blog";
-	String CONTACT_ADDED_URI = "content://org.briarproject.briar/contact/added";
-
 	// Actions for pending intents
 	String ACTION_DISMISS_REMINDER = "dismissReminder";