diff --git a/bitmask/vpn.go b/bitmask/vpn.go
index 9d12f85927c1efd3d89c391c03cb44fc67edd2c2..7922d6a50d8cc30c900318e26383b108b161b93d 100644
--- a/bitmask/vpn.go
+++ b/bitmask/vpn.go
@@ -1,5 +1,9 @@
 package bitmask
 
+import (
+	"errors"
+)
+
 // StartVPN for provider
 func (b *Bitmask) StartVPN(provider string) error {
 	_, err := b.send("vpn", "start", provider)
@@ -20,3 +24,28 @@ func (b *Bitmask) GetStatus() (string, error) {
 	}
 	return res["status"].(string), nil
 }
+
+// ListGateways return the names of the gateways
+func (b *Bitmask) ListGateways(provider string) ([]string, error) {
+	res, err := b.send("vpn", "list")
+	if err != nil {
+		return nil, err
+	}
+
+	names := []string{}
+	locations, ok := res[provider].([]interface{})
+	if !ok {
+		return nil, errors.New("Can't read the locations for provider " + provider)
+	}
+	for i := range locations {
+		loc := locations[i].(map[string]interface{})
+		names = append(names, loc["name"].(string))
+	}
+	return names, nil
+}
+
+// UseGateway selects name as the default gateway
+func (b *Bitmask) UseGateway(name string) error {
+	_, err := b.send("vpn", "locations", name)
+	return err
+}
diff --git a/main.go b/main.go
index ddf7172c923dad930f52cd9b70afcd20748e5e6e..1ed23c5a4fa9c40695f9e10d2ccdedaf24586df1 100644
--- a/main.go
+++ b/main.go
@@ -17,5 +17,6 @@ func main() {
 	if err != nil {
 		log.Fatal(err)
 	}
+
 	run(b)
 }
diff --git a/systray.go b/systray.go
index e520f0ad510b8807c02df8abb74f7edc7f42a443..38f02338298d3a7d01761d0de7692818e1fb2aaf 100644
--- a/systray.go
+++ b/systray.go
@@ -12,13 +12,18 @@ import (
 )
 
 type bmTray struct {
-	bm        *bitmask.Bitmask
-	waitCh    chan bool
-	mStatus   *systray.MenuItem
-	mTurnOn   *systray.MenuItem
-	mTurnOff  *systray.MenuItem
-	mCancel   *systray.MenuItem
-	mGateways []*systray.MenuItem
+	bm            *bitmask.Bitmask
+	waitCh        chan bool
+	mStatus       *systray.MenuItem
+	mTurnOn       *systray.MenuItem
+	mTurnOff      *systray.MenuItem
+	mCancel       *systray.MenuItem
+	activeGateway *gatewayTray
+}
+
+type gatewayTray struct {
+	menuItem *systray.MenuItem
+	name     string
 }
 
 func run(bm *bitmask.Bitmask) {
@@ -42,18 +47,10 @@ func (bt *bmTray) onReady() {
 	go bt.mCancel.Hide()
 	systray.AddSeparator()
 
-	mGateway := systray.AddMenuItem("Route traffic through", "")
-	mGateway.Disable()
-	bt.mGateways = append(bt.mGateways, systray.AddMenuItem("Seattle", "Use RiseupVPN Seattle gateway"))
-	bt.mGateways = append(bt.mGateways, systray.AddMenuItem("Montreal", "Use RiseupVPN Montreal gateway"))
-	bt.mGateways = append(bt.mGateways, systray.AddMenuItem("Amsterdam", "Use RiseupVPN Amsterdam gateway"))
-	bt.mGateways[0].Check()
-	bt.mGateways[1].Uncheck()
-	bt.mGateways[2].Uncheck()
-	systray.AddSeparator()
+	bt.addGateways()
 
 	mHelp := systray.AddMenuItem("Help ...", "")
-	mDonate := systray.AddMenuItem("Donate ...)", "")
+	mDonate := systray.AddMenuItem("Donate ...", "")
 	mAbout := systray.AddMenuItem("About ...", "")
 	systray.AddSeparator()
 
@@ -101,6 +98,51 @@ func (bt *bmTray) onReady() {
 	}()
 }
 
+func (bt *bmTray) addGateways() {
+	gatewayList, err := bt.bm.ListGateways(provider)
+	if err != nil {
+		log.Printf("Gateway initialization error: %v", err)
+		return
+	}
+
+	mGateway := systray.AddMenuItem("Route traffic through", "")
+	mGateway.Disable()
+	for i, name := range gatewayList {
+		menuItem := systray.AddMenuItem(name, "Use RiseupVPN "+name+" gateway")
+		gateway := gatewayTray{menuItem, name}
+
+		if i == 0 {
+			menuItem.Check()
+			menuItem.SetTitle("*" + name)
+			bt.activeGateway = &gateway
+		} else {
+			menuItem.Uncheck()
+		}
+
+		go func(gateway gatewayTray) {
+			for {
+				<-menuItem.ClickedCh
+				gateway.menuItem.SetTitle("*" + gateway.name)
+				gateway.menuItem.Check()
+
+				bt.activeGateway.menuItem.Uncheck()
+				bt.activeGateway.menuItem.SetTitle(bt.activeGateway.name)
+				bt.activeGateway = &gateway
+
+				bt.bm.UseGateway(gateway.name)
+			}
+		}(gateway)
+	}
+
+	systray.AddSeparator()
+
+	go bt.gatewaySelection()
+}
+
+func (bt *bmTray) gatewaySelection() {
+
+}
+
 func (bt *bmTray) changeStatus(status string) {
 	statusStr := status
 	bt.mTurnOn.SetTitle("Turn on")