diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java
index 89a4e69fcc8cc63e277d9bbc23ed076f8b21cbdc..c2068e28ebd3461038a4a3fbc98834841a37f142 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java
@@ -97,6 +97,13 @@ public abstract class TorPlugin
 	private static final String OWNER = "__OwningControllerProcess";
 	private static final int COOKIE_TIMEOUT_MS = 3000;
 	private static final int COOKIE_POLLING_INTERVAL_MS = 200;
+	/**
+	 * The number of uploads of our onion service descriptor we wait for
+	 * before we consider our onion service to be published.
+	 * In reality, the actual reachability is more complicated,
+	 * but this might be a reasonable heuristic.
+	 */
+	private static final int HS_DESC_UPLOADS = 3;
 
 	private final Executor ioExecutor;
 	private final Executor connectionStatusExecutor;
@@ -654,7 +661,8 @@ public abstract class TorPlugin
 			if (!networkInitialised) return ENABLING;
 			if (!networkEnabled) return INACTIVE;
 			if (bootstrapped && circuitBuilt) {
-				return (numServiceUploads >= 3) ? PUBLISHED : ACTIVE;
+				return (numServiceUploads >= HS_DESC_UPLOADS) ?
+						PUBLISHED : ACTIVE;
 			} else return ENABLING;
 		}