diff --git a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java
index 499eb9d9b71a15e337f07c09d300c35bdf7a4ed2..34de50400f325671e808ae066af2cf7bab94278c 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java
@@ -53,12 +53,12 @@ class LanTcpPlugin extends TcpPlugin {
 	}
 
 	@Override
-	protected List<SocketAddress> getLocalSocketAddresses() {
+	protected List<InetSocketAddress> getLocalSocketAddresses() {
 		// Use the same address and port as last time if available
 		TransportProperties p = callback.getLocalProperties();
 		String oldIpPorts = p.get(PROP_IP_PORTS);
 		List<InetSocketAddress> olds = parseSocketAddresses(oldIpPorts);
-		List<SocketAddress> locals = new LinkedList<SocketAddress>();
+		List<InetSocketAddress> locals = new LinkedList<InetSocketAddress>();
 		for (InetAddress local : getLocalIpAddresses()) {
 			if (isAcceptableAddress(local)) {
 				// If this is the old address, try to use the same port
@@ -168,7 +168,9 @@ class LanTcpPlugin extends TcpPlugin {
 	@Override
 	public KeyAgreementListener createKeyAgreementListener(byte[] commitment) {
 		ServerSocket ss = null;
-		for (SocketAddress addr : getLocalSocketAddresses()) {
+		for (InetSocketAddress addr : getLocalSocketAddresses()) {
+			// Don't try to reuse the same port we use for contact connections
+			addr = new InetSocketAddress(addr.getAddress(), 0);
 			try {
 				ss = new ServerSocket();
 				ss.bind(addr);
diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
index 5fc8742fdc312fd2fdbb6e5d738f18be17d44b5d..fab2a1cbb57a9f0afb91cd0098a980c65df344f5 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java
@@ -51,7 +51,7 @@ abstract class TcpPlugin implements DuplexPlugin {
 	 * Returns zero or more socket addresses on which the plugin should listen,
 	 * in order of preference. At most one of the addresses will be bound.
 	 */
-	protected abstract List<SocketAddress> getLocalSocketAddresses();
+	protected abstract List<InetSocketAddress> getLocalSocketAddresses();
 
 	/**
 	 * Adds the address on which the plugin is listening to the transport
diff --git a/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java
index bc54da0ae4f089e42f9a7f22509c709d431fb3de..82c3221a5b65cf99311a255321dbf87b16cd173d 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/WanTcpPlugin.java
@@ -9,7 +9,6 @@ import org.briarproject.api.properties.TransportProperties;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
-import java.net.SocketAddress;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -37,11 +36,11 @@ class WanTcpPlugin extends TcpPlugin {
 	}
 
 	@Override
-	protected List<SocketAddress> getLocalSocketAddresses() {
+	protected List<InetSocketAddress> getLocalSocketAddresses() {
 		// Use the same address and port as last time if available
 		TransportProperties p = callback.getLocalProperties();
 		InetSocketAddress old = parseSocketAddress(p.get(PROP_IP_PORT));
-		List<SocketAddress> addrs = new LinkedList<SocketAddress>();
+		List<InetSocketAddress> addrs = new LinkedList<InetSocketAddress>();
 		for (InetAddress a : getLocalIpAddresses()) {
 			if (isAcceptableAddress(a)) {
 				// If this is the old address, try to use the same port