diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java
index c960ffe9bf06430c71b829f3b626adab5dfbb6f6..ea539e0662adc0fb45607a86ef668228409e0719 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java
@@ -9,6 +9,7 @@ import android.content.IntentFilter;
 import android.os.Bundle;
 import android.support.annotation.UiThread;
 import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.FragmentManager;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AlertDialog.Builder;
 import android.support.v7.widget.Toolbar;
@@ -206,11 +207,14 @@ public class KeyAgreementActivity extends BriarActivity implements
 
 	private void showQrCodeFragment() {
 		// FIXME #824
-		BaseFragment f = ShowQrCodeFragment.newInstance();
-		getSupportFragmentManager().beginTransaction()
-				.replace(R.id.fragmentContainer, f, f.getUniqueTag())
-				.addToBackStack(f.getUniqueTag())
-				.commit();
+		FragmentManager fm = getSupportFragmentManager();
+		if (fm.findFragmentByTag(ShowQrCodeFragment.TAG) == null) {
+			BaseFragment f = ShowQrCodeFragment.newInstance();
+			fm.beginTransaction()
+					.replace(R.id.fragmentContainer, f, f.getUniqueTag())
+					.addToBackStack(f.getUniqueTag())
+					.commit();
+		}
 	}
 
 	private boolean checkPermissions() {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/QrCodeDecoder.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/QrCodeDecoder.java
index e191c640500a6af4afec18aed69a04a1eaaeb85f..7b018be03a96dab6abbb9836310071c5858685ff 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/QrCodeDecoder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/QrCodeDecoder.java
@@ -24,7 +24,6 @@ import java.util.logging.Logger;
 
 import static com.google.zxing.DecodeHintType.CHARACTER_SET;
 import static java.util.Collections.singletonMap;
-import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 
 @SuppressWarnings("deprecation")
@@ -67,7 +66,6 @@ class QrCodeDecoder implements PreviewConsumer, PreviewCallback {
 	@Override
 	public void onPreviewFrame(byte[] data, Camera camera) {
 		if (camera == this.camera) {
-			LOG.info("Got preview frame");
 			try {
 				Size size = camera.getParameters().getPreviewSize();
 				// The preview should be in NV21 format: width * height bytes of
@@ -105,20 +103,13 @@ class QrCodeDecoder implements PreviewConsumer, PreviewCallback {
 
 		@Override
 		protected Void doInBackground(Void... params) {
-			long now = System.currentTimeMillis();
 			BinaryBitmap bitmap = binarize(data, width, height, orientation);
 			Result result;
 			try {
 				result = reader.decode(bitmap,
 						singletonMap(CHARACTER_SET, "ISO8859_1"));
-				long duration = System.currentTimeMillis() - now;
-				if (LOG.isLoggable(INFO))
-					LOG.info("Decoding barcode took " + duration + " ms");
 			} catch (ReaderException e) {
 				// No barcode found
-				long duration = System.currentTimeMillis() - now;
-				if (LOG.isLoggable(INFO))
-					LOG.info("No barcode found after " + duration + " ms");
 				return null;
 			} catch (RuntimeException e) {
 				LOG.warning("Invalid preview frame");
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java
index b89f630d105a40418fad4ee9f6e43a3ddcb047e5..1088d78afdedaa306f3a1ddc5c24e4a2b34a67be 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java
@@ -61,7 +61,8 @@ import static java.util.logging.Level.WARNING;
 public class ShowQrCodeFragment extends BaseEventFragment
 		implements QrCodeDecoder.ResultCallback {
 
-	private static final String TAG = ShowQrCodeFragment.class.getName();
+	static final String TAG = ShowQrCodeFragment.class.getName();
+
 	private static final Logger LOG = Logger.getLogger(TAG);
 	private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
 
@@ -207,6 +208,15 @@ public class ShowQrCodeFragment extends BaseEventFragment
 
 	@UiThread
 	private void reset() {
+		// If we've stopped the camera view, restart it
+		if (gotRemotePayload) {
+			try {
+				cameraView.start(getScreenRotationDegrees());
+			} catch (CameraException e) {
+				logCameraExceptionAndFinish(e);
+				return;
+			}
+		}
 		statusView.setVisibility(INVISIBLE);
 		cameraView.setVisibility(VISIBLE);
 		gotRemotePayload = false;