diff --git a/pkg/backend/gatewaychecker.go b/pkg/backend/gatewaychecker.go
new file mode 100644
index 0000000000000000000000000000000000000000..f10e47eedeca2d2206f7cef915c404a132b4d25b
--- /dev/null
+++ b/pkg/backend/gatewaychecker.go
@@ -0,0 +1,32 @@
+package backend
+
+import (
+	"time"
+)
+
+// The gateway selector gets populated asynchronously, so this spawns a goroutine that
+// checks whether they've been fetched to update status.
+func (c connectionCtx) delayCheckForGateways() {
+	go func() {
+		cnt := 0
+		for {
+			if cnt > 60*2 {
+				break
+			}
+			time.Sleep(time.Second * 5)
+			transport := c.bm.GetTransport()
+			locs := c.bm.ListLocationFullness(transport)
+			if len(locs) != 0 {
+				c.Locations = locs
+				updateStatusForGateways()
+				break
+			}
+		}
+	}()
+}
+
+func updateStatusForGateways() {
+	statusMutex.Lock()
+	defer statusMutex.Unlock()
+	go trigger(OnStatusChanged)
+}
diff --git a/pkg/backend/init.go b/pkg/backend/init.go
index 6fb794aa029d2dc8607f32b32ffba0e3be4a4006..b7469c1acb71ed4de756fae27028326f6ad72c60 100644
--- a/pkg/backend/init.go
+++ b/pkg/backend/init.go
@@ -35,6 +35,7 @@ func initializeContext(opts *InitOpts) {
 	go checkErrors(errCh)
 	initializeBitmask(errCh, opts)
 	go trigger(OnStatusChanged)
+	ctx.delayCheckForGateways()
 }
 
 func checkErrors(errCh chan string) {
diff --git a/pkg/vpn/main.go b/pkg/vpn/main.go
index 826e5d45622894258f2118f73b97270d57eabc45..3a1f52144269556c431b2ec65ec87a6d33c11bd0 100644
--- a/pkg/vpn/main.go
+++ b/pkg/vpn/main.go
@@ -69,8 +69,9 @@ func Init() (*Bitmask, error) {
 	*/
 
 	err = ioutil.WriteFile(b.getTempCaCertPath(), config.CaCert, 0600)
-
+	go b.fetchGateways()
 	go b.openvpnManagement()
+
 	return &b, err
 }
 
diff --git a/pkg/vpn/openvpn.go b/pkg/vpn/openvpn.go
index 1a34c22210fa9e0d0fe573a656685c5f9c7d7160..66820940c797326f6f76fbdd48a827018762a22b 100644
--- a/pkg/vpn/openvpn.go
+++ b/pkg/vpn/openvpn.go
@@ -219,6 +219,15 @@ func (b *Bitmask) getCert() (certPath string, err error) {
 	return certPath, err
 }
 
+// Explicit call to GetGateways, to be able to fetch them all before starting the vpn
+func (b *Bitmask) fetchGateways() {
+	log.Println("Fetching gateways...")
+	_, err := b.bonafide.GetAllGateways(b.transport)
+	if err != nil {
+		log.Println("ERROR Cannot fetch gateways")
+	}
+}
+
 // StopVPN or cancel
 func (b *Bitmask) StopVPN() error {
 	err := b.launch.firewallStop()