diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java
index b90e1b564bc7c046297c6028a9f3d756c80495d6..b9407eb64c29ed0a0efbaf55a99fc53740b82563 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java
@@ -10,9 +10,6 @@ public interface TorConstants {
 	String PROP_ONION_V2 = "onion";
 	String PROP_ONION_V3 = "onion3";
 
-	int SOCKS_PORT = 59050;
-	int CONTROL_PORT = 59051;
-
 	int CONNECT_TO_PROXY_TIMEOUT = 5000; // Milliseconds
 	int EXTRA_SOCKET_TIMEOUT = 30000; // Milliseconds
 
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java
index ff5e2299a7c47c91673b38ba638385efbced428f..934500ffe65c1436b22e2ffe7260e9a6eecf0416 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java
@@ -42,4 +42,10 @@ public class PluginModule {
 		if (config.shouldPoll()) eventBus.addListener(poller);
 		return poller;
 	}
+
+	@Provides
+	@Singleton
+	TorPorts provideTorPorts() {
+		return new TorPortsImpl();
+	}
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/TorPorts.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/TorPorts.java
new file mode 100644
index 0000000000000000000000000000000000000000..0dd9eb9ade5c297de50b6f6e0ad67d61ef230953
--- /dev/null
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/TorPorts.java
@@ -0,0 +1,12 @@
+package org.briarproject.bramble.plugin;
+
+/**
+ * Interface used for injecting the tor ports.
+ */
+public interface TorPorts {
+
+	int getSocksPort();
+
+	int getControlPort();
+
+}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/TorPortsImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/TorPortsImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..31fae664f44f9dfe993a7348fe96bf75f353d806
--- /dev/null
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/TorPortsImpl.java
@@ -0,0 +1,28 @@
+package org.briarproject.bramble.plugin;
+
+public class TorPortsImpl implements TorPorts {
+
+	private static int currentPort = 59050;
+
+	private static int nextPort() {
+		return currentPort++;
+	}
+
+	private int socksPort;
+	private int controlPort;
+
+	public TorPortsImpl() {
+		socksPort = nextPort();
+		controlPort = nextPort();
+	}
+
+	@Override
+	public int getSocksPort() {
+		return socksPort;
+	}
+
+	@Override
+	public int getControlPort() {
+		return controlPort;
+	}
+}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
index 3bc4551314a91f35a1ba10c1106c93eaf83e187c..324bfcb4619d61ff47be84c7f1754f74de691125 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
@@ -33,6 +33,7 @@ import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent;
 import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.api.system.LocationUtils;
 import org.briarproject.bramble.api.system.ResourceProvider;
+import org.briarproject.bramble.plugin.TorPorts;
 
 import java.io.ByteArrayInputStream;
 import java.io.EOFException;
@@ -123,6 +124,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 	private final NetworkManager networkManager;
 	private final LocationUtils locationUtils;
 	private final SocketFactory torSocketFactory;
+	private final TorPorts torPorts;
 	private final Clock clock;
 	private final BatteryManager batteryManager;
 	private final Backoff backoff;
@@ -151,6 +153,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 			NetworkManager networkManager,
 			LocationUtils locationUtils,
 			SocketFactory torSocketFactory,
+			TorPorts torPorts,
 			Clock clock,
 			ResourceProvider resourceProvider,
 			CircumventionProvider circumventionProvider,
@@ -167,6 +170,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 		this.networkManager = networkManager;
 		this.locationUtils = locationUtils;
 		this.torSocketFactory = torSocketFactory;
+		this.torPorts = torPorts;
 		this.clock = clock;
 		this.resourceProvider = resourceProvider;
 		this.circumventionProvider = circumventionProvider;
@@ -279,7 +283,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 		}
 		try {
 			// Open a control connection and authenticate using the cookie file
-			controlSocket = new Socket("127.0.0.1", controlPort);
+			controlSocket = new Socket("127.0.0.1", torPorts.getControlPort());
 			controlConnection = new TorControlConnection(controlSocket);
 			controlConnection.authenticate(read(cookieFile));
 			// Tell Tor to exit when the control connection is closed
@@ -385,30 +389,18 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 		return zin;
 	}
 
-	private int socksPort;
-	private int controlPort;
-
 	private InputStream getTorrc() {
-		socksPort = nextPort();
-		controlPort = nextPort();
-
 		StringBuilder strb = new StringBuilder();
-		append(strb, "ControlPort", controlPort);
+		append(strb, "ControlPort", torPorts.getControlPort());
 		append(strb, "CookieAuthentication", 1);
 		append(strb, "DisableNetwork", 1);
 		append(strb, "RunAsDaemon", 1);
 		append(strb, "SafeSocks", 1);
-		append(strb, "SocksPort", socksPort);
+		append(strb, "SocksPort", torPorts.getSocksPort());
 
 		return new ByteArrayInputStream(strb.toString().getBytes());
 	}
 
-	private static int currentPort = 59050;
-
-	private static int nextPort() {
-		return currentPort++;
-	}
-
 	private static void append(StringBuilder strb, String name, int value) {
 		strb.append(name);
 		strb.append(" ");
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksModule.java b/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksModule.java
index be342f0110bc34d6353f54948cccd3945c798a1c..9706c8e67f7dec4a527338bbab01fc3eb8f040df 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksModule.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksModule.java
@@ -1,5 +1,7 @@
 package org.briarproject.bramble.socks;
 
+import org.briarproject.bramble.plugin.TorPorts;
+
 import java.net.InetSocketAddress;
 
 import javax.net.SocketFactory;
@@ -9,15 +11,14 @@ import dagger.Provides;
 
 import static org.briarproject.bramble.api.plugin.TorConstants.CONNECT_TO_PROXY_TIMEOUT;
 import static org.briarproject.bramble.api.plugin.TorConstants.EXTRA_SOCKET_TIMEOUT;
-import static org.briarproject.bramble.api.plugin.TorConstants.SOCKS_PORT;
 
 @Module
 public class SocksModule {
 
 	@Provides
-	SocketFactory provideTorSocketFactory() {
+	SocketFactory provideTorSocketFactory(TorPorts torPorts) {
 		InetSocketAddress proxy = new InetSocketAddress("127.0.0.1",
-				SOCKS_PORT);
+				torPorts.getSocksPort());
 		return new SocksSocketFactory(proxy, CONNECT_TO_PROXY_TIMEOUT,
 				EXTRA_SOCKET_TIMEOUT);
 	}
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java
index d9d5ddf89a051c41c0c91adc3a0d338c432e8195..9e21819f6535ac2a8ee74a21f041c40a1dfb58fb 100644
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java
+++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java
@@ -8,6 +8,7 @@ import org.briarproject.bramble.api.plugin.PluginCallback;
 import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.api.system.LocationUtils;
 import org.briarproject.bramble.api.system.ResourceProvider;
+import org.briarproject.bramble.plugin.TorPorts;
 
 import java.io.File;
 import java.net.URI;
@@ -25,6 +26,7 @@ abstract class JavaTorPlugin extends TorPlugin {
 			NetworkManager networkManager,
 			LocationUtils locationUtils,
 			SocketFactory torSocketFactory,
+			TorPorts torPorts,
 			Clock clock,
 			ResourceProvider resourceProvider,
 			CircumventionProvider circumventionProvider,
@@ -37,7 +39,7 @@ abstract class JavaTorPlugin extends TorPlugin {
 			int maxIdleTime,
 			File torDirectory) {
 		super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils,
-				torSocketFactory, clock, resourceProvider,
+				torSocketFactory, torPorts, clock, resourceProvider,
 				circumventionProvider, batteryManager, backoff,
 				torRendezvousCrypto, callback, architecture,
 				maxLatency, maxIdleTime, torDirectory);
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java
index f7ee9134eb6c874dc83de5f4e8a7842963d0a353..17bcdf784041fb2e0d3d6a88f1834e942b7e4631 100644
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java
+++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java
@@ -11,6 +11,7 @@ import org.briarproject.bramble.api.plugin.PluginCallback;
 import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.api.system.LocationUtils;
 import org.briarproject.bramble.api.system.ResourceProvider;
+import org.briarproject.bramble.plugin.TorPorts;
 
 import java.io.File;
 import java.util.concurrent.Executor;
@@ -25,6 +26,7 @@ class UnixTorPlugin extends JavaTorPlugin {
 			NetworkManager networkManager,
 			LocationUtils locationUtils,
 			SocketFactory torSocketFactory,
+			TorPorts torPorts,
 			Clock clock,
 			ResourceProvider resourceProvider,
 			CircumventionProvider circumventionProvider,
@@ -37,7 +39,7 @@ class UnixTorPlugin extends JavaTorPlugin {
 			int maxIdleTime,
 			File torDirectory) {
 		super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils,
-				torSocketFactory, clock, resourceProvider,
+				torSocketFactory, torPorts, clock, resourceProvider,
 				circumventionProvider, batteryManager, backoff,
 				torRendezvousCrypto, callback, architecture,
 				maxLatency, maxIdleTime, torDirectory);
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java
index 35fe3cc90663d2182e2b110adf6d6f8d9b6b8b1b..a66c974d9203388365a3c72e0c9eb00a304c5d02 100644
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java
+++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java
@@ -16,6 +16,7 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
 import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.api.system.LocationUtils;
 import org.briarproject.bramble.api.system.ResourceProvider;
+import org.briarproject.bramble.plugin.TorPorts;
 
 import java.io.File;
 import java.util.concurrent.Executor;
@@ -46,6 +47,7 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
 	private final LocationUtils locationUtils;
 	private final EventBus eventBus;
 	private final SocketFactory torSocketFactory;
+	private final TorPorts torPorts;
 	private final BackoffFactory backoffFactory;
 	private final ResourceProvider resourceProvider;
 	private final CircumventionProvider circumventionProvider;
@@ -60,6 +62,7 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
 			LocationUtils locationUtils,
 			EventBus eventBus,
 			SocketFactory torSocketFactory,
+			TorPorts torPorts,
 			BackoffFactory backoffFactory,
 			ResourceProvider resourceProvider,
 			CircumventionProvider circumventionProvider,
@@ -72,6 +75,7 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
 		this.locationUtils = locationUtils;
 		this.eventBus = eventBus;
 		this.torSocketFactory = torSocketFactory;
+		this.torPorts = torPorts;
 		this.backoffFactory = backoffFactory;
 		this.resourceProvider = resourceProvider;
 		this.circumventionProvider = circumventionProvider;
@@ -109,8 +113,8 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
 				MAX_POLLING_INTERVAL, BACKOFF_BASE);
 		TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl();
 		UnixTorPlugin plugin = new UnixTorPlugin(ioExecutor, wakefulIoExecutor,
-				networkManager, locationUtils, torSocketFactory, clock,
-				resourceProvider, circumventionProvider, batteryManager,
+				networkManager, locationUtils, torSocketFactory, torPorts,
+				clock, resourceProvider, circumventionProvider, batteryManager,
 				backoff, torRendezvousCrypto, callback, architecture,
 				MAX_LATENCY, MAX_IDLE_TIME, torDirectory);
 		eventBus.addListener(plugin);