diff --git a/briar-android/src/net/sf/briar/android/AndroidModule.java b/briar-android/src/net/sf/briar/android/AndroidModule.java
index d379f5086cc32b26583e3db7571a735aa3206452..83ec34737014019708dcf2a0e0dcbeea57c9a106 100644
--- a/briar-android/src/net/sf/briar/android/AndroidModule.java
+++ b/briar-android/src/net/sf/briar/android/AndroidModule.java
@@ -1,6 +1,5 @@
 package net.sf.briar.android;
 
-import net.sf.briar.android.invitation.AddContactActivity;
 import net.sf.briar.api.android.AndroidExecutor;
 import net.sf.briar.api.android.BundleEncrypter;
 import net.sf.briar.api.android.ReferenceManager;
@@ -17,6 +16,5 @@ public class AndroidModule extends AbstractModule {
 			Singleton.class);
 		bind(ReferenceManager.class).to(ReferenceManagerImpl.class).in(
 				Singleton.class);
-		requestStaticInjection(AddContactActivity.class);
 	}
 }
diff --git a/briar-android/src/net/sf/briar/android/BriarActivity.java b/briar-android/src/net/sf/briar/android/BriarActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..732afda9679e3a76a8f7990186fc68736060999d
--- /dev/null
+++ b/briar-android/src/net/sf/briar/android/BriarActivity.java
@@ -0,0 +1,28 @@
+package net.sf.briar.android;
+
+import roboguice.activity.RoboActivity;
+import android.os.Bundle;
+
+/**
+ * An abstract superclass for activities that overrides the default behaviour
+ * to prevent sensitive state from being saved unless the subclass explicitly
+ * saves it.
+ */
+public abstract class BriarActivity extends RoboActivity {
+
+	@Override
+	public void onCreate(Bundle state) {
+		// Don't pass state through to the superclass
+		super.onCreate(null);
+	}
+
+	@Override
+	public void onRestoreInstanceState(Bundle state) {
+		// Don't pass state through to the superclass
+	}
+
+	@Override
+	public void onSaveInstanceState(Bundle state) {
+		// Don't allow the superclass to save state
+	}
+}
diff --git a/briar-android/src/net/sf/briar/android/helloworld/HelloWorldActivity.java b/briar-android/src/net/sf/briar/android/helloworld/HelloWorldActivity.java
index 618160bc6cf12ca20230e4bf8d7a4ca17fe1c69f..b3b4417d8cce36be57fbfe2df39d69e8a0c08c03 100644
--- a/briar-android/src/net/sf/briar/android/helloworld/HelloWorldActivity.java
+++ b/briar-android/src/net/sf/briar/android/helloworld/HelloWorldActivity.java
@@ -8,14 +8,11 @@ import static java.util.logging.Level.INFO;
 
 import java.util.logging.Logger;
 
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
 import net.sf.briar.R;
+import net.sf.briar.android.BriarActivity;
 import net.sf.briar.android.BriarService;
 import net.sf.briar.android.invitation.AddContactActivity;
 import net.sf.briar.api.android.BundleEncrypter;
-import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
@@ -25,21 +22,19 @@ import android.widget.LinearLayout;
 import android.widget.RelativeLayout.LayoutParams;
 import android.widget.TextView;
 
-public class HelloWorldActivity extends RoboActivity
+import com.google.inject.Inject;
+
+public class HelloWorldActivity extends BriarActivity
 implements OnClickListener {
 
 	private static final Logger LOG =
 			Logger.getLogger(HelloWorldActivity.class.getName());
 
-	@Inject private static Provider<BundleEncrypter> bundleEncrypterProvider;
-
-	private final BundleEncrypter bundleEncrypter =
-			bundleEncrypterProvider.get();
+	@Inject private BundleEncrypter bundleEncrypter;
 
 	@Override
 	public void onCreate(Bundle state) {
-		if(state != null && !bundleEncrypter.decrypt(state)) state = null;
-		super.onCreate(state);
+		super.onCreate(null);
 		if(LOG.isLoggable(INFO)) LOG.info("Created");
 		LinearLayout layout = new LinearLayout(this);
 		layout.setLayoutParams(new LayoutParams(MATCH_PARENT, MATCH_PARENT));
@@ -70,18 +65,6 @@ implements OnClickListener {
 		startService(new Intent(BriarService.class.getName()));
 	}
 
-	@Override
-	public void onRestoreInstanceState(Bundle state) {
-		if(bundleEncrypter.decrypt(state))
-			super.onRestoreInstanceState(state);
-	}
-
-	@Override
-	public void onSaveInstanceState(Bundle state) {
-		super.onSaveInstanceState(state);
-		bundleEncrypter.encrypt(state);
-	}
-
 	@Override
 	public void onDestroy() {
 		super.onDestroy();
diff --git a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java
index bc229df0385b42f3d6680f4fc40a4db4a6aa7338..426758f52e6faeec7391e38f30a8f3a7a3abe3bb 100644
--- a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java
+++ b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java
@@ -5,6 +5,7 @@ import static java.util.logging.Level.WARNING;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
+import net.sf.briar.android.BriarActivity;
 import net.sf.briar.api.android.BundleEncrypter;
 import net.sf.briar.api.android.ReferenceManager;
 import net.sf.briar.api.crypto.CryptoComponent;
@@ -15,24 +16,17 @@ import net.sf.briar.api.invitation.InvitationListener;
 import net.sf.briar.api.invitation.InvitationState;
 import net.sf.briar.api.invitation.InvitationTask;
 import net.sf.briar.api.invitation.InvitationTaskFactory;
-import roboguice.activity.RoboActivity;
 import android.os.Bundle;
 
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 
-public class AddContactActivity extends RoboActivity
+public class AddContactActivity extends BriarActivity
 implements InvitationListener {
 
 	private static final Logger LOG =
 			Logger.getLogger(AddContactActivity.class.getName());
 
-	// This allows us to access bundleEncrypter before calling super.onCreate()
-	@Inject private static Provider<BundleEncrypter> bundleEncrypterProvider;
-
-	private final BundleEncrypter bundleEncrypter =
-			bundleEncrypterProvider.get();
-
+	@Inject private BundleEncrypter bundleEncrypter;
 	@Inject private CryptoComponent crypto;
 	@Inject private DatabaseComponent db;
 	@Inject @DatabaseExecutor private Executor dbExecutor;
@@ -53,9 +47,8 @@ implements InvitationListener {
 
 	@Override
 	public void onCreate(Bundle state) {
-		if(state != null && !bundleEncrypter.decrypt(state)) state = null;
-		super.onCreate(state);
-		if(state == null) {
+		super.onCreate(null);
+		if(state == null || !bundleEncrypter.decrypt(state)) {
 			// This is a new activity or the app has restarted
 			setView(new NetworkSetupView(this));
 		} else {
@@ -120,12 +113,6 @@ implements InvitationListener {
 		}
 	}
 
-	@Override
-	public void onRestoreInstanceState(Bundle state) {
-		if(bundleEncrypter.decrypt(state))
-			super.onRestoreInstanceState(state);
-	}
-
 	@Override
 	public void onResume() {
 		super.onResume();
@@ -134,7 +121,6 @@ implements InvitationListener {
 
 	@Override
 	public void onSaveInstanceState(Bundle state) {
-		super.onSaveInstanceState(state);
 		state.putString("net.sf.briar.NETWORK_NAME", networkName);
 		state.putBoolean("net.sf.briar.USE_BLUETOOTH", useBluetooth);
 		state.putInt("net.sf.briar.LOCAL_CODE", localInvitationCode);