diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/TestLanTcpPluginFactory.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/TestLanTcpPluginFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea2c2098a500ed5c47aeb0f800bff0036f8b38a3
--- /dev/null
+++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/TestLanTcpPluginFactory.java
@@ -0,0 +1,73 @@
+package org.briarproject.bramble.plugin.tcp;
+
+import org.briarproject.bramble.api.event.EventBus;
+import org.briarproject.bramble.api.lifecycle.IoExecutor;
+import org.briarproject.bramble.api.plugin.Backoff;
+import org.briarproject.bramble.api.plugin.BackoffFactory;
+import org.briarproject.bramble.api.plugin.PluginCallback;
+import org.briarproject.bramble.api.plugin.TransportId;
+import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
+import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
+import org.briarproject.bramble.api.system.WakefulIoExecutor;
+import org.briarproject.nullsafety.NotNullByDefault;
+
+import java.util.concurrent.Executor;
+
+import javax.annotation.concurrent.Immutable;
+import javax.inject.Inject;
+
+import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID;
+
+@Immutable
+@NotNullByDefault
+@SuppressWarnings("unused") // This class is used in briar-desktop
+public class TestLanTcpPluginFactory implements DuplexPluginFactory {
+
+	private static final int MAX_LATENCY = 30_000; // 30 seconds
+	private static final int MAX_IDLE_TIME = 30_000; // 30 seconds
+	private static final int CONNECTION_TIMEOUT = 3_000; // 3 seconds
+	private static final int MIN_POLLING_INTERVAL = 60_000; // 1 minute
+	private static final int MAX_POLLING_INTERVAL = 600_000; // 10 mins
+	private static final double BACKOFF_BASE = 1.2;
+
+	private final Executor ioExecutor, wakefulIoExecutor;
+	private final EventBus eventBus;
+	private final BackoffFactory backoffFactory;
+
+	@Inject
+	public TestLanTcpPluginFactory(@IoExecutor Executor ioExecutor,
+			@WakefulIoExecutor Executor wakefulIoExecutor,
+			EventBus eventBus,
+			BackoffFactory backoffFactory) {
+		this.ioExecutor = ioExecutor;
+		this.wakefulIoExecutor = wakefulIoExecutor;
+		this.eventBus = eventBus;
+		this.backoffFactory = backoffFactory;
+	}
+
+	@Override
+	public TransportId getId() {
+		return ID;
+	}
+
+	@Override
+	public long getMaxLatency() {
+		return MAX_LATENCY;
+	}
+
+	@Override
+	public DuplexPlugin createPlugin(PluginCallback callback) {
+		Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
+				MAX_POLLING_INTERVAL, BACKOFF_BASE);
+		LanTcpPlugin plugin = new LanTcpPlugin(ioExecutor, wakefulIoExecutor,
+				backoff, callback, MAX_LATENCY, MAX_IDLE_TIME,
+				CONNECTION_TIMEOUT) {
+			@Override
+			protected boolean canConnectToOwnAddress() {
+				return true;
+			}
+		};
+		eventBus.addListener(plugin);
+		return plugin;
+	}
+}