diff --git a/app/src/main/java/org/briarproject/interferometer/MainActivity.java b/app/src/main/java/org/briarproject/interferometer/MainActivity.java
index e84c571235aa44aab629246cfcd0f0f1f11023c9..07b1238284e1f2b7fd8b00c6029ba7b17d175be1 100644
--- a/app/src/main/java/org/briarproject/interferometer/MainActivity.java
+++ b/app/src/main/java/org/briarproject/interferometer/MainActivity.java
@@ -32,7 +32,7 @@ import static org.briarproject.interferometer.Utils.formatSpeed;
 public class MainActivity extends AppCompatActivity {
 
 	private MainViewModel viewModel;
-	private EditText serverAddressEditText;
+	private EditText serverAddressEditText, idlePeriodEditText;
 	private Button testButton;
 	private TextView testPhaseTextView, throughputTextView;
 
@@ -46,6 +46,7 @@ public class MainActivity extends AppCompatActivity {
 
 		viewModel = new ViewModelProvider(this).get(MainViewModel.class);
 		serverAddressEditText = findViewById(R.id.server_address_edit_text);
+		idlePeriodEditText = findViewById(R.id.idle_period_edit_text);
 		testPhaseTextView = findViewById(R.id.test_phase_text_view);
 		throughputTextView = findViewById(R.id.throughput_text_view);
 		testButton = findViewById(R.id.test_button);
@@ -107,7 +108,9 @@ public class MainActivity extends AppCompatActivity {
 	public void onTestClick(View view) {
 		TestPhase phase = viewModel.getTestPhase().getValue();
 		if (phase == null || phase == READY) {
-			StartResult result = viewModel.startTest(serverAddressEditText.getText().toString());
+			String serverAddress = serverAddressEditText.getText().toString();
+			String idlePeriod = idlePeriodEditText.getText().toString();
+			StartResult result = viewModel.startTest(serverAddress, idlePeriod);
 			if (result == INVALID_ADDRESS) {
 				Toast.makeText(this, R.string.server_address_error, LENGTH_SHORT).show();
 			} else if (result == NO_BLUETOOTH) {
diff --git a/app/src/main/java/org/briarproject/interferometer/MainViewModel.java b/app/src/main/java/org/briarproject/interferometer/MainViewModel.java
index e29c880254dfc90a47a89816ead733e9017e19c9..ce98a9423bf4d4bc43e78591b5c0794342d9f7a6 100644
--- a/app/src/main/java/org/briarproject/interferometer/MainViewModel.java
+++ b/app/src/main/java/org/briarproject/interferometer/MainViewModel.java
@@ -127,9 +127,10 @@ public class MainViewModel extends AndroidViewModel {
 	}
 
 	@UiThread
-	StartResult startTest(String serverAddress) {
+	StartResult startTest(String serverAddress, String idlePeriod) {
 		HostPort hostPort = parseServerAddress(serverAddress);
 		if (hostPort == null) return INVALID_ADDRESS;
+		int idleSeconds = parseIdlePeriod(idlePeriod);
 		BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
 		if (adapter == null) return NO_BLUETOOTH;
 
@@ -170,7 +171,7 @@ public class MainViewModel extends AndroidViewModel {
 				Log.i(TAG, "Testing throughput with device discovery");
 				List<Long> downDeviceDiscovery = new ArrayList<>();
 				List<Long> upDeviceDiscovery = new ArrayList<>();
-				Future<?> deviceDiscoveryTask = startDeviceDiscovery(adapter);
+				Future<?> deviceDiscoveryTask = startDeviceDiscovery(adapter, idleSeconds);
 				try {
 					if (!testThroughput(hostPort, downDeviceDiscovery, upDeviceDiscovery)) return;
 				} finally {
@@ -181,7 +182,7 @@ public class MainViewModel extends AndroidViewModel {
 				Log.i(TAG, "Testing throughput with service discovery");
 				List<Long> downServiceDiscovery = new ArrayList<>();
 				List<Long> upServiceDiscovery = new ArrayList<>();
-				Future<?> serviceDiscoveryTask = startServiceDiscovery(adapter);
+				Future<?> serviceDiscoveryTask = startServiceDiscovery(adapter, idleSeconds);
 				try {
 					if (!testThroughput(hostPort, downServiceDiscovery, upServiceDiscovery)) return;
 				} finally {
@@ -192,7 +193,7 @@ public class MainViewModel extends AndroidViewModel {
 				Log.i(TAG, "Testing throughput with connections");
 				List<Long> downloadConnections = new ArrayList<>();
 				List<Long> uploadConnections = new ArrayList<>();
-				Future<?> connectionTask = startConnections(adapter);
+				Future<?> connectionTask = startConnections(adapter, idleSeconds);
 				try {
 					if (!testThroughput(hostPort, downloadConnections, uploadConnections)) return;
 				} finally {
@@ -259,6 +260,14 @@ public class MainViewModel extends AndroidViewModel {
 		}
 	}
 
+	private int parseIdlePeriod(String s) {
+		try {
+			return Math.max(0, Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return 0;
+		}
+	}
+
 	private boolean disableBluetooth(BluetoothAdapter adapter) {
 		if (!adapter.isEnabled()) return true;
 		BluetoothStateReceiver receiver = new BluetoothStateReceiver(STATE_OFF);
@@ -293,7 +302,7 @@ public class MainViewModel extends AndroidViewModel {
 		}
 	}
 
-	private Future<?> startDeviceDiscovery(BluetoothAdapter adapter) {
+	private Future<?> startDeviceDiscovery(BluetoothAdapter adapter, int idleSeconds) {
 		Application app = getApplication();
 		return executorService.submit(() -> {
 			while (!Thread.currentThread().isInterrupted()) {
@@ -307,6 +316,7 @@ public class MainViewModel extends AndroidViewModel {
 					} else {
 						Log.w(TAG, "Device discovery did not finish within timeout");
 					}
+					if (idleSeconds > 0) Thread.sleep(idleSeconds * 1000);
 				} catch (InterruptedException e) {
 					Log.w(TAG, "Device discovery interrupted");
 					return;
@@ -318,7 +328,7 @@ public class MainViewModel extends AndroidViewModel {
 		});
 	}
 
-	private Future<?> startServiceDiscovery(BluetoothAdapter adapter) {
+	private Future<?> startServiceDiscovery(BluetoothAdapter adapter, int idleSeconds) {
 		Application app = getApplication();
 		return executorService.submit(() -> {
 			byte[] mac = new byte[6];
@@ -336,6 +346,7 @@ public class MainViewModel extends AndroidViewModel {
 						} else {
 							Log.w(TAG, "Service discovery did not finish within timeout");
 						}
+						if (idleSeconds > 0) Thread.sleep(idleSeconds * 1000);
 					} else {
 						Log.w(TAG, "Failed to start service discovery");
 					}
@@ -349,7 +360,7 @@ public class MainViewModel extends AndroidViewModel {
 		});
 	}
 
-	private Future<?> startConnections(BluetoothAdapter adapter) {
+	private Future<?> startConnections(BluetoothAdapter adapter, int idleSeconds) {
 		return executorService.submit(() -> {
 			byte[] mac = new byte[6];
 			byte[] uuidBytes = new byte[16];
@@ -368,6 +379,14 @@ public class MainViewModel extends AndroidViewModel {
 				} catch (IOException e) {
 					// Expected
 				}
+				if (idleSeconds > 0) {
+					try {
+						Thread.sleep(idleSeconds * 1000);
+					} catch (InterruptedException e) {
+						Log.w(TAG, "Sleep interrupted");
+						return;
+					}
+				}
 			}
 		});
 	}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 5c9c1f4af77efd9c5fdae0ec620a9b5b1aa0fa72..87da8f05b3113ebab0a20d78c32eb1b870f26b19 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -17,6 +17,15 @@
 		android:text="@string/default_server_address"
 		tools:ignore="Autofill" />
 
+	<EditText
+		android:id="@+id/idle_period_edit_text"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:hint="@string/idle_period"
+		android:inputType="number"
+		android:text="@string/default_idle_period"
+		tools:ignore="Autofill" />
+
 	<Button
 		android:id="@+id/test_button"
 		android:layout_width="wrap_content"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 33d8da6aadbce7f82936b4c66eebd262e254b30a..c55ae98b90e61bec473dfde44c2e1425d841e23d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -3,6 +3,9 @@
 
 	<string name="server_address">Server address</string>
 	<string name="default_server_address">139.162.237.194:40404</string>
+	<string name="idle_period">Idle period in seconds</string>
+	<string name="default_idle_period">0</string>
+
 	<string name="server_address_error">Invalid address</string>
 	<string name="no_bluetooth_error">Device does not have Bluetooth</string>