diff --git a/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java b/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
index 4cfa8a7..52c6430 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
@@ -75,8 +75,6 @@
     static final int ACCOUNT_EDIT_REQUEST = 2;
     private ISipService service;
 
-    // HashMap<String,HashMap<String,String>> mAccountList = new HashMap<String,HashMap<String,String>>();
-    HashMap<String, AccountPreferenceScreen> mAccountList = new HashMap<String, AccountPreferenceScreen>();
     ArrayList<AccountDetail.PreferenceEntry> basicDetailKeys;
     ArrayList<AccountDetail.PreferenceEntry> advancedDetailKeys;
     ArrayList<AccountDetail.PreferenceEntry> srtpDetailKeys;
@@ -112,20 +110,6 @@
     {
         super.onStop();
         Log.i(TAG, "onStop");
-
-        ArrayList<String> accountList = getAccountList();
-
-        try {
-            for(String s : accountList) {
-                Log.i(TAG, "         set details for " + s);
-                AccountPreferenceScreen accountPref = mAccountList.get(s);
-                if(accountPref != null) {
-                    service.setAccountDetails(s, accountPref.preferenceMap);
-                }
-            }
-        } catch (RemoteException e) {
-           Log.e(TAG, "Cannot call service method", e); 
-        }
     }
 
     @Override
@@ -147,6 +131,23 @@
                     Bundle bundle = data.getExtras();
                     String accountID = bundle.getString("AccountID");
                     Log.i(TAG, "Update account settings for " + accountID);
+
+                    AccountDetailBasic basicDetails = 
+                        new AccountDetailBasic(bundle.getStringArrayList(AccountDetailBasic.BUNDLE_TAG));
+                    AccountDetailAdvanced advancedDetails = 
+                        new AccountDetailAdvanced(bundle.getStringArrayList(AccountDetailAdvanced.BUNDLE_TAG));
+                    AccountDetailSrtp srtpDetails = 
+                        new AccountDetailSrtp(bundle.getStringArrayList(AccountDetailSrtp.BUNDLE_TAG));
+                    AccountDetailTls tlsDetails = 
+                        new AccountDetailTls(bundle.getStringArrayList(AccountDetailTls.BUNDLE_TAG));
+
+                    HashMap<String, String> map = new HashMap<String, String>();
+                    map.putAll(basicDetails.getDetailsHashMap()); 
+                    map.putAll(advancedDetails.getDetailsHashMap());
+                    map.putAll(srtpDetails.getDetailsHashMap());
+                    map.putAll(tlsDetails.getDetailsHashMap());
+
+                    setAccountDetails(accountID, map);
                 }
                 break;
             default:
@@ -159,6 +160,7 @@
         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();
             currentList.remove(DEFAULT_ACCOUNT_ID);
@@ -179,27 +181,7 @@
                     }
                 }
             } 
-        }
-    };
-
-
-    Preference.OnPreferenceChangeListener changeBasicTextEditListener = new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary(getString(R.string.account_current_value_label) + (CharSequence)newValue);
-            AccountPreferenceScreen accountPreference = mAccountList.get(preference.getKey());
-            String preferenceKey = basicDetailKeys.get(preference.getOrder()).mKey; 
-            accountPreference.preferenceMap.put(preferenceKey, ((CharSequence)newValue).toString());
-            if(preferenceKey == AccountDetailBasic.CONFIG_ACCOUNT_ALIAS)
-                accountPreference.mScreen.setTitle(((CharSequence)newValue.toString()));
-            return true;
-        }
-    };
-
-    Preference.OnPreferenceChangeListener changeAdvancedTextEditListener = new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary(getString(R.string.account_current_value_label) + (CharSequence)newValue);
-            mAccountList.get(preference.getKey()).preferenceMap.put(advancedDetailKeys.get(preference.getOrder()).mKey, ((CharSequence)newValue).toString());
-            return true;
+            */
         }
     };
 
@@ -239,6 +221,24 @@
     {
         Log.i(TAG, "Launch account edit activity");
         Intent intent = preference.getIntent();
+
+        Bundle bundle = intent.getExtras();
+        String accountID = bundle.getString("AccountID");
+
+        HashMap<String, String> preferenceMap = getAccountDetails(accountID);
+
+        AccountDetailBasic basicDetails = new AccountDetailBasic(preferenceMap);
+        AccountDetailAdvanced advancedDetails = new AccountDetailAdvanced(preferenceMap);
+        AccountDetailSrtp srtpDetails = new AccountDetailSrtp(preferenceMap);
+        AccountDetailTls tlsDetails = new AccountDetailTls(preferenceMap);
+
+        bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, basicDetails.getValuesOnly());
+        bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, advancedDetails.getValuesOnly());
+        bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, srtpDetails.getValuesOnly());
+        bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, tlsDetails.getValuesOnly());
+
+        intent.putExtras(bundle);
+
         startActivityForResult(intent, ACCOUNT_EDIT_REQUEST);
     }
 
@@ -291,9 +291,6 @@
     {
         Activity currentContext = getActivity();
 
-        ArrayList<String> accountList = getAccountList();
-        // Log.i(TAG, "GetAccountList: " + mAccountList);
-
         mRoot = getPreferenceManager().createPreferenceScreen(currentContext);
 
         // Default account category
@@ -314,6 +311,7 @@
         createNewAccount.setIntent(new Intent().setClass(getActivity(), AccountCreationActivity.class));
         mRoot.addPreference(createNewAccount);
 
+        ArrayList<String> accountList = getAccountList();
         for(String s : accountList) {
             // mRoot.addPreference(getAccountPreferenceScreen(s));
             mRoot.addPreference(createAccountPreferenceScreen(s));
@@ -324,19 +322,8 @@
 
     Preference createAccountPreferenceScreen(String accountID) {
 
-        HashMap<String, String> preferenceMap = getAccountDetails(accountID);
-
-        AccountDetailBasic basicDetails = new AccountDetailBasic(preferenceMap);
-        AccountDetailAdvanced advancedDetails = new AccountDetailAdvanced(preferenceMap);
-        AccountDetailSrtp srtpDetails = new AccountDetailSrtp(preferenceMap);
-        AccountDetailTls tlsDetails = new AccountDetailTls(preferenceMap);
-
         Bundle bundle = new Bundle();
         bundle.putString("AccountID", accountID);
-        bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, basicDetails.getValuesOnly());
-        bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, advancedDetails.getValuesOnly());
-        bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, srtpDetails.getValuesOnly());
-        bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, tlsDetails.getValuesOnly());
 
         Intent intent = new Intent().setClass(getActivity(), AccountPreferenceActivity.class); 
         intent.putExtras(bundle);
@@ -348,62 +335,4 @@
         
         return editAccount;
     }
-
-    /*
-    AccountPreferenceScreen createAccountPreferenceScreen(String accountID) {
-        AccountPreferenceScreen preference = new AccountPreferenceScreen(getPreferenceManager(), getActivity(), accountID);
-        mAccountList.put(accountID, preference);
-
-        return preference;
-    }
-    */
-
-    private class AccountPreferenceScreen
-    {
-        public PreferenceScreen mScreen;
-        public HashMap<String, String> preferenceMap;
-
-        public AccountPreferenceScreen(PreferenceManager prefManager, Context context, String accountID)
-        {
-            mScreen = prefManager.createPreferenceScreen(context);
-            preferenceMap = getAccountDetails(accountID);
-
-            mScreen.setTitle(preferenceMap.get(ServiceConstants.CONFIG_ACCOUNT_ALIAS));
-
-            if(accountID != DEFAULT_ACCOUNT_ID) {
-                Preference deleteThisAccount = new Preference(context);
-                deleteThisAccount.setTitle("Delete Account");
-                deleteThisAccount.setKey(accountID);
-                deleteThisAccount.setOnPreferenceClickListener(removeSelectedAccountOnClick);
-                deleteThisAccount.setIntent(new Intent().setClass(getActivity(), AccountCreationActivity.class));
-                mScreen.addPreference(deleteThisAccount);
-            }
-
-            createPreferenceSection(mScreen, context, R.string.account_preferences_basic, basicDetailKeys, accountID, preferenceMap);
-            createPreferenceSection(mScreen, context, R.string.account_preferences_advanced, advancedDetailKeys, accountID, preferenceMap);
-            createPreferenceSection(mScreen, context, R.string.account_preferences_srtp, srtpDetailKeys, accountID, preferenceMap);
-            createPreferenceSection(mScreen, context, R.string.account_preferences_tls, tlsDetailKeys, accountID, preferenceMap);
-        }
-
-        public void createPreferenceSection(PreferenceScreen root, Context context, int titleId, ArrayList<AccountDetail.PreferenceEntry> detailEntries, 
-                                                                                                                      String accountID, HashMap<String, String> map)
-        {
-            // Inline preference
-            PreferenceCategory accountPrefCat = new PreferenceCategory(context);
-            accountPrefCat.setTitle(titleId);
-            root.addPreference(accountPrefCat);
-
-            for(AccountDetail.PreferenceEntry entry : detailEntries)
-            {
-                EditTextPreference accountPref = new EditTextPreference(context);
-                accountPref.setDialogTitle(entry.mLabelId);
-                accountPref.setPersistent(false);
-                accountPref.setTitle(entry.mLabelId);
-                accountPref.setSummary(getString(R.string.account_current_value_label) + map.get(entry.mKey));
-                accountPref.setOnPreferenceChangeListener(changeBasicTextEditListener);
-                accountPref.setKey(accountID);
-                accountPrefCat.addPreference(accountPref);
-            }
-        }
-    }
 }
