diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java
index 4f7afa0349d3f4f6fa97cecce57f1c5614f97af1..ce43261a40d3c0eba7c54c2b3980f0aa132878f7 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java
@@ -60,6 +60,7 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
 	private final AtomicBoolean used = new AtomicBoolean(false);
 
 	private volatile boolean running = false, contactConnections = false;
+	private volatile String contactConnectionsUuid = null;
 	private volatile SS socket = null;
 
 	abstract void initialiseAdapter() throws IOException;
@@ -72,6 +73,10 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
 
 	abstract void setEnabledByUs();
 
+	/**
+	 * Returns the local Bluetooth address, or null if no valid address can
+	 * be found.
+	 */
 	@Nullable
 	abstract String getBluetoothAddress();
 
@@ -98,6 +103,8 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
 
 	void onAdapterEnabled() {
 		LOG.info("Bluetooth enabled");
+		// We may not have been able to get the local address before
+		ioExecutor.execute(this::updateProperties);
 		if (shouldAllowContactConnections()) bind();
 	}
 
@@ -131,6 +138,7 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
 		} catch (IOException e) {
 			throw new PluginException(e);
 		}
+		updateProperties();
 		running = true;
 		loadSettings();
 		if (shouldAllowContactConnections()) {
@@ -151,19 +159,10 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
 	private void bind() {
 		ioExecutor.execute(() -> {
 			if (!isRunning() || !shouldAllowContactConnections()) return;
-			String address = getBluetoothAddress();
-			if (LOG.isLoggable(INFO))
-				LOG.info("Local address " + scrubMacAddress(address));
-			if (!StringUtils.isNullOrEmpty(address)) {
-				// Advertise our Bluetooth address to contacts
-				TransportProperties p = new TransportProperties();
-				p.put(PROP_ADDRESS, address);
-				callback.mergeLocalProperties(p);
-			}
 			// Bind a server socket to accept connections from contacts
 			SS ss;
 			try {
-				ss = openServerSocket(getUuid());
+				ss = openServerSocket(contactConnectionsUuid);
 			} catch (IOException e) {
 				if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 				return;
@@ -179,17 +178,29 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
 		});
 	}
 
-	private String getUuid() {
-		String uuid = callback.getLocalProperties().get(PROP_UUID);
+	private void updateProperties() {
+		TransportProperties p = callback.getLocalProperties();
+		String address = p.get(PROP_ADDRESS);
+		String uuid = p.get(PROP_UUID);
+		boolean changed = false;
+		if (address == null) {
+			address = getBluetoothAddress();
+			if (LOG.isLoggable(INFO))
+				LOG.info("Local address " + scrubMacAddress(address));
+			if (!StringUtils.isNullOrEmpty(address)) {
+				p.put(PROP_ADDRESS, address);
+				changed = true;
+			}
+		}
 		if (uuid == null) {
 			byte[] random = new byte[UUID_BYTES];
 			secureRandom.nextBytes(random);
 			uuid = UUID.nameUUIDFromBytes(random).toString();
-			TransportProperties p = new TransportProperties();
 			p.put(PROP_UUID, uuid);
-			callback.mergeLocalProperties(p);
+			changed = true;
 		}
-		return uuid;
+		contactConnectionsUuid = uuid;
+		if (changed) callback.mergeLocalProperties(p);
 	}
 
 	private void acceptContactConnections() {