diff --git a/src/com/savoirfairelinux/sflphone/account/AccountDetail.java b/src/com/savoirfairelinux/sflphone/account/AccountDetail.java
index 50a6257..9507c24 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountDetail.java
+++ b/src/com/savoirfairelinux/sflphone/account/AccountDetail.java
@@ -58,6 +58,8 @@
         }
     }
 
+    public static final String TAG = "PreferenceHashMap";
+
     public ArrayList<PreferenceEntry> getDetailValues();
 
     public ArrayList<String> getValuesOnly();
diff --git a/src/com/savoirfairelinux/sflphone/account/AccountDetailBasic.java b/src/com/savoirfairelinux/sflphone/account/AccountDetailBasic.java
index 03a1354..0db2523 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountDetailBasic.java
+++ b/src/com/savoirfairelinux/sflphone/account/AccountDetailBasic.java
@@ -107,6 +107,7 @@
         ArrayList<String> valueList = new ArrayList<String>();
 
         for(AccountDetail.PreferenceEntry p : privateArray) {
+            Log.i(TAG,""+p.mValue);
             valueList.add(p.mValue);
         }
 
diff --git a/src/com/savoirfairelinux/sflphone/account/AccountDetailsHandler.java b/src/com/savoirfairelinux/sflphone/account/AccountDetailsHandler.java
index 3e71d72..6b8c41b 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountDetailsHandler.java
+++ b/src/com/savoirfairelinux/sflphone/account/AccountDetailsHandler.java
@@ -21,16 +21,13 @@
  */
 package com.savoirfairelinux.sflphone.account;
 
-import android.util.Log;
+import java.util.ArrayList;
+import java.util.HashMap;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.service.ServiceConstants;
 import com.savoirfairelinux.sflphone.service.StringMap;
 
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-
 public class AccountDetailsHandler {
     private static final String TAG = "AccountDetailsHandler";
 
diff --git a/src/com/savoirfairelinux/sflphone/account/AccountManagementUI.java b/src/com/savoirfairelinux/sflphone/account/AccountManagementUI.java
index 6401d5b..d58aa7c 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountManagementUI.java
+++ b/src/com/savoirfairelinux/sflphone/account/AccountManagementUI.java
@@ -32,7 +32,7 @@
 
 import java.util.ArrayList;
 
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
 
 public interface AccountManagementUI
 {
diff --git a/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java b/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java
index ef23f35..9642fdf 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java
+++ b/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java
@@ -32,6 +32,8 @@
 
 import java.util.ArrayList;
 
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
+
 import android.content.Context;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -92,12 +94,18 @@
     };
 
 
+    /****************************************
+     * AccountManagementUI Interface
+     ****************************************/
+    
+    @Override
     public void setAccountList(AccountListReceiver accountList) {
         Log.i(TAG,"setAccountList");
         mAccountList = accountList;
         
     }
 
+    @Override
     public void accountSelectedNotifyAccountList(String accountID) {
         Log.i(TAG, "->accountSelectedNotifyAccountList");
         if (mAccountList != null) {
@@ -105,11 +113,13 @@
         }
     }
 
+    @Override
     public void setSelectedAccount(String accountID) {
         Log.i(TAG,"Account Selected");
         // setText(accountID);
     }
 
+    @Override
     public void accountAdded(ArrayList<String> newList) {
         mListAdapter = new ArrayAdapter(mContext, android.R.layout.simple_expandable_list_item_1, newList.toArray());
 
@@ -123,10 +133,12 @@
         // }
     }
 
+    @Override
     public void accountRemoved() {
         Log.i(TAG,"Account Removed");
     }
 
+    @Override
     public void accountUpdated() {
         Log.i(TAG,"Account Updated");
     }
diff --git a/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java b/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
deleted file mode 100644
index 93de02e..0000000
--- a/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
- *
- *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
- */
-
-package com.savoirfairelinux.sflphone.client;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.preference.CheckBoxPreference;
-import android.preference.EditTextPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceManager;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.account.AccountDetail;
-import com.savoirfairelinux.sflphone.account.AccountDetailAdvanced;
-import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
-import com.savoirfairelinux.sflphone.account.AccountDetailSrtp;
-import com.savoirfairelinux.sflphone.account.AccountDetailTls;
-import com.savoirfairelinux.sflphone.service.ISipService;
-import com.savoirfairelinux.sflphone.service.SipService;
-
-public class AccountCreationActivity extends PreferenceActivity
-{
-    static final String TAG = "SFLPhonePreferenceActivity";
-    private ISipService service;
-    private boolean mBound = false;
-    private PreferenceManager mPreferenceManager = null;
-    private AccountDetailBasic basicDetails;
-    private AccountDetailAdvanced advancedDetails;
-    private AccountDetailSrtp srtpDetails;
-    private AccountDetailTls tlsDetails;
-    private MenuItem createAccountAction = null;
-    private ArrayList<String> requiredFields = null;
-
-    Preference.OnPreferenceChangeListener changeNewAccountPreferenceListener = new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary(getString(R.string.account_current_value_label) + (CharSequence)newValue);
-            return true;
-        }
-    };
-
-    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            return true;
-        } 
-    };
-
-    private ServiceConnection mConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName className, IBinder binder) {
-            service = ISipService.Stub.asInterface(binder);
-            mBound = true;
-            Log.d(TAG, "Service connected");
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName arg0) {
-            mBound = false;
-            Log.d(TAG, "Service disconnected");
-        }
-    };
-
-    public AccountCreationActivity()
-    {
-        basicDetails = new AccountDetailBasic();
-        advancedDetails = new AccountDetailAdvanced();
-        srtpDetails = new AccountDetailSrtp();
-        tlsDetails = new AccountDetailTls();
-
-        requiredFields = new ArrayList<String>();
-
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS);
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME);
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME);
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD);
-    }
-
-    private AlertDialog createAlertDialog()
-    {
-        Activity ownerActivity = this;
-        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
-        builder.setMessage("All parameters will be lost").setTitle("Account Creation")
-               .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        Activity activity = ((Dialog)dialog).getOwnerActivity();
-                        activity.finish();
-                    }
-                })
-                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        /* Terminate with no action */
-                    }
-                });
-
-        AlertDialog alertDialog = builder.create();
-        alertDialog.setOwnerActivity(ownerActivity);
-
-        return alertDialog;
-    }
-
-    private AlertDialog createCouldNotValidateDialog(ArrayList<String> missingValue)
-    {
-        String message = "The following parameters are missing:";
-
-        for(String s : missingValue)
-            message += "\n    - " + s;
-
-        Activity ownerActivity = this;
-        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
-        builder.setMessage(message).setTitle("Missing Parameters")
-               .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                   public void onClick(DialogInterface dialog, int whichButton) {
-                       /* Nothing to be done */
-                   }
-               });
-
-        AlertDialog alertDialog = builder.create();
-        return alertDialog;
-    }
-
-    public boolean validateAccountCreation(ArrayList<String> missingValue)
-    {
-        boolean valid = true;
-
-        for(String s : requiredFields) {
-            EditTextPreference pref = (EditTextPreference)mPreferenceManager.findPreference(s);
-            Log.i(TAG, "Looking for " + s);
-            if(pref.getText().isEmpty()) {
-                Log.i(TAG, "    INVALIDATED " + s + " " + pref.getText() + ";");
-                valid = false;
-                missingValue.add(pref.getTitle().toString());
-            }
-        }
-
-        return valid;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        addPreferencesFromResource(R.xml.account_creation_preferences);
-        mPreferenceManager = getPreferenceManager();
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        createAccountAction = menu.add("Create Account");
-        createAccountAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        ArrayList<String> missingValue = new ArrayList<String>();
-        if(validateAccountCreation(missingValue)) {
-            createNewAccount();
-            finish();
-        }
-        else {
-            AlertDialog dialog = createCouldNotValidateDialog(missingValue);
-            dialog.show();
-        }
-
-        return true;
-    }
-
-    private void addPreferenceListener(AccountDetail details) {
-        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
-            Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(!p.isTwoState) {
-                    pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
-                }
-            }
-        }
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-
-        addPreferenceListener(basicDetails);
-        addPreferenceListener(advancedDetails);
-        addPreferenceListener(srtpDetails);
-        addPreferenceListener(tlsDetails);
- 
-        if(!mBound) {
-            Log.i(TAG, "onStart: Binding service...");
-            Intent intent = new Intent(this, SipService.class);
-            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
-        }
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-
-        if(mBound) {
-            Log.i(TAG, "onStop: Unbinding service...");
-            unbindService(mConnection);
-            mBound = false;
-        }
-    }
-
-    @Override
-    public void onBackPressed() {
-
-        AlertDialog dialog = createAlertDialog();
-        dialog.show();
-    }
-
-    private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
-        for(AccountDetail.PreferenceEntry p : det.getDetailValues()) {
-            Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(p.isTwoState) {
-                    CheckBoxPreference boxPref = (CheckBoxPreference) pref;
-                    accountDetails.put(p.mKey, boxPref.isChecked() ? "true" : "false");
-                }
-                else {
-                    EditTextPreference textPref = (EditTextPreference) pref;
-                    accountDetails.put(p.mKey, textPref.getText());
-                }
-            }
-        }
-    }
-
-    private void createNewAccount() {
-
-        HashMap<String, String> accountDetails = new HashMap<String, String>();
-
-        updateAccountDetails(accountDetails, basicDetails);
-        updateAccountDetails(accountDetails, advancedDetails);
-        updateAccountDetails(accountDetails, srtpDetails);
-        updateAccountDetails(accountDetails, tlsDetails);
-
-        try {
-            Log.i(TAG, "ADD ACCOUNT");
-            service.addAccount(accountDetails);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot call service method", e);
-        }
-    }
-}
diff --git a/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java b/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
index 72c8efd..a11b80c 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
@@ -31,24 +31,23 @@
 
 package com.savoirfairelinux.sflphone.client;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.content.ComponentName;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
+import android.preference.CheckBoxPreference;
+import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
-import android.preference.EditTextPreference;
-import android.preference.CheckBoxPreference;
 import android.util.Log;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 
 import com.savoirfairelinux.sflphone.R;
@@ -57,49 +56,73 @@
 import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
 import com.savoirfairelinux.sflphone.account.AccountDetailSrtp;
 import com.savoirfairelinux.sflphone.account.AccountDetailTls;
-import com.savoirfairelinux.sflphone.account.AccountDetailsHandler;
 
-import java.util.HashMap;
-import java.util.ArrayList;
-
-public class AccountPreferenceActivity extends PreferenceActivity
-{
+public class AccountPreferenceActivity extends PreferenceActivity {
     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;
+
+    public static final String KEY_MODE = "mode";
+
+    public interface mode {
+        static final int CREATION_MODE = 0;
+        static final int EDITION_MODE = 1;
+    }
+
+    public interface result {
+        static final int ACCOUNT_CREATED = Activity.RESULT_FIRST_USER + 0;
+        static final int ACCOUNT_MODIFIED = Activity.RESULT_FIRST_USER + 1;
+        static final int ACCOUNT_DELETED = Activity.RESULT_FIRST_USER + 2;
+    }
 
     private AccountDetailBasic basicDetails = null;
     private AccountDetailAdvanced advancedDetails = null;
     private AccountDetailSrtp srtpDetails = null;
     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() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary(getString(R.string.account_current_value_label)+(CharSequence)newValue);
-            
-            // String preferenceKey = basicDetailKeys.get(preference.getOrder()).mKey; 
-            // accountPreference.preferenceMap.put(preferenceKey, ((CharSequence)newValue).toString());
-            basicDetails.setDetailString(preference.getOrder(), ((CharSequence)newValue).toString());
-            // if(preferenceKey == AccountDetailBasic.CONFIG_ACCOUNT_ALIAS)
-            //     accountPreference.mScreen.setTitle(((CharSequence)newValue.toString()));
-            return true;
-        }
-    };
+    private ArrayList<String> requiredFields = null;
 
-    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = 
-                                            new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            return true;
-        }
-    };
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.account_creation_preferences);
+        mPreferenceManager = getPreferenceManager();
 
-    private void init() {
+        Bundle b = getIntent().getExtras();
+
+        switch (b.getInt(KEY_MODE)) {
+        case mode.CREATION_MODE:
+            Log.i(TAG, "CREATION");
+            initCreation();
+            break;
+        case mode.EDITION_MODE:
+            Log.i(TAG, "ESDITION");
+            initEdition();
+            break;
+        }
+
+        requiredFields = new ArrayList<String>();
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS);
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME);
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME);
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD);
+
+    }
+
+    private void initCreation() {
+        basicDetails = new AccountDetailBasic();
+        advancedDetails = new AccountDetailAdvanced();
+        srtpDetails = new AccountDetailSrtp();
+        tlsDetails = new AccountDetailTls();
+
+        addPreferenceListener(basicDetails);
+        addPreferenceListener(advancedDetails);
+        addPreferenceListener(srtpDetails);
+        addPreferenceListener(tlsDetails);
+
+    }
+    
+    private void initEdition() {
 
         Bundle b = getIntent().getExtras();
         mAccountID = b.getString("AccountID");
@@ -108,7 +131,7 @@
         ArrayList<String> srtpPreferenceList = b.getStringArrayList(AccountDetailSrtp.BUNDLE_TAG);
         ArrayList<String> tlsPreferenceList = b.getStringArrayList(AccountDetailTls.BUNDLE_TAG);
 
-        basicDetails = new AccountDetailBasic(basicPreferenceList); 
+        basicDetails = new AccountDetailBasic(basicPreferenceList);
         advancedDetails = new AccountDetailAdvanced(advancedPreferenceList);
         srtpDetails = new AccountDetailSrtp(srtpPreferenceList);
         tlsDetails = new AccountDetailTls(tlsPreferenceList);
@@ -124,113 +147,225 @@
         addPreferenceListener(tlsDetails);
     }
 
-    private void setPreferenceDetails(AccountDetail details) {
-        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+
+        Bundle b = getIntent().getExtras();
+
+        switch (b.getInt(KEY_MODE)) {
+        case mode.CREATION_MODE:
+            Log.i(TAG, "CREATION");
+            inflater.inflate(R.menu.account_creation, menu);
+            break;
+        case mode.EDITION_MODE:
+            Log.i(TAG, "onCreateOptionsMenu: " + mAccountID);
+
+            if (mAccountID.equals("IP2IP"))
+                return true;
+
+            inflater.inflate(R.menu.account_edition, menu);
+            break;
+        }
+
+        return true;
+    }
+
+    @Override
+    public void onBackPressed() {
+        Bundle b = getIntent().getExtras();
+        switch (b.getInt(KEY_MODE)) {
+        case mode.CREATION_MODE:
+            Log.i(TAG, "CREATION");
+            AlertDialog dialog = createCancelDialog();
+            dialog.show();
+            break;
+        case mode.EDITION_MODE:
+            finish();
+        }
+
+    }
+
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        switch (item.getItemId()) {
+        case R.id.menuitem_delete:
+            AlertDialog dialog = createDeleteDialog();
+            dialog.show();
+            break;
+        case R.id.menuitem_create:
+            processAccount(result.ACCOUNT_CREATED);
+            break;
+        case R.id.menuitem_edit:
+            processAccount(result.ACCOUNT_MODIFIED);
+            break;
+
+        }
+
+        return true;
+    }
+
+    private void processAccount(int resultCode) {
+        AlertDialog dialog;
+        ArrayList<String> missingValue = new ArrayList<String>();
+        if (validateAccountCreation(missingValue)) {
+
+            Bundle bundle = new Bundle();
+            bundle.putString("AccountID", mAccountID);
+            HashMap<String, String> accountDetails = new HashMap<String, String>();
+
+            updateAccountDetails(accountDetails, basicDetails);
+            updateAccountDetails(accountDetails, advancedDetails);
+            updateAccountDetails(accountDetails, srtpDetails);
+            updateAccountDetails(accountDetails, tlsDetails);
+
+            bundle.putSerializable(AccountDetail.TAG, accountDetails);
+            Intent resultIntent = new Intent();
+            resultIntent.putExtras(bundle);
+
+            setResult(resultCode, resultIntent);
+            finish();
+        } else {
+            dialog = createCouldNotValidateDialog(missingValue);
+            dialog.show();
+        }
+
+    }
+
+    public boolean validateAccountCreation(ArrayList<String> missingValue) {
+        boolean valid = true;
+
+        for (String s : requiredFields) {
+            EditTextPreference pref = (EditTextPreference) mPreferenceManager.findPreference(s);
+            Log.i(TAG, "Looking for " + s);
+            if (pref.getText().isEmpty()) {
+                Log.i(TAG, "    INVALIDATED " + s + " " + pref.getText() + ";");
+                valid = false;
+                missingValue.add(pref.getTitle().toString());
+            }
+        }
+
+        return valid;
+    }
+
+   
+    private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
+        for (AccountDetail.PreferenceEntry p : det.getDetailValues()) {
             Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(!p.isTwoState) {
-                    ((EditTextPreference)pref).setText(p.mValue);
-                    pref.setSummary(getString(R.string.account_current_value_label) + p.mValue);
+            if (pref != null) {
+                if (p.isTwoState) {
+                    CheckBoxPreference boxPref = (CheckBoxPreference) pref;
+                    accountDetails.put(p.mKey, boxPref.isChecked() ? "true" : "false");
+                } else {
+                    EditTextPreference textPref = (EditTextPreference) pref;
+                    accountDetails.put(p.mKey, textPref.getText());
+                }
+            }
+        }
+    }
+
+    Preference.OnPreferenceChangeListener changeBasicPreferenceListener = new Preference.OnPreferenceChangeListener() {
+        public boolean onPreferenceChange(Preference preference, Object newValue) {
+            preference.setSummary((CharSequence) newValue);
+            basicDetails.setDetailString(preference.getOrder(), ((CharSequence) newValue).toString());
+            return true;
+        }
+    };
+    
+    private void setPreferenceDetails(AccountDetail details) {
+        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+            Preference pref = mPreferenceManager.findPreference(p.mKey);
+            if (pref != null) {
+                if (!p.isTwoState) {
+                    ((EditTextPreference) pref).setText(p.mValue);
+                    pref.setSummary(p.mValue);
                 }
             }
         }
     }
 
     private void addPreferenceListener(AccountDetail details) {
-        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
             Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(!p.isTwoState) {
+            if (pref != null) {
+                if (!p.isTwoState) {
                     pref.setOnPreferenceChangeListener(changeBasicPreferenceListener);
                 }
             }
         }
     }
 
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    
+    
+    
+    
+    /******************************************
+     * 
+     * AlertDialogs
+     * 
+     ******************************************/
+    
+    private AlertDialog createCouldNotValidateDialog(ArrayList<String> missingValue) {
+        String message = "The following parameters are missing:";
 
-        addPreferencesFromResource(R.xml.account_creation_preferences);
-        mPreferenceManager = getPreferenceManager();
+        for (String s : missingValue)
+            message += "\n    - " + s;
 
-        init();
+        Activity ownerActivity = this;
+        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
+        builder.setMessage(message).setTitle("Missing Parameters").setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                /* Nothing to be done */
+            }
+        });
+
+        AlertDialog alertDialog = builder.create();
+        return alertDialog;
     }
+    
+    private AlertDialog createCancelDialog() {
+        Activity ownerActivity = this;
+        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
+        builder.setMessage("All parameters will be lost").setTitle("Account Creation").setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                Activity activity = ((Dialog) dialog).getOwnerActivity();
+                activity.finish();
+            }
+        }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                /* Terminate with no action */
+            }
+        });
 
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        Log.i(TAG, "onCreateOptionsMenu: " + mAccountID);
-        if(mAccountID.equals("IP2IP"))
-            return true;
-          
-          
-        deleteAccountAction = menu.add("Delete Account");
-        deleteAccountAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
-        return true;
+        AlertDialog alertDialog = builder.create();
+        alertDialog.setOwnerActivity(ownerActivity);
+
+        return alertDialog;
     }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-    }
-
-    @Override
-    protected void onStop() {
-       super.onStop();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-    }
-
-    @Override
-    public void onBackPressed() {
-        Bundle bundle = new Bundle();
-        bundle.putString("AccountID", mAccountID);
-        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 resultIntent = new Intent();
-        resultIntent.putExtras(bundle);
-
-        setResult(ACCOUNT_MODIFIED, resultIntent);
-        finish(); 
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        AlertDialog dialog = createAlertDialog();
-        dialog.show();
-
-        return true;
-    }
-
-    private AlertDialog createAlertDialog()
-    {
+    
+    private AlertDialog createDeleteDialog() {
         Activity ownerActivity = this;
         AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
         builder.setMessage("Do you realy want to delete this account").setTitle("Delete Account")
-               .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                   public void onClick(DialogInterface dialog, int whichButton) {
-                       Bundle bundle = new Bundle();
-                       bundle.putString("AccountID", mAccountID);
+                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        Bundle bundle = new Bundle();
+                        bundle.putString("AccountID", mAccountID);
 
-                       Intent resultIntent = new Intent();
-                       resultIntent.putExtras(bundle);
+                        Intent resultIntent = new Intent();
+                        resultIntent.putExtras(bundle);
 
-                       Activity activity = ((Dialog)dialog).getOwnerActivity();
-                       activity.setResult(ACCOUNT_DELETED, resultIntent);
-                       activity.finish();
-                   }
-               })
-               .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                   public void onClick(DialogInterface dialog, int whichButton) {
-                       /* Terminate with no action */
-                   }
-               });
+                        Activity activity = ((Dialog) dialog).getOwnerActivity();
+                        activity.setResult(result.ACCOUNT_DELETED, resultIntent);
+                        activity.finish();
+                    }
+                }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        /* Terminate with no action */
+                    }
+                });
 
         AlertDialog alertDialog = builder.create();
         alertDialog.setOwnerActivity(ownerActivity);
@@ -238,29 +373,4 @@
         return alertDialog;
     }
 
-    private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
-        for(AccountDetail.PreferenceEntry p : det.getDetailValues()) {
-            Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(p.isTwoState) {
-                    CheckBoxPreference boxPref = (CheckBoxPreference) pref;
-                    accountDetails.put(p.mKey, boxPref.isChecked() ? "true" : "false");
-                }
-                else {
-                    EditTextPreference textPref = (EditTextPreference)pref;
-                    accountDetails.put(p.mKey, textPref.getText());
-                }
-            }
-        }
-    }
-
-    private void updateAccountDetails() {
-        HashMap<String, String> accountDetails = new HashMap<String, String>();
-
-        updateAccountDetails(accountDetails, basicDetails);
-        updateAccountDetails(accountDetails, advancedDetails);
-        updateAccountDetails(accountDetails, srtpDetails);
-        updateAccountDetails(accountDetails, tlsDetails);
-    }
 }
-
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index 26eb7b3..ad06924 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -48,26 +48,23 @@
 import android.support.v4.content.LocalBroadcastManager;
 import android.support.v4.view.ViewPager;
 import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
 import android.view.animation.LinearInterpolator;
 import android.widget.EditText;
 import android.widget.ImageButton;
-import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
-import com.savoirfairelinux.sflphone.client.receiver.CallList;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
+import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver;
 import com.savoirfairelinux.sflphone.fragments.ButtonSectionFragment;
 import com.savoirfairelinux.sflphone.fragments.CallElementListFragment;
 import com.savoirfairelinux.sflphone.fragments.ContactListFragment;
+import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
@@ -82,12 +79,12 @@
 	static Animation animation;
 	private ContactListFragment mContactListFragment = null;
 	private CallElementListFragment mCallElementList = null;
-	private HistorySectionFragment mHistorySectionFragment = null;
+	private HistoryFragment mHistorySectionFragment = null;
 	private ButtonSectionFragment mButtonSectionFragment = null;
 	private boolean mBound = false;
 	private ISipService service;
 	public AccountListReceiver mAccountList;
-	public CallList mCallList = new CallList(this);
+	public CallListReceiver mCallList = new CallListReceiver(this);
 	private SFLphoneApplication mApplication;
 
 	private static final int ACTION_BAR_TAB_CONTACT = 0;
@@ -146,7 +143,7 @@
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CONTACT));
 			mCallElementList = (CallElementListFragment) getFragmentManager().getFragment(savedInstanceState,
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CALL));
-			mHistorySectionFragment = (HistorySectionFragment) getFragmentManager().getFragment(savedInstanceState,
+			mHistorySectionFragment = (HistoryFragment) getFragmentManager().getFragment(savedInstanceState,
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_HISTORY));
 			mButtonSectionFragment = (ButtonSectionFragment) getFragmentManager().getFragment(savedInstanceState,
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_TEST));
@@ -161,7 +158,7 @@
 			Log.w(TAG, "Recreated mCallElementList=" + mCallElementList);
 		}
 		if (mHistorySectionFragment == null) {
-			mHistorySectionFragment = new HistorySectionFragment();
+			mHistorySectionFragment = new HistoryFragment();
 			Log.w(TAG, "Recreated mHistorySectionFragment=" + mHistorySectionFragment);
 		}
 		if (mButtonSectionFragment == null) {
@@ -408,8 +405,8 @@
 				Log.w(TAG, "getItem() CallElementList=" + fragment);
 				break;
 			case 2:
-				fragment = new HistorySectionFragment();
-				Log.w(TAG, "getItem() HistorySectionFragment=" + fragment);
+				fragment = new HistoryFragment();
+				Log.w(TAG, "getItem() HistoryFragment=" + fragment);
 				break;
 			case 3:
 				fragment = new ButtonSectionFragment();
@@ -422,7 +419,7 @@
 
 			// Log.i(TAG, "getItem() fragment is " + fragment);
 			Bundle args = new Bundle();
-			args.putInt(HistorySectionFragment.ARG_SECTION_NUMBER, i + 1);
+			args.putInt(HistoryFragment.ARG_SECTION_NUMBER, i + 1);
 			fragment.setArguments(args);
 			return fragment;
 		}
@@ -463,7 +460,7 @@
 				name = CallElementListFragment.class.getName();
 				break;
 			case 2:
-				name = HistorySectionFragment.class.getName();
+				name = HistoryFragment.class.getName();
 				break;
 			case 3:
 				name = ButtonSectionFragment.class.getName();
@@ -501,25 +498,6 @@
 		}
 	}
 
-	/**
-	 * A dummy fragment representing a section of the app, but that simply displays dummy text.
-	 */
-	public static class HistorySectionFragment extends Fragment {
-		public HistorySectionFragment() {
-			setRetainInstance(true);
-		}
-
-		public static final String ARG_SECTION_NUMBER = "section_number";
-
-		@Override
-		public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-			TextView textView = new TextView(getActivity());
-			textView.setGravity(Gravity.CENTER);
-			Bundle args = getArguments();
-			textView.setText("ARG_SECTION_NUMBER=" + Integer.toString(args.getInt(ARG_SECTION_NUMBER)));
-			return textView;
-		}
-	}
 
 	@Override
 	public void onClick(View view) {
@@ -555,7 +533,7 @@
 		info.mEmail = "coolGuy@coolGuy.com";
 		info.mCallType = SipCall.CALL_TYPE_OUTGOING;
 
-		SipCall call = CallList.getCallInstance(info);
+		SipCall call = CallListReceiver.getCallInstance(info);
 		call.launchCallActivity(this);
 		call.placeCallUpdateUi();
 		call.notifyServicePlaceCall(service);
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java
index 17bed3e..00d3023 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java
@@ -49,14 +49,14 @@
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.fragments.AccountManagementFragment;
-import com.savoirfairelinux.sflphone.fragments.PrefManagementFragment;
+import com.savoirfairelinux.sflphone.fragments.AudioManagementFragment;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 
 public class SFLPhonePreferenceActivity extends Activity implements ActionBar.TabListener
 {
     static final int NUM_PAGES = 2;
-    static final String TAG = "SFLPhonePreferenceActivity";
+    static final String TAG = SFLPhonePreferenceActivity.class.getSimpleName();
     PreferencesPagerAdapter mPreferencesPagerAdapter;
     private boolean mBound = false;
     static boolean serviceIsOn = false;
@@ -185,7 +185,7 @@
                 fragment = new AccountManagementFragment();
                 break;
             case 1:
-                fragment = new PrefManagementFragment();
+                fragment = new AudioManagementFragment();
                 break;
             default:
                 Log.i(TAG, "Get new fragment " + position + " is null");
@@ -211,32 +211,4 @@
         }
     }
 
-    public static class ArrayListFragment extends ListFragment {
-        int mNum;
-
-        static ArrayListFragment newInstance(int num) {
-            ArrayListFragment f = new ArrayListFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
-        }
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-            // setListAdapter(new ArrayAdapter<String>(getActivity(),
-            //        android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
-        }
-
-    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java b/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java
index f7ef9c9..4fc4427 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java
@@ -8,7 +8,7 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.util.Log;
 
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 
diff --git a/src/com/savoirfairelinux/sflphone/account/AccountListReceiver.java b/src/com/savoirfairelinux/sflphone/client/receiver/AccountListReceiver.java
similarity index 96%
rename from src/com/savoirfairelinux/sflphone/account/AccountListReceiver.java
rename to src/com/savoirfairelinux/sflphone/client/receiver/AccountListReceiver.java
index d78db6f..efd6c5b 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountListReceiver.java
+++ b/src/com/savoirfairelinux/sflphone/client/receiver/AccountListReceiver.java
@@ -29,7 +29,7 @@
  *  as that of the covered work.
  */
 
-package com.savoirfairelinux.sflphone.account;
+package com.savoirfairelinux.sflphone.client.receiver;
 
 import android.content.BroadcastReceiver;
 import android.content.Intent;
@@ -39,6 +39,7 @@
 
 import java.util.ArrayList;
 
+import com.savoirfairelinux.sflphone.account.AccountManagementUI;
 import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
 import com.savoirfairelinux.sflphone.service.ISipService;
 
@@ -80,7 +81,7 @@
     {
         String signalName = intent.getStringExtra(ConfigurationManagerCallback.SIGNAL_NAME);
         Log.d(TAG, "Signal received: " + signalName);
-
+        
         if(signalName.equals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
             processAccountsChangedSignal(intent);
         } else if(signalName.equals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
diff --git a/src/com/savoirfairelinux/sflphone/client/receiver/CallList.java b/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java
similarity index 97%
rename from src/com/savoirfairelinux/sflphone/client/receiver/CallList.java
rename to src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java
index bfec63a..ddf4efa 100644
--- a/src/com/savoirfairelinux/sflphone/client/receiver/CallList.java
+++ b/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java
@@ -44,7 +44,7 @@
 import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
 
-public class CallList extends BroadcastReceiver
+public class CallListReceiver extends BroadcastReceiver
 {
     static final String TAG = "CallList";
     static ArrayList<SipCall> mList = new ArrayList<SipCall>();
@@ -81,7 +81,7 @@
         return call;
     }
 
-    public CallList(SFLPhoneHomeActivity home) {
+    public CallListReceiver(SFLPhoneHomeActivity home) {
         mHome = home;
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java b/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java
index 6568ade..4881381 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java
@@ -33,7 +33,6 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Set;
 
 import android.app.Activity;
@@ -56,14 +55,13 @@
 import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
 import com.savoirfairelinux.sflphone.account.AccountDetailSrtp;
 import com.savoirfairelinux.sflphone.account.AccountDetailTls;
-import com.savoirfairelinux.sflphone.client.AccountCreationActivity;
 import com.savoirfairelinux.sflphone.client.AccountPreferenceActivity;
 import com.savoirfairelinux.sflphone.client.SFLPhonePreferenceActivity;
 import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
+import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
 import com.savoirfairelinux.sflphone.service.ISipService;
 
-public class AccountManagementFragment extends PreferenceFragment
-{
+public class AccountManagementFragment extends PreferenceFragment {
     static final String TAG = "AccountManagementFragment";
     static final String DEFAULT_ACCOUNT_ID = "IP2IP";
     static final int ACCOUNT_CREATE_REQUEST = 1;
@@ -86,30 +84,27 @@
         Log.w(TAG, "onAttach() service=" + service);
     }
 
-    public AccountManagementFragment()
-    {
-        basicDetailKeys =  AccountDetailBasic.getPreferenceEntries();
+    public AccountManagementFragment() {
+        basicDetailKeys = AccountDetailBasic.getPreferenceEntries();
         advancedDetailKeys = AccountDetailAdvanced.getPreferenceEntries();
         srtpDetailKeys = AccountDetailSrtp.getPreferenceEntries();
         tlsDetailKeys = AccountDetailTls.getPreferenceEntries();
 
         accountPreferenceHashMap = new HashMap<String, Preference>();
-    } 
+    }
 
     @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         Log.i(TAG, "Create Account Management Fragment");
 
         /*
-         * FIXME if service cannot be obtained from SFLPhonePreferenceActivity,
-         * then get it from Application
+         * FIXME if service cannot be obtained from SFLPhonePreferenceActivity, then get it from Application
          */
         service = sflphonePreferenceActivity.getSipService();
         if (service == null) {
-            service = ((SFLphoneApplication)sflphonePreferenceActivity.getApplication()).getSipService();
+            service = ((SFLphoneApplication) sflphonePreferenceActivity.getApplication()).getSipService();
             if (service == null) {
                 Log.e(TAG, "onCreate() service=" + service);
             }
@@ -118,19 +113,17 @@
 
         setPreferenceScreen(getAccountListPreferenceScreen());
 
-        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver, new IntentFilter("accounts-changed"));
+        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver, new IntentFilter(ConfigurationManagerCallback.ACCOUNTS_CHANGED));
     }
 
     @Override
-    public void onStop()
-    {
+    public void onStop() {
         super.onStop();
         Log.i(TAG, "onStop");
     }
 
     @Override
-    public void onDestroy()
-    {
+    public void onDestroy() {
         LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mMessageReceiver);
         super.onDestroy();
         Log.i(TAG, "onDestroy");
@@ -138,57 +131,66 @@
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        switch(requestCode) {
-            case ACCOUNT_CREATE_REQUEST:
-                Log.i(TAG, "ACCOUNT_CREATE_REQUEST Done");
-                break;
-            case ACCOUNT_EDIT_REQUEST:
-                if(resultCode == AccountPreferenceActivity.ACCOUNT_MODIFIED) {
-                    Bundle bundle = data.getExtras();
-                    String accountID = bundle.getString("AccountID");
-                    Log.i(TAG, "Update account settings for " + accountID);
+        switch (requestCode) {
+        case ACCOUNT_CREATE_REQUEST:
+            if (resultCode == AccountPreferenceActivity.result.ACCOUNT_CREATED) {
+                Bundle bundle = data.getExtras();
+                Log.i(TAG, "Create account settings");
+                HashMap<String, String> accountDetails = new HashMap<String, String>();
+                accountDetails = (HashMap<String, String>) bundle.getSerializable(AccountDetail.TAG);
+                createNewAccount(accountDetails);
+            }
+            break;
+        case ACCOUNT_EDIT_REQUEST:
+            if (resultCode == AccountPreferenceActivity.result.ACCOUNT_MODIFIED) {
+                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> accountDetails = new HashMap<String, String>();
+                accountDetails = (HashMap<String, String>) bundle.getSerializable(AccountDetail.TAG);
+                
+                Preference accountScreen = accountPreferenceHashMap.get(accountID);
+                mRoot.removePreference(accountScreen);
+                accountPreferenceHashMap.remove(accountID);
+                setAccountDetails(accountID, accountDetails);
+                
+            } else if (resultCode == AccountPreferenceActivity.result.ACCOUNT_DELETED) {
+                Bundle bundle = data.getExtras();
+                String accountID = bundle.getString("AccountID");
 
-                    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);
-                } 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:
-                break;
+                Log.i(TAG, "Remove account " + accountID);
+                deleteSelectedAccount(accountID);
+                Preference accountScreen = accountPreferenceHashMap.get(accountID);
+                mRoot.removePreference(accountScreen);
+                accountPreferenceHashMap.remove(accountID);
+            } else {
+                Log.i(TAG, "Edition canceled");
+            }
+            break;
+        default:
+            break;
         }
     }
 
+    private void createNewAccount(HashMap<String, String> accountDetails) {
+        try {
+            Log.i(TAG, "ADD ACCOUNT");
+            service.addAccount(accountDetails);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Cannot call service method", e);
+        }
+
+    }
+
     private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            String message = intent.getStringExtra("message");
             ArrayList<String> newList = (ArrayList<String>) getAccountList();
             Set<String> currentList = (Set<String>) accountPreferenceHashMap.keySet();
-            if(newList.size() > currentList.size()) {
-                for(String s : newList) {
-                    if(!currentList.contains(s)) {
+            if (newList.size() > currentList.size()) {
+                for (String s : newList) {
+                    if (!currentList.contains(s)) {
                         Preference accountScreen = createAccountPreferenceScreen(s);
                         mRoot.addPreference(accountScreen);
                         accountPreferenceHashMap.put(s, accountScreen);
@@ -200,7 +202,7 @@
 
     Preference.OnPreferenceClickListener launchAccountCreationOnClick = new Preference.OnPreferenceClickListener() {
         public boolean onPreferenceClick(Preference preference) {
-            if(preference.getTitle() == "Create New Account") {
+            if (preference.getTitle() == "Create New Account") {
                 launchAccountCreationActivity(preference);
             }
             return true;
@@ -216,25 +218,24 @@
 
     Preference.OnPreferenceClickListener removeSelectedAccountOnClick = new Preference.OnPreferenceClickListener() {
         public boolean onPreferenceClick(Preference preference) {
-            if(preference.getTitle() == "Delete Account") {
+            if (preference.getTitle() == "Delete Account") {
                 deleteSelectedAccount(preference.getKey());
             }
             return true;
         }
     };
 
-    private void launchAccountCreationActivity(Preference preference)
-    {
+    private void launchAccountCreationActivity(Preference preference) {
         Log.i(TAG, "Launch account creation activity");
         Intent intent = preference.getIntent();
+        intent.putExtra(AccountPreferenceActivity.KEY_MODE, AccountPreferenceActivity.mode.CREATION_MODE);
         startActivityForResult(intent, ACCOUNT_CREATE_REQUEST);
     }
 
-    private void launchAccountEditActivity(Preference preference)
-    {
+    private void launchAccountEditActivity(Preference preference) {
         Log.i(TAG, "Launch account edit activity");
         Intent intent = preference.getIntent();
-
+        intent.putExtra(AccountPreferenceActivity.KEY_MODE, AccountPreferenceActivity.mode.EDITION_MODE);
         Bundle bundle = intent.getExtras();
         String accountID = bundle.getString("AccountID");
 
@@ -264,13 +265,12 @@
         }
     };
 
-    private ArrayList<String> getAccountList()
-    {
+    private ArrayList<String> getAccountList() {
         ArrayList<String> accountList = null;
         try {
-            accountList = (ArrayList<String>) service.getAccountList(); 
+            accountList = (ArrayList<String>) service.getAccountList();
         } catch (RemoteException e) {
-           Log.e(TAG, "Cannot call service method", e); 
+            Log.e(TAG, "Cannot call service method", e);
         }
 
         // Remove the default account from list
@@ -279,8 +279,7 @@
         return accountList;
     }
 
-    private HashMap<String, String> getAccountDetails(String accountID)
-    {
+    private HashMap<String, String> getAccountDetails(String accountID) {
         HashMap<String, String> accountDetails = null;
         try {
             accountDetails = (HashMap<String, String>) service.getAccountDetails(accountID);
@@ -291,8 +290,7 @@
         return accountDetails;
     }
 
-    private void setAccountDetails(String accountID, HashMap<String, String> accountDetails)
-    {
+    private void setAccountDetails(String accountID, HashMap<String, String> accountDetails) {
         try {
             service.setAccountDetails(accountID, accountDetails);
         } catch (RemoteException e) {
@@ -300,8 +298,7 @@
         }
     }
 
-    public PreferenceScreen getAccountListPreferenceScreen()
-    {
+    public PreferenceScreen getAccountListPreferenceScreen() {
         Activity currentContext = getActivity();
 
         mRoot = getPreferenceManager().createPreferenceScreen(currentContext);
@@ -321,31 +318,31 @@
         Preference createNewAccount = new Preference(currentContext);
         createNewAccount.setTitle("Create New Account");
         createNewAccount.setOnPreferenceClickListener(launchAccountCreationOnClick);
-        createNewAccount.setIntent(new Intent().setClass(getActivity(), AccountCreationActivity.class));
+        createNewAccount.setIntent(new Intent().setClass(getActivity(), AccountPreferenceActivity.class));
         mRoot.addPreference(createNewAccount);
 
         ArrayList<String> accountList = getAccountList();
-        for(String s : accountList) {
+        for (String s : accountList) {
             Preference accountScreen = createAccountPreferenceScreen(s);
             mRoot.addPreference(accountScreen);
-            accountPreferenceHashMap.put(s, accountScreen); 
+            accountPreferenceHashMap.put(s, accountScreen);
         }
-         
+
         return mRoot;
     }
 
     Preference createAccountPreferenceScreen(String accountID) {
 
         HashMap<String, String> details = getAccountDetails(accountID);
-        Set<String> keys = details.keySet();
-        Iterator<String> ite = keys.iterator();
-        while(ite.hasNext()){
-            Log.i(TAG,"key : "+ ite.next());
-        }
+        // Set<String> keys = details.keySet();
+        // Iterator<String> ite = keys.iterator();
+        // while(ite.hasNext()){
+        // Log.i(TAG,"key : "+ ite.next());
+        // }
         Bundle bundle = new Bundle();
         bundle.putString("AccountID", accountID);
 
-        Intent intent = new Intent().setClass(getActivity(), AccountPreferenceActivity.class); 
+        Intent intent = new Intent().setClass(getActivity(), AccountPreferenceActivity.class);
         intent.putExtras(bundle);
 
         Preference editAccount = new Preference(getActivity());
@@ -353,7 +350,7 @@
         editAccount.setSummary(details.get(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME));
         editAccount.setOnPreferenceClickListener(launchAccountEditOnClick);
         editAccount.setIntent(intent);
-        
+
         return editAccount;
     }
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/PrefManagementFragment.java b/src/com/savoirfairelinux/sflphone/fragments/AudioManagementFragment.java
similarity index 98%
rename from src/com/savoirfairelinux/sflphone/fragments/PrefManagementFragment.java
rename to src/com/savoirfairelinux/sflphone/fragments/AudioManagementFragment.java
index bc2916a..954eb49 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/PrefManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/AudioManagementFragment.java
@@ -53,12 +53,12 @@
 
 import com.savoirfairelinux.sflphone.R;
 
-public class PrefManagementFragment extends PreferenceFragment
+public class AudioManagementFragment extends PreferenceFragment
 {
     static final String TAG = "PrefManagementFragment";
     static final String CURRENT_VALUE = "Current value:: "; 
 
-    public PrefManagementFragment()
+    public AudioManagementFragment()
     {
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
index ae5fc4a..48535cd 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
@@ -70,10 +70,10 @@
 import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
 import com.savoirfairelinux.sflphone.account.AccountSelectionSpinner;
 import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
 import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
 import com.savoirfairelinux.sflphone.model.ContactManager;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.ISipService;
@@ -82,7 +82,7 @@
  * Main list of Call Elements. We don't manage contacts ourself so they are
  */
 public class CallElementListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
-    private static final String TAG = "CallElementList";
+    private static final String TAG = CallElementListFragment.class.getSimpleName();
     private static final String CURRENT_STATE_LABEL = "    CURRENT STATE: ";
     private ContactManager mContactManager;
     private CallElementAdapter mAdapter;
@@ -107,7 +107,7 @@
     }
 
     public String getSelectedAccount() {
-//        return mAccountSelectionButton.getText().toString();
+        // return mAccountSelectionButton.getText().toString();
         return "CIOUCOU";
     }
 
@@ -340,6 +340,7 @@
     @Override
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
 
+        Log.i(TAG,"onCreateLoader");
         // return new CursorLoader(getActivity(), CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
 
         // This is called when a new Loader needs to be created. This
diff --git a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
index a968d36..18e8043 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
@@ -77,10 +77,10 @@
 import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
 import com.savoirfairelinux.sflphone.account.AccountSelectionSpinner;
 import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
 import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.ISipService;
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java b/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
new file mode 100644
index 0000000..23d98f5
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
@@ -0,0 +1,23 @@
+package com.savoirfairelinux.sflphone.fragments;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class HistoryFragment extends Fragment {
+
+    public static final String ARG_SECTION_NUMBER = "section_number";
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+        TextView textView = new TextView(getActivity());
+        textView.setGravity(Gravity.CENTER);
+        Bundle args = getArguments();
+        textView.setText("ARG_SECTION_NUMBER=" + Integer.toString(args.getInt(ARG_SECTION_NUMBER)));
+        return textView;
+    }
+}
