diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index cc195722b5ed4d73697f2aff55a7ecfaada950bf..19b55dca6c55a92afa71a330a11b8adea6f47781 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -352,6 +352,16 @@
 				/>
 		</activity>
 
+		<activity
+			android:name="org.briarproject.briar.android.test.TestDataActivity"
+			android:label="Create test data"
+			android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
+			<meta-data
+				android:name="android.support.PARENT_ACTIVITY"
+				android:value="org.briarproject.briar.android.settings.SettingsActivity"
+				/>
+		</activity>
+
 		<activity
 			android:name="org.briarproject.briar.android.panic.PanicPreferencesActivity"
 			android:label="@string/panic_setting"
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
index 2f8ca83faa6bd97999870c692cf6452479a23f70..68564c4e49f615cf295a705394cf5149ab19096e 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
@@ -70,6 +70,7 @@ import org.briarproject.briar.android.sharing.ShareForumFragment;
 import org.briarproject.briar.android.sharing.ShareForumMessageFragment;
 import org.briarproject.briar.android.sharing.SharingModule;
 import org.briarproject.briar.android.splash.SplashScreenActivity;
+import org.briarproject.briar.android.test.TestDataActivity;
 
 import dagger.Component;
 
@@ -147,6 +148,8 @@ public interface ActivityComponent {
 
 	void inject(SettingsActivity activity);
 
+	void inject(TestDataActivity activity);
+
 	void inject(ChangePasswordActivity activity);
 
 	void inject(IntroductionActivity activity);
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 1efca23465491c20b513f321237c79ed89812573..8f8c4440407de5e1c73e4e10d79d744acac2fedb 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
@@ -30,7 +30,6 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
 import org.briarproject.bramble.util.StringUtils;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.util.UserFeedback;
-import org.briarproject.briar.api.test.TestDataCreator;
 
 import java.util.logging.Logger;
 
@@ -105,8 +104,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
 
 	@Inject
 	AndroidExecutor androidExecutor;
-	@Inject
-	TestDataCreator testDataCreator;
 
 	@Override
 	public void onAttach(Context context) {
@@ -153,14 +150,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
 				});
 
 		Preference testData = findPreference("pref_key_test_data");
-		if (IS_DEBUG_BUILD) {
-			testData.setOnPreferenceClickListener(preference -> {
-				LOG.info("Creating test data");
-				testDataCreator.createTestData();
-				getActivity().finish();
-				return true;
-			});
-		} else {
+		if (!IS_DEBUG_BUILD) {
 			testData.setVisible(false);
 		}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4315f12ab0de0eae1a626716989d9300dbf1e5e
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java
@@ -0,0 +1,100 @@
+package org.briarproject.briar.android.test;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+
+import org.briarproject.briar.R;
+import org.briarproject.briar.android.activity.ActivityComponent;
+import org.briarproject.briar.android.activity.BriarActivity;
+import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
+import org.briarproject.briar.api.test.TestDataCreator;
+
+import javax.inject.Inject;
+
+public class TestDataActivity extends BriarActivity {
+
+	@Inject
+	TestDataCreator testDataCreator;
+
+	private TextView[] textViews = new TextView[5];
+	private SeekBar[] seekBars = new SeekBar[5];
+
+	@Override
+	public void onCreate(Bundle bundle) {
+		super.onCreate(bundle);
+
+		ActionBar actionBar = getSupportActionBar();
+		if (actionBar != null) {
+			actionBar.setHomeButtonEnabled(true);
+			actionBar.setDisplayHomeAsUpEnabled(true);
+		}
+
+		setContentView(R.layout.activity_test_data);
+		textViews[0] = findViewById(R.id.textViewContactsSb);
+		textViews[1] = findViewById(R.id.textViewMessagesSb);
+		textViews[2] = findViewById(R.id.TextViewBlogPostsSb);
+		textViews[3] = findViewById(R.id.TextViewForumsSb);
+		textViews[4] = findViewById(R.id.TextViewForumMessagesSb);
+		seekBars[0] = findViewById(R.id.seekBarContacts);
+		seekBars[1] = findViewById(R.id.seekBarMessages);
+		seekBars[2] = findViewById(R.id.seekBarBlogPosts);
+		seekBars[3] = findViewById(R.id.seekBarForums);
+		seekBars[4] = findViewById(R.id.seekBarForumMessages);
+
+		for (int i = 0; i < 5; i++) {
+			final TextView textView = textViews[i];
+			seekBars[i].setOnSeekBarChangeListener(
+					new OnSeekBarChangeListener() {
+						@Override
+						public void onProgressChanged(SeekBar seekBar,
+								int progress,
+								boolean fromUser) {
+							textView.setText("" + progress);
+						}
+
+						@Override
+						public void onStartTrackingTouch(SeekBar seekBar) {
+						}
+
+						@Override
+						public void onStopTrackingTouch(SeekBar seekBar) {
+						}
+
+					});
+		}
+
+		findViewById(R.id.buttonCreateTestData).setOnClickListener(
+				v -> {
+					createTestData();
+				});
+	}
+
+	private void createTestData() {
+		testDataCreator.createTestData(seekBars[0].getProgress(),
+				seekBars[1].getProgress(), seekBars[2].getProgress(),
+				seekBars[3].getProgress(), seekBars[4].getProgress());
+		Intent intent = new Intent(this, NavDrawerActivity.class);
+		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+		startActivity(intent);
+		finish();
+	}
+
+	@Override
+	public void injectActivity(ActivityComponent component) {
+		component.inject(this);
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item) {
+		if (item.getItemId() == android.R.id.home) {
+			onBackPressed();
+			return true;
+		}
+		return false;
+	}
+}
diff --git a/briar-android/src/main/res/layout/activity_test_data.xml b/briar-android/src/main/res/layout/activity_test_data.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0d6c68334499744fd3270823fb61995c331c6b3
--- /dev/null
+++ b/briar-android/src/main/res/layout/activity_test_data.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent">
+
+	<ScrollView
+		android:layout_width="match_parent"
+		android:layout_height="0dp"
+		android:padding="8dp">
+
+		<android.support.constraint.ConstraintLayout
+			xmlns:android="http://schemas.android.com/apk/res/android"
+			xmlns:app="http://schemas.android.com/apk/res-auto"
+			android:layout_width="match_parent"
+			android:layout_height="match_parent">
+
+			<TextView
+				android:id="@+id/textViewContacts"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of contacts"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toTopOf="parent"/>
+
+			<SeekBar
+				android:id="@+id/seekBarContacts"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:progress="20"
+				app:layout_constraintEnd_toStartOf="@+id/textViewContactsSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewContacts"/>
+
+			<TextView
+				android:id="@+id/textViewContactsSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarContacts"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+
+			<TextView
+				android:id="@+id/textViewMessages"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of messages per contact"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarContacts"/>
+
+			<SeekBar
+				android:id="@+id/seekBarMessages"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:paddingTop="5dp"
+				android:progress="15"
+				app:layout_constraintEnd_toStartOf="@+id/textViewMessagesSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewMessages"/>
+
+			<TextView
+				android:id="@+id/textViewMessagesSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarMessages"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<TextView
+				android:id="@+id/textViewBlogPosts"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of blog posts"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarMessages"/>
+
+			<SeekBar
+				android:id="@+id/seekBarBlogPosts"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:paddingTop="5dp"
+				android:progress="30"
+				app:layout_constraintEnd_toStartOf="@+id/TextViewBlogPostsSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewBlogPosts"/>
+
+			<TextView
+				android:id="@+id/TextViewBlogPostsSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarBlogPosts"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<TextView
+				android:id="@+id/textViewForums"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of forums"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarBlogPosts"/>
+
+			<SeekBar
+				android:id="@+id/seekBarForums"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="10"
+				android:paddingTop="5dp"
+				android:progress="3"
+				app:layout_constraintEnd_toStartOf="@+id/TextViewForumsSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewForums"/>
+
+			<TextView
+				android:id="@+id/TextViewForumsSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarForums"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<TextView
+				android:id="@+id/textViewForumMessages"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of forum messages"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarForums"/>
+
+			<SeekBar
+				android:id="@+id/seekBarForumMessages"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:paddingTop="5dp"
+				android:progress="30"
+				app:layout_constraintEnd_toStartOf="@+id/TextViewForumMessagesSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewForumMessages"/>
+
+			<TextView
+				android:id="@+id/TextViewForumMessagesSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarForumMessages"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<Button
+				android:id="@+id/buttonCreateTestData"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_margin="10dp"
+				android:text="Create test data"
+				app:layout_constraintEnd_toEndOf="parent"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarForumMessages"/>
+		</android.support.constraint.ConstraintLayout>
+	</ScrollView>
+</android.support.constraint.ConstraintLayout>
diff --git a/briar-android/src/main/res/xml/settings.xml b/briar-android/src/main/res/xml/settings.xml
index 43ad96985aa583ecfefceab56a780dbfc1afe65a..9f3a55f94f0e7266d3911f89e50b734698be20c2 100644
--- a/briar-android/src/main/res/xml/settings.xml
+++ b/briar-android/src/main/res/xml/settings.xml
@@ -124,6 +124,11 @@
 
 	<Preference
 		android:key="pref_key_test_data"
-		android:title="Create Test Data"/>
+		android:title="Create Test Data">
 
-</PreferenceScreen>
\ No newline at end of file
+		<intent
+			android:targetClass="org.briarproject.briar.android.test.TestDataActivity"
+			android:targetPackage="@string/app_package"/>
+	</Preference>
+
+</PreferenceScreen>
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java b/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java
index 55b77221d2e69e47af60da4930fd160a52e8ad4f..41ccb64341268564cbb30d0a20ff586554414541 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java
@@ -5,7 +5,17 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 @NotNullByDefault
 public interface TestDataCreator {
 
-	/* Creates fake test data on the DatabaseExecutor */
-	void createTestData();
+	/**
+	 * Create fake test data on the DatabaseExecutor
+	 *
+	 * @param numContacts Number of contacts to create.
+	 * @param numPrivateMsgs Number of private messages to create for each
+	 * contact.
+	 * @param numBlogPosts Number of blog posts to create.
+	 * @param numForums Number of forums to create.
+	 * @param numForumPosts Number of forum posts to create per forum.
+	 */
+	void createTestData(int numContacts, int numPrivateMsgs, int numBlogPosts,
+			int numForums, int numForumPosts);
 
 }
diff --git a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
index c090feefdada2b5da98696b45ccdea9fa90a5821..90f2b77c87cf1bcc16b328c289350e75328f14bc 100644
--- a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
@@ -61,12 +61,6 @@ import static org.briarproject.briar.test.TestData.GROUP_NAMES;
 
 public class TestDataCreatorImpl implements TestDataCreator {
 
-	private final static int NUM_CONTACTS = 20;
-	private final static int NUM_PRIVATE_MSGS = 15;
-	private final static int NUM_BLOG_POSTS = 30;
-	private final static int NUM_FORUMS = 3;
-	private final static int NUM_FORUM_POSTS = 30;
-
 	private final Logger LOG =
 			Logger.getLogger(TestDataCreatorImpl.class.getName());
 
@@ -119,10 +113,12 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		this.ioExecutor = ioExecutor;
 	}
 
-	public void createTestData() {
+	public void createTestData(int numContacts, int numPrivateMsgs,
+			int numBlogPosts, int numForums, int numForumPosts) {
 		ioExecutor.execute(() -> {
 			try {
-				createTestDataOnDbExecutor();
+				createTestDataOnDbExecutor(numContacts, numPrivateMsgs,
+						numBlogPosts, numForums, numForumPosts);
 			} catch (DbException e) {
 				if (LOG.isLoggable(WARNING))
 					LOG.log(WARNING, "Creating test data failed", e);
@@ -131,21 +127,23 @@ public class TestDataCreatorImpl implements TestDataCreator {
 	}
 
 	@IoExecutor
-	private void createTestDataOnDbExecutor() throws DbException {
-		List<Contact> contacts = createContacts();
-		createPrivateMessages(contacts);
-		createBlogPosts(contacts);
-		List<Forum> forums = createForums(contacts);
+	private void createTestDataOnDbExecutor(int numContacts, int numPrivateMsgs,
+			int numBlogPosts, int numForums, int numForumPosts)
+			throws DbException {
+		List<Contact> contacts = createContacts(numContacts);
+		createPrivateMessages(contacts, numPrivateMsgs);
+		createBlogPosts(contacts, numBlogPosts);
+		List<Forum> forums = createForums(contacts, numForums, numForumPosts);
 
 		for (Forum forum : forums) {
-			createRandomForumPosts(forum, contacts);
+			createRandomForumPosts(forum, contacts, numForumPosts);
 		}
 	}
 
-	private List<Contact> createContacts() throws DbException {
-		List<Contact> contacts = new ArrayList<>(NUM_CONTACTS);
+	private List<Contact> createContacts(int numContacts) throws DbException {
+		List<Contact> contacts = new ArrayList<>(numContacts);
 		LocalAuthor localAuthor = identityManager.getLocalAuthor();
-		for (int i = 0; i < NUM_CONTACTS; i++) {
+		for (int i = 0; i < numContacts; i++) {
 			Contact contact = addRandomContact(localAuthor);
 			contacts.add(contact);
 		}
@@ -210,7 +208,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		String btAddress = getRandomBluetoothAddress();
 		String uuid = getRandomUUID();
 		bt.put(BluetoothConstants.PROP_ADDRESS, btAddress);
-		bt.put(BluetoothConstants.PROP_UUID,uuid);
+		bt.put(BluetoothConstants.PROP_UUID, uuid);
 		props.put(BluetoothConstants.ID, bt);
 
 		// LAN
@@ -271,11 +269,12 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		return sb.toString();
 	}
 
-	private void createPrivateMessages(List<Contact> contacts)
+	private void createPrivateMessages(List<Contact> contacts,
+			int numPrivateMsgs)
 			throws DbException {
 		for (Contact contact : contacts) {
 			Group group = messagingManager.getContactGroup(contact);
-			for (int i = 0; i < NUM_PRIVATE_MSGS; i++) {
+			for (int i = 0; i < numPrivateMsgs; i++) {
 				try {
 					createPrivateMessage(group.getId(), i);
 				} catch (FormatException e) {
@@ -284,7 +283,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 			}
 		}
 		if (LOG.isLoggable(INFO)) {
-			LOG.info("Created " + NUM_PRIVATE_MSGS +
+			LOG.info("Created " + numPrivateMsgs +
 					" private messages per contact.");
 		}
 	}
@@ -313,15 +312,15 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		}
 	}
 
-	private void createBlogPosts(List<Contact> contacts)
+	private void createBlogPosts(List<Contact> contacts, int numBlogPosts)
 			throws DbException {
-		for (int i = 0; i < NUM_BLOG_POSTS; i++) {
+		for (int i = 0; i < numBlogPosts; i++) {
 			Contact contact = contacts.get(random.nextInt(contacts.size()));
 			LocalAuthor author = localAuthors.get(contact);
 			addBlogPost(author, i);
 		}
 		if (LOG.isLoggable(INFO)) {
-			LOG.info("Created " + NUM_BLOG_POSTS + " blog posts.");
+			LOG.info("Created " + numBlogPosts + " blog posts.");
 		}
 	}
 
@@ -339,10 +338,11 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		}
 	}
 
-	private List<Forum> createForums(List<Contact> contacts)
+	private List<Forum> createForums(List<Contact> contacts, int numForums,
+			int numForumPosts)
 			throws DbException {
-		List<Forum> forums = new ArrayList<>(NUM_FORUMS);
-		for (int i = 0; i < NUM_FORUMS; i++) {
+		List<Forum> forums = new ArrayList<>(numForums);
+		for (int i = 0; i < numForums; i++) {
 			// create forum
 			String name = GROUP_NAMES[random.nextInt(GROUP_NAMES.length)];
 			Forum forum = forumManager.addForum(name);
@@ -361,16 +361,17 @@ public class TestDataCreatorImpl implements TestDataCreator {
 			forums.add(forum);
 		}
 		if (LOG.isLoggable(INFO)) {
-			LOG.info("Created " + NUM_FORUMS + " forums with " +
-					NUM_FORUM_POSTS + " posts each.");
+			LOG.info("Created " + numForums + " forums with " +
+					numForumPosts + " posts each.");
 		}
 		return forums;
 	}
 
-	private void createRandomForumPosts(Forum forum, List<Contact> contacts)
+	private void createRandomForumPosts(Forum forum, List<Contact> contacts,
+			int numForumPosts)
 			throws DbException {
 		List<ForumPost> posts = new ArrayList<>();
-		for (int i = 0; i < NUM_FORUM_POSTS; i++) {
+		for (int i = 0; i < numForumPosts; i++) {
 			Contact contact = contacts.get(random.nextInt(contacts.size()));
 			LocalAuthor author = localAuthors.get(contact);
 			long timestamp = clock.currentTimeMillis() - i * 60 * 1000;