diff --git a/.gitignore b/.gitignore
index 56a08a4..8647aa6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,5 +11,9 @@
 SFLPhoneservice*
 CallManagerJNI.java
 Callback.java
+ConfigurationCallback.java
 ManagerImpl.java
+SWIGTYPE*
+StringMap.java
+StringVect.java
 
diff --git a/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java b/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
index 2975aae..2f71c51 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
@@ -32,8 +32,10 @@
 package com.savoirfairelinux.sflphone.client;
 
 import android.app.Activity;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
@@ -42,10 +44,13 @@
 import android.preference.ListPreference;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 import android.view.View;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
+
+import java.util.Set;
 import java.util.HashMap;
 import java.util.ArrayList;
 
@@ -76,6 +81,7 @@
     AccountDetailAdvanced advancedDetails;
     AccountDetailSrtp srtpDetails;
     AccountDetailTls tlsDetails;
+    PreferenceScreen mRoot;
 
     Activity context = getActivity();
 
@@ -102,6 +108,8 @@
         Log.i(TAG, "Create Account Management Fragment");
 
         setPreferenceScreen(getAccountListPreferenceScreen());
+
+        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver, new IntentFilter("accounts-changed"));
     }
 
     @Override
@@ -128,10 +136,9 @@
     @Override
     public void onDestroy()
     {
+        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mMessageReceiver);
         super.onDestroy();
         Log.i(TAG, "onDestroy");
-
-        
     }
 
     @Override
@@ -140,6 +147,22 @@
         }
     }
 
+    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String message = intent.getStringExtra("message");
+            Log.d("receiver", "Got message: " + message);
+            ArrayList<String> newList = (ArrayList<String>) getAccountList();
+            Set<String> currentList = (Set<String>) mAccountList.keySet();
+            for(String s : newList) {
+                if(!currentList.contains(s)) {
+                    Log.i("receiver", "ADDING ACCOUNT!!!!!! " + s);
+                    mRoot.addPreference(getAccountPreferenceScreen(s));
+                }
+            }
+        }
+    };
+
 
     Preference.OnPreferenceChangeListener changeBasicTextEditListener = new Preference.OnPreferenceChangeListener() {
         public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -216,30 +239,30 @@
         ArrayList<String> accountList = getAccountList();
         // Log.i(TAG, "GetAccountList: " + mAccountList);
 
-        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(currentContext);
+        mRoot = getPreferenceManager().createPreferenceScreen(currentContext);
 
         // Default account category
         PreferenceCategory defaultAccountCat = new PreferenceCategory(currentContext);
         defaultAccountCat.setTitle(R.string.default_account_category);
-        root.addPreference(defaultAccountCat);
+        mRoot.addPreference(defaultAccountCat);
 
-        root.addPreference(getAccountPreferenceScreen(DEFAULT_ACCOUNT_ID));
+        mRoot.addPreference(getAccountPreferenceScreen(DEFAULT_ACCOUNT_ID));
 
         // Account list category
         PreferenceCategory accountListCat = new PreferenceCategory(currentContext);
         accountListCat.setTitle(R.string.default_account_category);
-        root.addPreference(accountListCat);
+        mRoot.addPreference(accountListCat);
 
         Preference createNewAccount = new Preference(currentContext);
         createNewAccount.setTitle("Touch to Create New Account");
         createNewAccount.setOnPreferenceClickListener(launchAccountCreationOnClick);
         createNewAccount.setIntent(new Intent().setClass(getActivity(), AccountCreationActivity.class));
-        root.addPreference(createNewAccount);
+        mRoot.addPreference(createNewAccount);
 
         for(String s : accountList)
-            root.addPreference(getAccountPreferenceScreen(s));
+            mRoot.addPreference(getAccountPreferenceScreen(s));
          
-        return root;
+        return mRoot;
     }
 
     public PreferenceCategory createPreferenceSection(PreferenceScreen root, Context context, int titleId, ArrayList<AccountDetail.PreferenceEntry> detailEntries, 
diff --git a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
index b2c7e84..787447b 100644
--- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
+++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
@@ -22,13 +22,29 @@
  */
 package com.savoirfairelinux.sflphone.service;
 
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 
 public class ConfigurationManagerCallback extends ConfigurationCallback {
-    private static final String TAG = "ConfigurationManagerCallback"; 
+    private static final String TAG = "ConfigurationManagerCallback";
+    Context mContext; 
+
+    ConfigurationManagerCallback(Context context) {
+        mContext = context;
+    }
 
     @Override
     public void on_account_state_changed() {
         Log.i(TAG, "on_account_state_changed ninja!!!!!!!!!!!!!!");
+        sendAccountsChangedMessage();
+    }
+
+    private void sendAccountsChangedMessage() {
+        Log.d("sender", "Boradcasting message");
+        Intent intent = new Intent("accounts-changed");
+        intent.putExtra("message", "Accounts Changed");
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
 }
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index ddf1614..14c39bf 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -60,6 +60,7 @@
     private ConfigurationManagerCallback configurationManagerCallback;
     private ManagerImpl managerImpl;
     private boolean isPjSipStackStarted = false;
+    
 
     /* Implement public interface for the service */
     private final ISipService.Stub mBinder = new ISipService.Stub() {
@@ -372,7 +373,7 @@
         SFLPhoneservice.setCallbackObject(callManagerCallBack);
 
         configurationManagerJNI = new ConfigurationManagerJNI();
-        configurationManagerCallback = new ConfigurationManagerCallback();
+        configurationManagerCallback = new ConfigurationManagerCallback(this);
         SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
 
         managerImpl.init("");
