diff --git a/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java b/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
index 52c6430..a56f098 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountManagementFragment.java
@@ -75,10 +75,11 @@
     static final int ACCOUNT_EDIT_REQUEST = 2;
     private ISipService service;
 
-    ArrayList<AccountDetail.PreferenceEntry> basicDetailKeys;
-    ArrayList<AccountDetail.PreferenceEntry> advancedDetailKeys;
-    ArrayList<AccountDetail.PreferenceEntry> srtpDetailKeys;
-    ArrayList<AccountDetail.PreferenceEntry> tlsDetailKeys;
+    ArrayList<AccountDetail.PreferenceEntry> basicDetailKeys = null;
+    ArrayList<AccountDetail.PreferenceEntry> advancedDetailKeys = null;
+    ArrayList<AccountDetail.PreferenceEntry> srtpDetailKeys = null;
+    ArrayList<AccountDetail.PreferenceEntry> tlsDetailKeys = null;
+    HashMap<String, Preference> accountPreferenceHashMap = null;
     PreferenceScreen mRoot = null;
 
     Activity context = getActivity();
@@ -91,6 +92,8 @@
         advancedDetailKeys = AccountDetailAdvanced.getPreferenceEntries();
         srtpDetailKeys = AccountDetailSrtp.getPreferenceEntries();
         tlsDetailKeys = AccountDetailTls.getPreferenceEntries();
+
+        accountPreferenceHashMap = new HashMap<String, Preference>();
     } 
 
     @Override
@@ -148,6 +151,15 @@
                     map.putAll(tlsDetails.getDetailsHashMap());
 
                     setAccountDetails(accountID, map);
+                } else if(resultCode == AccountPreferenceActivity.ACCOUNT_DELETED) {
+                    Bundle bundle = data.getExtras();
+                    String accountID = bundle.getString("AccountID");
+
+                    Log.i(TAG, "Remove account " + accountID);
+                    deleteSelectedAccount(accountID);
+                    Preference accountScreen = accountPreferenceHashMap.get(accountID); 
+                    mRoot.removePreference(accountScreen);
+                    accountPreferenceHashMap.remove(accountID);
                 }
                 break;
             default:
@@ -159,29 +171,17 @@
         @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();
-            currentList.remove(DEFAULT_ACCOUNT_ID);
+            Set<String> currentList = (Set<String>) accountPreferenceHashMap.keySet();
             if(newList.size() > currentList.size()) {
                 for(String s : newList) {
                     if(!currentList.contains(s)) {
-                        Log.i("receiver", "ADDING ACCOUNT!!!!!! " + s);
-                        mRoot.addPreference(createAccountPreferenceScreen(s));
+                        Preference accountScreen = createAccountPreferenceScreen(s);
+                        mRoot.addPreference(accountScreen);
+                        accountPreferenceHashMap.put(s, accountScreen);
                     }
                 }
             }
-            else if(newList.size() < currentList.size()) {
-                for(String s : currentList) {
-                    if(!newList.contains(s)) {
-                        Log.i("receiver", "REMOVING ACCOUNT!!!!!! " + s);
-                        mRoot.removePreference(mAccountList.get(s).mScreen);
-                        mAccountList.remove(s);
-                    }
-                }
-            } 
-            */
         }
     };
 
@@ -313,8 +313,9 @@
 
         ArrayList<String> accountList = getAccountList();
         for(String s : accountList) {
-            // mRoot.addPreference(getAccountPreferenceScreen(s));
-            mRoot.addPreference(createAccountPreferenceScreen(s));
+            Preference accountScreen = createAccountPreferenceScreen(s);
+            mRoot.addPreference(accountScreen);
+            accountPreferenceHashMap.put(s, accountScreen); 
         }
          
         return mRoot;
diff --git a/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java b/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
index b53adf5..81908ac 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
@@ -46,10 +46,10 @@
 import android.preference.EditTextPreference;
 import android.preference.CheckBoxPreference;
 import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
 
 import com.savoirfairelinux.sflphone.R;
-// import com.savoirfairelinux.sflphone.service.SipService;
-// import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.utils.AccountDetail;
 import com.savoirfairelinux.sflphone.utils.AccountDetailsHandler;
 import com.savoirfairelinux.sflphone.utils.AccountDetailBasic;
@@ -65,6 +65,7 @@
     private static final String TAG = "AccoutPreferenceActivity";
     public static final int ACCOUNT_MODIFIED = Activity.RESULT_FIRST_USER + 0;
     public static final int ACCOUNT_NOT_MODIFIED = Activity.RESULT_FIRST_USER + 1;
+    public static final int ACCOUNT_DELETED = Activity.RESULT_FIRST_USER + 2;
 
     private AccountDetailBasic basicDetails = null;
     private AccountDetailAdvanced advancedDetails = null;
@@ -72,9 +73,11 @@
     private AccountDetailTls tlsDetails = null;
     private PreferenceManager mPreferenceManager;
     private HashMap<String, String> mPreferenceMap;
+    private MenuItem deleteAccountAction = null;
     private String mAccountID;
            
-    Preference.OnPreferenceChangeListener changeBasicPreferenceListener = new Preference.OnPreferenceChangeListener() {
+    Preference.OnPreferenceChangeListener changeBasicPreferenceListener = 
+                                            new Preference.OnPreferenceChangeListener() {
         public boolean onPreferenceChange(Preference preference, Object newValue) {
             preference.setSummary(getString(R.string.account_current_value_label)+(CharSequence)newValue);
             
@@ -87,7 +90,8 @@
         }
     };
 
-    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = new Preference.OnPreferenceChangeListener() {
+    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = 
+                                            new Preference.OnPreferenceChangeListener() {
         public boolean onPreferenceChange(Preference preference, Object newValue) {
             return true;
         }
@@ -153,6 +157,13 @@
     }
 
     @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        deleteAccountAction = menu.add("Delete Account");
+        deleteAccountAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        return true;
+    }
+
+    @Override
     protected void onStart() {
         super.onStart();
     }
@@ -183,6 +194,19 @@
         finish(); 
     }
 
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        Bundle bundle = new Bundle();
+        bundle.putString("AccountID", mAccountID);
+
+        Intent resultIntent = new Intent();
+        resultIntent.putExtras(bundle);
+
+        setResult(ACCOUNT_DELETED, resultIntent);
+        finish();
+        return true;
+    }
+
     private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
         for(AccountDetail.PreferenceEntry p : det.getDetailValues()) {
             Preference pref = mPreferenceManager.findPreference(p.mKey);
