diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
index 2e2497d515347ad0431388984d611aa94af02ead..2680f612f96ea57dd84f6671c454326321a2d994 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
@@ -9,9 +9,11 @@ import static se.leap.bitmaskclient.base.models.Constants.BROADCAST_RESULT_KEY;
 import static se.leap.bitmaskclient.base.models.Constants.COUNTRYCODE;
 import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_KEY;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_DOWNLOADED_EIP_SERVICE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.DOWNLOAD_SERVICE_JSON;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.ERRORS;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.INCORRECTLY_DOWNLOADED_EIP_SERVICE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_NOK;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_OK;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.QUIETLY_UPDATE_VPN_CERTIFICATE;
@@ -19,8 +21,8 @@ import static se.leap.bitmaskclient.providersetup.ProviderAPI.SET_UP_PROVIDER;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupFailedDialog.DOWNLOAD_ERRORS.ERROR_INVALID_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_BRIDGES;
-import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_SERVICE_JSON;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_GATEWAYS;
+import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_SERVICE_JSON;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.tor.TorStatusObservable.TorStatus.OFF;
 
@@ -84,7 +86,6 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
                 break;
 
             case QUIETLY_UPDATE_VPN_CERTIFICATE:
-            case UPDATE_INVALID_VPN_CERTIFICATE:
                 result = updateVpnCertificate(provider);
                 if (result.getBoolean(BROADCAST_RESULT_KEY)) {
                     Log.d(TAG, "successfully downloaded VPN certificate");
@@ -93,6 +94,14 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
                     ProviderObservable.getInstance().updateProvider(provider);
                 }
                 break;
+            case UPDATE_INVALID_VPN_CERTIFICATE:
+                result = updateVpnCertificate(provider);
+                if (result.getBoolean(BROADCAST_RESULT_KEY)) {
+                    eventSender.sendToReceiverOrBroadcast(receiver, CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE, result, provider);
+                } else {
+                    eventSender.sendToReceiverOrBroadcast(receiver, INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE, result, provider);
+                }
+                break;
         }
 
     }
@@ -103,6 +112,7 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
         BitmaskMobile bm;
         try {
             bm = new BitmaskMobile(provider.getMainUrl(), new PreferenceHelper.SharedPreferenceStore());
+            bm.setDebug(BuildConfig.DEBUG);
         } catch (IllegalStateException e) {
             return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
         }
@@ -120,12 +130,21 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
             return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
         }
 
+        try {
+            if (provider.hasIntroducer()) {
+                    bm.setIntroducer(provider.getIntroducer().toUrl());
+            }
+        } catch (Exception e) {
+            return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
+        }
+
         if (PreferenceHelper.getUseBridges()) {
             try {
                 String bridgesJson = bm.getAllBridges("", "", "", "");
                 provider.setBridges(bridgesJson);
             } catch (Exception e) {
                 // TODO: send failed to fetch bridges event
+                return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
             }
         } else {
             try {
@@ -137,7 +156,7 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
 
             }
         }
-
+        currentDownload.putBoolean(BROADCAST_RESULT_KEY, true);
         return currentDownload;
 
     }
@@ -191,7 +210,6 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
         }
 
         try {
-            // TODO: check if provider supports this API endpoint?
             String gatewaysJson = bm.getAllGateways("", "", "");
             Log.d(TAG, "gateways Json reponse: " + gatewaysJson);
             provider.setGateways(gatewaysJson);
@@ -203,7 +221,6 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
         }
 
         try {
-            // TODO: check if provider supports this API endpoint?
             String bridgesJson = bm.getAllBridges("", "", "", "");
             Log.d(TAG, "bridges Json reponse: " + bridgesJson);
             provider.setBridges(bridgesJson);
@@ -313,7 +330,25 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
     }
 
     protected Bundle updateVpnCertificate(Provider provider) {
-        return null;
+        Bundle currentDownload = new Bundle();
+        BitmaskMobile bm;
+        try {
+            bm = new BitmaskMobile(provider.getMainUrl(), new PreferenceHelper.SharedPreferenceStore());
+            bm.setDebug(BuildConfig.DEBUG);
+        } catch (IllegalStateException e) {
+            return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
+        }
+
+        try {
+            String cert = bm.getOpenVPNCert();
+            currentDownload = loadCredentials(provider, cert);
+            currentDownload = validateCertificateForProvider(currentDownload, provider);
+            ProviderSetupObservable.updateProgress(DOWNLOADED_VPN_CERTIFICATE);
+        } catch (Exception e) {
+            return eventSender.setErrorResult(currentDownload, R.string.error_json_exception_user_message, null);
+        }
+
+        return currentDownload;
     }
 
 }