diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/BitmaskCoreProvider.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/BitmaskCoreProvider.java
index a9797142855d00c6257691be87ee33bf981ed31c..9cd2a7470e1d38d4b8eb26ef1213e771793ceb32 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/BitmaskCoreProvider.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/BitmaskCoreProvider.java
@@ -1,2 +1,22 @@
-package se.leap.bitmaskclient.base.utils;public class BitmaskCoreProvider {
+package se.leap.bitmaskclient.base.utils;
+
+import de.blinkt.openvpn.core.NativeUtils;
+import mobile.BitmaskMobile;
+import mobilemodels.BitmaskMobileCore;
+
+public class BitmaskCoreProvider {
+    private static BitmaskMobileCore customMobileCore;
+    public static BitmaskMobileCore getBitmaskMobile() {
+        if (customMobileCore == null) {
+            return new BitmaskMobile(new PreferenceHelper.SharedPreferenceStore());
+        }
+        return customMobileCore;
+    }
+
+    public static void initBitmaskMobile(BitmaskMobileCore bitmaskMobileCore) {
+        if (!NativeUtils.isUnitTest()) {
+            throw new IllegalStateException("Initializing custom BitmaskMobileCore implementation outside of an unit test is not allowed");
+        }
+        BitmaskCoreProvider.customMobileCore = bitmaskMobileCore;
+    }
 }
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
index 5cc3ff709f7eab96ff2c631479bcfb756e94d569..25a9a3fbbea4df61355bb67c24e903f101e0c9ef 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
@@ -52,6 +52,7 @@ import static se.leap.bitmaskclient.base.models.Constants.USE_PORT_HOPPING;
 import static se.leap.bitmaskclient.base.models.Constants.USE_SNOWFLAKE;
 import static se.leap.bitmaskclient.base.models.Constants.USE_SYSTEM_PROXY;
 import static se.leap.bitmaskclient.base.models.Constants.USE_TUNNEL;
+import static se.leap.bitmaskclient.base.utils.BitmaskCoreProvider.getBitmaskMobile;
 
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -82,6 +83,7 @@ import de.blinkt.openvpn.VpnProfile;
 import de.blinkt.openvpn.core.NativeUtils;
 import io.swagger.client.JSON;
 import mobile.BitmaskMobile;
+import mobilemodels.BitmaskMobileCore;
 import se.leap.bitmaskclient.BuildConfig;
 import se.leap.bitmaskclient.base.models.Introducer;
 import se.leap.bitmaskclient.base.models.Provider;
@@ -169,8 +171,7 @@ public class PreferenceHelper {
                 provider.setService(preferences.getString(PROVIDER_MODELS_EIPSERVICE, null));
                 provider.setBridges(preferences.getString(PROVIDER_MODELS_BRIDGES, null));
                 provider.setGateways(preferences.getString(PROVIDER_MODELS_GATEWAYS, null));
-                BitmaskMobile bm = new BitmaskMobile(new SharedPreferenceStore());
-                provider.setIntroducer(bm.getIntroducerURLByDomain(provider.getDomain()));
+                provider.setIntroducer(getBitmaskMobile().getIntroducerURLByDomain(provider.getDomain()));
 
             } catch (Exception e) {
                 e.printStackTrace();
@@ -218,13 +219,12 @@ public class PreferenceHelper {
         Set<String> providerDomains = getCustomProviderDomains();
         HashMap<String, Provider> customProviders = new HashMap<>();
         if (providerDomains.size() > 0) {
-            BitmaskMobile bm = new BitmaskMobile(new PreferenceHelper.SharedPreferenceStore());
             for (String domain : providerDomains) {
                 String mainURL = preferences.getString(Provider.MAIN_URL + "." + domain, null);
                 if (mainURL != null) {
                     Introducer introducer = null;
                     try {
-                       introducer = Introducer.fromUrl(bm.getIntroducerURLByDomain(domain));
+                       introducer = Introducer.fromUrl(BitmaskCoreProvider.getBitmaskMobile().getIntroducerURLByDomain(domain));
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
diff --git a/bitmask-core-android b/bitmask-core-android
index 1a726fb69daab25b0572266d803817de231a6d9e..bdec5e522433a9b0719b000891a7c625e734e9d3 160000
--- a/bitmask-core-android
+++ b/bitmask-core-android
@@ -1 +1 @@
-Subproject commit 1a726fb69daab25b0572266d803817de231a6d9e
+Subproject commit bdec5e522433a9b0719b000891a7c625e734e9d3