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..c648a0b739a0b7abb0f4129c51c64c4db9fcdaa2 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
@@ -14,6 +14,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.AlphaAnimation;
 import android.widget.ImageView;
+import android.widget.LinearLayout.LayoutParams;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -52,6 +53,7 @@ import javax.inject.Provider;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
 import static android.view.View.INVISIBLE;
 import static android.view.View.VISIBLE;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.widget.Toast.LENGTH_LONG;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
@@ -83,6 +85,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	private ImageView qrCode;
 	private TextView mainProgressTitle;
 	private ViewGroup mainProgressContainer;
+	private boolean fullscreen = false;
 
 	private boolean gotRemotePayload;
 	private volatile boolean gotLocalPayload;
@@ -127,6 +130,25 @@ public class ShowQrCodeFragment extends BaseEventFragment
 		qrCode = view.findViewById(R.id.qr_code);
 		mainProgressTitle = view.findViewById(R.id.title_progress_bar);
 		mainProgressContainer = view.findViewById(R.id.container_progress);
+		ImageView fullscreenButton = view.findViewById(R.id.fullscreen_button);
+		fullscreenButton.setOnClickListener(v -> {
+			View qrCodeContainer = view.findViewById(R.id.qr_code_container);
+			if (fullscreen) {
+				// Shrink the QR code container
+				qrCodeContainer.setLayoutParams(
+						new LayoutParams(MATCH_PARENT, 0, 1f));
+				fullscreenButton.setBackgroundResource(
+						R.drawable.ic_fullscreen_black_48dp);
+			} else {
+				// Grow the QR code container
+				qrCodeContainer.setLayoutParams(
+						new LayoutParams(MATCH_PARENT, MATCH_PARENT, 1f));
+				fullscreenButton.setBackgroundResource(
+						R.drawable.ic_fullscreen_exit_black_48dp);
+			}
+			view.findViewById(R.id.camera_overlay).invalidate();
+			fullscreen = !fullscreen;
+		});
 	}
 
 	@Override
@@ -274,6 +296,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 		new AsyncTask<Void, Void, Bitmap>() {
 
 			@Override
+			@Nullable
 			protected Bitmap doInBackground(Void... params) {
 				byte[] payloadBytes = payloadEncoder.encode(payload);
 				if (LOG.isLoggable(INFO)) {
diff --git a/briar-android/src/main/res/drawable/ic_fullscreen_black_48dp.xml b/briar-android/src/main/res/drawable/ic_fullscreen_black_48dp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..affab0d46563683d99c14c53dc3e2118b65f63cf
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_fullscreen_black_48dp.xml
@@ -0,0 +1,4 @@
+<vector android:height="48dp" android:viewportHeight="24.0"
+    android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#FF000000" android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z"/>
+</vector>
diff --git a/briar-android/src/main/res/drawable/ic_fullscreen_exit_black_48dp.xml b/briar-android/src/main/res/drawable/ic_fullscreen_exit_black_48dp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b62d104c1dba38e6b6b60aba19014442437b9ed
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_fullscreen_exit_black_48dp.xml
@@ -0,0 +1,4 @@
+<vector android:height="48dp" android:viewportHeight="24.0"
+    android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#FF000000" android:pathData="M5,16h3v3h2v-5L5,14v2zM8,8L5,8v2h5L10,5L8,5v3zM14,19h2v-3h3v-2h-5v5zM16,8L16,5h-2v5h5L19,8h-3z"/>
+</vector>
diff --git a/briar-android/src/main/res/layout-land/fragment_keyagreement_qr.xml b/briar-android/src/main/res/layout-land/fragment_keyagreement_qr.xml
index e9a174c77812fdc41074268acede649e1c3a08e8..c811b58c8b92d9fcfacc98db4157296bdf4a79b2 100644
--- a/briar-android/src/main/res/layout-land/fragment_keyagreement_qr.xml
+++ b/briar-android/src/main/res/layout-land/fragment_keyagreement_qr.xml
@@ -15,39 +15,36 @@
 		android:layout_width="match_parent"
 		android:layout_height="match_parent"
 		android:orientation="horizontal"
-		android:weightSum="2">
+		android:weightSum="2"
+		android:baselineAligned="false">
 
-		<FrameLayout
+		<LinearLayout
+			android:id="@+id/status_container"
 			android:layout_width="0dp"
 			android:layout_height="match_parent"
-			android:layout_weight="1">
+			android:layout_weight="1"
+			android:background="@android:color/background_light"
+			android:gravity="center"
+			android:orientation="vertical"
+			android:padding="@dimen/margin_medium"
+			android:visibility="invisible">
 
-			<LinearLayout
-				android:id="@+id/status_container"
+			<ProgressBar
+				style="?android:attr/progressBarStyleLarge"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"/>
+
+			<TextView
+				android:id="@+id/connect_status"
 				android:layout_width="match_parent"
-				android:layout_height="match_parent"
-				android:background="@android:color/background_light"
+				android:layout_height="wrap_content"
 				android:gravity="center"
-				android:orientation="vertical"
-				android:padding="@dimen/margin_medium"
-				android:visibility="invisible">
-
-				<ProgressBar
-					style="?android:attr/progressBarStyleLarge"
-					android:layout_width="wrap_content"
-					android:layout_height="wrap_content"/>
-
-				<TextView
-					android:id="@+id/connect_status"
-					android:layout_width="match_parent"
-					android:layout_height="wrap_content"
-					android:gravity="center"
-					android:paddingTop="@dimen/margin_large"
-					tools:text="Connection failed"/>
-			</LinearLayout>
-		</FrameLayout>
+				android:paddingTop="@dimen/margin_large"
+				tools:text="Connection failed"/>
+		</LinearLayout>
 
 		<FrameLayout
+			android:id="@+id/qr_code_container"
 			android:layout_width="0dp"
 			android:layout_height="match_parent"
 			android:layout_weight="1"
@@ -59,12 +56,30 @@
 				android:layout_height="wrap_content"
 				android:layout_gravity="center"/>
 
-			<ImageView
-				android:id="@+id/qr_code"
+			<RelativeLayout
 				android:layout_width="match_parent"
-				android:layout_height="match_parent"
-				android:scaleType="fitCenter"
-				android:layout_gravity="center"/>
+				android:layout_height="match_parent">
+
+				<ImageView
+					android:id="@+id/qr_code"
+					android:layout_width="match_parent"
+					android:layout_height="match_parent"
+					android:layout_centerInParent="true"
+					android:contentDescription="@string/qr_code"
+					android:scaleType="fitCenter"/>
+
+				<ImageView
+					android:id="@+id/fullscreen_button"
+					android:background="@drawable/ic_fullscreen_black_48dp"
+					android:alpha="0.54"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:layout_margin="@dimen/margin_small"
+					android:layout_alignParentBottom="true"
+					android:layout_alignParentRight="true"
+					android:layout_alignParentEnd="true"
+					android:contentDescription="@string/show_qr_code_fullscreen"/>
+			</RelativeLayout>
 		</FrameLayout>
 	</LinearLayout>
 
@@ -92,5 +107,4 @@
 			android:paddingTop="@dimen/margin_large"
 			tools:text="@string/waiting_for_contact_to_scan"/>
 	</RelativeLayout>
-
 </FrameLayout>
diff --git a/briar-android/src/main/res/layout/fragment_keyagreement_qr.xml b/briar-android/src/main/res/layout/fragment_keyagreement_qr.xml
index 1aaf28183f99d20e5b66f9842d3f68f9aa176336..456ffbca129364bf3ea4ed00ae92f3bc6b4852a5 100644
--- a/briar-android/src/main/res/layout/fragment_keyagreement_qr.xml
+++ b/briar-android/src/main/res/layout/fragment_keyagreement_qr.xml
@@ -15,39 +15,36 @@
 		android:layout_width="match_parent"
 		android:layout_height="match_parent"
 		android:orientation="vertical"
-		android:weightSum="2">
+		android:weightSum="2"
+		android:baselineAligned="false">
 
-		<FrameLayout
+		<LinearLayout
+			android:id="@+id/status_container"
 			android:layout_width="match_parent"
 			android:layout_height="0dp"
-			android:layout_weight="1">
+			android:layout_weight="1"
+			android:background="@android:color/background_light"
+			android:gravity="center"
+			android:orientation="vertical"
+			android:padding="@dimen/margin_medium"
+			android:visibility="invisible">
 
-			<LinearLayout
-				android:id="@+id/status_container"
+			<ProgressBar
+				style="?android:attr/progressBarStyleLarge"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"/>
+
+			<TextView
+				android:id="@+id/connect_status"
 				android:layout_width="match_parent"
-				android:layout_height="match_parent"
-				android:background="@android:color/background_light"
+				android:layout_height="wrap_content"
 				android:gravity="center"
-				android:orientation="vertical"
-				android:padding="@dimen/margin_medium"
-				android:visibility="invisible">
-
-				<ProgressBar
-					style="?android:attr/progressBarStyleLarge"
-					android:layout_width="wrap_content"
-					android:layout_height="wrap_content"/>
-
-				<TextView
-					android:id="@+id/connect_status"
-					android:layout_width="match_parent"
-					android:layout_height="wrap_content"
-					android:gravity="center"
-					android:paddingTop="@dimen/margin_large"
-					tools:text="Connection failed"/>
-			</LinearLayout>
-		</FrameLayout>
+				android:paddingTop="@dimen/margin_large"
+				tools:text="Connection failed"/>
+		</LinearLayout>
 
 		<FrameLayout
+			android:id="@+id/qr_code_container"
 			android:layout_width="match_parent"
 			android:layout_height="0dp"
 			android:layout_weight="1"
@@ -59,12 +56,30 @@
 				android:layout_height="wrap_content"
 				android:layout_gravity="center"/>
 
-			<ImageView
-				android:id="@+id/qr_code"
+			<RelativeLayout
 				android:layout_width="match_parent"
-				android:layout_height="match_parent"
-				android:scaleType="fitCenter"
-				android:layout_gravity="center"/>
+				android:layout_height="match_parent">
+
+				<ImageView
+					android:id="@+id/qr_code"
+					android:layout_width="match_parent"
+					android:layout_height="match_parent"
+					android:layout_centerInParent="true"
+					android:contentDescription="@string/qr_code"
+					android:scaleType="fitCenter"/>
+
+				<ImageView
+					android:id="@+id/fullscreen_button"
+					android:background="@drawable/ic_fullscreen_black_48dp"
+					android:alpha="0.54"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:layout_margin="@dimen/margin_small"
+					android:layout_alignParentBottom="true"
+					android:layout_alignParentRight="true"
+					android:layout_alignParentEnd="true"
+					android:contentDescription="@string/show_qr_code_fullscreen"/>
+			</RelativeLayout>
 		</FrameLayout>
 	</LinearLayout>
 
@@ -92,5 +107,4 @@
 			android:paddingTop="@dimen/margin_large"
 			tools:text="@string/waiting_for_contact_to_scan"/>
 	</RelativeLayout>
-
 </FrameLayout>
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 14de9071b5dd7e220b2ed96e66999f29c6e197b2..4df1ed1981bc580533729f308627c62eefa57d47 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -410,5 +410,7 @@
 	<string name="permission_camera_request_body">To scan the QR code, Briar needs access to the camera.</string>
 	<string name="permission_camera_denied_body">You have denied access to the camera, but adding contacts requires using the camera.\n\nPlease consider granting access.</string>
 	<string name="permission_camera_denied_toast">Camera permission was not granted</string>
+	<string name="qr_code">QR code</string>
+	<string name="show_qr_code_fullscreen">Show QR code fullscreen</string>
 
 </resources>