diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
index 255d98e0f22b3150a3559953343a0bdc5359311a..81fcd7d5453f26c32836687ad3d2c839a975cbd9 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
@@ -16,9 +16,11 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 import java.io.IOException;
+import java.util.List;
 
 import de.blinkt.openvpn.VpnProfile;
 import de.blinkt.openvpn.core.ConfigParser;
+import se.leap.bitmaskclient.base.models.Location;
 import se.leap.bitmaskclient.base.models.Provider;
 import se.leap.bitmaskclient.base.models.ProviderObservable;
 import se.leap.bitmaskclient.testutils.MockHelper;
@@ -283,6 +285,112 @@ public class GatewaysManagerTest {
         assertEquals(null, gatewaysManager.select(3));
     }
 
+    @Test
+    public void testSelectN_selectNAndCity_returnsGatewaysInPresortedOrder() {
+        Provider provider = getProvider(null, null, null, null, null, null, "v4/riseup_eipservice_for_geoip_v4.json", "v4/riseup_geoip_v4.json");
+
+        MockHelper.mockProviderObserver(provider);
+        //use openvpn, not pluggable transports
+        mockStatic(PreferenceHelper.class);
+        when(PreferenceHelper.getUsePluggableTransports(any(Context.class))).thenReturn(false);
+        GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+
+        assertEquals("mouette.riseup.net", gatewaysManager.select(0, "Paris").getHost());
+        assertEquals("hoatzin.riseup.net", gatewaysManager.select(1, "Paris").getHost());
+        assertEquals("zarapito.riseup.net", gatewaysManager.select(2, "Paris").getHost());
+    }
+
+    @Test
+    public void testSelectN_selectNAndCityWithGeoIpServiceV1_returnsGatewaysInPresortedOrder() {
+        Provider provider = getProvider(null, null, null, null, null, null, "v4/riseup_eipservice_for_geoip_v4.json", "v4/riseup_geoip_v1.json");
+
+        MockHelper.mockProviderObserver(provider);
+        //use openvpn, not pluggable transports
+        mockStatic(PreferenceHelper.class);
+        when(PreferenceHelper.getUsePluggableTransports(any(Context.class))).thenReturn(false);
+        GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+
+        assertEquals("mouette.riseup.net", gatewaysManager.select(0, "Paris").getHost());
+        assertEquals("hoatzin.riseup.net", gatewaysManager.select(1, "Paris").getHost());
+        assertEquals("zarapito.riseup.net", gatewaysManager.select(2, "Paris").getHost());
+    }
+
+    @Test
+    public void testSelectN_selectNAndCityWithTimezoneCalculation_returnsRandomizedGatewaysOfSelectedCity() {
+        Provider provider = getProvider(null, null, null, null, null, null, "v4/riseup_eipservice_for_geoip_v4.json", null);
+
+        provider.setGeoIpJson(new JSONObject());
+        MockHelper.mockProviderObserver(provider);
+        //use openvpn, not pluggable transports
+        mockStatic(PreferenceHelper.class);
+        when(PreferenceHelper.getUsePluggableTransports(any(Context.class))).thenReturn(false);
+        GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+
+        assertEquals("Paris", gatewaysManager.select(0, "Paris").getName());
+        assertEquals("Paris", gatewaysManager.select(1, "Paris").getName());
+        assertEquals("Paris", gatewaysManager.select(2, "Paris").getName());
+        assertEquals(null, gatewaysManager.select(3, "Paris"));
+    }
+
+    @Test
+    public void testSelectN_selectFromCityWithTimezoneCalculationCityNotExisting_returnsNull() {
+        Provider provider = getProvider(null, null, null, null, null, null, "v4/riseup_eipservice_for_geoip_v4.json", "v4/riseup_geoip_v4.json");
+
+        provider.setGeoIpJson(new JSONObject());
+        MockHelper.mockProviderObserver(provider);
+        //use openvpn, not pluggable transports
+        mockStatic(PreferenceHelper.class);
+        when(PreferenceHelper.getUsePluggableTransports(any(Context.class))).thenReturn(false);
+        GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+        assertNull(gatewaysManager.select(0, "Stockholm"));
+    }
+
+    @Test
+    public void testGetLocations_openvpn() {
+        Provider provider = getProvider(null, null, null, null, null, null, "v4/riseup_eipservice_for_geoip_v4.json", "v4/riseup_geoip_v4.json");
+
+        MockHelper.mockProviderObserver(provider);
+        mockStatic(PreferenceHelper.class);
+        when(PreferenceHelper.getUsePluggableTransports(any(Context.class))).thenReturn(false);
+        GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+        List<Location> locations = gatewaysManager.getGatewayLocations();
+
+        assertEquals(3, locations.size());
+        for (Location location : locations) {
+            if ("Paris".equals(location.name)) {
+                assertEquals(3, location.numberOfGateways);
+                // manually calculate average load of paris gateways in "v4/riseup_geoip_v4.json"
+                double averageLoad = (0.3 + 0.36 + 0.92) / 3.0;
+                assertEquals(averageLoad, location.averageLoad);
+            }
+        }
+    }
+
+    @Test
+    public void testGetLocations_obfs4() {
+        Provider provider = getProvider(null, null, null, null, null, null, "v4/riseup_eipservice_for_geoip_v4.json", "v4/riseup_geoip_v4.json");
+
+        MockHelper.mockProviderObserver(provider);
+        mockStatic(PreferenceHelper.class);
+        when(PreferenceHelper.getUsePluggableTransports(any(Context.class))).thenReturn(true);
+        GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+        List<Location> locations = gatewaysManager.getGatewayLocations();
+
+        assertEquals(2, locations.size());
+        for (Location location : locations) {
+            if ("Montreal".equals(location.name)) {
+                assertEquals(1, location.numberOfGateways);
+                assertEquals(0.59, location.averageLoad);
+            }
+            if ("Paris".equals(location.name)) {
+                // checks that only gateways supporting obfs4 are taken into account
+                assertEquals(1, location.numberOfGateways);
+                assertEquals(0.36, location.averageLoad);
+            }
+        }
+
+    }
+
 
     private String getJsonStringFor(String filename) throws IOException {
         return TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream(filename));
diff --git a/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json b/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json
index b8fa8bbfd2e721d9c848d8e554f4d30ba261aba8..76fbea52558968cbde501cee17facbb57089f774 100644
--- a/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json
+++ b/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json
@@ -28,6 +28,19 @@
         "filter_dns": false,
         "limited": false,
         "transport":[
+          {
+            "type":"obfs4",
+            "protocols":[
+              "tcp"
+            ],
+            "ports":[
+              "23042"
+            ],
+            "options": {
+              "cert": "48F/JNm/LKYt7zkDmPHXcw5f3Jqgwg/3OBRrqW14Yj87ATZ4KyAZRV7np4RhCXGSJHgoCQ",
+              "iatMode": "0"
+            }
+          },
           {
             "type":"openvpn",
             "protocols":[