diff --git a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java
index 3d530f4680da31deacb6b13a514dfc811a26d496..d9625b36a612b24e79a30fd13da362c5eaeb5494 100644
--- a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java
+++ b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java
@@ -46,7 +46,7 @@ public class AndroidPluginsModule extends PluginsModule {
 		DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext,
 				locationUtils, eventBus);
 		DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor,
-				appContext);
+				backoffFactory, appContext);
 		final Collection<DuplexPluginFactory> factories =
 				Arrays.asList(bluetooth, tor, lan);
 		return new DuplexPluginConfig() {
diff --git a/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPlugin.java b/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPlugin.java
index 70bd116a03b8f4c514f83713572f30bd25e4def1..e04e2f4fcb567eaed59f4f68d0b27eacc8b866c0 100644
--- a/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPlugin.java
+++ b/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPlugin.java
@@ -1,14 +1,5 @@
 package org.briarproject.plugins.tcp;
 
-import static android.content.Context.CONNECTIVITY_SERVICE;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
-
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -16,6 +7,16 @@ import android.content.IntentFilter;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 
+import org.briarproject.api.plugins.Backoff;
+import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
+
+import java.util.concurrent.Executor;
+import java.util.logging.Logger;
+
+import static android.content.Context.CONNECTIVITY_SERVICE;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+
 class AndroidLanTcpPlugin extends LanTcpPlugin {
 
 	private static final Logger LOG =
@@ -25,10 +26,10 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
 
 	private volatile BroadcastReceiver networkStateReceiver = null;
 
-	AndroidLanTcpPlugin(Executor ioExecutor, Context appContext,
-			DuplexPluginCallback callback, int maxLatency,
-			int maxIdleTime, int pollingInterval) {
-		super(ioExecutor, callback, maxLatency, maxIdleTime, pollingInterval);
+	AndroidLanTcpPlugin(Executor ioExecutor, Backoff backoff,
+			Context appContext, DuplexPluginCallback callback, int maxLatency,
+			int maxIdleTime) {
+		super(ioExecutor, backoff, callback, maxLatency, maxIdleTime);
 		this.appContext = appContext;
 	}
 
diff --git a/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPluginFactory.java b/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPluginFactory.java
index debad159c47e8d84eb96c11182186b67f2526dbd..0813ebfdd71dc460f9038f20ff314dcc749f50fd 100644
--- a/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPluginFactory.java
+++ b/briar-android/src/org/briarproject/plugins/tcp/AndroidLanTcpPluginFactory.java
@@ -1,25 +1,32 @@
 package org.briarproject.plugins.tcp;
 
-import java.util.concurrent.Executor;
+import android.content.Context;
 
 import org.briarproject.api.TransportId;
+import org.briarproject.api.plugins.Backoff;
+import org.briarproject.api.plugins.BackoffFactory;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
 
-import android.content.Context;
+import java.util.concurrent.Executor;
 
 public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
 
 	private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
 	private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
-	private static final int POLLING_INTERVAL = 3 * 60 * 1000; // 3 minutes
+	private static final int MIN_POLLING_INTERVAL = 2 * 60 * 1000; // 2 minutes
+	private static final int MAX_POLLING_INTERVAL = 60 * 60 * 1000; // 1 hour
+	private static final double BACKOFF_BASE = 1.2;
 
 	private final Executor ioExecutor;
+	private final BackoffFactory backoffFactory;
 	private final Context appContext;
 
-	public AndroidLanTcpPluginFactory(Executor ioExecutor, Context appContext) {
+	public AndroidLanTcpPluginFactory(Executor ioExecutor,
+			BackoffFactory backoffFactory, Context appContext) {
 		this.ioExecutor = ioExecutor;
+		this.backoffFactory = backoffFactory;
 		this.appContext = appContext;
 	}
 
@@ -28,7 +35,9 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
 	}
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
-		return new AndroidLanTcpPlugin(ioExecutor, appContext, callback,
-				MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL);
+		Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
+				MAX_POLLING_INTERVAL, BACKOFF_BASE);
+		return new AndroidLanTcpPlugin(ioExecutor, backoff, appContext,
+				callback, MAX_LATENCY, MAX_IDLE_TIME);
 	}
 }
diff --git a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java
index 01b377f0fc407c92bed18a9e9da60180a8c9e22c..8a75a971e6495b1f470a0cee40aa3fced823f327 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java
@@ -1,6 +1,7 @@
 package org.briarproject.plugins.tcp;
 
 import org.briarproject.api.TransportId;
+import org.briarproject.api.plugins.Backoff;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.properties.TransportProperties;
 
@@ -16,9 +17,9 @@ class LanTcpPlugin extends TcpPlugin {
 
 	static final TransportId ID = new TransportId("lan");
 
-	LanTcpPlugin(Executor ioExecutor, DuplexPluginCallback callback,
-			int maxLatency, int maxIdleTime, int pollingInterval) {
-		super(ioExecutor, callback, maxLatency, maxIdleTime, pollingInterval);
+	LanTcpPlugin(Executor ioExecutor, Backoff backoff,
+			DuplexPluginCallback callback, int maxLatency, int maxIdleTime) {
+		super(ioExecutor, backoff, callback, maxLatency, maxIdleTime);
 	}
 
 	public TransportId getId() {
diff --git a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPluginFactory.java b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPluginFactory.java
index 68f2edc0e77aab769e242a3e63f4334376ac5083..929f63a6b849b80454e24c33f7783cdd765b0c5f 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPluginFactory.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPluginFactory.java
@@ -1,22 +1,29 @@
 package org.briarproject.plugins.tcp;
 
-import java.util.concurrent.Executor;
-
 import org.briarproject.api.TransportId;
+import org.briarproject.api.plugins.Backoff;
+import org.briarproject.api.plugins.BackoffFactory;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
 
+import java.util.concurrent.Executor;
+
 public class LanTcpPluginFactory implements DuplexPluginFactory {
 
 	private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
 	private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
-	private static final int POLLING_INTERVAL = 3 * 60 * 1000; // 3 minutes
+	private static final int MIN_POLLING_INTERVAL = 2 * 60 * 1000; // 2 minutes
+	private static final int MAX_POLLING_INTERVAL = 60 * 60 * 1000; // 1 hour
+	private static final double BACKOFF_BASE = 1.2;
 
 	private final Executor ioExecutor;
+	private final BackoffFactory backoffFactory;
 
-	public LanTcpPluginFactory(Executor ioExecutor) {
+	public LanTcpPluginFactory(Executor ioExecutor,
+			BackoffFactory backoffFactory) {
 		this.ioExecutor = ioExecutor;
+		this.backoffFactory = backoffFactory;
 	}
 
 	public TransportId getId() {
@@ -24,7 +31,9 @@ public class LanTcpPluginFactory implements DuplexPluginFactory {
 	}
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
-		return new LanTcpPlugin(ioExecutor, callback,  MAX_LATENCY,
-				MAX_IDLE_TIME, POLLING_INTERVAL);
+		Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
+				MAX_POLLING_INTERVAL, BACKOFF_BASE);
+		return new LanTcpPlugin(ioExecutor, backoff, callback, MAX_LATENCY,
+				MAX_IDLE_TIME);
 	}
 }
diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
index a7a0b201d72ed1f603ffd74a347d13adbda58729..03263bd77669e4a8db8af66068542a65b6cad5d9 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
@@ -2,6 +2,7 @@ package org.briarproject.plugins.tcp;
 
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.crypto.PseudoRandom;
+import org.briarproject.api.plugins.Backoff;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
@@ -36,8 +37,9 @@ abstract class TcpPlugin implements DuplexPlugin {
 			Logger.getLogger(TcpPlugin.class.getName());
 
 	protected final Executor ioExecutor;
+	protected final Backoff backoff;
 	protected final DuplexPluginCallback callback;
-	protected final int maxLatency, maxIdleTime, pollingInterval, socketTimeout;
+	protected final int maxLatency, maxIdleTime, socketTimeout;
 
 	protected volatile boolean running = false;
 	protected volatile ServerSocket socket = null;
@@ -51,13 +53,13 @@ abstract class TcpPlugin implements DuplexPlugin {
 	/** Returns true if connections to the given address can be attempted. */
 	protected abstract boolean isConnectable(InetSocketAddress remote);
 
-	protected TcpPlugin(Executor ioExecutor, DuplexPluginCallback callback,
-			int maxLatency, int maxIdleTime, int pollingInterval) {
+	protected TcpPlugin(Executor ioExecutor, Backoff backoff,
+			DuplexPluginCallback callback, int maxLatency, int maxIdleTime) {
 		this.ioExecutor = ioExecutor;
+		this.backoff = backoff;
 		this.callback = callback;
 		this.maxLatency = maxLatency;
 		this.maxIdleTime = maxIdleTime;
-		this.pollingInterval = pollingInterval;
 		if (maxIdleTime > Integer.MAX_VALUE / 2)
 			socketTimeout = Integer.MAX_VALUE;
 		else socketTimeout = maxIdleTime * 2;
@@ -102,6 +104,7 @@ abstract class TcpPlugin implements DuplexPlugin {
 					return;
 				}
 				socket = ss;
+				backoff.reset();
 				SocketAddress local = ss.getLocalSocketAddress();
 				setLocalSocketAddress((InetSocketAddress) local);
 				if (LOG.isLoggable(INFO)) LOG.info("Listening on " + local);
@@ -147,6 +150,7 @@ abstract class TcpPlugin implements DuplexPlugin {
 			}
 			if (LOG.isLoggable(INFO))
 				LOG.info("Connection from " + s.getRemoteSocketAddress());
+			backoff.reset();
 			TcpTransportConnection conn = new TcpTransportConnection(this, s);
 			callback.incomingConnectionCreated(conn);
 		}
@@ -166,11 +170,12 @@ abstract class TcpPlugin implements DuplexPlugin {
 	}
 
 	public int getPollingInterval() {
-		return pollingInterval;
+		return backoff.getPollingInterval();
 	}
 
 	public void poll(Collection<ContactId> connected) {
 		if (!isRunning()) return;
+		backoff.increment();
 		for (ContactId c : callback.getRemoteProperties().keySet())
 			if (!connected.contains(c)) connectAndCallBack(c);
 	}
@@ -179,7 +184,10 @@ abstract class TcpPlugin implements DuplexPlugin {
 		ioExecutor.execute(new Runnable() {
 			public void run() {
 				DuplexTransportConnection d = createConnection(c);
-				if (d != null) callback.outgoingConnectionCreated(c, d);
+				if (d != null) {
+					backoff.reset();
+					callback.outgoingConnectionCreated(c, d);
+				}
 			}
 		});
 	}
diff --git a/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java
index 64c924e4e3d6d89b6f36c4ee3a35935e85d6ab27..beabc8bec54f71f6814a4077cc30e6bfd20dc67e 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java
@@ -1,6 +1,7 @@
 package org.briarproject.plugins.tcp;
 
 import org.briarproject.api.TransportId;
+import org.briarproject.api.plugins.Backoff;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.properties.TransportProperties;
 
@@ -20,10 +21,9 @@ class WanTcpPlugin extends TcpPlugin {
 
 	private volatile MappingResult mappingResult;
 
-	WanTcpPlugin(Executor ioExecutor, PortMapper portMapper,
-			DuplexPluginCallback callback, int maxLatency, int maxIdleTime,
-			int pollingInterval) {
-		super(ioExecutor, callback, maxLatency, maxIdleTime, pollingInterval);
+	WanTcpPlugin(Executor ioExecutor, Backoff backoff, PortMapper portMapper,
+			DuplexPluginCallback callback, int maxLatency, int maxIdleTime) {
+		super(ioExecutor, backoff, callback, maxLatency, maxIdleTime);
 		this.portMapper = portMapper;
 	}
 
diff --git a/briar-core/src/org/briarproject/plugins/tcp/WanTcpPluginFactory.java b/briar-core/src/org/briarproject/plugins/tcp/WanTcpPluginFactory.java
index bd326ebbc0e8281f47511ceae223cc536caaa25d..659b79f1c0536b80105ea855caf6a63e6a3b48a1 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/WanTcpPluginFactory.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/WanTcpPluginFactory.java
@@ -1,25 +1,31 @@
 package org.briarproject.plugins.tcp;
 
-import java.util.concurrent.Executor;
-
 import org.briarproject.api.TransportId;
 import org.briarproject.api.lifecycle.ShutdownManager;
+import org.briarproject.api.plugins.Backoff;
+import org.briarproject.api.plugins.BackoffFactory;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
 
+import java.util.concurrent.Executor;
+
 public class WanTcpPluginFactory implements DuplexPluginFactory {
 
 	private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
 	private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
-	private static final int POLLING_INTERVAL = 5 * 60 * 1000; // 5 minutes
+	private static final int MIN_POLLING_INTERVAL = 2 * 60 * 1000; // 2 minutes
+	private static final int MAX_POLLING_INTERVAL = 60 * 60 * 1000; // 1 hour
+	private static final double BACKOFF_BASE = 1.2;
 
 	private final Executor ioExecutor;
+	private final BackoffFactory backoffFactory;
 	private final ShutdownManager shutdownManager;
 
 	public WanTcpPluginFactory(Executor ioExecutor,
-			ShutdownManager shutdownManager) {
+			BackoffFactory backoffFactory, ShutdownManager shutdownManager) {
 		this.ioExecutor = ioExecutor;
+		this.backoffFactory = backoffFactory;
 		this.shutdownManager = shutdownManager;
 	}
 
@@ -28,7 +34,10 @@ public class WanTcpPluginFactory implements DuplexPluginFactory {
 	}
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
-		return new WanTcpPlugin(ioExecutor, new PortMapperImpl(shutdownManager),
-				callback, MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL);
+		Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
+				MAX_POLLING_INTERVAL, BACKOFF_BASE);
+		return new WanTcpPlugin(ioExecutor, backoff,
+				new PortMapperImpl(shutdownManager), callback, MAX_LATENCY,
+				MAX_IDLE_TIME);
 	}
 }
diff --git a/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java b/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java
index aa56c79b65123c3835a0bb95b8b28ec6ecf1378b..ff69727386264ae2c8a4c580560158a105fc7c83 100644
--- a/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java
+++ b/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java
@@ -47,9 +47,10 @@ public class DesktopPluginsModule extends PluginsModule {
 				random, backoffFactory);
 		DuplexPluginFactory modem = new ModemPluginFactory(ioExecutor,
 				reliabilityFactory);
-		DuplexPluginFactory lan = new LanTcpPluginFactory(ioExecutor);
+		DuplexPluginFactory lan = new LanTcpPluginFactory(ioExecutor,
+				backoffFactory);
 		DuplexPluginFactory wan = new WanTcpPluginFactory(ioExecutor,
-				shutdownManager);
+				backoffFactory, shutdownManager);
 		final Collection<DuplexPluginFactory> factories =
 				Arrays.asList(bluetooth, modem, lan, wan);
 		return new DuplexPluginConfig() {
diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java
deleted file mode 100644
index c8bfb3118682ce294d4112cbd817eaeacc728eb0..0000000000000000000000000000000000000000
--- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.briarproject.plugins.tcp;
-
-import org.briarproject.api.contact.ContactId;
-import org.briarproject.api.properties.TransportProperties;
-import org.briarproject.api.settings.Settings;
-import org.briarproject.plugins.DuplexClientTest;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-// This is not a JUnit test - it has to be run manually while the server test
-// is running on another machine
-public class LanTcpClientTest extends DuplexClientTest {
-
-	private static final int MAX_LATENCY = 60 * 1000;
-	private static final int MAX_IDLE_TIME = 30 * 1000;
-	private static final int POLLING_INTERVAL = 60 * 1000;
-
-	private LanTcpClientTest(Executor executor, String serverAddress,
-			String serverPort) {
-		// Store the server's internal address and port
-		TransportProperties p = new TransportProperties();
-		p.put("address", serverAddress);
-		p.put("port", serverPort);
-		Map<ContactId, TransportProperties> remote =
-				Collections.singletonMap(contactId, p);
-		// Create the plugin
-		callback = new ClientCallback(new Settings(),
-				new TransportProperties(), remote);
-		plugin = new LanTcpPlugin(executor, callback,  MAX_LATENCY,
-				MAX_IDLE_TIME, POLLING_INTERVAL);
-	}
-
-	public static void main(String[] args) throws Exception {
-		if (args.length != 2) {
-			System.err.println("Please specify the server's address and port");
-			System.exit(1);
-		}
-		ExecutorService executor = Executors.newCachedThreadPool();
-		try {
-			new LanTcpClientTest(executor, args[0], args[1]).run();
-		} finally {
-			executor.shutdown();
-		}
-	}
-}
diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java
index cef6fb7ad269a125efef6d6f41a8a9bb8d7494fd..1554a0832e6a66fc75130acc11035c3753ecefc5 100644
--- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java
+++ b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java
@@ -2,6 +2,7 @@ package org.briarproject.plugins.tcp;
 
 import org.briarproject.BriarTestCase;
 import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.plugins.Backoff;
 import org.briarproject.api.plugins.duplex.DuplexPlugin;
 import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
@@ -32,10 +33,11 @@ import static org.junit.Assert.assertTrue;
 public class LanTcpPluginTest extends BriarTestCase {
 
 	private final ContactId contactId = new ContactId(234);
+	private final Backoff backoff = new TestBackoff();
 
 	@Test
 	public void testAddressesAreOnSameLan() {
-		LanTcpPlugin plugin = new LanTcpPlugin(null, null, 0, 0, 0);
+		LanTcpPlugin plugin = new LanTcpPlugin(null, null, null, 0, 0);
 		// Local and remote in 10.0.0.0/8 should return true
 		assertTrue(plugin.addressesAreOnSameLan(makeAddress(10, 0, 0, 0),
 				makeAddress(10, 255, 255, 255)));
@@ -84,7 +86,8 @@ public class LanTcpPluginTest extends BriarTestCase {
 		}
 		Callback callback = new Callback();
 		Executor executor = Executors.newCachedThreadPool();
-		DuplexPlugin plugin = new LanTcpPlugin(executor, callback, 0, 0, 0);
+		DuplexPlugin plugin = new LanTcpPlugin(executor, backoff, callback,
+				0, 0);
 		plugin.start();
 		// The plugin should have bound a socket and stored the port number
 		assertTrue(callback.propertiesLatch.await(5, SECONDS));
@@ -116,7 +119,8 @@ public class LanTcpPluginTest extends BriarTestCase {
 		}
 		Callback callback = new Callback();
 		Executor executor = Executors.newCachedThreadPool();
-		DuplexPlugin plugin = new LanTcpPlugin(executor, callback, 0, 0, 0);
+		DuplexPlugin plugin = new LanTcpPlugin(executor, backoff, callback,
+				0, 0);
 		plugin.start();
 		// The plugin should have bound a socket and stored the port number
 		assertTrue(callback.propertiesLatch.await(5, SECONDS));
@@ -216,4 +220,15 @@ public class LanTcpPluginTest extends BriarTestCase {
 
 		public void transportDisabled() {}
 	}
+
+	private static class TestBackoff implements Backoff {
+
+		public int getPollingInterval() {
+			return 60 * 1000;
+		}
+
+		public void increment() {}
+
+		public void reset() {}
+	}
 }
diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java
deleted file mode 100644
index 51d7b2ff3d1efe49a840a46e176f526b4c8dada2..0000000000000000000000000000000000000000
--- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.briarproject.plugins.tcp;
-
-import org.briarproject.api.properties.TransportProperties;
-import org.briarproject.api.settings.Settings;
-import org.briarproject.plugins.DuplexServerTest;
-
-import java.util.Collections;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-// This is not a JUnit test - it has to be run manually while the client test
-// is running on another machine
-public class LanTcpServerTest extends DuplexServerTest {
-
-	private static final int MAX_LATENCY = 60 * 1000;
-	private static final int MAX_IDLE_TIME = 30 * 1000;
-	private static final int POLLING_INTERVAL = 60 * 1000;
-
-	private LanTcpServerTest(Executor executor) {
-		callback = new ServerCallback(new Settings(),
-				new TransportProperties(),
-				Collections.singletonMap(contactId, new TransportProperties()));
-		plugin = new LanTcpPlugin(executor, callback, MAX_LATENCY,
-				MAX_IDLE_TIME, POLLING_INTERVAL);
-	}
-
-	public static void main(String[] args) throws Exception {
-		ExecutorService executor = Executors.newCachedThreadPool();
-		try {
-			new LanTcpServerTest(executor).run();
-		} finally {
-			executor.shutdown();
-		}
-	}
-}