diff --git a/app/src/main/java/io/swagger/client/JSON.java b/app/src/main/java/io/swagger/client/JSON.java
index 9be3f54228c0c2e26cd75076c9fe3782c5018a5b..b1ca69a875764deda6c46dcfbfefaa54380ea4ed 100644
--- a/app/src/main/java/io/swagger/client/JSON.java
+++ b/app/src/main/java/io/swagger/client/JSON.java
@@ -32,6 +32,7 @@ import io.swagger.client.model.*;
 import io.swagger.client.model.*;
 import io.swagger.client.model.*;
 import io.swagger.client.model.*;
+import io.swagger.client.model.*;
 import okio.ByteString;
 
 import java.io.IOException;
diff --git a/app/src/main/java/io/swagger/client/model/ModelsBridge.java b/app/src/main/java/io/swagger/client/model/ModelsBridge.java
index 3110bf30fd4d17c5625874cd651af78417ec1c3f..88f3575ec2b844ce28d7f26eb231be4ffe470bd4 100644
--- a/app/src/main/java/io/swagger/client/model/ModelsBridge.java
+++ b/app/src/main/java/io/swagger/client/model/ModelsBridge.java
@@ -54,6 +54,9 @@ public class ModelsBridge {
   @SerializedName("ip6_addr")
   private String ip6Addr = null;
 
+  @SerializedName("last_seen_millis")
+  private Long lastSeenMillis = null;
+
   @SerializedName("load")
   private BigDecimal load = null;
 
@@ -201,6 +204,24 @@ public class ModelsBridge {
     this.ip6Addr = ip6Addr;
   }
 
+  public ModelsBridge lastSeenMillis(Long lastSeenMillis) {
+    this.lastSeenMillis = lastSeenMillis;
+    return this;
+  }
+
+   /**
+   * LastSeenMillis is a unix time in milliseconds representing the last time we received a heartbeat update from this bridge
+   * @return lastSeenMillis
+  **/
+  @ApiModelProperty(value = "LastSeenMillis is a unix time in milliseconds representing the last time we received a heartbeat update from this bridge")
+  public Long getLastSeenMillis() {
+    return lastSeenMillis;
+  }
+
+  public void setLastSeenMillis(Long lastSeenMillis) {
+    this.lastSeenMillis = lastSeenMillis;
+  }
+
   public ModelsBridge load(BigDecimal load) {
     this.load = load;
     return this;
@@ -352,6 +373,7 @@ public class ModelsBridge {
         Objects.equals(this.host, modelsBridge.host) &&
         Objects.equals(this.ipAddr, modelsBridge.ipAddr) &&
         Objects.equals(this.ip6Addr, modelsBridge.ip6Addr) &&
+        Objects.equals(this.lastSeenMillis, modelsBridge.lastSeenMillis) &&
         Objects.equals(this.load, modelsBridge.load) &&
         Objects.equals(this.location, modelsBridge.location) &&
         Objects.equals(this.options, modelsBridge.options) &&
@@ -363,7 +385,7 @@ public class ModelsBridge {
 
   @Override
   public int hashCode() {
-    return Objects.hash(auth, bucket, experimental, healthy, host, ipAddr, ip6Addr, load, location, options, overloaded, port, transport, type);
+    return Objects.hash(auth, bucket, experimental, healthy, host, ipAddr, ip6Addr, lastSeenMillis, load, location, options, overloaded, port, transport, type);
   }
 
 
@@ -379,6 +401,7 @@ public class ModelsBridge {
     sb.append("    host: ").append(toIndentedString(host)).append("\n");
     sb.append("    ipAddr: ").append(toIndentedString(ipAddr)).append("\n");
     sb.append("    ip6Addr: ").append(toIndentedString(ip6Addr)).append("\n");
+    sb.append("    lastSeenMillis: ").append(toIndentedString(lastSeenMillis)).append("\n");
     sb.append("    load: ").append(toIndentedString(load)).append("\n");
     sb.append("    location: ").append(toIndentedString(location)).append("\n");
     sb.append("    options: ").append(toIndentedString(options)).append("\n");
diff --git a/app/src/main/java/io/swagger/client/model/ModelsEIPService.java b/app/src/main/java/io/swagger/client/model/ModelsEIPService.java
index f9796f71b0758f29200a18a99c1e3d5a38186b6a..939f8aa6a5cdc3ab0b61820af0ee3db5abdd7392 100644
--- a/app/src/main/java/io/swagger/client/model/ModelsEIPService.java
+++ b/app/src/main/java/io/swagger/client/model/ModelsEIPService.java
@@ -22,6 +22,7 @@ import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonWriter;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.client.model.ModelsLocation;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
@@ -36,7 +37,7 @@ public class ModelsEIPService {
   private String auth = null;
 
   @SerializedName("locations")
-  private Object locations = null;
+  private Map<String, ModelsLocation> locations = null;
 
   @SerializedName("openvpn_configuration")
   private Map<String, Object> openvpnConfiguration = null;
@@ -65,21 +66,29 @@ public class ModelsEIPService {
     this.auth = auth;
   }
 
-  public ModelsEIPService locations(Object locations) {
+  public ModelsEIPService locations(Map<String, ModelsLocation> locations) {
     this.locations = locations;
     return this;
   }
 
+  public ModelsEIPService putLocationsItem(String key, ModelsLocation locationsItem) {
+    if (this.locations == null) {
+      this.locations = new HashMap<String, ModelsLocation>();
+    }
+    this.locations.put(key, locationsItem);
+    return this;
+  }
+
    /**
    * Get locations
    * @return locations
   **/
   @ApiModelProperty(value = "")
-  public Object getLocations() {
+  public Map<String, ModelsLocation> getLocations() {
     return locations;
   }
 
-  public void setLocations(Object locations) {
+  public void setLocations(Map<String, ModelsLocation> locations) {
     this.locations = locations;
   }
 
diff --git a/app/src/main/java/io/swagger/client/model/ModelsGateway.java b/app/src/main/java/io/swagger/client/model/ModelsGateway.java
index 75cd7b43c489315c31dd30c84dfb47f1fd82941f..3da72aa9c6b516e9e5b3e0947c3da76acb774215 100644
--- a/app/src/main/java/io/swagger/client/model/ModelsGateway.java
+++ b/app/src/main/java/io/swagger/client/model/ModelsGateway.java
@@ -48,6 +48,9 @@ public class ModelsGateway {
   @SerializedName("ip6_addr")
   private String ip6Addr = null;
 
+  @SerializedName("last_seen_millis")
+  private Long lastSeenMillis = null;
+
   @SerializedName("load")
   private BigDecimal load = null;
 
@@ -174,6 +177,24 @@ public class ModelsGateway {
     this.ip6Addr = ip6Addr;
   }
 
+  public ModelsGateway lastSeenMillis(Long lastSeenMillis) {
+    this.lastSeenMillis = lastSeenMillis;
+    return this;
+  }
+
+   /**
+   * LastSeenMillis is a unix time in milliseconds representing the last time we received a heartbeat update from this gateway
+   * @return lastSeenMillis
+  **/
+  @ApiModelProperty(value = "LastSeenMillis is a unix time in milliseconds representing the last time we received a heartbeat update from this gateway")
+  public Long getLastSeenMillis() {
+    return lastSeenMillis;
+  }
+
+  public void setLastSeenMillis(Long lastSeenMillis) {
+    this.lastSeenMillis = lastSeenMillis;
+  }
+
   public ModelsGateway load(BigDecimal load) {
     this.load = load;
     return this;
@@ -298,6 +319,7 @@ public class ModelsGateway {
         Objects.equals(this.host, modelsGateway.host) &&
         Objects.equals(this.ipAddr, modelsGateway.ipAddr) &&
         Objects.equals(this.ip6Addr, modelsGateway.ip6Addr) &&
+        Objects.equals(this.lastSeenMillis, modelsGateway.lastSeenMillis) &&
         Objects.equals(this.load, modelsGateway.load) &&
         Objects.equals(this.location, modelsGateway.location) &&
         Objects.equals(this.overloaded, modelsGateway.overloaded) &&
@@ -308,7 +330,7 @@ public class ModelsGateway {
 
   @Override
   public int hashCode() {
-    return Objects.hash(bucket, experimental, healthy, host, ipAddr, ip6Addr, load, location, overloaded, port, transport, type);
+    return Objects.hash(bucket, experimental, healthy, host, ipAddr, ip6Addr, lastSeenMillis, load, location, overloaded, port, transport, type);
   }
 
 
@@ -323,6 +345,7 @@ public class ModelsGateway {
     sb.append("    host: ").append(toIndentedString(host)).append("\n");
     sb.append("    ipAddr: ").append(toIndentedString(ipAddr)).append("\n");
     sb.append("    ip6Addr: ").append(toIndentedString(ip6Addr)).append("\n");
+    sb.append("    lastSeenMillis: ").append(toIndentedString(lastSeenMillis)).append("\n");
     sb.append("    load: ").append(toIndentedString(load)).append("\n");
     sb.append("    location: ").append(toIndentedString(location)).append("\n");
     sb.append("    overloaded: ").append(toIndentedString(overloaded)).append("\n");
diff --git a/app/src/main/java/io/swagger/client/model/ModelsLocation.java b/app/src/main/java/io/swagger/client/model/ModelsLocation.java
new file mode 100644
index 0000000000000000000000000000000000000000..adda676ba9c09e19ee2a9f9347583e2c7c62f721
--- /dev/null
+++ b/app/src/main/java/io/swagger/client/model/ModelsLocation.java
@@ -0,0 +1,301 @@
+/*
+ * Menshen API
+ * This is a LEAP VPN Service API
+ *
+ * OpenAPI spec version: 0.5.2
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+
+package io.swagger.client.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import com.google.gson.TypeAdapter;
+import com.google.gson.annotations.JsonAdapter;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.IOException;
+
+/**
+ * ModelsLocation
+ */
+
+public class ModelsLocation {
+  @SerializedName("country_code")
+  private String countryCode = null;
+
+  @SerializedName("display_name")
+  private String displayName = null;
+
+  @SerializedName("has_bridges")
+  private Boolean hasBridges = null;
+
+  @SerializedName("healthy")
+  private Boolean healthy = null;
+
+  @SerializedName("hemisphere")
+  private String hemisphere = null;
+
+  @SerializedName("label")
+  private String label = null;
+
+  @SerializedName("lat")
+  private String lat = null;
+
+  @SerializedName("lon")
+  private String lon = null;
+
+  @SerializedName("region")
+  private String region = null;
+
+  @SerializedName("timezone")
+  private String timezone = null;
+
+  public ModelsLocation countryCode(String countryCode) {
+    this.countryCode = countryCode;
+    return this;
+  }
+
+   /**
+   * CountryCode is the two-character country ISO identifier (uppercase).
+   * @return countryCode
+  **/
+  @ApiModelProperty(value = "CountryCode is the two-character country ISO identifier (uppercase).")
+  public String getCountryCode() {
+    return countryCode;
+  }
+
+  public void setCountryCode(String countryCode) {
+    this.countryCode = countryCode;
+  }
+
+  public ModelsLocation displayName(String displayName) {
+    this.displayName = displayName;
+    return this;
+  }
+
+   /**
+   * DisplayName is the user-facing string for a given location.
+   * @return displayName
+  **/
+  @ApiModelProperty(value = "DisplayName is the user-facing string for a given location.")
+  public String getDisplayName() {
+    return displayName;
+  }
+
+  public void setDisplayName(String displayName) {
+    this.displayName = displayName;
+  }
+
+  public ModelsLocation hasBridges(Boolean hasBridges) {
+    this.hasBridges = hasBridges;
+    return this;
+  }
+
+   /**
+   * Any location that has at least one bridge configured will set this to true.
+   * @return hasBridges
+  **/
+  @ApiModelProperty(value = "Any location that has at least one bridge configured will set this to true.")
+  public Boolean isHasBridges() {
+    return hasBridges;
+  }
+
+  public void setHasBridges(Boolean hasBridges) {
+    this.hasBridges = hasBridges;
+  }
+
+  public ModelsLocation healthy(Boolean healthy) {
+    this.healthy = healthy;
+    return this;
+  }
+
+   /**
+   * TODO Not used right now, but intended to signal when a location has all of their nodes overwhelmed.
+   * @return healthy
+  **/
+  @ApiModelProperty(value = "TODO Not used right now, but intended to signal when a location has all of their nodes overwhelmed.")
+  public Boolean isHealthy() {
+    return healthy;
+  }
+
+  public void setHealthy(Boolean healthy) {
+    this.healthy = healthy;
+  }
+
+  public ModelsLocation hemisphere(String hemisphere) {
+    this.hemisphere = hemisphere;
+    return this;
+  }
+
+   /**
+   * Hemisphere is a legacy label for a gateway. The rationale was once intended to be to allocate gateways for an hemisphere with certain regional \&quot;fairness\&quot;, even if they&#39;re geographically located in a different region. We might want to set this on the Gateway or Bridge, not in the Location itself...
+   * @return hemisphere
+  **/
+  @ApiModelProperty(value = "Hemisphere is a legacy label for a gateway. The rationale was once intended to be to allocate gateways for an hemisphere with certain regional \"fairness\", even if they're geographically located in a different region. We might want to set this on the Gateway or Bridge, not in the Location itself...")
+  public String getHemisphere() {
+    return hemisphere;
+  }
+
+  public void setHemisphere(String hemisphere) {
+    this.hemisphere = hemisphere;
+  }
+
+  public ModelsLocation label(String label) {
+    this.label = label;
+    return this;
+  }
+
+   /**
+   * Label is the short representation of a location, used internally.
+   * @return label
+  **/
+  @ApiModelProperty(value = "Label is the short representation of a location, used internally.")
+  public String getLabel() {
+    return label;
+  }
+
+  public void setLabel(String label) {
+    this.label = label;
+  }
+
+  public ModelsLocation lat(String lat) {
+    this.lat = lat;
+    return this;
+  }
+
+   /**
+   * Lat is the latitude for the location.
+   * @return lat
+  **/
+  @ApiModelProperty(value = "Lat is the latitude for the location.")
+  public String getLat() {
+    return lat;
+  }
+
+  public void setLat(String lat) {
+    this.lat = lat;
+  }
+
+  public ModelsLocation lon(String lon) {
+    this.lon = lon;
+    return this;
+  }
+
+   /**
+   * Lon is the longitude for the location.
+   * @return lon
+  **/
+  @ApiModelProperty(value = "Lon is the longitude for the location.")
+  public String getLon() {
+    return lon;
+  }
+
+  public void setLon(String lon) {
+    this.lon = lon;
+  }
+
+  public ModelsLocation region(String region) {
+    this.region = region;
+    return this;
+  }
+
+   /**
+   * Region is the continental region this gateway is assigned to. Not used at the moment, intended to use a label from the 7-continent model.
+   * @return region
+  **/
+  @ApiModelProperty(value = "Region is the continental region this gateway is assigned to. Not used at the moment, intended to use a label from the 7-continent model.")
+  public String getRegion() {
+    return region;
+  }
+
+  public void setRegion(String region) {
+    this.region = region;
+  }
+
+  public ModelsLocation timezone(String timezone) {
+    this.timezone = timezone;
+    return this;
+  }
+
+   /**
+   * Timezone is the TZ for the location (-1, 0, +1, ...)
+   * @return timezone
+  **/
+  @ApiModelProperty(value = "Timezone is the TZ for the location (-1, 0, +1, ...)")
+  public String getTimezone() {
+    return timezone;
+  }
+
+  public void setTimezone(String timezone) {
+    this.timezone = timezone;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ModelsLocation modelsLocation = (ModelsLocation) o;
+    return Objects.equals(this.countryCode, modelsLocation.countryCode) &&
+        Objects.equals(this.displayName, modelsLocation.displayName) &&
+        Objects.equals(this.hasBridges, modelsLocation.hasBridges) &&
+        Objects.equals(this.healthy, modelsLocation.healthy) &&
+        Objects.equals(this.hemisphere, modelsLocation.hemisphere) &&
+        Objects.equals(this.label, modelsLocation.label) &&
+        Objects.equals(this.lat, modelsLocation.lat) &&
+        Objects.equals(this.lon, modelsLocation.lon) &&
+        Objects.equals(this.region, modelsLocation.region) &&
+        Objects.equals(this.timezone, modelsLocation.timezone);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(countryCode, displayName, hasBridges, healthy, hemisphere, label, lat, lon, region, timezone);
+  }
+
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ModelsLocation {\n");
+    
+    sb.append("    countryCode: ").append(toIndentedString(countryCode)).append("\n");
+    sb.append("    displayName: ").append(toIndentedString(displayName)).append("\n");
+    sb.append("    hasBridges: ").append(toIndentedString(hasBridges)).append("\n");
+    sb.append("    healthy: ").append(toIndentedString(healthy)).append("\n");
+    sb.append("    hemisphere: ").append(toIndentedString(hemisphere)).append("\n");
+    sb.append("    label: ").append(toIndentedString(label)).append("\n");
+    sb.append("    lat: ").append(toIndentedString(lat)).append("\n");
+    sb.append("    lon: ").append(toIndentedString(lon)).append("\n");
+    sb.append("    region: ").append(toIndentedString(region)).append("\n");
+    sb.append("    timezone: ").append(toIndentedString(timezone)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+}
+
diff --git a/app/src/main/java/io/swagger/client/model/ModelsProviderService.java b/app/src/main/java/io/swagger/client/model/ModelsProviderService.java
index 7edf78c3a6788ca8cd2540045f1018907781ed93..ef13b60d70d42c8abab071b68f951dd243eac8b9 100644
--- a/app/src/main/java/io/swagger/client/model/ModelsProviderService.java
+++ b/app/src/main/java/io/swagger/client/model/ModelsProviderService.java
@@ -15,7 +15,14 @@ package io.swagger.client.model;
 
 import java.util.Objects;
 import java.util.Arrays;
+import com.google.gson.TypeAdapter;
+import com.google.gson.annotations.JsonAdapter;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.IOException;
 
 /**
  * Operational properties which describe how the provider offers the service
@@ -23,6 +30,48 @@ import io.swagger.annotations.ApiModel;
 @ApiModel(description = "Operational properties which describe how the provider offers the service")
 
 public class ModelsProviderService {
+  @SerializedName("allow_anonymous")
+  private Boolean allowAnonymous = null;
+
+  @SerializedName("allow_registration")
+  private Boolean allowRegistration = null;
+
+  public ModelsProviderService allowAnonymous(Boolean allowAnonymous) {
+    this.allowAnonymous = allowAnonymous;
+    return this;
+  }
+
+   /**
+   * Flag indicating if anonymous usage without registration is allowed deprecated: kept for backwards compatibility
+   * @return allowAnonymous
+  **/
+  @ApiModelProperty(value = "Flag indicating if anonymous usage without registration is allowed deprecated: kept for backwards compatibility")
+  public Boolean isAllowAnonymous() {
+    return allowAnonymous;
+  }
+
+  public void setAllowAnonymous(Boolean allowAnonymous) {
+    this.allowAnonymous = allowAnonymous;
+  }
+
+  public ModelsProviderService allowRegistration(Boolean allowRegistration) {
+    this.allowRegistration = allowRegistration;
+    return this;
+  }
+
+   /**
+   * Flag indicating if the provider supports user registration deprecated: kept for backwards compatibility
+   * @return allowRegistration
+  **/
+  @ApiModelProperty(value = "Flag indicating if the provider supports user registration deprecated: kept for backwards compatibility")
+  public Boolean isAllowRegistration() {
+    return allowRegistration;
+  }
+
+  public void setAllowRegistration(Boolean allowRegistration) {
+    this.allowRegistration = allowRegistration;
+  }
+
 
   @Override
   public boolean equals(java.lang.Object o) {
@@ -32,12 +81,14 @@ public class ModelsProviderService {
     if (o == null || getClass() != o.getClass()) {
       return false;
     }
-    return true;
+    ModelsProviderService modelsProviderService = (ModelsProviderService) o;
+    return Objects.equals(this.allowAnonymous, modelsProviderService.allowAnonymous) &&
+        Objects.equals(this.allowRegistration, modelsProviderService.allowRegistration);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash();
+    return Objects.hash(allowAnonymous, allowRegistration);
   }
 
 
@@ -46,6 +97,8 @@ public class ModelsProviderService {
     StringBuilder sb = new StringBuilder();
     sb.append("class ModelsProviderService {\n");
     
+    sb.append("    allowAnonymous: ").append(toIndentedString(allowAnonymous)).append("\n");
+    sb.append("    allowRegistration: ").append(toIndentedString(allowRegistration)).append("\n");
     sb.append("}");
     return sb.toString();
   }