diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt
index 460bec355310776554ac14d2c4bd8ac477f632cc..f0f8f6ac677040b6cd288edeb3c5928f6f63a603 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt
@@ -73,7 +73,7 @@ internal class AndroidTorModule {
         backoff: Backoff,
         lifecycleManager: LifecycleManager,
         eventBus: EventBus,
-    ): TorPlugin = AndroidTorPlugin(
+    ): TorPlugin = MockTorPlugin(
         ioExecutor,
         app,
         settingsManager,
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/MockTorPlugin.java b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/MockTorPlugin.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f2989a1c3c2f4df989a463abca94b7e5401db02
--- /dev/null
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/MockTorPlugin.java
@@ -0,0 +1,140 @@
+/*
+ *     Briar Mailbox
+ *     Copyright (C) 2021-2022  The Briar Project
+ *
+ *     This program is free software: you can redistribute it and/or modify
+ *     it under the terms of the GNU Affero General Public License as
+ *     published by the Free Software Foundation, either version 3 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU Affero General Public License for more details.
+ *
+ *     You should have received a copy of the GNU Affero General Public License
+ *     along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+package org.briarproject.mailbox.core.tor;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+import org.briarproject.mailbox.core.db.DbException;
+import org.briarproject.mailbox.core.event.Event;
+import org.briarproject.mailbox.core.settings.Settings;
+import org.briarproject.mailbox.core.settings.SettingsManager;
+import org.briarproject.mailbox.core.system.AndroidWakeLock;
+import org.briarproject.mailbox.core.system.AndroidWakeLockManager;
+import org.briarproject.mailbox.core.system.Clock;
+import org.briarproject.mailbox.core.system.LocationUtils;
+import org.briarproject.mailbox.core.system.ResourceProvider;
+import org.slf4j.Logger;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.Executor;
+
+import javax.annotation.Nullable;
+
+import static org.briarproject.mailbox.core.tor.TorConstants.HS_ADDRESS_V3;
+import static org.briarproject.mailbox.core.tor.TorConstants.SETTINGS_NAMESPACE;
+import static org.briarproject.mailbox.core.util.LogUtils.info;
+import static org.briarproject.mailbox.core.util.LogUtils.logException;
+import static org.briarproject.mailbox.core.util.PrivacyUtils.scrubOnion;
+import static org.slf4j.LoggerFactory.getLogger;
+
+public class MockTorPlugin extends TorPlugin {
+
+	private static final Logger LOG = getLogger(MockTorPlugin.class);
+
+	private final Context ctx;
+	private final AndroidWakeLock wakeLock;
+
+	private final SettingsManager settingsManager;
+
+	MockTorPlugin(Executor ioExecutor,
+			Context ctx,
+			SettingsManager settingsManager,
+			NetworkManager networkManager,
+			LocationUtils locationUtils,
+			Clock clock,
+			ResourceProvider resourceProvider,
+			CircumventionProvider circumventionProvider,
+			AndroidWakeLockManager wakeLockManager,
+			Backoff backoff,
+			@Nullable String architecture,
+			File torDirectory) {
+		super(ioExecutor, settingsManager, networkManager, locationUtils, clock,
+				resourceProvider, circumventionProvider, backoff, architecture,
+				torDirectory);
+		this.ctx = ctx;
+		wakeLock = wakeLockManager.createWakeLock("TorPlugin");
+		this.settingsManager = settingsManager;
+	}
+
+	@Override
+	protected int getProcessId() {
+		return android.os.Process.myPid();
+	}
+
+	@Override
+	protected long getLastUpdateTime() {
+		try {
+			PackageManager pm = ctx.getPackageManager();
+			PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), 0);
+			return pi.lastUpdateTime;
+		} catch (NameNotFoundException e) {
+			throw new AssertionError(e);
+		}
+	}
+
+	@Override
+	protected void enableNetwork(boolean enable) throws IOException {
+		if (enable) wakeLock.acquire();
+		super.enableNetwork(enable);
+		if (!enable) wakeLock.release();
+	}
+
+	@Override
+	public void startService() {
+		state.setStarted();
+		state.enableNetwork(true);
+		state.getAndSetCircuitBuilt();
+		state.setBootstrapPercent(100);
+		state.onServiceDescriptorUploaded();
+		state.onServiceDescriptorUploaded();
+		state.onServiceDescriptorUploaded();
+		Settings s = new Settings();
+		String onion3 =
+				"rxyuze4lx2xzanneyu2wzcfxodkhxcix76nc57higz7cn2g6bt76jiqd";
+		s.put(HS_ADDRESS_V3, onion3);
+		info(LOG, () -> "V3 hidden service " + scrubOnion(onion3));
+
+		try {
+			settingsManager.mergeSettings(s, SETTINGS_NAMESPACE);
+		} catch (DbException e) {
+			logException(LOG, e, "Error while merging settings");
+		}
+	}
+
+	@Override
+	public void stopService() {
+		wakeLock.release();
+	}
+
+	@Override
+	public void orConnStatus(String status, String orName) {
+		// No-Op
+	}
+
+	@Override
+	public void eventOccurred(Event e) {
+		// No-Op
+	}
+
+}