diff --git a/src/org/sflphone/client/AccountEditionActivity.java b/src/org/sflphone/client/AccountEditionActivity.java
index acc282d..fefc12b 100644
--- a/src/org/sflphone/client/AccountEditionActivity.java
+++ b/src/org/sflphone/client/AccountEditionActivity.java
@@ -44,6 +44,7 @@
 import org.sflphone.account.AccountDetailTls;
 import org.sflphone.fragments.AudioManagementFragment;
 import org.sflphone.fragments.EditionFragment;
+import org.sflphone.model.Account;
 import org.sflphone.service.ISipService;
 import org.sflphone.service.SipService;
 
@@ -77,12 +78,10 @@
     public static final String KEY_MODE = "mode";
     private boolean mBound = false;
     private ISipService service;
-    private String mAccountID;
-    HashMap<String, String> basicPreferenceList;
-    HashMap<String, String> advancedPreferenceList;
-    HashMap<String, String> srtpPreferenceList;
-    HashMap<String, String> tlsPreferenceList;
-
+    
+    private Account acc_selected;
+    
+    
     PreferencesPagerAdapter mPreferencesPagerAdapter;
     private ServiceConnection mConnection = new ServiceConnection() {
 
@@ -134,12 +133,8 @@
             }
         });
 
-        basicPreferenceList = (HashMap<String, String>) getIntent().getExtras().getSerializable(AccountDetailBasic.BUNDLE_TAG);
-        advancedPreferenceList = (HashMap<String, String>) getIntent().getExtras().getSerializable(AccountDetailAdvanced.BUNDLE_TAG);
-        srtpPreferenceList = (HashMap<String, String>) getIntent().getExtras().getSerializable(AccountDetailSrtp.BUNDLE_TAG);
-        tlsPreferenceList = (HashMap<String, String>) getIntent().getExtras().getSerializable(AccountDetailTls.BUNDLE_TAG);
-
-        mAccountID = getIntent().getExtras().getString("AccountID");
+        acc_selected = getIntent().getExtras().getParcelable("account");
+        
         if (!mBound) {
             Log.i(TAG, "onCreate: Binding service...");
             Intent intent = new Intent(this, SipService.class);
@@ -214,7 +209,7 @@
 
             accountDetails.put("Account.type", "SIP");
             try {
-                service.setAccountDetails(mAccountID, accountDetails);
+                service.setAccountDetails(acc_selected.getAccountID(), accountDetails);
             } catch (RemoteException e) {
                 e.printStackTrace();
             }
@@ -289,10 +284,10 @@
                     @Override
                     public void onClick(DialogInterface dialog, int whichButton) {
                         Bundle bundle = new Bundle();
-                        bundle.putString("AccountID", mAccountID);
+                        bundle.putString("AccountID", acc_selected.getAccountID());
 
                         try {
-                            service.removeAccount(mAccountID);
+                            service.removeAccount(acc_selected.getAccountID());
                         } catch (RemoteException e) {
                             e.printStackTrace();
                         }
@@ -369,22 +364,22 @@
 
     @Override
     public HashMap<String, String> getBasicDetails() {
-        return basicPreferenceList;
+        return acc_selected.getBasicDetails().getDetailsHashMap();
     }
 
     @Override
     public HashMap<String, String> getAdvancedDetails() {
-        return advancedPreferenceList;
+        return acc_selected.getAdvancedDetails().getDetailsHashMap();
     }
 
     @Override
     public HashMap<String, String> getSRTPDetails() {
-        return srtpPreferenceList;
+        return acc_selected.getSrtpDetails().getDetailsHashMap();
     }
 
     @Override
     public HashMap<String, String> getTLSDetails() {
-        return tlsPreferenceList;
+        return acc_selected.getTlsDetails().getDetailsHashMap();
     }
 
     @Override
@@ -394,7 +389,7 @@
     
     @Override
     public String getAccountID(){
-        return mAccountID;
+        return acc_selected.getAccountID();
     }
 
 }
diff --git a/src/org/sflphone/fragments/AccountManagementFragment.java b/src/org/sflphone/fragments/AccountManagementFragment.java
index 8602a75..a458397 100644
--- a/src/org/sflphone/fragments/AccountManagementFragment.java
+++ b/src/org/sflphone/fragments/AccountManagementFragment.java
@@ -75,7 +75,7 @@
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.TextView;
 
-public class AccountManagementFragment extends ListFragment implements LoaderCallbacks<ArrayList<Account>>, AccountsInterface {
+public class AccountManagementFragment extends ListFragment implements LoaderCallbacks<Bundle>, AccountsInterface {
     static final String TAG = "AccountManagementFragment";
     static final String DEFAULT_ACCOUNT_ID = "IP2IP";
     static final int ACCOUNT_CREATE_REQUEST = 1;
@@ -98,7 +98,6 @@
             }
         }
 
-       
     };
 
     private Callbacks mCallbacks = sDummyCallbacks;
@@ -171,7 +170,7 @@
             }
         });
 
-         list.setEmptyView(view.findViewById(android.R.id.empty));
+        list.setEmptyView(view.findViewById(android.R.id.empty));
     }
 
     @Override
@@ -191,22 +190,22 @@
     }
 
     @Override
-    public Loader<ArrayList<Account>> onCreateLoader(int id, Bundle args) {
+    public Loader<Bundle> onCreateLoader(int id, Bundle args) {
         AccountsLoader l = new AccountsLoader(getActivity(), mCallbacks.getService());
 
         l.forceLoad();
-
         return l;
     }
 
     @Override
-    public void onLoadFinished(Loader<ArrayList<Account>> loader, ArrayList<Account> results) {
+    public void onLoadFinished(Loader<Bundle> loader, Bundle bun) {
         mAdapter.removeAll();
-        mAdapter.addAll(results);
+        ArrayList<Account> accounts = bun.getParcelableArrayList(AccountsLoader.ACCOUNTS);
+        mAdapter.addAll(accounts);
     }
 
     @Override
-    public void onLoaderReset(Loader<ArrayList<Account>> arg0) {
+    public void onLoaderReset(Loader<Bundle> arg0) {
         // TODO Auto-generated method stub
 
     }
@@ -235,12 +234,7 @@
 
         Intent intent = new Intent().setClass(getActivity(), AccountEditionActivity.class);
         Bundle bundle = new Bundle();
-        bundle.putString("AccountID", acc.getAccountID());
-        bundle.putSerializable(AccountDetailBasic.BUNDLE_TAG, acc.getBasicDetails().getDetailsHashMap());
-        bundle.putSerializable(AccountDetailAdvanced.BUNDLE_TAG, acc.getAdvancedDetails().getDetailsHashMap());
-        bundle.putSerializable(AccountDetailSrtp.BUNDLE_TAG, acc.getSrtpDetails().getDetailsHashMap());
-        bundle.putSerializable(AccountDetailTls.BUNDLE_TAG, acc.getTlsDetails().getDetailsHashMap());
-
+        bundle.putParcelable("account", acc);
         intent.putExtras(bundle);
 
         startActivityForResult(intent, ACCOUNT_EDIT_REQUEST);
@@ -286,9 +280,9 @@
             accounts.remove(item);
             notifyDataSetChanged();
         }
-        
+
         @Override
-        public boolean hasStableIds(){
+        public boolean hasStableIds() {
             return true;
         }
 
@@ -386,7 +380,7 @@
             }
 
         }
-        
+
         private String generateAccountOrder() {
             String result = DEFAULT_ACCOUNT_ID + File.separator;
             for (Account a : accounts) {
diff --git a/src/org/sflphone/fragments/MenuFragment.java b/src/org/sflphone/fragments/MenuFragment.java
index 53e359e..cabfc66 100644
--- a/src/org/sflphone/fragments/MenuFragment.java
+++ b/src/org/sflphone/fragments/MenuFragment.java
@@ -66,7 +66,7 @@
 import android.widget.RadioButton;
 import android.widget.Spinner;
 
-public class MenuFragment extends Fragment implements LoaderCallbacks<ArrayList<Account>>, AccountsInterface {
+public class MenuFragment extends Fragment implements LoaderCallbacks<Bundle>, AccountsInterface {
 
     private static final String TAG = MenuFragment.class.getSimpleName();
     public static final String ARG_SECTION_NUMBER = "section_number";
@@ -78,7 +78,6 @@
     AccountsReceiver accountReceiver;
     private Callbacks mCallbacks = sDummyCallbacks;
 
-    
     private static Callbacks sDummyCallbacks = new Callbacks() {
 
         @Override
@@ -221,21 +220,22 @@
     }
 
     @Override
-    public Loader<ArrayList<Account>> onCreateLoader(int id, Bundle args) {
+    public Loader<Bundle> onCreateLoader(int id, Bundle args) {
         AccountsLoader l = new AccountsLoader(getActivity(), mCallbacks.getService());
         l.forceLoad();
         return l;
     }
 
     @Override
-    public void onLoadFinished(Loader<ArrayList<Account>> loader, ArrayList<Account> results) {
+    public void onLoadFinished(Loader<Bundle> loader, Bundle bun) {
         mAccountAdapter.removeAll();
-        mAccountAdapter.addAll(results);
+        ArrayList<Account> accounts = bun.getParcelableArrayList(AccountsLoader.ACCOUNTS);
+        mAccountAdapter.addAll(accounts);
 
     }
 
     @Override
-    public void onLoaderReset(Loader<ArrayList<Account>> arg0) {
+    public void onLoaderReset(Loader<Bundle> arg0) {
         // TODO Auto-generated method stub
 
     }
diff --git a/src/org/sflphone/loaders/AccountsLoader.java b/src/org/sflphone/loaders/AccountsLoader.java
index 65a0f38..b95c00f 100644
--- a/src/org/sflphone/loaders/AccountsLoader.java
+++ b/src/org/sflphone/loaders/AccountsLoader.java
@@ -8,13 +8,15 @@
 
 import android.content.AsyncTaskLoader;
 import android.content.Context;
+import android.os.Bundle;
 import android.os.RemoteException;
 import android.util.Log;
 
-public class AccountsLoader extends AsyncTaskLoader<ArrayList<Account>> {
+public class AccountsLoader extends AsyncTaskLoader<Bundle> {
 
     private static final String TAG = AccountsLoader.class.getSimpleName();
-
+    public static final String ACCOUNTS = "accounts";
+    public static final String ACCOUNT_IP2IP = "IP2IP";
     ISipService service;
 
     public AccountsLoader(Context context, ISipService ref) {
@@ -24,21 +26,23 @@
 
     @SuppressWarnings("unchecked") // Hashmap runtime cast 
     @Override
-    public ArrayList<Account> loadInBackground() {
+    public Bundle loadInBackground() {
 
-        ArrayList<Account> result = new ArrayList<Account>();
-
-        ArrayList<String> accountIDs;
-        HashMap<String, String> details;
+        ArrayList<Account> accounts = new ArrayList<Account>();
+        Account IP2IP = null;
+        
         try {
-            accountIDs = (ArrayList<String>) service.getAccountList();
+            ArrayList<String> accountIDs = (ArrayList<String>) service.getAccountList();
+            HashMap<String, String> details;
             for (String id : accountIDs) {
 
-                if (id.contentEquals("IP2IP")) {
+                if (id.contentEquals(ACCOUNT_IP2IP)) {
+                    details = (HashMap<String, String>) service.getAccountDetails(id);
+                    IP2IP = new Account(ACCOUNT_IP2IP, details);
                     continue;
                 }
                 details = (HashMap<String, String>) service.getAccountDetails(id);
-                result.add(new Account(id, details));
+                accounts.add(new Account(id, details));
 
             }
         } catch (RemoteException e) {
@@ -47,6 +51,9 @@
             Log.e(TAG, e1.toString());
         }
 
+        Bundle result = new Bundle();
+        result.putParcelableArrayList(ACCOUNTS, accounts);
+        result.putParcelable(ACCOUNT_IP2IP, IP2IP);
         return result;
     }
 
