diff --git a/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl b/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl
index 5281c5e7f7e8ef6c27a7292efacb829bad0990d4..bd77ecfcf998cba38a5c823f7d75b46e83a82727 100644
--- a/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl
+++ b/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl
@@ -23,6 +23,8 @@ interface ISipService {
     Map getAccountTemplate(in String accountType);
     void registerAllAccounts();
     void setAccountDetails(in String accountId, in Map accountDetails);
+    void setAccountActive(in String accountId, in boolean active);
+    void setAccountsActive(in boolean active);
     List getCredentials(in String accountID);
     void setCredentials(in String accountID, in List creds);
     void setAudioPlugin(in String callID);
diff --git a/ring-android/app/src/main/java/cx/ring/service/LocalService.java b/ring-android/app/src/main/java/cx/ring/service/LocalService.java
index fcce36791b48b4bbffc85819d736ec41a4839454..34e5a91b27870a5e3ac575259ae450fb28efa46c 100644
--- a/ring-android/app/src/main/java/cx/ring/service/LocalService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/LocalService.java
@@ -78,7 +78,8 @@ import cx.ring.model.TextMessage;
 import cx.ring.model.account.Account;
 
 
-public class LocalService extends Service {
+public class LocalService extends Service
+{
     static final String TAG = LocalService.class.getSimpleName();
     static public final String ACTION_CONF_UPDATE = BuildConfig.APPLICATION_ID + ".action.CONF_UPDATE";
     static public final String ACTION_ACCOUNT_UPDATE = BuildConfig.APPLICATION_ID + ".action.ACCOUNT_UPDATE";
@@ -109,6 +110,9 @@ public class LocalService extends Service {
     private LruCache<Long, Bitmap> mMemoryCache = null;
     private final ExecutorService mPool = Executors.newCachedThreadPool();
 
+    private boolean isWifiConn = false;
+    private boolean isMobileConn = false;
+
     public ContactsLoader.Result getSortedContacts() {
         Log.w(TAG, "getSortedContacts " + lastContactLoaderResult.contacts.size() + " contacts, " + lastContactLoaderResult.starred.size() + " starred.");
         return lastContactLoaderResult;
@@ -126,6 +130,13 @@ public class LocalService extends Service {
         return systemContactCache;
     }
 
+    public boolean isConnected() {
+        return isWifiConn || isMobileConn;
+    }
+    public boolean isWifiConnected() {
+        return isWifiConn;
+    }
+
     public interface Callbacks {
         ISipService getRemoteService();
         LocalService getService();
@@ -159,7 +170,13 @@ public class LocalService extends Service {
         historyManager = new HistoryManager(this);
         Intent intent = new Intent(this, SipService.class);
         startService(intent);
-        bindService(intent, mConnection, BIND_AUTO_CREATE | BIND_IMPORTANT | BIND_ABOVE_CLIENT );
+        bindService(intent, mConnection, BIND_AUTO_CREATE | BIND_IMPORTANT | BIND_ABOVE_CLIENT);
+
+        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+        isWifiConn = ni != null && ni.isConnected();
+        ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
+        isMobileConn = ni != null && ni.isConnected();
     }
 
     @Override
@@ -184,11 +201,11 @@ public class LocalService extends Service {
     private final Loader.OnLoadCompleteListener<ArrayList<Account>> onAccountsLoaded = new Loader.OnLoadCompleteListener<ArrayList<Account>>() {
         @Override
         public void onLoadComplete(Loader<ArrayList<Account>> loader, ArrayList<Account> data) {
-            Log.w(TAG, "AccountsLoader Loader.OnLoadCompleteListener");
+            Log.w(TAG, "AccountsLoader Loader.OnLoadCompleteListener " + data.size());
             all_accounts = data;
             accounts = all_accounts.subList(0,data.size()-1);
             ip2ip_account = all_accounts.subList(data.size()-1,data.size());
-            sendBroadcast(new Intent(ACTION_ACCOUNT_UPDATE));
+            updateConnectivityState();
         }
     };
     private final Loader.OnLoadCompleteListener<ContactsLoader.Result> onSystemContactsLoaded = new Loader.OnLoadCompleteListener<ContactsLoader.Result>() {
@@ -201,7 +218,7 @@ public class LocalService extends Service {
             for (CallContact c : data.contacts)
                 systemContactCache.put(c.getId(), c);
 
-            sendBroadcast(new Intent(ACTION_ACCOUNT_UPDATE));
+            sendBroadcast(new Intent(ACTION_CONF_UPDATE));
         }
     };
 
@@ -830,15 +847,35 @@ public class LocalService extends Service {
         }
     }
 
+    private void updateConnectivityState() {
+        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+
+        NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+        Log.w(TAG, "ActiveNetworkInfo (Wifi): " + (ni == null ? "null" : ni.toString()));
+        isWifiConn = ni != null && ni.isConnected();
+
+        ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
+        Log.w(TAG, "ActiveNetworkInfo (mobile): " + (ni == null ? "null" : ni.toString()));
+        isMobileConn = ni != null && ni.isConnected();
+
+        try {
+            getRemoteService().setAccountsActive(isWifiConn);
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+
+        // if account list loaded
+        if (!ip2ip_account.isEmpty())
+            sendBroadcast(new Intent(ACTION_ACCOUNT_UPDATE));
+    }
+
     private final BroadcastReceiver receiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             switch(intent.getAction()) {
                 case ConnectivityManager.CONNECTIVITY_ACTION:
                     Log.w(TAG, "ConnectivityManager.CONNECTIVITY_ACTION " + " " + intent.getStringExtra(ConnectivityManager.EXTRA_EXTRA_INFO) + " " + intent.getStringExtra(ConnectivityManager.EXTRA_EXTRA_INFO));
-                    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
-                    NetworkInfo ni = cm.getActiveNetworkInfo();
-                    Log.w(TAG, "ActiveNetworkInfo: " + (ni == null ? "null" : ni.toString()));
+                    updateConnectivityState();
                     break;
                 case ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED:
                     Log.w(TAG, "Received " + intent.getAction() + " " + intent.getStringExtra("Account") + " " + intent.getStringExtra("State") + " " + intent.getIntExtra("code", 0));
diff --git a/ring-android/app/src/main/java/cx/ring/service/SipService.java b/ring-android/app/src/main/java/cx/ring/service/SipService.java
index 1e3ea96f5b696c36fc769081b5d6d3f905f38b4d..81ed8862cd0af6b44a41401098999df78f425082 100644
--- a/ring-android/app/src/main/java/cx/ring/service/SipService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/SipService.java
@@ -660,6 +660,30 @@ public class SipService extends Service {
             });
         }
 
+        @Override
+        public void setAccountActive(final String accountId, final boolean active) {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.setAccountActive() thread running... " + accountId + " -> " + active);
+                    Ringservice.setAccountActive(accountId, active);
+                }
+            });
+        }
+
+        @Override
+        public void setAccountsActive(final boolean active) {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.setAccountsActive() thread running... " + active);
+                    StringVect list = Ringservice.getAccountList();
+                    for (int i=0, n=list.size(); i<n; i++)
+                        Ringservice.setAccountActive(list.get(i), active);
+                }
+            });
+        }
+
         @Override
         public Map<String, String> getVolatileAccountDetails(final String accountId) {
             return getExecutor().executeAndReturn(new SipRunnableWithReturn<Map<String, String>>() {
diff --git a/ring-android/app/src/main/jni/configurationmanager.i b/ring-android/app/src/main/jni/configurationmanager.i
index 2450194c3c99952947f22d84ead1f51300399ee5..9cfc514d2f21194283b904eefda776e2a2dc55f4 100644
--- a/ring-android/app/src/main/jni/configurationmanager.i
+++ b/ring-android/app/src/main/jni/configurationmanager.i
@@ -61,6 +61,7 @@ namespace DRing {
 std::map<std::string, std::string> getAccountDetails(const std::string& accountID);
 std::map<std::string, std::string> getVolatileAccountDetails(const std::string& accountID);
 void setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details);
+void setAccountActive(const std::string& accountID, bool active);
 std::map<std::string, std::string> getAccountTemplate(const std::string& accountType);
 std::string addAccount(const std::map<std::string, std::string>& details);
 void removeAccount(const std::string& accountID);